8000 [HttpKernel] Nullable and default value arguments in RequestPayloadVa… · symfony/symfony@8d31ed5 · GitHub
[go: up one dir, main page]

Skip to content

Commit 8d31ed5

Browse files
mdeboernicolas-grekas
authored andcommitted
[HttpKernel] Nullable and default value arguments in RequestPayloadValueResolver
1 parent 15f384c commit 8d31ed5

File tree

2 files changed

+148
-2
lines changed

2 files changed

+148
-2
lines changed

src/Symfony/Component/HttpKernel/Controller/ArgumentResolver/RequestPayloadValueResolver.php

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -134,8 +134,12 @@ public function onKernelControllerArguments(ControllerArgumentsEvent $event): vo
134134
}
135135
}
136136

137-
if (null === $payload && !$argument->metadata->isNullable()) {
138-
throw new HttpException($validationFailedCode);
137+
if (null === $payload) {
138+
$payload = match (true) {
139+
$argument->metadata->hasDefaultValue() => $argument->metadata->getDefaultValue(),
140+
$argument->metadata->isNullable() => null,
141+
default => throw new HttpException($validationFailedCode)
142+
};
139143
}
140144

141145
$arguments[$i] = $payload;

src/Symfony/Component/HttpKernel/Tests/Controller/ArgumentResolver/RequestPayloadValueResolverTest.php

Lines changed: 142 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -57,6 +57,148 @@ public function testNotTypedArgument()
5757
$resolver->onKernelControllerArguments($event);
5858
}
5959

60+
public function testDefaultValueArgument()
61+
{
62+
$payload = new RequestPayload(50);
63+
64+
$validator = $this->createMock(ValidatorInterface::class);
65+
$validator->expects($this->never())
66+
->method('validate');
67+
68+
$resolver = new RequestPayloadValueResolver(new Serializer(), $validator);
69+
70+
$argument = new ArgumentMetadata('valid', RequestPayload::class, false, true, $payload, false, [
71+
MapRequestPayload::class => new MapRequestPayload(),
72+
]);
73+
$request = Request::create('/', 'POST', server: ['CONTENT_TYPE' => 'application/json']);
74+
75+
$kernel = $this->createMock(HttpKernelInterface::class);
76+
$arguments = $resolver->resolve($request, $argument);
77+
$event = new ControllerArgumentsEvent($kernel, fn () => null, $arguments, $request, HttpKernelInterface::MAIN_REQUEST);
78+
79+
$resolver->onKernelControllerArguments($event);
80+
81+
$this->assertEquals([$payload], $event->getArguments());
82+
}
83+
84+
public function testQueryDefaultValueArgument()
85+
{
86+
$payload = new RequestPayload(50);
87+
88+
$validator = $this->createMock(ValidatorInterface::class);
89+
$validator->expects($this->never())
90+
->method('validate');
91+
92+
$resolver = new RequestPayloadValueResolver(new Serializer(), $validator);
93+
94+
$argument = new ArgumentMetadata('valid', RequestPayload::class, false, true, $payload, false, [
95+
MapQueryString::class => new MapQueryString(),
96+
]);
97+
$request = Request::create('/', 'GET');
98+
99+
$kernel = $this->createMock(HttpKernelInterface::class);
100+
$arguments = $resolver->resolve($request, $argument);
101+
$event = new ControllerArgumentsEvent($kernel, fn () => null, $arguments, $request, HttpKernelInterface::MAIN_REQUEST);
102+
103+
$resolver->onKernelControllerArguments($event);
104+
105+
$this->assertEquals([$payload], $event->getArguments());
106+
}
107+
108+
public function testNullableValueArgument()
109+
{
110+
$validator = $this->createMock(ValidatorInterface::class);
111+
$validator->expects($this->never())
112+
->method('validate');
113+
114+
$resolver = new RequestPayloadValueResolver(new Serializer(), $validator);
115+
116+
$argument = new ArgumentMetadata('valid', RequestPayload::class, false, false, null, true, [
117+
MapRequestPayload::class => new MapRequestPayload(),
118+
]);
119+
$request = Request::create('/', 'POST', server: ['CONTENT_TYPE' => 'application/json']);
120+
121+
$kernel = $this->createMock(HttpKernelInterface::class);
122+
$arguments = $resolver->resolve($request, $argument);
123+
$event = new ControllerArgumentsEvent($kernel, fn () => null, $arguments, $request, HttpKernelInterface::MAIN_REQUEST);
124+
125+
$resolver->onKernelControllerArguments($event);
126+
127+
$this->assertEquals([null], $event->getArguments());
128+
}
129+
130+
public function testQueryNullableValueArgument()
131+
{
132+
$validator = $this->createMock(ValidatorInterface::class);
133+
$validator->expects($this->never())
134+
->method('validate');
135+
136+
$resolver = new RequestPayloadValueResolver(new Serializer(), $validator);
137+
138+
$argument = new ArgumentMetadata('valid', RequestPayload::class, false, false, null, true, [
139+
MapQueryString::class => new MapQueryString(),
140+
]);
141+
$request = Request::create('/', 'GET');
142+
143+
$kernel = $this->createMock(HttpKernelInterface::class);
144+
$arguments = $resolver->resolve($request, $argument);
145+
$event = new ControllerArgumentsEvent($kernel, fn () => null, $arguments, $request, HttpKernelInterface::MAIN_REQUEST);
146+
147+
$resolver->onKernelControllerArguments($event);
148+
149+
$this->assertSame([null], $event->getArguments());
150+
}
151+
152+
public function testNullPayloadAndNotDefaultOrNullableArgument()
153+
{
154+
$validator = $this->createMock(ValidatorInterface::class);
155+
$validator->expects($this->never())
156+
->method('validate');
157+
158+
$resolver = new RequestPayloadValueResolver(new Serializer(), $validator);
159+
160+
$argument = new ArgumentMetadata('valid', RequestPayload::class, false, false, null, false, [
161+
MapRequestPayload::class => new MapRequestPayload(),
162+
]);
163+
$request = Request::create('/', 'POST', server: ['CONTENT_TYPE' => 'application/json']);
164+
165+
$kernel = $this->createMock(HttpKernelInterface::class);
166+
$arguments = $resolver->resolve($request, $argument);
167+
$event = new ControllerArgumentsEvent($kernel, fn () => null, $arguments, $request, HttpKernelInterface::MAIN_REQUEST);
168+
169+
try {
170+
$resolver->onKernelControllerArguments($event);
171+
$this->fail(sprintf('Expected "%s" to be thrown.', HttpException::class));
172+
} catch (HttpException $e) {
173+
$this->assertSame(422, $e->getStatusCode());
174+
}
175+
}
176+
177+
public function testQueryNullPayloadAndNotDefaultOrNullableArgument()
178+
{
179+
$validator = $this->createMock(ValidatorInterface::class);
180+
$validator->expects($this->never())
181+
->method('validate');
182+
183+
$resolver = new RequestPayloadValueResolver(new Serializer(), $validator);
184+
185+
$argument = new ArgumentMetadata('valid', RequestPayload::class, false, false, null, false, [
186+
MapQueryString::class => new MapQueryString(),
187+
]);
188+
$request = Request::create('/', 'GET');
189+
190+
$kernel = $this->createMock(HttpKernelInterface::class);
191+
$arguments = $resolver->resolve($request, $argument);
192+
$event = new ControllerArgumentsEvent($kernel, fn () => null, $arguments, $request, HttpKernelInterface::MAIN_REQUEST);
193+
194+
try {
195+
$resolver->onKernelControllerArguments($event);
196+
$this->fail(sprintf('Expected "%s" to be thrown.', HttpException::class));
197+
} catch (HttpException $e) {
198+
$this->assertSame(404, $e->getStatusCode());
199+
}
200+
}
201+
60202
public function testWithoutValidatorAndCouldNotDenormalize()
61203
{
62204
$content = '{"price": 50, "title": ["not a string"]}';

0 commit comments

Comments
 (0)
0