@@ -749,4 +749,155 @@ public function testUsingDefaults()
749749 'is_published ' => 'invalid-value ' ,
750750 ]);
751751 }
752+
753+ public function testHumanizedKeyInArrayValidation ()
754+ {
755+ $ validation = $ this ->validator ->validate ([
756+ 'cart ' => [
757+ [
758+ 'qty ' => 'xyz ' ,
759+ ],
760+ ]
761+ ], [
762+ 'cart.*.itemName ' => 'required ' ,
763+ 'cart.*.qty ' => 'required|numeric '
764+ ]);
765+
766+ $ errors = $ validation ->errors ();
767+
768+ $ this ->assertEquals ($ errors ->first ('cart.*.qty ' ), 'The Cart 1 qty must be numeric ' );
769+ $ this ->assertEquals ($ errors ->first ('cart.*.itemName ' ), 'The Cart 1 item name is required ' );
770+ }
771+
772+ public function testCustomMessageInArrayValidation ()
773+ {
774+ $ validation = $ this ->validator ->make ([
775+ 'cart ' => [
776+ [
777+ 'qty ' => 'xyz ' ,
778+ 'itemName ' => 'Lorem ipsum '
779+ ],
780+ [
781+ 'qty ' => 10 ,
782+ 'attributes ' => [
783+ [
784+ 'name ' => 'color ' ,
785+ 'value ' => null
786+ ]
787+ ]
788+ ],
789+ ]
790+ ], [
791+ 'cart.*.itemName ' => 'required ' ,
792+ 'cart.*.qty ' => 'required|numeric ' ,
793+ 'cart.*.attributes.*.value ' => 'required '
794+ ]);
795+
796+ $ validation ->setMessages ([
797+ 'cart.*.itemName:required ' => 'Item [0] name is required ' ,
798+ 'cart.*.qty:numeric ' => 'Item {0} qty is not a number ' ,
799+ 'cart.*.attributes.*.value ' => 'Item {0} attribute {1} value is required ' ,
800+ ]);
801+
802+ $ validation ->validate ();
803+
804+ $ errors = $ validation ->errors ();
805+
806+ $ this ->assertEquals ($ errors ->first ('cart.*.qty ' ), 'Item 1 qty is not a number ' );
807+ $ this ->assertEquals ($ errors ->first ('cart.*.itemName ' ), 'Item 1 name is required ' );
808+ $ this ->assertEquals ($ errors ->first ('cart.*.attributes.*.value ' ), 'Item 2 attribute 1 value is required ' );
809+ }
810+
811+ public function testRequiredIfOnArrayAttribute ()
812+ {
813+ $ validation = $ this ->validator ->validate ([
814+ 'products ' => [
815+ // invalid because has_notes is not empty
816+ '10 ' => [
817+ 'quantity ' => 8 ,
818+ 'has_notes ' => 1 ,
819+ 'notes ' => ''
820+ ],
821+ // valid because has_notes is null
822+ '12 ' => [
823+ 'quantity ' => 0 ,
824+ 'has_notes ' => null ,
825+ 'notes ' => ''
826+ ],
827+ // valid because no has_notes
828+ '14 ' => [
829+ 'quantity ' => 0 ,
830+ 'notes ' => ''
831+ ],
832+ ]
833+ ], [
834+ 'products.*.notes ' => 'required_if:products.*.has_notes,1 ' ,
835+ ]);
836+
837+ $ this ->assertFalse ($ validation ->passes ());
838+
839+ $ errors = $ validation ->errors ();
840+ $ this ->assertNotNull ($ errors ->first ('products.10.notes ' ));
841+ $ this ->assertNull ($ errors ->first ('products.12.notes ' ));
842+ $ this ->assertNull ($ errors ->first ('products.14.notes ' ));
843+ }
844+
845+ public function testRequiredUnlessOnArrayAttribute ()
846+ {
847+ $ validation = $ this ->validator ->validate ([
848+ 'products ' => [
849+ // valid because has_notes is 1
850+ '10 ' => [
851+ 'quantity ' => 8 ,
852+ 'has_notes ' => 1 ,
853+ 'notes ' => ''
854+ ],
855+ // invalid because has_notes is not 1
856+ '12 ' => [
857+ 'quantity ' => 0 ,
858+ 'has_notes ' => null ,
859+ 'notes ' => ''
860+ ],
861+ // invalid because no has_notes
862+ '14 ' => [
863+ 'quantity ' => 0 ,
864+ 'notes ' => ''
865+ ],
866+ ]
867+ ], [
868+ 'products.*.notes ' => 'required_unless:products.*.has_notes,1 ' ,
869+ ]);
870+
871+ $ this ->assertFalse ($ validation ->passes ());
872+
873+ $ errors = $ validation ->errors ();
874+ $ this ->assertNull ($ errors ->first ('products.10.notes ' ));
875+ $ this ->assertNotNull ($ errors ->first ('products.12.notes ' ));
876+ $ this ->assertNotNull ($ errors ->first ('products.14.notes ' ));
877+ }
878+
879+ public function testSameRuleOnArrayAttribute ()
880+ {
881+ $ validation = $ this ->validator ->validate ([
882+ 'users ' => [
883+ [
884+ 'password ' => 'foo ' ,
885+ 'password_confirmation ' => 'foo '
886+ ],
887+ [
888+ 'password ' => 'foo ' ,
889+ 'password_confirmation ' => 'bar '
890+ ],
891+ ]
892+ ], [
893+ 'users.*.password_confirmation ' => 'required|same:users.*.password ' ,
894+ ]);
895+
896+ $ this ->assertFalse ($ validation ->passes ());
897+
898+ $ errors = $ validation ->errors ();
899+ $ this ->assertNull ($ errors ->first ('users.0.password_confirmation:same ' ));
900+ $ this ->assertNotNull ($ errors ->first ('users.1.password_confirmation:same ' ));
901+ }
902+
752903}
0 commit comments