@@ -722,6 +722,88 @@ public function testRequestPayloadValidationErrorCustomStatusCode()
722
722
$ this ->assertSame ('This value should be of type string. ' , $ validationFailedException ->getViolations ()[0 ]->getMessage ());
723
723
}
724
724
}
725
+
726
+ /**
727
+ * @dataProvider provideBoolArgument
728
+ */
729
+ public function testBoolArgumentInQueryString (mixed $ expectedValue , ?string $ parameterValue )
730
+ {
731
+ $ serializer = new Serializer ([new ObjectNormalizer ()]);
732
+ $ validator = $ this ->createMock (ValidatorInterface::class);
733
+ $ resolver = new RequestPayloadValueResolver ($ serializer , $ validator );
734
+
735
+ $ argument = new ArgumentMetadata ('filtered ' , ObjectWithBoolArgument::class, false , false , null , false , [
736
+ MapQueryString::class => new MapQueryString (),
737
+ ]);
738
+ $ request = Request::create ('/ ' , 'GET ' , ['value ' => $ parameterValue ]);
739
+
740
+ $ kernel = $ this ->createMock (HttpKernelInterface::class);
741
+ $ arguments = $ resolver ->resolve ($ request , $ argument );
742
+ $ event = new ControllerArgumentsEvent ($ kernel , function () {}, $ arguments , $ request , HttpKernelInterface::MAIN_REQUEST );
743
+
744
+ $ resolver ->onKernelControllerArguments ($ event );
745
+
746
+ $ this ->assertSame ($ expectedValue , $ event ->getArguments ()[0 ]->value );
747
+ }
748
+
749
+ /**
750
+ * @dataProvider provideBoolArgument
751
+ */
752
+ public function testBoolArgumentInBody (mixed $ expectedValue , ?string $ parameterValue )
753
+ {
754
+ $ serializer = new Serializer ([new ObjectNormalizer ()]);
755
+ $ validator = $ this ->createMock (ValidatorInterface::class);
756
+ $ resolver = new RequestPayloadValueResolver ($ serializer , $ validator );
757
+
758
+ $ argument = new ArgumentMetadata ('filtered ' , ObjectWithBoolArgument::class, false , false , null , false , [
759
+ MapRequestPayload::class => new MapRequestPayload (),
760
+ ]);
761
+ $ request = Request::create ('/ ' , 'POST ' , ['value ' => $ parameterValue ], server: ['CONTENT_TYPE ' => 'multipart/form-data ' ]);
762
+
763
+ $ kernel = $ this ->createMock (HttpKernelInterface::class);
764
+ $ arguments = $ resolver ->resolve ($ request , $ argument );
765
+ $ event = new ControllerArgumentsEvent ($ kernel , function () {}, $ arguments , $ request , HttpKernelInterface::MAIN_REQUEST );
766
+
767
+ $ resolver ->onKernelControllerArguments ($ event );
768
+
769
+ $ this ->assertSame ($ expectedValue , $ event ->getArguments ()[0 ]->value );
770
+ }
771
+
772
+ public static function provideBoolArgument ()
773
+ {
774
+ yield 'default value ' => [null , null ];
775
+ yield '"0" ' => [false , '0 ' ];
776
+ yield '"false" ' => [false , 'false ' ];
777
+ yield '"no" ' => [false , 'no ' ];
778
+ yield '"off" ' => [false , 'off ' ];
779
+ yield '"1" ' => [true , '1 ' ];
780
+ yield '"true" ' => [true , 'true ' ];
781
+ yield '"yes" ' => [true , 'yes ' ];
782
+ yield '"on" ' => [true , 'on ' ];
783
+ }
784
+
785
+ /**
786
+ * Boolean filtering must be disabled for content types other than form data.
787
+ */
788
+ public function testBoolArgumentInJsonBody ()
789
+ {
790
+ $ serializer = new Serializer ([new ObjectNormalizer ()]);
791
+ $ validator = $ this ->createMock (ValidatorInterface::class);
792
+ $ resolver = new RequestPayloadValueResolver ($ serializer , $ validator );
793
+
794
+ $ argument = new ArgumentMetadata ('filtered ' , ObjectWithBoolArgument::class, false , false , null , false , [
795
+ MapRequestPayload::class => new MapRequestPayload (),
796
+ ]);
797
+ $ request = Request::create ('/ ' , 'POST ' , ['value ' => 'off ' ], server: ['CONTENT_TYPE ' => 'application/json ' ]);
798
+
799
+ $ kernel = $ this ->createMock (HttpKernelInterface::class);
800
+ $ arguments = $ resolver ->resolve ($ request , $ argument );
801
+ $ event = new ControllerArgumentsEvent ($ kernel , function () {}, $ arguments , $ request , HttpKernelInterface::MAIN_REQUEST );
802
+
803
+ $ resolver ->onKernelControllerArguments ($ event );
804
+
805
+ $ this ->assertTrue ($ event ->getArguments ()[0 ]->value );
806
+ }
725
807
}
726
808
727
809
class RequestPayload
@@ -765,3 +847,10 @@ public function getPassword(): string
765
847
return $ this ->password ;
766
848
}
767
849
}
850
+
851
+ class ObjectWithBoolArgument
852
+ {
853
+ public function __construct (public readonly ?bool $ value = null )
854
+ {
855
+ }
856
+ }
0 commit comments