|
17 | 17 | use Fusonic\HttpKernelBundle\Controller\RequestDtoResolver;
|
18 | 18 | use Fusonic\HttpKernelBundle\Exception\ConstraintViolationException;
|
19 | 19 | use Fusonic\HttpKernelBundle\Normalizer\ConstraintViolationExceptionNormalizer;
|
| 20 | +use Fusonic\HttpKernelBundle\Normalizer\DecoratedBackedEnumNormalizer; |
20 | 21 | use Fusonic\HttpKernelBundle\Provider\ContextAwareProviderInterface;
|
21 | 22 | use Fusonic\HttpKernelBundle\Request\StrictRequestDataCollector;
|
22 | 23 | use Fusonic\HttpKernelBundle\Tests\Dto\ArrayDto;
|
23 | 24 | use Fusonic\HttpKernelBundle\Tests\Dto\DummyClassA;
|
24 | 25 | use Fusonic\HttpKernelBundle\Tests\Dto\EmptyDto;
|
| 26 | +use Fusonic\HttpKernelBundle\Tests\Dto\EnumDto; |
| 27 | +use Fusonic\HttpKernelBundle\Tests\Dto\ExampleEnum; |
25 | 28 | use Fusonic\HttpKernelBundle\Tests\Dto\IntArrayDto;
|
26 | 29 | use Fusonic\HttpKernelBundle\Tests\Dto\NestedDto;
|
27 | 30 | use Fusonic\HttpKernelBundle\Tests\Dto\NotADto;
|
@@ -199,6 +202,85 @@ public function testStrictTypeMappingForPostFormRequestBody(): void
|
199 | 202 | self::assertSame('barfoo', $dto->getSubType()->getTest());
|
200 | 203 | }
|
201 | 204 |
|
| 205 | + public function testValidEnumFormRequestBody(): void |
| 206 | + { |
| 207 | + $data = [ |
| 208 | + 'exampleEnum' => 'CHOICE_1', |
| 209 | + ]; |
| 210 | + |
| 211 | + $request = new Request([], $data, [], [], [], []); |
| 212 | + $request->setMethod(Request::METHOD_POST); |
| 213 | + $argument = $this->createArgumentMetadata(EnumDto::class, [new FromRequest()]); |
| 214 | + |
| 215 | + $resolver = new RequestDtoResolver($this->getDenormalizer(), $this->getValidator()); |
| 216 | + $generator = $resolver->resolve($request, $argument); |
| 217 | + |
| 218 | + $dto = $generator->current(); |
| 219 | + |
| 220 | + self::assertInstanceOf(EnumDto::class, $dto); |
| 221 | + self::assertSame(ExampleEnum::CHOICE_1, $dto->exampleEnum); |
| 222 | + } |
| 223 | + |
| 224 | + public function testInvalidEnumFormRequestBody(): void |
| 225 | + { |
| 226 | + $data = [ |
| 227 | + 'exampleEnum' => 'WRONG_CHOICE', |
| 228 | + ]; |
| 229 | + |
| 230 | + $request = new Request([], $data, [], [], [], []); |
| 231 | + $request->setMethod(Request::METHOD_POST); |
| 232 | + $argument = $this->createArgumentMetadata(EnumDto::class, [new FromRequest()]); |
| 233 | + |
| 234 | + $resolver = new RequestDtoResolver($this->getDenormalizer(), $this->getValidator()); |
| 235 | + $generator = $resolver->resolve($request, $argument); |
| 236 | + |
| 237 | + $this->expectException(ConstraintViolationException::class); |
| 238 | + $this->expectExceptionMessage( |
| 239 | + 'The value you selected is not a valid choice.' |
| 240 | + ); |
| 241 | + |
| 242 | + $generator->current(); |
| 243 | + } |
| 244 | + |
| 245 | + public function testInvalidEnumFormQuery(): void |
| 246 | + { |
| 247 | + $request = new Request([ |
| 248 | + 'exampleEnum' => 'WRONG_CHOICE', |
| 249 | + ]); |
| 250 | + $request->setMethod(Request::METHOD_GET); |
| 251 | + $argument = $this->createArgumentMetadata(EnumDto::class, [new FromRequest()]); |
| 252 | + |
| 253 | + $resolver = new RequestDtoResolver($this->getDenormalizer(), $this->getValidator()); |
| 254 | + $generator = $resolver->resolve($request, $argument); |
| 255 | + |
| 256 | + $this->expectException(ConstraintViolationException::class); |
| 257 | + $this->expectExceptionMessage( |
| 258 | + 'The value you selected is not a valid choice.' |
| 259 | + ); |
| 260 | + |
| 261 | + $generator->current(); |
| 262 | + } |
| 263 | + |
| 264 | + public function testInvalidEnumTypeFormBody(): void |
| 265 | + { |
| 266 | + $data = [ |
| 267 | + 'exampleEnum' => [], |
| 268 | + ]; |
| 269 | + |
| 270 | + $request = new Request([], $data, [], [], [], []); |
| 271 | + $request->setMethod(Request::METHOD_POST); |
| 272 | + $argument = $this->createArgumentMetadata(EnumDto::class, [new FromRequest()]); |
| 273 | + |
| 274 | + $resolver = new RequestDtoResolver($this->getDenormalizer(), $this->getValidator()); |
| 275 | + $generator = $resolver->resolve($request, $argument); |
| 276 | + |
| 277 | + $this->expectException(ConstraintViolationException::class); |
| 278 | + $this->expectExceptionMessage( |
| 279 | + 'ConstraintViolation: This value should be of type int|string.' |
| 280 | + ); |
| 281 | + $generator->current(); |
| 282 | + } |
| 283 | + |
202 | 284 | public function testSkippingBodyGetRequest(): void
|
203 | 285 | {
|
204 | 286 | $this->expectException(ConstraintViolationException::class);
|
@@ -505,7 +587,7 @@ public function testIntegerRouteParameterTypeError(): void
|
505 | 587 | );
|
506 | 588 | $generator = $resolver->resolve($request, $argument);
|
507 | 589 |
|
508 |
| - self::expectExceptionMessage('ConstraintViolation: This value should be of type int.'); |
| 590 | + $this->expectExceptionMessage('ConstraintViolation: This value should be of type int.'); |
509 | 591 |
|
510 | 592 | /* @var DummyClassA $dto */
|
511 | 593 | $generator->current();
|
@@ -632,6 +714,7 @@ private function getDenormalizer(): DenormalizerInterface
|
632 | 714 | $normalizers = [
|
633 | 715 | new UnwrappingDenormalizer(),
|
634 | 716 | new ConstraintViolationExceptionNormalizer($constraintViolationListNormalizer),
|
| 717 | + new DecoratedBackedEnumNormalizer(new BackedEnumNormalizer()), |
635 | 718 | new ProblemNormalizer(),
|
636 | 719 | new UidNormalizer(),
|
637 | 720 | new JsonSerializableNormalizer(),
|
|
0 commit comments