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 static 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
public static function getClasses ()
@@ -78,10 +82,10 @@ public function testUnsupportedArgument()
78
82
/**
79
83
* @dataProvider getTimeZones
80
84
*/
81
- public function testFullDate (string $ timezone )
85
+ public function testFullDate (string $ timezone, bool $ withClock )
82
86
{
83
87
date_default_timezone_set ($ timezone );
84
- $ resolver = new DateTimeValueResolver ();
88
+ $ resolver = new DateTimeValueResolver ($ withClock ? new MockClock () : null );
85
89
86
90
$ argument = new ArgumentMetadata ('dummy ' , \DateTimeImmutable::class, false , false , null );
87
91
$ request = self ::requestWithAttributes (['dummy ' => '2012-07-21 00:00:00 ' ]);
@@ -97,10 +101,10 @@ public function testFullDate(string $timezone)
97
101
/**
98
102
* @dataProvider getTimeZones
99
103
*/
100
- public function testUnixTimestamp (string $ timezone )
104
+ public function testUnixTimestamp (string $ timezone, bool $ withClock )
101
105
{
102
106
date_default_timezone_set ($ timezone );
103
- $ resolver = new DateTimeValueResolver ();
107
+ $ resolver = new DateTimeValueResolver ($ withClock ? new MockClock ( ' now ' , $ timezone ) : null );
104
108
105
109
$ argument = new ArgumentMetadata ('dummy ' , \DateTimeImmutable::class, false , false , null );
106
110
$ request = self ::requestWithAttributes (['dummy ' => '989541720 ' ]);
@@ -127,21 +131,46 @@ public function testNullableWithEmptyAttribute()
127
131
}
128
132
129
133
/**
130
- * @dataProvider getTimeZones
134
+ * @param class-string<\DateTimeInterface> $class
135
+ *
136
+ * @dataProvider getClasses
131
137
*/
132
- public function testNow (string $ timezone )
138
+ public function testNow (string $ class )
133
139
{
134
- date_default_timezone_set ($ timezone );
140
+ date_default_timezone_set ($ timezone = ' Etc/GMT+9 ' );
135
141
$ resolver = new DateTimeValueResolver ();
136
142
137
- $ argument = new ArgumentMetadata ('dummy ' , \DateTime:: class, false , false , null , false );
143
+ $ argument = new ArgumentMetadata ('dummy ' , $ class , false , false , null , false );
138
144
$ request = self ::requestWithAttributes (['dummy ' => null ]);
139
145
140
146
$ results = $ resolver ->resolve ($ request , $ argument );
141
147
142
148
$ this ->assertCount (1 , $ results );
143
- $ this ->assertEquals ( ' 0 ' , $ results [0 ]-> diff ( new \ DateTimeImmutable ())-> format ( ' %s ' ) );
149
+ $ this ->assertInstanceOf ( $ class , $ results [0 ]);
144
150
$ this ->assertSame ($ timezone , $ results [0 ]->getTimezone ()->getName (), 'Default timezone ' );
151
+ $ this ->assertEquals ('0 ' , $ results [0 ]->diff (new \DateTimeImmutable ())->format ('%s ' ));
152
+ }
153
+
154
+ /**
155
+ * @param class-string<\DateTimeInterface> $class
156
+ *
157
+ * @dataProvider getClasses
158
+ */
159
+ public function testNowWithClock (string $ class )
160
+ {
161
+ date_default_timezone_set ('Etc/GMT+9 ' );
162
+ $ clock = new MockClock ('2022-02-20 22:20:02 ' );
163
+ $ resolver = new DateTimeValueResolver ($ clock );
164
+
165
+ $ argument = new ArgumentMetadata ('dummy ' , $ class , false , false , null , false );
166
+ $ request = self ::requestWithAttributes (['dummy ' => null ]);
167
+
168
+ $ results = $ resolver ->resolve ($ request , $ argument );
169
+
170
+ $ this ->assertCount (1 , $ results );
171
+ $ this ->assertInstanceOf ($ class , $ results [0 ]);
172
+ $ this ->assertSame ('UTC ' , $ results [0 ]->getTimezone ()->getName (), 'Default timezone ' );
173
+ $ this ->assertEquals ($ clock ->now (), $ results [0 ]);
145
174
}
146
175
147
176
/**
@@ -181,10 +210,10 @@ public function testCustomClass()
181
210
/**
182
211
* @dataProvider getTimeZones
183
212
*/
184
- public function testDateTimeImmutable (string $ timezone )
213
+ public function testDateTimeImmutable (string $ timezone, bool $ withClock )
185
214
{
186
215
date_default_timezone_set ($ timezone );
187
- $ resolver = new DateTimeValueResolver ();
216
+ $ resolver = new DateTimeValueResolver ($ withClock ? new MockClock ( ' now ' , $ timezone ) : null );
188
217
189
218
$ argument = new ArgumentMetadata ('dummy ' , \DateTimeImmutable::class, false , false , null );
190
219
$ request = self ::requestWithAttributes (['dummy ' => '2016-09-08 00:00:00 +05:00 ' ]);
@@ -200,10 +229,10 @@ public function testDateTimeImmutable(string $timezone)
200
229
/**
201
230
* @dataProvider getTimeZones
202
231
*/
203
- public function testWithFormat (string $ timezone )
232
+ public function testWithFormat (string $ timezone, bool $ withClock )
204
233
{
205
234
date_default_timezone_set ($ timezone );
206
- $ resolver = new DateTimeValueResolver ();
235
+ $ resolver = new DateTimeValueResolver ($ withClock ? new MockClock ( ' now ' , $ timezone ) : null );
207
236
208
237
$ argument = new ArgumentMetadata ('dummy ' , \DateTimeInterface::class, false , false , null , false , [
209
238
MapDateTime::class => new MapDateTime ('m-d-y H:i:s ' ),
0 commit comments