From 312b1981de428eabb03d272697af26cc20607c8e Mon Sep 17 00:00:00 2001 From: Aleksander Machniak Date: Thu, 25 Jan 2024 15:58:15 +0100 Subject: [PATCH] Fix test --- .../lib/libcalendaring_vcalendar.php | 50 +++++++++---------- .../libcalendaring/tests/VcalendarTest.php | 18 +++---- 2 files changed, 33 insertions(+), 35 deletions(-) diff --git a/plugins/libcalendaring/lib/libcalendaring_vcalendar.php b/plugins/libcalendaring/lib/libcalendaring_vcalendar.php index c025ca65..9af59615 100644 --- a/plugins/libcalendaring/lib/libcalendaring_vcalendar.php +++ b/plugins/libcalendaring/lib/libcalendaring_vcalendar.php @@ -944,7 +944,7 @@ class libcalendaring_vcalendar implements Iterator if ($dt) { if ($utc) { - $dt->setTimeZone(new \DateTimeZone('UTC')); + $dt->setTimeZone(new DateTimeZone('UTC')); $is_utc = true; } else { $is_utc = ($tz = $dt->getTimezone()) && in_array($tz->getName(), ['UTC','GMT','Z']); @@ -1092,7 +1092,7 @@ class libcalendaring_vcalendar implements Iterator $ve->UID = $event['uid']; // set DTSTAMP according to RFC 5545, 3.8.7.2. - $dtstamp = !empty($event['changed']) && empty($this->method) ? $event['changed'] : new DateTime('now', new \DateTimeZone('UTC')); + $dtstamp = !empty($event['changed']) && empty($this->method) ? $event['changed'] : new DateTime('now', new DateTimeZone('UTC')); $ve->DTSTAMP = $this->datetime_prop($cal, 'DTSTAMP', $dtstamp, true); // all-day events end the next day @@ -1410,13 +1410,13 @@ class libcalendaring_vcalendar implements Iterator * Returns a VTIMEZONE component for a Olson timezone identifier * with daylight transitions covering the given date range. * - * @param string Timezone ID as used in PHP's Date functions - * @param integer Unix timestamp with first date/time in this timezone - * @param integer Unix timestap with last date/time in this timezone + * @param string $tzid Timezone ID as used in PHP's Date functions + * @param int $from Unix timestamp with first date/time in this timezone + * @param int $to Unix timestap with last date/time in this timezone * @param VObject\Component\VCalendar Optional VCalendar component * - * @return mixed A Sabre\VObject\Component object representing a VTIMEZONE definition - * or false if no timezone information is available + * @return Sabre\VObject\Component|false Object representing a VTIMEZONE definition + * or false if no timezone information is available */ public static function get_vtimezone($tzid, $from = 0, $to = 0, $cal = null) { @@ -1434,15 +1434,15 @@ class libcalendaring_vcalendar implements Iterator if (is_string($tzid)) { try { - $tz = new \DateTimeZone($tzid); - } catch (\Exception $e) { - return false; + $tz = new DateTimeZone($tzid); + } catch (Exception $e) { + // do nothing } - } elseif (is_a($tzid, '\\DateTimeZone')) { + } elseif ($tzid instanceof DateTimeZone) { $tz = $tzid; } - if (empty($tz) || !is_a($tz, '\\DateTimeZone')) { + if (empty($tz) || !$tz instanceof DateTimeZone) { return false; } @@ -1466,9 +1466,8 @@ class libcalendaring_vcalendar implements Iterator $std = null; $dst = null; $t_dst = $t_std = 0; - foreach ($transitions as $i => $trans) { - $cmp = null; + foreach ($transitions as $i => $trans) { if (!isset($tzfrom)) { $tzfrom = $trans['offset'] / 3600; continue; @@ -1484,22 +1483,21 @@ class libcalendaring_vcalendar implements Iterator $cmp = $std; } - if ($cmp) { - $dt = new DateTime($trans['time']); - $offset = $trans['offset'] / 3600; + // FIXME: Imho $trans['time'] is UTC, shouldn't we consider timezone offset for DTSTART below? + $dt = new DateTime($trans['time']); + $offset = $trans['offset'] / 3600; - $cmp->DTSTART = $dt->format('Ymd\THis'); - $cmp->TZOFFSETFROM = sprintf('%+03d%02d', floor($tzfrom), ($tzfrom - floor($tzfrom)) * 60); - $cmp->TZOFFSETTO = sprintf('%+03d%02d', floor($offset), ($offset - floor($offset)) * 60); + $cmp->DTSTART = $dt->format('Ymd\THis'); + $cmp->TZOFFSETFROM = sprintf('%+03d%02d', floor($tzfrom), ($tzfrom - floor($tzfrom)) * 60); + $cmp->TZOFFSETTO = sprintf('%+03d%02d', floor($offset), ($offset - floor($offset)) * 60); - if (!empty($trans['abbr'])) { - $cmp->TZNAME = $trans['abbr']; - } - - $tzfrom = $offset; - $vt->add($cmp); + if (!empty($trans['abbr'])) { + $cmp->TZNAME = $trans['abbr']; } + $tzfrom = $offset; + $vt->add($cmp); + // we covered the entire date range if ($std && $dst && min($t_std, $t_dst) < $from && max($t_std, $t_dst) > $to) { break; diff --git a/plugins/libcalendaring/tests/VcalendarTest.php b/plugins/libcalendaring/tests/VcalendarTest.php index d1320c73..891b1c90 100644 --- a/plugins/libcalendaring/tests/VcalendarTest.php +++ b/plugins/libcalendaring/tests/VcalendarTest.php @@ -584,22 +584,22 @@ class VcalendarTest extends PHPUnit\Framework\TestCase // Making sure VTIMEZOONE contains at least one STANDARD/DAYLIGHT component // when there's only one transition in specified time period (T5626) - $vtz = libcalendaring_vcalendar::get_vtimezone('Europe/Istanbul', strtotime('2019-10-04T15:00:00')); + $vtz = libcalendaring_vcalendar::get_vtimezone('Europe/Warsaw', strtotime('2023-10-04T15:00:00')); $this->assertInstanceOf('\Sabre\VObject\Component', $vtz); $dst = $vtz->select('DAYLIGHT'); $std = $vtz->select('STANDARD'); - $this->assertEmpty($dst); - $this->assertCount(1, $std); - + $this->assertCount(1, $dst); + $this->assertCount(2, $std); $std = end($std); - $this->assertEquals('STANDARD', $std->name); - $this->assertEquals('20181009T150000', $std->DTSTART); - $this->assertEquals('+0300', $std->TZOFFSETFROM); - $this->assertEquals('+0300', $std->TZOFFSETTO); - $this->assertEquals('+03', $std->TZNAME); + + $this->assertSame('STANDARD', $std->name); + $this->assertSame('20231029T010000', (string) $std->DTSTART); + $this->assertSame('+0200', (string) $std->TZOFFSETFROM); + $this->assertSame('+0100', (string) $std->TZOFFSETTO); + $this->assertSame('CET', (string) $std->TZNAME); } public function get_attachment_data($id, $event)