Skip to content

Commit 59b362d

Browse files
committed
Add tests
1 parent b207feb commit 59b362d

File tree

1 file changed

+100
-33
lines changed

1 file changed

+100
-33
lines changed

src/Symfony/Component/HttpKernel/Tests/Controller/ArgumentResolverTest.php

Lines changed: 100 additions & 33 deletions
Original file line numberDiff line numberDiff line change
@@ -12,35 +12,38 @@
1212
namespace Symfony\Component\HttpKernel\Tests\Controller;
1313

1414
use PHPUnit\Framework\TestCase;
15+
use Symfony\Component\DependencyInjection\ServiceLocator;
1516
use Symfony\Component\HttpFoundation\Request;
1617
use Symfony\Component\HttpFoundation\Session\Session;
1718
use Symfony\Component\HttpFoundation\Session\SessionInterface;
1819
use Symfony\Component\HttpFoundation\Session\Storage\MockArraySessionStorage;
20+
use Symfony\Component\HttpKernel\Attribute\ValueResolver;
1921
use Symfony\Component\HttpKernel\Controller\ArgumentResolver;
22+
use Symfony\Component\HttpKernel\Controller\ArgumentResolver\DefaultValueResolver;
2023
use Symfony\Component\HttpKernel\Controller\ArgumentResolver\RequestAttributeValueResolver;
2124
use Symfony\Component\HttpKernel\Controller\ArgumentValueResolverInterface;
2225
use Symfony\Component\HttpKernel\ControllerMetadata\ArgumentMetadataFactory;
26+
use Symfony\Component\HttpKernel\Exception\ResolverNotFoundException;
2327
use Symfony\Component\HttpKernel\Tests\Fixtures\Controller\ExtendingRequest;
2428
use Symfony\Component\HttpKernel\Tests\Fixtures\Controller\ExtendingSession;
2529
use Symfony\Component\HttpKernel\Tests\Fixtures\Controller\NullableController;
2630
use Symfony\Component\HttpKernel\Tests\Fixtures\Controller\VariadicController;
2731

2832
class ArgumentResolverTest extends TestCase
2933
{
30-
/** @var ArgumentResolver */
31-
private static $resolver;
32-
33-
public static function setUpBeforeClass(): void
34+
public static function getResolver(array $chainableResolvers = [], array $namedResolvers = null): ArgumentResolver
3435
{
35-
$factory = new ArgumentMetadataFactory();
36+
if (null !== $namedResolvers) {
37+
$namedResolvers = new ServiceLocator(array_map(fn ($resolver) => fn () => $resolver, $namedResolvers));
38+
}
3639

37-
self::$resolver = new ArgumentResolver($factory);
40+
return new ArgumentResolver(new ArgumentMetadataFactory(), $chainableResolvers, $namedResolvers);
3841
}
3942

4043
public function testDefaultState()
4144
{
42-
$this->assertEquals(self::$resolver, new ArgumentResolver());
43-
$this->assertNotEquals(self::$resolver, new ArgumentResolver(null, [new RequestAttributeValueResolver()]));
45+
$this->assertEquals(self::getResolver(), new ArgumentResolver());
46+
$this->assertNotEquals(self::getResolver(), new ArgumentResolver(null, [new RequestAttributeValueResolver()]));
4447
}
4548

4649
public function testGetArguments()
@@ -49,15 +52,15 @@ public function testGetArguments()
4952
$request->attributes->set('foo', 'foo');
5053
$controller = [new self(), 'controllerWithFoo'];
5154

52-
$this->assertEquals(['foo'], self::$resolver->getArguments($request, $controller), '->getArguments() returns an array of arguments for the controller method');
55+
$this->assertEquals(['foo'], self::getResolver()->getArguments($request, $controller), '->getArguments() returns an array of arguments for the controller method');
5356
}
5457

5558
public function testGetArgumentsReturnsEmptyArrayWhenNoArguments()
5659
{
5760
$request = Request::create('/');
5861
$controller = [new self(), 'controllerWithoutArguments'];
5962

60-
$this->assertEquals([], self::$resolver->getArguments($request, $controller), '->getArguments() returns an empty array if the method takes no arguments');
63+
$this->assertEquals([], self::getResolver()->getArguments($request, $controller), '->getArguments() returns an empty array if the method takes no arguments');
6164
}
6265

6366
public function testGetArgumentsUsesDefaultValue()
@@ -66,7 +69,7 @@ public function testGetArgumentsUsesDefaultValue()
6669
$request->attributes->set('foo', 'foo');
6770
$controller = [new self(), 'controllerWithFooAndDefaultBar'];
6871

69-
$this->assertEquals(['foo', null], self::$resolver->getArguments($request, $controller), '->getArguments() uses default values if present');
72+
$this->assertEquals(['foo', null], self::getResolver()->getArguments($request, $controller), '->getArguments() uses default values if present');
7073
}
7174

7275
public function testGetArgumentsOverrideDefaultValueByRequestAttribute()
@@ -76,7 +79,7 @@ public function testGetArgumentsOverrideDefaultValueByRequestAttribute()
7679
$request->attributes->set('bar', 'bar');
7780
$controller = [new self(), 'controllerWithFooAndDefaultBar'];
7881

79-
$this->assertEquals(['foo', 'bar'], self::$resolver->getArguments($request, $controller), '->getArguments() overrides default values if provided in the request attributes');
82+
$this->assertEquals(['foo', 'bar'], self::getResolver()->getArguments($request, $controller), '->getArguments() overrides default values if provided in the request attributes');
8083
}
8184

8285
public function testGetArgumentsFromClosure()
@@ -85,7 +88,7 @@ public function testGetArgumentsFromClosure()
8588
$request->attributes->set('foo', 'foo');
8689
$controller = function ($foo) {};
8790

88-
$this->assertEquals(['foo'], self::$resolver->getArguments($request, $controller));
91+
$this->assertEquals(['foo'], self::getResolver()->getArguments($request, $controller));
8992
}
9093

9194
public function testGetArgumentsUsesDefaultValueFromClosure()
@@ -94,7 +97,7 @@ public function testGetArgumentsUsesDefaultValueFromClosure()
9497
$request->attributes->set('foo', 'foo');
9598
$controller = function ($foo, $bar = 'bar') {};
9699

97-
$this->assertEquals(['foo', 'bar'], self::$resolver->getArguments($request, $controller));
100+
$this->assertEquals(['foo', 'bar'], self::getResolver()->getArguments($request, $controller));
98101
}
99102

100103
public function testGetArgumentsFromInvokableObject()
@@ -103,12 +106,12 @@ public function testGetArgumentsFromInvokableObject()
103106
$request->attributes->set('foo', 'foo');
104107
$controller = new self();
105108

106-
$this->assertEquals(['foo', null], self::$resolver->getArguments($request, $controller));
109+
$this->assertEquals(['foo', null], self::getResolver()->getArguments($request, $controller));
107110

108111
// Test default bar overridden by request attribute
109112
$request->attributes->set('bar', 'bar');
110113

111-
$this->assertEquals(['foo', 'bar'], self::$resolver->getArguments($request, $controller));
114+
$this->assertEquals(['foo', 'bar'], self::getResolver()->getArguments($request, $controller));
112115
}
113116

114117
public function testGetArgumentsFromFunctionName()
@@ -118,7 +121,7 @@ public function testGetArgumentsFromFunctionName()
118121
$request->attributes->set('foobar', 'foobar');
119122
$controller = __NAMESPACE__.'\controller_function';
120123

121-
$this->assertEquals(['foo', 'foobar'], self::$resolver->getArguments($request, $controller));
124+
$this->assertEquals(['foo', 'foobar'], self::getResolver()->getArguments($request, $controller));
122125
}
123126

124127
public function testGetArgumentsFailsOnUnresolvedValue()
@@ -129,7 +132,7 @@ public function testGetArgumentsFailsOnUnresolvedValue()
129132
$controller = [new self(), 'controllerWithFooBarFoobar'];
130133

131134
try {
132-
self::$resolver->getArguments($request, $controller);
135+
self::getResolver()->getArguments($request, $controller);
133136
$this->fail('->getArguments() throws a \RuntimeException exception if it cannot determine the argument value');
134137
} catch (\Exception $e) {
135138
$this->assertInstanceOf(\RuntimeException::class, $e, '->getArguments() throws a \RuntimeException exception if it cannot determine the argument value');
@@ -141,15 +144,15 @@ public function testGetArgumentsInjectsRequest()
141144
$request = Request::create('/');
142145
$controller = [new self(), 'controllerWithRequest'];
143146

144-
$this->assertEquals([$request], self::$resolver->getArguments($request, $controller), '->getArguments() injects the request');
147+
$this->assertEquals([$request], self::getResolver()->getArguments($request, $controller), '->getArguments() injects the request');
145148
}
146149

147150
public function testGetArgumentsInjectsExtendingRequest()
148151
{
149152
$request = ExtendingRequest::create('/');
150153
$controller = [new self(), 'controllerWithExtendingRequest'];
151154

152-
$this->assertEquals([$request], self::$resolver->getArguments($request, $controller), '->getArguments() injects the request when extended');
155+
$this->assertEquals([$request], self::getResolver()->getArguments($request, $controller), '->getArguments() injects the request when extended');
153156
}
154157

155158
public function testGetVariadicArguments()
@@ -159,7 +162,7 @@ public function testGetVariadicArguments()
159162
$request->attributes->set('bar', ['foo', 'bar']);
160163
$controller = [new VariadicController(), 'action'];
161164

162-
$this->assertEquals(['foo', 'foo', 'bar'], self::$resolver->getArguments($request, $controller));
165+
$this->assertEquals(['foo', 'foo', 'bar'], self::getResolver()->getArguments($request, $controller));
163166
}
164167

165168
public function testGetVariadicArgumentsWithoutArrayInRequest()
@@ -170,7 +173,7 @@ public function testGetVariadicArgumentsWithoutArrayInRequest()
170173
$request->attributes->set('bar', 'foo');
171174
$controller = [new VariadicController(), 'action'];
172175

173-
self::$resolver->getArguments($request, $controller);
176+
self::getResolver()->getArguments($request, $controller);
174177
}
175178

176179
/**
@@ -179,9 +182,8 @@ public function testGetVariadicArgumentsWithoutArrayInRequest()
179182
public function testGetArgumentWithoutArray()
180183
{
181184
$this->expectException(\InvalidArgumentException::class);
182-
$factory = new ArgumentMetadataFactory();
183185
$valueResolver = $this->createMock(ArgumentValueResolverInterface::class);
184-
$resolver = new ArgumentResolver($factory, [$valueResolver]);
186+
$resolver = self::getResolver([$valueResolver]);
185187

186188
$valueResolver->expects($this->any())->method('supports')->willReturn(true);
187189
$valueResolver->expects($this->any())->method('resolve')->willReturn([]);
@@ -199,7 +201,7 @@ public function testIfExceptionIsThrownWhenMissingAnArgument()
199201
$request = Request::create('/');
200202
$controller = $this->controllerWithFoo(...);
201203

202-
self::$resolver->getArguments($request, $controller);
204+
self::getResolver()->getArguments($request, $controller);
203205
}
204206

205207
public function testGetNullableArguments()
@@ -210,7 +212,7 @@ public function testGetNullableArguments()
210212
$request->attributes->set('last', 'last');
211213
$controller = [new NullableController(), 'action'];
212214

213-
$this->assertEquals(['foo', new \stdClass(), 'value', 'last'], self::$resolver->getArguments($request, $controller));
215+
$this->assertEquals(['foo', new \stdClass(), 'value', 'last'], self::getResolver()->getArguments($request, $controller));
214216
}
215217

216218
public function testGetNullableArgumentsWithDefaults()
@@ -219,7 +221,7 @@ public function testGetNullableArgumentsWithDefaults()
219221
$request->attributes->set('last', 'last');
220222
$controller = [new NullableController(), 'action'];
221223

222-
$this->assertEquals([null, null, 'value', 'last'], self::$resolver->getArguments($request, $controller));
224+
$this->assertEquals([null, null, 'value', 'last'], self::getResolver()->getArguments($request, $controller));
223225
}
224226

225227
public function testGetSessionArguments()
@@ -229,7 +231,7 @@ public function testGetSessionArguments()
229231
$request->setSession($session);
230232
$controller = $this->controllerWithSession(...);
231233

232-
$this->assertEquals([$session], self::$resolver->getArguments($request, $controller));
234+
$this->assertEquals([$session], self::getResolver()->getArguments($request, $controller));
233235
}
234236

235237
public function testGetSessionArgumentsWithExtendedSession()
@@ -239,7 +241,7 @@ public function testGetSessionArgumentsWithExtendedSession()
239241
$request->setSession($session);
240242
$controller = $this->controllerWithExtendingSession(...);
241243

242-
$this->assertEquals([$session], self::$resolver->getArguments($request, $controller));
244+
$this->assertEquals([$session], self::getResolver()->getArguments($request, $controller));
243245
}
244246

245247
public function testGetSessionArgumentsWithInterface()
@@ -249,7 +251,7 @@ public function testGetSessionArgumentsWithInterface()
249251
$request->setSession($session);
250252
$controller = $this->controllerWithSessionInterface(...);
251253

252-
$this->assertEquals([$session], self::$resolver->getArguments($request, $controller));
254+
$this->assertEquals([$session], self::getResolver()->getArguments($request, $controller));
253255
}
254256

255257
public function testGetSessionMissMatchWithInterface()
@@ -260,7 +262,7 @@ public function testGetSessionMissMatchWithInterface()
260262
$request->setSession($session);
261263
$controller = $this->controllerWithExtendingSession(...);
262264

263-
self::$resolver->getArguments($request, $controller);
265+
self::getResolver()->getArguments($request, $controller);
264266
}
265267

266268
public function testGetSessionMissMatchWithImplementation()
@@ -271,7 +273,7 @@ public function testGetSessionMissMatchWithImplementation()
271273
$request->setSession($session);
272274
$controller = $this->controllerWithExtendingSession(...);
273275

274-
self::$resolver->getArguments($request, $controller);
276+
self::getResolver()->getArguments($request, $controller);
275277
}
276278

277279
public function testGetSessionMissMatchOnNull()
@@ -280,7 +282,51 @@ public function testGetSessionMissMatchOnNull()
280282
$request = Request::create('/');
281283
$controller = $this->controllerWithExtendingSession(...);
282284

283-
self::$resolver->getArguments($request, $controller);
285+
self::getResolver()->getArguments($request, $controller);
286+
}
287+
288+
public function testPinnedResolver()
289+
{
290+
$resolver = self::getResolver([], [DefaultValueResolver::class => new DefaultValueResolver()]);
291+
292+
$request = Request::create('/');
293+
$request->attributes->set('foo', 'bar');
294+
$controller = $this->controllerPinningResolver(...);
295+
296+
$this->assertSame([1], $resolver->getArguments($request, $controller));
297+
}
298+
299+
public function testDisabledResolver()
300+
{
301+
$resolver = self::getResolver(namedResolvers: []);
302+
303+
$request = Request::create('/');
304+
$request->attributes->set('foo', 'bar');
305+
$controller = $this->controllerDisablingResolver(...);
306+
307+
$this->assertSame([1], $resolver->getArguments($request, $controller));
308+
}
309+
310+
public function testManyPinnedResolvers()
311+
{
312+
$resolver = self::getResolver(namedResolvers: []);
313+
314+
$request = Request::create('/');
315+
$controller = $this->controllerPinningManyResolvers(...);
316+
317+
$this->expectException(\LogicException::class);
318+
$resolver->getArguments($request, $controller);
319+
}
320+
321+
public function testUnknownPinnedResolver()
322+
{
323+
$resolver = self::getResolver(namedResolvers: []);
324+
325+
$request = Request::create('/');
326+
$controller = $this->controllerPinningUnknownResolver(...);
327+
328+
$this->expectException(ResolverNotFoundException::class);
329+
$resolver->getArguments($request, $controller);
284330
}
285331

286332
public function __invoke($foo, $bar = null)
@@ -322,6 +368,27 @@ public function controllerWithSessionInterface(SessionInterface $session)
322368
public function controllerWithExtendingSession(ExtendingSession $session)
323369
{
324370
}
371+
372+
public function controllerPinningResolver(#[ValueResolver(DefaultValueResolver::class)] int $foo = 1)
373+
{
374+
}
375+
376+
public function controllerDisablingResolver(#[ValueResolver(RequestAttributeValueResolver::class, disabled: true)] int $foo = 1)
377+
{
378+
}
379+
380+
public function controllerPinningManyResolvers(
381+
#[ValueResolver(RequestAttributeValueResolver::class)]
382+
#[ValueResolver(DefaultValueResolver::class)]
383+
int $foo
384+
) {
385+
}
386+
387+
public function controllerPinningUnknownResolver(
388+
#[ValueResolver('foo')]
389+
int $bar
390+
) {
391+
}
325392
}
326393

327394
function controller_function($foo, $foobar)

0 commit comments

Comments
 (0)