12
12
namespace Symfony \Component \HttpKernel \Tests \Controller \ArgumentResolver ;
13
13
14
14
use PHPUnit \Framework \TestCase ;
15
+ use Symfony \Component \Clock \MockClock ;
15
16
use Symfony \Component \HttpFoundation \Request ;
16
17
use Symfony \Component \HttpKernel \Attribute \MapDateTime ;
17
18
use Symfony \Component \HttpKernel \Controller \ArgumentResolver \DateTimeValueResolver ;
@@ -34,9 +35,12 @@ protected function tearDown(): void
34
35
35
36
public function getTimeZones ()
36
37
{
37
- yield ['UTC ' ];
38
- yield ['Etc/GMT+9 ' ];
39
- yield ['Etc/GMT-14 ' ];
38
+ yield ['UTC ' , false ];
39
+ yield ['Etc/GMT+9 ' , false ];
40
+ yield ['Etc/GMT-14 ' , false ];
41
+ yield ['UTC ' , true ];
42
+ yield ['Etc/GMT+9 ' , true ];
43
+ yield ['Etc/GMT-14 ' , true ];
40
44
}
41
45
42
46
/**
@@ -71,10 +75,10 @@ public function testUnsupportedArgument()
71
75
/**
72
76
* @dataProvider getTimeZones
73
77
*/
74
- public function testFullDate (string $ timezone )
78
+ public function testFullDate (string $ timezone, bool $ withClock )
75
79
{
76
80
date_default_timezone_set ($ timezone );
77
- $ resolver = new DateTimeValueResolver ();
81
+ $ resolver = new DateTimeValueResolver ($ withClock ? new MockClock () : null );
78
82
79
83
$ argument = new ArgumentMetadata ('dummy ' , \DateTimeImmutable::class, false , false , null );
80
84
$ request = self ::requestWithAttributes (['dummy ' => '2012-07-21 00:00:00 ' ]);
@@ -90,10 +94,10 @@ public function testFullDate(string $timezone)
90
94
/**
91
95
* @dataProvider getTimeZones
92
96
*/
93
- public function testUnixTimestamp (string $ timezone )
97
+ public function testUnixTimestamp (string $ timezone, bool $ withClock )
94
98
{
95
99
date_default_timezone_set ($ timezone );
96
- $ resolver = new DateTimeValueResolver ();
100
+ $ resolver = new DateTimeValueResolver ($ withClock ? new MockClock ( ' now ' , $ timezone ) : null );
97
101
98
102
$ argument = new ArgumentMetadata ('dummy ' , \DateTimeImmutable::class, false , false , null );
99
103
$ request = self ::requestWithAttributes (['dummy ' => '989541720 ' ]);
@@ -150,10 +154,10 @@ public function testCustomClass()
150
154
/**
151
155
* @dataProvider getTimeZones
152
156
*/
153
- public function testDateTimeImmutable (string $ timezone )
157
+ public function testDateTimeImmutable (string $ timezone, bool $ withClock )
154
158
{
155
159
date_default_timezone_set ($ timezone );
156
- $ resolver = new DateTimeValueResolver ();
160
+ $ resolver = new DateTimeValueResolver ($ withClock ? new MockClock ( ' now ' , $ timezone ) : null );
157
161
158
162
$ argument = new ArgumentMetadata ('dummy ' , \DateTimeImmutable::class, false , false , null );
159
163
$ request = self ::requestWithAttributes (['dummy ' => '2016-09-08 00:00:00 +05:00 ' ]);
@@ -169,10 +173,10 @@ public function testDateTimeImmutable(string $timezone)
169
173
/**
170
174
* @dataProvider getTimeZones
171
175
*/
172
- public function testWithFormat (string $ timezone )
176
+ public function testWithFormat (string $ timezone, bool $ withClock )
173
177
{
174
178
date_default_timezone_set ($ timezone );
175
- $ resolver = new DateTimeValueResolver ();
179
+ $ resolver = new DateTimeValueResolver ($ withClock ? new MockClock ( ' now ' , $ timezone ) : null );
176
180
177
181
$ argument = new ArgumentMetadata ('dummy ' , \DateTimeInterface::class, false , false , null , false , [
178
182
MapDateTime::class => new MapDateTime ('m-d-y H:i:s ' ),
@@ -218,6 +222,27 @@ public function test404Exception(ArgumentMetadata $argument, Request $request)
218
222
$ resolver ->resolve ($ request , $ argument );
219
223
}
220
224
225
+ /**
226
+ * @param class-string<\DateTimeInterface> $class
227
+ * @testWith ["DateTimeInterface"]
228
+ * ["DateTimeImmutable"]
229
+ * ["DateTime"]
230
+ */
231
+ public function testNowFromClock (string $ class )
232
+ {
233
+ $ clock = new MockClock ('2022-02-20 22:20:02 ' );
234
+ $ resolver = new DateTimeValueResolver ($ clock );
235
+
236
+ $ argument = new ArgumentMetadata ('dummy ' , $ class , false , false , null , false );
237
+ $ request = self ::requestWithAttributes (['dummy ' => null ]);
238
+
239
+ $ results = $ resolver ->resolve ($ request , $ argument );
240
+
241
+ $ this ->assertCount (1 , $ results );
242
+ $ this ->assertInstanceOf ($ class , $ results [0 ]);
243
+ $ this ->assertEquals ($ clock ->now (), $ results [0 ]);
244
+ }
245
+
221
246
private static function requestWithAttributes (array $ attributes ): Request
222
247
{
223
248
$ request = Request::create ('/ ' );
0 commit comments