diff --git a/src/ORM/FieldType/DBDatetime.php b/src/ORM/FieldType/DBDatetime.php index 8c120f246..17235d49e 100644 --- a/src/ORM/FieldType/DBDatetime.php +++ b/src/ORM/FieldType/DBDatetime.php @@ -247,6 +247,22 @@ class DBDatetime extends DBDate implements TemplateGlobalProvider self::$mock_now = null; } + /** + * Test safe version of sleep() + * + * @param int $seconds + * @return DBDatetime + * @throws Exception + */ + public static function mockSleep(int $seconds): DBDatetime + { + $now = DBDatetime::now(); + $now->modify(sprintf('+ %d seconds', $seconds)); + DBDatetime::set_mock_now($now); + + return $now; + } + /** * Run a callback with specific time, original mock value is retained after callback * diff --git a/tests/php/ORM/DBDatetimeTest.php b/tests/php/ORM/DBDatetimeTest.php index 6abf14d4e..b122e48cf 100644 --- a/tests/php/ORM/DBDatetimeTest.php +++ b/tests/php/ORM/DBDatetimeTest.php @@ -58,6 +58,25 @@ class DBDatetimeTest extends SapphireTest }); } + public function testMockSleep() + { + DBDatetime::set_mock_now('2010-01-01 10:00:00'); + + DBDatetime::mockSleep(1); + $this->assertEquals( + '2010-01-01 10:00:01', + DBDatetime::now()->Rfc2822(), + 'We expect the time to move forward by 1 second' + ); + + DBDatetime::mockSleep(10); + $this->assertEquals( + '2010-01-01 10:00:11', + DBDatetime::now()->Rfc2822(), + 'We expect the time to move forward by 10 seconds' + ); + } + public function testSetNullAndZeroValues() { $date = DBDatetime::create_field('Datetime', '');