From 76275dadf524d6874386fdcc9be9a2ec6c99e2f8 Mon Sep 17 00:00:00 2001 From: Neill Magill Date: Thu, 22 May 2025 10:17:37 +0100 Subject: [PATCH] MDL-85563 phpunit: Clock API should always use Moodle system time When using `clock::now()` the frozen cloxk and incrementing clock will now always return a `DateTimeImmutable` that uses the configured Moodle system time. In unit tests this will be Australia/Perth. Before this change, it would sometimes be UCT. --- lib/phpunit/tests/advanced_test.php | 4 ++++ lib/testing/classes/frozen_clock.php | 2 +- lib/testing/classes/incrementing_clock.php | 6 +++++- 3 files changed, 10 insertions(+), 2 deletions(-) diff --git a/lib/phpunit/tests/advanced_test.php b/lib/phpunit/tests/advanced_test.php index 69826145452..3bb4d861c1a 100644 --- a/lib/phpunit/tests/advanced_test.php +++ b/lib/phpunit/tests/advanced_test.php @@ -781,6 +781,7 @@ final class advanced_test extends \advanced_testcase { $this->assertEquals(0, $mockedclock->now()->getTimestamp()); $this->assertEquals(1, $newclock->now()->getTimestamp()); $this->assertEquals(2, $mockedclock->now()->getTimestamp()); + $this->assertEquals('Australia/Perth', $newclock->now()->getTimezone()->getName()); // Specify a specific start time. $newclock = $this->mock_clock_with_incrementing(12345); @@ -792,6 +793,7 @@ final class advanced_test extends \advanced_testcase { $this->assertEquals(12347, $mockedclock->now()->getTimestamp()); $this->assertEquals($newclock->time, $mockedclock->now()->getTimestamp()); + $this->assertEquals('Australia/Perth', $newclock->now()->getTimezone()->getName()); } /** @@ -814,6 +816,7 @@ final class advanced_test extends \advanced_testcase { $initialtime = $mockedclock->now()->getTimestamp(); $this->assertEquals($initialtime, $newclock->now()->getTimestamp()); $this->assertEquals($initialtime, $mockedclock->now()->getTimestamp()); + $this->assertEquals('Australia/Perth', $newclock->now()->getTimezone()->getName()); // Specify a specific start time. $newclock = $this->mock_clock_with_frozen(12345); @@ -824,5 +827,6 @@ final class advanced_test extends \advanced_testcase { $this->assertEquals($initialtime, $mockedclock->now()); $this->assertEquals($initialtime, $newclock->now()); $this->assertEquals($initialtime, $mockedclock->now()); + $this->assertEquals('Australia/Perth', $newclock->now()->getTimezone()->getName()); } } diff --git a/lib/testing/classes/frozen_clock.php b/lib/testing/classes/frozen_clock.php index 15e532ae3fd..2efef14eeb0 100644 --- a/lib/testing/classes/frozen_clock.php +++ b/lib/testing/classes/frozen_clock.php @@ -40,7 +40,7 @@ class frozen_clock implements \core\clock { $this->time = (new \DateTimeImmutable("@{$time}")) ->setTimezone(\core_date::get_server_timezone_object()); } else { - $this->time = new \DateTimeImmutable(); + $this->time = (new \DateTimeImmutable())->setTimezone(\core_date::get_server_timezone_object()); } } diff --git a/lib/testing/classes/incrementing_clock.php b/lib/testing/classes/incrementing_clock.php index e124c7b7d19..9c72d3b782c 100644 --- a/lib/testing/classes/incrementing_clock.php +++ b/lib/testing/classes/incrementing_clock.php @@ -26,6 +26,9 @@ class incrementing_clock implements \core\clock { /** @var int The next time of the clock */ public int $time; + /** @var DateTimeZone The system timezone. */ + protected DateTimeZone $timezone; + /** * Create a new instance of the incrementing clock. * @@ -35,10 +38,11 @@ class incrementing_clock implements \core\clock { ?int $starttime = null, ) { $this->time = $starttime ?? time(); + $this->timezone = \core_date::get_server_timezone_object(); } public function now(): \DateTimeImmutable { - return new \DateTimeImmutable('@' . $this->time++); + return (new \DateTimeImmutable('@' . $this->time++))->setTimezone($this->timezone); } public function time(): int {