From e1674b1472e59e2ba3634c14192be7b35f99cf77 Mon Sep 17 00:00:00 2001 From: Daniel Siepmann Date: Mon, 29 Aug 2022 12:44:36 +0000 Subject: [PATCH] Fix broken timezone during import --- .../DatesFactory.php | 25 +-- Documentation/Changelog/2.6.1.rst | 32 +++ .../Fixtures/TypoScript/Rendering.typoscript | 1 + .../ImportsAllConfigurationTest.csv | 52 ++--- .../Assertions/ImportsExampleAsExpected.csv | 26 +-- .../Fixtures/Response.json | 60 +++--- .../ImportsAllConfigurationTest.php | 2 + .../ImportsExampleAsExpectedTest.php | 2 + .../ImportsSingleConfigurationTest.php | 2 + .../DatesFactoryTest.php | 186 +++++++++--------- 10 files changed, 215 insertions(+), 173 deletions(-) create mode 100644 Documentation/Changelog/2.6.1.rst diff --git a/Classes/Service/DestinationDataImportService/DatesFactory.php b/Classes/Service/DestinationDataImportService/DatesFactory.php index aef6331..956997b 100644 --- a/Classes/Service/DestinationDataImportService/DatesFactory.php +++ b/Classes/Service/DestinationDataImportService/DatesFactory.php @@ -126,16 +126,15 @@ class DatesFactory $end = new \DateTimeImmutable($date['end'], $timeZone); $until = new \DateTimeImmutable($date['repeatUntil'], $timeZone); - $nextDate = $start; - while ($nextDate <= $until) { - $dateToUse = $nextDate; - $nextDate = $dateToUse->modify('+1 day'); - if ($dateToUse < $today) { + $period = new \DatePeriod($start, new \DateInterval('P1D'), $until); + foreach ($period as $day) { + $day = $day->setTimezone($timeZone); + if ($day < $today) { continue; } yield $this->createDateFromStartAndEnd( - $dateToUse, + $day, $start, $end, $canceled @@ -157,16 +156,18 @@ class DatesFactory $until = new \DateTimeImmutable($date['repeatUntil'], $timeZone); foreach ($date['weekdays'] as $day) { - $nextDate = $start->modify($day); - while ($nextDate <= $until) { - $dateToUse = $nextDate; - $nextDate = $dateToUse->modify('+1 week'); - if ($dateToUse < $today) { + $dateToUse = $start->modify($day); + $dateToUse = $dateToUse->setTime((int) $start->format('H'), (int) $start->format('i')); + + $period = new \DatePeriod($dateToUse, new \DateInterval('P1W'), $until); + foreach ($period as $day) { + $day = $day->setTimezone($timeZone); + if ($day < $today) { continue; } yield $this->createDateFromStartAndEnd( - $dateToUse, + $day, $start, $end, $canceled diff --git a/Documentation/Changelog/2.6.1.rst b/Documentation/Changelog/2.6.1.rst new file mode 100644 index 0000000..966e117 --- /dev/null +++ b/Documentation/Changelog/2.6.1.rst @@ -0,0 +1,32 @@ +2.6.0 +===== + +Breaking +-------- + +Nothing + +Features +-------- + +Nothing + +Fixes +----- + +* Respect timezone for recurring events. + Some events occur over multiple time zones (same time zone but summer and winter time). + We ensure PHP creates those objects as expected so we do not use the current offset, + but the one of that date. + +* Tests won't work after a specific date, we ensure they will work all the time. + +Tasks +----- + +Nothing + +Deprecation +----------- + +Nothing diff --git a/Tests/Functional/Frontend/Fixtures/TypoScript/Rendering.typoscript b/Tests/Functional/Frontend/Fixtures/TypoScript/Rendering.typoscript index 6a3ecb3..4e1b9c9 100644 --- a/Tests/Functional/Frontend/Fixtures/TypoScript/Rendering.typoscript +++ b/Tests/Functional/Frontend/Fixtures/TypoScript/Rendering.typoscript @@ -11,5 +11,6 @@ plugin.tx_events { settings { sortByDate = start sortOrder = ASC + start = 1660158000 } } diff --git a/Tests/Functional/Import/DestinationDataTest/Assertions/ImportsAllConfigurationTest.csv b/Tests/Functional/Import/DestinationDataTest/Assertions/ImportsAllConfigurationTest.csv index 5b63af8..c452381 100644 --- a/Tests/Functional/Import/DestinationDataTest/Assertions/ImportsAllConfigurationTest.csv +++ b/Tests/Functional/Import/DestinationDataTest/Assertions/ImportsAllConfigurationTest.csv @@ -16,32 +16,32 @@ ,"6","3","0","0","0","0","0","-1","0","0","0","0","0","Adventliche Orgelmusik (Orgel: KMD Frank Bettenhausen)",,"e_100350503","e-100350503","0",,"1","2",,"8","6",,"1", "tx_events_domain_model_date",,,,,,,,,,,,,,,,,,,,,,,,,,, ,"uid","pid","cruser_id","hidden","starttime","endtime","sys_language_uid","l10n_parent","t3ver_oid","t3ver_wsid","t3ver_state","event","start","end","canceled","postponed_date","canceled_link",,,,,,,,,, -,"1","2","0","0","0","0",-1,0,"0","0","0","1","4101372000","4101377400","no","0",,,,,,,,,,, -,"2","2","0","0","0","0",-1,0,"0","0","0","2","4101112800","4101118200","no","0",,,,,,,,,,, -,"3","2","0","0","0","0",-1,0,"0","0","0","2",4078717200,4078724400,"no","0",,,,,,,,,,, -,"4","2","0","0","0","0",-1,0,"0","0","0","2",4078803600,4078810800,"no","0",,,,,,,,,,, -,"5","2","0","0","0","0",-1,0,"0","0","0","2","4075020000","4075027200","no","0",,,,,,,,,,, -,"6","2","0","0","0","0",-1,0,"0","0","0","3","4099831200","4099834800","no","0",,,,,,,,,,, -,"7","2","0","0","0","0",-1,0,"0","0","0","3","4097728800","4097736000","no","0",,,,,,,,,,, -,"8","2","0","0","0","0",-1,0,"0","0","0","3","4098333600","4098340800","no","0",,,,,,,,,,, -,"9","2","0","0","0","0",-1,0,"0","0","0","3","4098938400","4098945600","no","0",,,,,,,,,,, -,"10","2","0","0","0","0",-1,0,"0","0","0","3","4097815200","4097822400","no","0",,,,,,,,,,, -,"11","2","0","0","0","0",-1,0,"0","0","0","3","4098420000","4098427200","no","0",,,,,,,,,,, -,"12","2","0","0","0","0",-1,0,"0","0","0","3","4099024800","4099032000","no","0",,,,,,,,,,, -,"13","2","0","0","0","0",-1,0,"0","0","0","3","4101645600","4101649200","no","0",,,,,,,,,,, -,"14","3","0","0","0","0",-1,0,"0","0","0","4","4101372000","4101377400","no","0",,,,,,,,,,, -,"15","3","0","0","0","0",-1,0,"0","0","0","5","4101112800","4101118200","no","0",,,,,,,,,,, -,"16","3","0","0","0","0",-1,0,"0","0","0","5",4078717200,4078724400,"no","0",,,,,,,,,,, -,"17","3","0","0","0","0",-1,0,"0","0","0","5",4078803600,4078810800,"no","0",,,,,,,,,,, -,"18","3","0","0","0","0",-1,0,"0","0","0","5","4075020000","4075027200","no","0",,,,,,,,,,, -,"19","3","0","0","0","0",-1,0,"0","0","0","6","4099831200","4099834800","no","0",,,,,,,,,,, -,"20","3","0","0","0","0",-1,0,"0","0","0","6","4097728800","4097736000","no","0",,,,,,,,,,, -,"21","3","0","0","0","0",-1,0,"0","0","0","6","4098333600","4098340800","no","0",,,,,,,,,,, -,"22","3","0","0","0","0",-1,0,"0","0","0","6","4098938400","4098945600","no","0",,,,,,,,,,, -,"23","3","0","0","0","0",-1,0,"0","0","0","6","4097815200","4097822400","no","0",,,,,,,,,,, -,"24","3","0","0","0","0",-1,0,"0","0","0","6","4098420000","4098427200","no","0",,,,,,,,,,, -,"25","3","0","0","0","0",-1,0,"0","0","0","6","4099024800","4099032000","no","0",,,,,,,,,,, -,"26","3","0","0","0","0",-1,0,"0","0","0","6","4101645600","4101649200","no","0",,,,,,,,,,, +,"1","2","0","0","0","0",-1,0,"0","0","0","1","1671458400","1671463800","no","0",,,,,,,,,,, +,"2","2","0","0","0","0",-1,0,"0","0","0","2","1671199200","1671204600","no","0",,,,,,,,,,, +,"3","2","0","0","0","0",-1,0,"0","0","0","2",1648803600,1648810800,"no","0",,,,,,,,,,, +,"4","2","0","0","0","0",-1,0,"0","0","0","2",1648890000,1648897200,"no","0",,,,,,,,,,, +,"5","2","0","0","0","0",-1,0,"0","0","0","2","1645106400","1645113600","no","0",,,,,,,,,,, +,"6","2","0","0","0","0",-1,0,"0","0","0","3","1669917600","1669921200","no","0",,,,,,,,,,, +,"7","2","0","0","0","0",-1,0,"0","0","0","3","1667642400","1667649600","no","0",,,,,,,,,,, +,"8","2","0","0","0","0",-1,0,"0","0","0","3","1668247200","1668254400","no","0",,,,,,,,,,, +,"9","2","0","0","0","0",-1,0,"0","0","0","3","1668852000","1668859200","no","0",,,,,,,,,,, +,"10","2","0","0","0","0",-1,0,"0","0","0","3","1667728800","1667736000","no","0",,,,,,,,,,, +,"11","2","0","0","0","0",-1,0,"0","0","0","3","1668333600","1668340800","no","0",,,,,,,,,,, +,"12","2","0","0","0","0",-1,0,"0","0","0","3","1668938400","1668945600","no","0",,,,,,,,,,, +,"13","2","0","0","0","0",-1,0,"0","0","0","3","1671732000","1671735600","no","0",,,,,,,,,,, +,"14","3","0","0","0","0",-1,0,"0","0","0","4","1671458400","1671463800","no","0",,,,,,,,,,, +,"15","3","0","0","0","0",-1,0,"0","0","0","5","1671199200","1671204600","no","0",,,,,,,,,,, +,"16","3","0","0","0","0",-1,0,"0","0","0","5",1648803600,1648810800,"no","0",,,,,,,,,,, +,"17","3","0","0","0","0",-1,0,"0","0","0","5",1648890000,1648897200,"no","0",,,,,,,,,,, +,"18","3","0","0","0","0",-1,0,"0","0","0","5","1645106400","1645113600","no","0",,,,,,,,,,, +,"19","3","0","0","0","0",-1,0,"0","0","0","6","1669917600","1669921200","no","0",,,,,,,,,,, +,"20","3","0","0","0","0",-1,0,"0","0","0","6","1667642400","1667649600","no","0",,,,,,,,,,, +,"21","3","0","0","0","0",-1,0,"0","0","0","6","1668247200","1668254400","no","0",,,,,,,,,,, +,"22","3","0","0","0","0",-1,0,"0","0","0","6","1668852000","1668859200","no","0",,,,,,,,,,, +,"23","3","0","0","0","0",-1,0,"0","0","0","6","1667728800","1667736000","no","0",,,,,,,,,,, +,"24","3","0","0","0","0",-1,0,"0","0","0","6","1668333600","1668340800","no","0",,,,,,,,,,, +,"25","3","0","0","0","0",-1,0,"0","0","0","6","1668938400","1668945600","no","0",,,,,,,,,,, +,"26","3","0","0","0","0",-1,0,"0","0","0","6","1671732000","1671735600","no","0",,,,,,,,,,, "sys_category",,,,,,,,,,,,,,,,,,,,,,,,,,, ,"uid","pid","cruser_id","hidden","starttime","endtime","sys_language_uid","l10n_parent","title","items","parent",,,,,,,,,,,,,,,, ,1,2,0,0,0,0,0,0,"Top Category",0,0,,,,,,,,,,,,,,,, diff --git a/Tests/Functional/Import/DestinationDataTest/Assertions/ImportsExampleAsExpected.csv b/Tests/Functional/Import/DestinationDataTest/Assertions/ImportsExampleAsExpected.csv index a50167b..8d2b104 100644 --- a/Tests/Functional/Import/DestinationDataTest/Assertions/ImportsExampleAsExpected.csv +++ b/Tests/Functional/Import/DestinationDataTest/Assertions/ImportsExampleAsExpected.csv @@ -18,19 +18,19 @@ Bitte beachten Sie die derzeit geltenden Zugangsregeln.",,"http://www.stadtbibli Es gilt die 2G-PLUS-Regel.",,,,,,,,"1","2",,"8","3",,"1",,3,,,,,,,, "tx_events_domain_model_date",,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, ,"uid","pid","cruser_id","hidden","starttime","endtime","sys_language_uid","l10n_parent","t3ver_oid","t3ver_wsid","t3ver_state","event","start","end","canceled","postponed_date","canceled_link",,,,,,,,,,,,,,,,,,,,,,,,,,, -,"1","2","0","0","0","0",-1,0,"0","0","0","1","4101372000","4101377400","no","0",,,,,,,,,,,,,,,,,,,,,,,,,,,, -,"2","2","0","0","0","0",-1,0,"0","0","0","2","4101112800","4101118200","no","0",,,,,,,,,,,,,,,,,,,,,,,,,,,, -,"3","2","0","0","0","0",-1,0,"0","0","0","2",4078717200,4078724400,"no","0",,,,,,,,,,,,,,,,,,,,,,,,,,,, -,"4","2","0","0","0","0",-1,0,"0","0","0","2",4078803600,4078810800,"no","0",,,,,,,,,,,,,,,,,,,,,,,,,,,, -,"5","2","0","0","0","0",-1,0,"0","0","0","2","4075020000","4075027200","no","0",,,,,,,,,,,,,,,,,,,,,,,,,,,, -,"6","2","0","0","0","0",-1,0,"0","0","0","3","4099831200","4099834800","no","0",,,,,,,,,,,,,,,,,,,,,,,,,,,, -,"7","2","0","0","0","0",-1,0,"0","0","0","3","4097728800","4097736000","no","0",,,,,,,,,,,,,,,,,,,,,,,,,,,, -,"8","2","0","0","0","0",-1,0,"0","0","0","3","4098333600","4098340800","no","0",,,,,,,,,,,,,,,,,,,,,,,,,,,, -,"9","2","0","0","0","0",-1,0,"0","0","0","3","4098938400","4098945600","no","0",,,,,,,,,,,,,,,,,,,,,,,,,,,, -,"10","2","0","0","0","0",-1,0,"0","0","0","3","4097815200","4097822400","no","0",,,,,,,,,,,,,,,,,,,,,,,,,,,, -,"11","2","0","0","0","0",-1,0,"0","0","0","3","4098420000","4098427200","no","0",,,,,,,,,,,,,,,,,,,,,,,,,,,, -,"12","2","0","0","0","0",-1,0,"0","0","0","3","4099024800","4099032000","no","0",,,,,,,,,,,,,,,,,,,,,,,,,,,, -,"13","2","0","0","0","0",-1,0,"0","0","0","3","4101645600","4101649200","no","0",,,,,,,,,,,,,,,,,,,,,,,,,,,, +,"1","2","0","0","0","0",-1,0,"0","0","0","1","1671458400","1671463800","no","0",,,,,,,,,,,,,,,,,,,,,,,,,,,, +,"2","2","0","0","0","0",-1,0,"0","0","0","2","1671199200","1671204600","no","0",,,,,,,,,,,,,,,,,,,,,,,,,,,, +,"3","2","0","0","0","0",-1,0,"0","0","0","2",1648803600,1648810800,"no","0",,,,,,,,,,,,,,,,,,,,,,,,,,,, +,"4","2","0","0","0","0",-1,0,"0","0","0","2",1648890000,1648897200,"no","0",,,,,,,,,,,,,,,,,,,,,,,,,,,, +,"5","2","0","0","0","0",-1,0,"0","0","0","2","1645106400","1645113600","no","0",,,,,,,,,,,,,,,,,,,,,,,,,,,, +,"6","2","0","0","0","0",-1,0,"0","0","0","3","1669917600","1669921200","no","0",,,,,,,,,,,,,,,,,,,,,,,,,,,, +,"7","2","0","0","0","0",-1,0,"0","0","0","3","1667642400","1667649600","no","0",,,,,,,,,,,,,,,,,,,,,,,,,,,, +,"8","2","0","0","0","0",-1,0,"0","0","0","3","1668247200","1668254400","no","0",,,,,,,,,,,,,,,,,,,,,,,,,,,, +,"9","2","0","0","0","0",-1,0,"0","0","0","3","1668852000","1668859200","no","0",,,,,,,,,,,,,,,,,,,,,,,,,,,, +,"10","2","0","0","0","0",-1,0,"0","0","0","3","1667728800","1667736000","no","0",,,,,,,,,,,,,,,,,,,,,,,,,,,, +,"11","2","0","0","0","0",-1,0,"0","0","0","3","1668333600","1668340800","no","0",,,,,,,,,,,,,,,,,,,,,,,,,,,, +,"12","2","0","0","0","0",-1,0,"0","0","0","3","1668938400","1668945600","no","0",,,,,,,,,,,,,,,,,,,,,,,,,,,, +,"13","2","0","0","0","0",-1,0,"0","0","0","3","1671732000","1671735600","no","0",,,,,,,,,,,,,,,,,,,,,,,,,,,, "tx_events_domain_model_location",,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, ,"uid","pid","cruser_id","hidden","starttime","endtime","sys_language_uid","l10n_parent","t3ver_oid","t3ver_wsid","t3ver_state","name","street","district","city","zip","country","latitude","longitude","phone",,,,,,,,,,,,,,,,,,,,,,,, ,"1","2","0","0","0","0",-1,0,"0","0","0","Schillerhaus Rudolstadt","Schillerstraße 25",,"Rudolstadt","07407","Deutschland","50.720971023259","11.335229873657","+ 49 3672 / 486470",,,,,,,,,,,,,,,,,,,,,,,, diff --git a/Tests/Functional/Import/DestinationDataTest/Fixtures/Response.json b/Tests/Functional/Import/DestinationDataTest/Fixtures/Response.json index 8bf8bdb..1d22254 100644 --- a/Tests/Functional/Import/DestinationDataTest/Fixtures/Response.json +++ b/Tests/Functional/Import/DestinationDataTest/Fixtures/Response.json @@ -88,8 +88,8 @@ "timeIntervals": [ { "weekdays": [], - "start": "2099-12-19T15:00:00+01:00", - "end": "2099-12-19T16:30:00+01:00", + "start": "2022-12-19T15:00:00+01:00", + "end": "2022-12-19T16:30:00+01:00", "tz": "Europe/Berlin", "interval": 1 } @@ -117,11 +117,11 @@ }, { "key": "interval_first_match_start", - "value": "2099-12-19T15:00:00+01" + "value": "2022-12-19T15:00:00+01" }, { "key": "interval_first_match_end", - "value": "2099-12-19T16:30:00+01" + "value": "2022-12-19T16:30:00+01" }, { "key": "interval_match_count", @@ -165,8 +165,8 @@ "rel": "organizer" } ], - "created": "2099-10-31T12:29:00+00:00", - "changed": "2099-12-14T08:29:00+00:00", + "created": "2022-10-31T12:29:00+00:00", + "changed": "2022-12-14T08:29:00+00:00", "source": { "url": "http://destination.one/", "value": "destination.one" @@ -262,24 +262,24 @@ "timeIntervals": [ { "weekdays": [], - "start": "2099-12-16T15:00:00+01:00", - "end": "2099-12-16T16:30:00+01:00", + "start": "2022-12-16T15:00:00+01:00", + "end": "2022-12-16T16:30:00+01:00", "tz": "Europe/Berlin", "interval": 1 }, { "weekdays": [], - "start": "2099-04-01T11:00:00+02:00", - "end": "2099-04-01T13:00:00+02:00", - "repeatUntil": "2099-04-03T00:00+02:00", + "start": "2022-04-01T11:00:00+02:00", + "end": "2022-04-01T13:00:00+02:00", + "repeatUntil": "2022-04-03T00:00+02:00", "tz": "Europe/Berlin", "freq": "Daily", "interval": 1 }, { "weekdays": [], - "start": "2099-02-17T15:00:00+01:00", - "end": "2099-02-17T17:00:00+01:00", + "start": "2022-02-17T15:00:00+01:00", + "end": "2022-02-17T17:00:00+01:00", "tz": "Europe/Berlin", "interval": 1 } @@ -307,11 +307,11 @@ }, { "key": "interval_first_match_start", - "value": "2099-12-16T15:00:00+01" + "value": "2022-12-16T15:00:00+01" }, { "key": "interval_first_match_end", - "value": "2099-12-16T16:30:00+01" + "value": "2022-12-16T16:30:00+01" }, { "key": "interval_match_count", @@ -356,8 +356,8 @@ "rel": "organizer" } ], - "created": "2099-11-10T23:02:00+00:00", - "changed": "2099-12-14T08:28:00+00:00", + "created": "2022-11-10T23:02:00+00:00", + "changed": "2022-12-14T08:28:00+00:00", "source": { "url": "http://destination.one/", "value": "destination.one" @@ -444,8 +444,8 @@ "timeIntervals": [ { "weekdays": [], - "start": "2099-12-01T19:00:00+01:00", - "end": "2099-12-01T20:00:00+01:00", + "start": "2022-12-01T19:00:00+01:00", + "end": "2022-12-01T20:00:00+01:00", "tz": "Europe/Berlin", "interval": 1 }, @@ -454,17 +454,17 @@ "Saturday", "Sunday" ], - "start": "2099-11-02T11:00:00+01:00", - "end": "2099-11-02T13:00:00+01:00", - "repeatUntil": "2099-11-25T13:00:00+01:00", + "start": "2022-11-02T11:00:00+01:00", + "end": "2022-11-02T13:00:00+01:00", + "repeatUntil": "2022-11-25T13:00:00+01:00", "tz": "Europe/Berlin", "freq": "Weekly", "interval": 1 }, { "weekdays": [], - "start": "2099-12-22T19:00:00+01:00", - "end": "2099-12-22T20:00:00+01:00", + "start": "2022-12-22T19:00:00+01:00", + "end": "2022-12-22T20:00:00+01:00", "tz": "Europe/Berlin", "interval": 1 } @@ -492,11 +492,11 @@ }, { "key": "interval_first_match_start", - "value": "2099-12-15T19:00:00+01" + "value": "2022-12-15T19:00:00+01" }, { "key": "interval_first_match_end", - "value": "2099-12-15T20:00:00+01" + "value": "2022-12-15T20:00:00+01" }, { "key": "interval_match_count", @@ -504,11 +504,11 @@ }, { "key": "interval_last_match_start", - "value": "2099-12-22T19:00:00+01" + "value": "2022-12-22T19:00:00+01" }, { "key": "interval_last_match_end", - "value": "2099-12-22T20:00:00+01" + "value": "2022-12-22T20:00:00+01" } ], "features": [], @@ -538,8 +538,8 @@ "rel": "organizer" } ], - "created": "2099-11-08T22:15:00+00:00", - "changed": "2099-12-14T08:38:00+00:00", + "created": "2022-11-08T22:15:00+00:00", + "changed": "2022-12-14T08:38:00+00:00", "source": { "url": "http://destination.one/", "value": "destination.one" diff --git a/Tests/Functional/Import/DestinationDataTest/ImportsAllConfigurationTest.php b/Tests/Functional/Import/DestinationDataTest/ImportsAllConfigurationTest.php index 5735996..34f9d94 100644 --- a/Tests/Functional/Import/DestinationDataTest/ImportsAllConfigurationTest.php +++ b/Tests/Functional/Import/DestinationDataTest/ImportsAllConfigurationTest.php @@ -16,6 +16,8 @@ class ImportsAllConfigurationTest extends AbstractTest */ public function importsConfiguration(): void { + $this->setDateAspect(new \DateTimeImmutable('2021-07-13', new \DateTimeZone('Europe/Berlin'))); + $fileImportPathConfiguration1 = 'staedte/beispielstadt/events/'; $fileImportPath1 = $this->getInstancePath() . '/fileadmin/' . $fileImportPathConfiguration1; GeneralUtility::mkdir_deep($fileImportPath1); diff --git a/Tests/Functional/Import/DestinationDataTest/ImportsExampleAsExpectedTest.php b/Tests/Functional/Import/DestinationDataTest/ImportsExampleAsExpectedTest.php index 74c847c..79d48a3 100644 --- a/Tests/Functional/Import/DestinationDataTest/ImportsExampleAsExpectedTest.php +++ b/Tests/Functional/Import/DestinationDataTest/ImportsExampleAsExpectedTest.php @@ -15,6 +15,8 @@ class ImportsExampleAsExpectedTest extends AbstractTest */ public function importsExampleAsExpected(): void { + $this->setDateAspect(new \DateTimeImmutable('2021-07-13', new \DateTimeZone('Europe/Berlin'))); + $fileImportPathConfiguration = 'staedte/beispielstadt/events/'; $fileImportPath = $this->getInstancePath() . '/fileadmin/' . $fileImportPathConfiguration; GeneralUtility::mkdir_deep($fileImportPath); diff --git a/Tests/Functional/Import/DestinationDataTest/ImportsSingleConfigurationTest.php b/Tests/Functional/Import/DestinationDataTest/ImportsSingleConfigurationTest.php index da35ccf..70b628e 100644 --- a/Tests/Functional/Import/DestinationDataTest/ImportsSingleConfigurationTest.php +++ b/Tests/Functional/Import/DestinationDataTest/ImportsSingleConfigurationTest.php @@ -16,6 +16,8 @@ class ImportsSingleConfigurationTest extends AbstractTest */ public function importsConfiguration(): void { + $this->setDateAspect(new \DateTimeImmutable('2021-07-13', new \DateTimeZone('Europe/Berlin'))); + $fileImportPathConfiguration = 'staedte/beispielstadt/events/'; $fileImportPath = $this->getInstancePath() . '/fileadmin/' . $fileImportPathConfiguration; GeneralUtility::mkdir_deep($fileImportPath); diff --git a/Tests/Unit/Service/DestinationDataImportService/DatesFactoryTest.php b/Tests/Unit/Service/DestinationDataImportService/DatesFactoryTest.php index 3c64067..d14412f 100644 --- a/Tests/Unit/Service/DestinationDataImportService/DatesFactoryTest.php +++ b/Tests/Unit/Service/DestinationDataImportService/DatesFactoryTest.php @@ -6,26 +6,22 @@ namespace Wrm\Events\Tests\Unit\Service\DestinationDataImportService; use PHPUnit\Framework\TestCase; use TYPO3\CMS\Core\Context\Context; +use TYPO3\CMS\Core\Context\DateTimeAspect; use Wrm\Events\Domain\Model\Date; use Wrm\Events\Service\DestinationDataImportService\DatesFactory; -use Wrm\Events\Tests\ProphecyTrait; /** * @covers \Wrm\Events\Service\DestinationDataImportService\DatesFactory */ class DatesFactoryTest extends TestCase { - use ProphecyTrait; - /** * @test */ public function canBeCreated(): void { - $context = $this->prophesize(Context::class); - $subject = new DatesFactory( - $context->reveal() + $this->getContext(new \DateTimeImmutable('now')) ); self::assertInstanceOf( @@ -40,10 +36,8 @@ class DatesFactoryTest extends TestCase */ public function returnsNoResultOnUnkownInput(array $unkownInput): void { - $context = $this->prophesize(Context::class); - $subject = new DatesFactory( - $context->reveal() + $this->getContext(new \DateTimeImmutable('2022-01-01T13:17:24 Europe/Berlin')) ); $result = $subject->createDates($unkownInput, false); @@ -72,15 +66,13 @@ class DatesFactoryTest extends TestCase */ public function returnsSingleNotCanceledDate(): void { - $context = $this->prophesize(Context::class); - $subject = new DatesFactory( - $context->reveal() + $this->getContext(new \DateTimeImmutable('2022-01-01T13:17:24 Europe/Berlin')) ); $result = $subject->createDates([[ - 'start' => '2099-06-21T16:00:00+02:00', - 'end' => '2099-06-21T22:00:00+02:00', + 'start' => '2022-04-01T16:00:00+02:00', + 'end' => '2022-04-01T17:00:00+02:00', 'tz' => 'Europe/Berlin', 'interval' => 1, ]], false); @@ -92,8 +84,8 @@ class DatesFactoryTest extends TestCase self::assertCount(1, $result); self::assertInstanceOf(Date::class, $firstEntry); - self::assertSame('4085733600', $firstEntry->getStart()->format('U')); - self::assertSame('4085755200', $firstEntry->getEnd()->format('U')); + self::assertSame(1648821600, $firstEntry->getStart()->getTimestamp()); + self::assertSame(1648825200, $firstEntry->getEnd()->getTimestamp()); self::assertSame('no', $firstEntry->getCanceled()); } @@ -102,28 +94,27 @@ class DatesFactoryTest extends TestCase */ public function returnsSingleCanceledDate(): void { - $context = $this->prophesize(Context::class); - $subject = new DatesFactory( - $context->reveal() + $this->getContext(new \DateTimeImmutable('2022-01-01T13:17:24 Europe/Berlin')) ); $result = $subject->createDates([[ - 'start' => '2099-06-21T16:00:00+02:00', - 'end' => '2099-06-21T22:00:00+02:00', + 'start' => '2022-04-01T16:00:00+02:00', + 'end' => '2022-04-01T17:00:00+02:00', 'tz' => 'Europe/Berlin', 'interval' => 1, ]], true); self::assertInstanceOf(\Generator::class, $result); - $result = iterator_to_array($result); + + $firstEntry = $result->current(); self::assertCount(1, $result); - self::assertInstanceOf(Date::class, $result[0]); - self::assertSame('4085733600', $result[0]->getStart()->format('U')); - self::assertSame('4085755200', $result[0]->getEnd()->format('U')); - self::assertSame('canceled', $result[0]->getCanceled()); + self::assertInstanceOf(Date::class, $firstEntry); + self::assertSame(1648821600, $firstEntry->getStart()->getTimestamp()); + self::assertSame(1648825200, $firstEntry->getEnd()->getTimestamp()); + self::assertSame('canceled', $firstEntry->getCanceled()); } /** @@ -131,16 +122,14 @@ class DatesFactoryTest extends TestCase */ public function returnsCanceledDatesOnDailyBasis(): void { - $context = $this->prophesize(Context::class); - $subject = new DatesFactory( - $context->reveal() + $this->getContext(new \DateTimeImmutable('2022-01-01T13:17:24 Europe/Berlin')) ); $result = $subject->createDates([[ - 'start' => '2099-04-01T16:00:00+02:00', - 'end' => '2099-04-01T17:00:00+02:00', - 'repeatUntil' => '2099-04-03T18:00:00+02:00', + 'start' => '2022-10-29T16:00:00+02:00', + 'end' => '2022-10-29T17:00:00+02:00', + 'repeatUntil' => '2022-11-02T17:00:00+01:00', 'tz' => 'Europe/Berlin', 'freq' => 'Daily', 'interval' => 1, @@ -149,16 +138,16 @@ class DatesFactoryTest extends TestCase self::assertInstanceOf(\Generator::class, $result); $result = iterator_to_array($result); - self::assertCount(3, $result); + self::assertCount(5, $result); self::assertInstanceOf(Date::class, $result[0]); - self::assertSame('4078735200', $result[0]->getStart()->format('U')); - self::assertSame('4078738800', $result[0]->getEnd()->format('U')); + self::assertSame(1667052000, $result[0]->getStart()->getTimestamp()); + self::assertSame(1667055600, $result[0]->getEnd()->getTimestamp()); self::assertSame('canceled', $result[0]->getCanceled()); - self::assertSame('4078908000', $result[2]->getStart()->format('U')); - self::assertSame('4078911600', $result[2]->getEnd()->format('U')); - self::assertSame('canceled', $result[2]->getCanceled()); + self::assertSame(1667401200, $result[4]->getStart()->getTimestamp()); + self::assertSame(1667404800, $result[4]->getEnd()->getTimestamp()); + self::assertSame('canceled', $result[4]->getCanceled()); } /** @@ -166,16 +155,14 @@ class DatesFactoryTest extends TestCase */ public function returnsNotCanceledDatesOnDailyBasis(): void { - $context = $this->prophesize(Context::class); - $subject = new DatesFactory( - $context->reveal() + $this->getContext(new \DateTimeImmutable('2022-08-29T13:17:24 Europe/Berlin')) ); $result = $subject->createDates([[ - 'start' => '2099-04-01T16:00:00+02:00', - 'end' => '2099-04-01T17:00:00+02:00', - 'repeatUntil' => '2099-04-03T18:00:00+02:00', + 'start' => '2022-10-29T16:00:00+02:00', + 'end' => '2022-10-29T17:00:00+02:00', + 'repeatUntil' => '2022-11-02T17:00:00+01:00', 'tz' => 'Europe/Berlin', 'freq' => 'Daily', 'interval' => 1, @@ -184,16 +171,16 @@ class DatesFactoryTest extends TestCase self::assertInstanceOf(\Generator::class, $result); $result = iterator_to_array($result); - self::assertCount(3, $result); + self::assertCount(5, $result); self::assertInstanceOf(Date::class, $result[0]); - self::assertSame('4078735200', $result[0]->getStart()->format('U')); - self::assertSame('4078738800', $result[0]->getEnd()->format('U')); + self::assertSame(1667052000, $result[0]->getStart()->getTimestamp()); + self::assertSame(1667055600, $result[0]->getEnd()->getTimestamp()); self::assertSame('no', $result[0]->getCanceled()); - self::assertSame('4078908000', $result[2]->getStart()->format('U')); - self::assertSame('4078911600', $result[2]->getEnd()->format('U')); - self::assertSame('no', $result[2]->getCanceled()); + self::assertSame(1667401200, $result[4]->getStart()->getTimestamp()); + self::assertSame(1667404800, $result[4]->getEnd()->getTimestamp()); + self::assertSame('no', $result[4]->getCanceled()); } /** @@ -201,10 +188,8 @@ class DatesFactoryTest extends TestCase */ public function returnsCanceledDatesOnWeeklyBasis(): void { - $context = $this->prophesize(Context::class); - $subject = new DatesFactory( - $context->reveal() + $this->getContext(new \DateTimeImmutable('2022-08-29T13:17:24 Europe/Berlin')) ); $result = $subject->createDates([[ @@ -212,9 +197,9 @@ class DatesFactoryTest extends TestCase 'Saturday', 'Sunday', ], - 'start' => '2099-03-02T11:00:00+01:00', - 'end' => '2099-03-02T13:00:00+01:00', - 'repeatUntil' => '2099-03-15T13:00:00+02:00', + 'start' => '2022-10-29T16:00:00+02:00', + 'end' => '2022-10-29T17:00:00+02:00', + 'repeatUntil' => '2022-11-06T17:00:00+01:00', 'tz' => 'Europe/Berlin', 'freq' => 'Weekly', 'interval' => 1, @@ -226,12 +211,20 @@ class DatesFactoryTest extends TestCase self::assertCount(4, $result); self::assertInstanceOf(Date::class, $result[0]); - self::assertSame('4076560800', $result[0]->getStart()->format('U')); - self::assertSame('4076568000', $result[0]->getEnd()->format('U')); + self::assertSame(1667052000, $result[0]->getStart()->getTimestamp()); + self::assertSame(1667055600, $result[0]->getEnd()->getTimestamp()); self::assertSame('canceled', $result[0]->getCanceled()); - self::assertSame('4077252000', $result[3]->getStart()->format('U')); - self::assertSame('4077259200', $result[3]->getEnd()->format('U')); + self::assertSame(1667660400, $result[1]->getStart()->getTimestamp()); + self::assertSame(1667664000, $result[1]->getEnd()->getTimestamp()); + self::assertSame('canceled', $result[1]->getCanceled()); + + self::assertSame(1667142000, $result[2]->getStart()->getTimestamp()); + self::assertSame(1667145600, $result[2]->getEnd()->getTimestamp()); + self::assertSame('canceled', $result[2]->getCanceled()); + + self::assertSame(1667746800, $result[3]->getStart()->getTimestamp()); + self::assertSame(1667750400, $result[3]->getEnd()->getTimestamp()); self::assertSame('canceled', $result[3]->getCanceled()); } @@ -240,10 +233,8 @@ class DatesFactoryTest extends TestCase */ public function returnsNotCanceledDatesOnWeeklyBasis(): void { - $context = $this->prophesize(Context::class); - $subject = new DatesFactory( - $context->reveal() + $this->getContext(new \DateTimeImmutable('2022-08-29T13:17:24 Europe/Berlin')) ); $result = $subject->createDates([[ @@ -251,9 +242,9 @@ class DatesFactoryTest extends TestCase 'Saturday', 'Sunday', ], - 'start' => '2099-03-02T11:00:00+01:00', - 'end' => '2099-03-02T13:00:00+01:00', - 'repeatUntil' => '2099-03-15T13:00:00+02:00', + 'start' => '2022-10-29T16:00:00+02:00', + 'end' => '2022-10-29T17:00:00+02:00', + 'repeatUntil' => '2022-11-06T17:00:00+01:00', 'tz' => 'Europe/Berlin', 'freq' => 'Weekly', 'interval' => 1, @@ -265,12 +256,20 @@ class DatesFactoryTest extends TestCase self::assertCount(4, $result); self::assertInstanceOf(Date::class, $result[0]); - self::assertSame('4076560800', $result[0]->getStart()->format('U')); - self::assertSame('4076568000', $result[0]->getEnd()->format('U')); + self::assertSame(1667052000, $result[0]->getStart()->getTimestamp()); + self::assertSame(1667055600, $result[0]->getEnd()->getTimestamp()); self::assertSame('no', $result[0]->getCanceled()); - self::assertSame('4077252000', $result[3]->getStart()->format('U')); - self::assertSame('4077259200', $result[3]->getEnd()->format('U')); + self::assertSame(1667660400, $result[1]->getStart()->getTimestamp()); + self::assertSame(1667664000, $result[1]->getEnd()->getTimestamp()); + self::assertSame('no', $result[1]->getCanceled()); + + self::assertSame(1667142000, $result[2]->getStart()->getTimestamp()); + self::assertSame(1667145600, $result[2]->getEnd()->getTimestamp()); + self::assertSame('no', $result[2]->getCanceled()); + + self::assertSame(1667746800, $result[3]->getStart()->getTimestamp()); + self::assertSame(1667750400, $result[3]->getEnd()->getTimestamp()); self::assertSame('no', $result[3]->getCanceled()); } @@ -279,23 +278,21 @@ class DatesFactoryTest extends TestCase */ public function returnsCanceledDatesOnMixedIntervals(): void { - $context = $this->prophesize(Context::class); - $subject = new DatesFactory( - $context->reveal() + $this->getContext(new \DateTimeImmutable('2022-01-01T13:17:24 Europe/Berlin')) ); $result = $subject->createDates([ [ - 'start' => '2099-06-21T16:00:00+02:00', - 'end' => '2099-06-21T22:00:00+02:00', + 'start' => '2022-06-21T16:00:00+02:00', + 'end' => '2022-06-21T22:00:00+02:00', 'tz' => 'Europe/Berlin', 'interval' => 1, ], [ - 'start' => '2099-04-01T16:00:00+02:00', - 'end' => '2099-04-01T17:00:00+02:00', - 'repeatUntil' => '2099-04-03T18:00:00+02:00', + 'start' => '2022-04-01T16:00:00+02:00', + 'end' => '2022-04-01T17:00:00+02:00', + 'repeatUntil' => '2022-04-03T18:00:00+02:00', 'tz' => 'Europe/Berlin', 'freq' => 'Daily', 'interval' => 1, @@ -305,9 +302,9 @@ class DatesFactoryTest extends TestCase 'Saturday', 'Sunday', ], - 'start' => '2099-03-02T11:00:00+01:00', - 'end' => '2099-03-02T13:00:00+01:00', - 'repeatUntil' => '2099-03-15T13:00:00+02:00', + 'start' => '2022-03-02T11:00:00+01:00', + 'end' => '2022-03-02T13:00:00+01:00', + 'repeatUntil' => '2022-03-15T13:00:00+02:00', 'tz' => 'Europe/Berlin', 'freq' => 'Weekly', 'interval' => 1, @@ -330,23 +327,21 @@ class DatesFactoryTest extends TestCase */ public function returnsNotCanceledDatesOnMixedIntervals(): void { - $context = $this->prophesize(Context::class); - $subject = new DatesFactory( - $context->reveal() + $this->getContext(new \DateTimeImmutable('2022-01-01T13:17:24 Europe/Berlin')) ); $result = $subject->createDates([ [ - 'start' => '2099-06-21T16:00:00+02:00', - 'end' => '2099-06-21T22:00:00+02:00', + 'start' => '2022-06-21T16:00:00+02:00', + 'end' => '2022-06-21T22:00:00+02:00', 'tz' => 'Europe/Berlin', 'interval' => 1, ], [ - 'start' => '2099-04-01T16:00:00+02:00', - 'end' => '2099-04-01T17:00:00+02:00', - 'repeatUntil' => '2099-04-03T18:00:00+02:00', + 'start' => '2022-04-01T16:00:00+02:00', + 'end' => '2022-04-01T17:00:00+02:00', + 'repeatUntil' => '2022-04-03T18:00:00+02:00', 'tz' => 'Europe/Berlin', 'freq' => 'Daily', 'interval' => 1, @@ -356,9 +351,9 @@ class DatesFactoryTest extends TestCase 'Saturday', 'Sunday', ], - 'start' => '2099-03-02T11:00:00+01:00', - 'end' => '2099-03-02T13:00:00+01:00', - 'repeatUntil' => '2099-03-15T13:00:00+02:00', + 'start' => '2022-03-02T11:00:00+01:00', + 'end' => '2022-03-02T13:00:00+01:00', + 'repeatUntil' => '2022-03-15T13:00:00+02:00', 'tz' => 'Europe/Berlin', 'freq' => 'Weekly', 'interval' => 1, @@ -375,4 +370,11 @@ class DatesFactoryTest extends TestCase self::assertSame('no', $date->getCanceled()); } } + + private function getContext(\DateTimeImmutable $dateTime): Context + { + $context = new Context(); + $context->setAspect('date', new DateTimeAspect($dateTime)); + return $context; + } }