Skip to content

Navigation Menu

Sign in
Appearance settings

Search code, repositories, users, issues, pull requests...

Provide feedback

We read every piece of feedback, and take your input very seriously.

Saved searches

Use saved searches to filter your results more quickly

Appearance settings

Commit 59b362d

Browse filesBrowse files
committed
Add tests
1 parent b207feb commit 59b362d
Copy full SHA for 59b362d

File tree

1 file changed

+100
-33
lines changed
Filter options

1 file changed

+100
-33
lines changed

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

Copy file name to clipboardExpand all lines: src/Symfony/Component/HttpKernel/Tests/Controller/ArgumentResolverTest.php
+100-33Lines 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 (0)
Morty Proxy This is a proxified and sanitized view of the page, visit original site.