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 ' ]);
@@ -120,34 +124,69 @@ public function testNullableWithEmptyAttribute()
120
124
}
121
125
122
126
/**
123
- * @dataProvider getTimeZones
127
+ * @param class-string<\DateTimeInterface> $class
128
+ * @dataProvider getClasses
124
129
*/
125
- public function testNow (string $ timezone )
130
+ public function testNow (string $ class )
126
131
{
127
- date_default_timezone_set ($ timezone );
132
+ date_default_timezone_set ($ timezone = ' Etc/GMT+9 ' );
128
133
$ resolver = new DateTimeValueResolver ();
129
134
130
- $ argument = new ArgumentMetadata ('dummy ' , \DateTime:: class, false , false , null , false );
135
+ $ argument = new ArgumentMetadata ('dummy ' , $ class , false , false , null , false );
131
136
$ request = self ::requestWithAttributes (['dummy ' => null ]);
132
137
133
138
$ results = $ resolver ->resolve ($ request , $ argument );
134
139
135
140
$ this ->assertCount (1 , $ results );
141
+ $ this ->assertInstanceOf ($ class , $ results [0 ]);
142
+ $ this ->assertSame ($ timezone , $ results [0 ]->getTimezone ()->getName (), 'Default timezone ' );
136
143
$ this ->assertEquals ('0 ' , $ results [0 ]->diff (new \DateTimeImmutable ())->format ('%s ' ));
144
+ }
145
+
146
+ /**
147
+ * @param class-string<\DateTimeInterface> $class
148
+ * @dataProvider getClasses
149
+ */
150
+ public function testNowWithClock (string $ class )
151
+ {
152
+ date_default_timezone_set ($ timezone = 'Etc/GMT+9 ' );
153
+ $ clock = new MockClock ('2022-02-20 22:20:02 ' );
154
+ $ resolver = new DateTimeValueResolver ($ clock );
155
+
156
+ $ argument = new ArgumentMetadata ('dummy ' , $ class , false , false , null , false );
157
+ $ request = self ::requestWithAttributes (['dummy ' => null ]);
158
+
159
+ $ results = $ resolver ->resolve ($ request , $ argument );
160
+
161
+ $ this ->assertCount (1 , $ results );
162
+ $ this ->assertInstanceOf ($ class , $ results [0 ]);
137
163
$ this ->assertSame ($ timezone , $ results [0 ]->getTimezone ()->getName (), 'Default timezone ' );
164
+ $ this ->assertEquals ($ clock ->now (), $ results [0 ]);
165
+ }
166
+
167
+ public static function getClasses ()
168
+ {
169
+ yield [\DateTimeInterface::class];
170
+ yield [\DateTime::class];
171
+ yield [FooDateTime::class];
138
172
}
139
173
140
- public function testPreviouslyConvertedAttribute ()
174
+ /**
175
+ * @param class-string<\DateTimeInterface> $class
176
+ * @dataProvider getClasses
177
+ */
178
+ public function testPreviouslyConvertedAttribute (string $ class )
141
179
{
142
180
$ resolver = new DateTimeValueResolver ();
143
181
144
- $ argument = new ArgumentMetadata ('dummy ' , \DateTimeImmutable:: class, false , false , null , true );
182
+ $ argument = new ArgumentMetadata ('dummy ' , $ class , false , false , null , true );
145
183
$ request = self ::requestWithAttributes (['dummy ' => $ datetime = new \DateTimeImmutable ()]);
146
184
147
185
$ results = $ resolver ->resolve ($ request , $ argument );
148
186
149
187
$ this ->assertCount (1 , $ results );
150
- $ this ->assertSame ($ datetime , $ results [0 ]);
188
+ $ this ->assertEquals ($ datetime , $ results [0 ], 'The value is the same, but the class can be modified. ' );
189
+ $ this ->assertInstanceOf ($ class , $ results [0 ]);
151
190
}
152
191
153
192
public function testCustomClass ()
@@ -168,10 +207,10 @@ public function testCustomClass()
168
207
/**
169
208
* @dataProvider getTimeZones
170
209
*/
171
- public function testDateTimeImmutable (string $ timezone )
210
+ public function testDateTimeImmutable (string $ timezone, bool $ withClock )
172
211
{
173
212
date_default_timezone_set ($ timezone );
174
- $ resolver = new DateTimeValueResolver ();
213
+ $ resolver = new DateTimeValueResolver ($ withClock ? new MockClock ( ' now ' , $ timezone ) : null );
175
214
176
215
$ argument = new ArgumentMetadata ('dummy ' , \DateTimeImmutable::class, false , false , null );
177
216
$ request = self ::requestWithAttributes (['dummy ' => '2016-09-08 00:00:00 +05:00 ' ]);
@@ -187,10 +226,10 @@ public function testDateTimeImmutable(string $timezone)
187
226
/**
188
227
* @dataProvider getTimeZones
189
228
*/
190
- public function testWithFormat (string $ timezone )
229
+ public function testWithFormat (string $ timezone, bool $ withClock )
191
230
{
192
231
date_default_timezone_set ($ timezone );
193
- $ resolver = new DateTimeValueResolver ();
232
+ $ resolver = new DateTimeValueResolver ($ withClock ? new MockClock ( ' now ' , $ timezone ) : null );
194
233
195
234
$ argument = new ArgumentMetadata ('dummy ' , \DateTimeInterface::class, false , false , null , false , [
196
235
MapDateTime::class => new MapDateTime ('m-d-y H:i:s ' ),
0 commit comments