@@ -698,6 +698,85 @@ public function can_parse_rules_which_reference_other_fields()
698698
699699 $ this ->assertEquals ("Must be a valid date. Must be a date before <code>to_time</code>. " , $ results ['from_time ' ]['description ' ]);
700700 }
701+
702+ /** @test */
703+ public function sometimes_rule_prevents_required_from_required_rule ()
704+ {
705+ $ ruleset = [
706+ 'optional_field ' => 'sometimes|required ' ,
707+ ];
708+
709+ $ results = $ this ->strategy ->parse ($ ruleset );
710+
711+ $ this ->assertFalse ($ results ['optional_field ' ]['required ' ], 'Field with "sometimes|required" should not be required ' );
712+ $ this ->assertTrue ($ results ['optional_field ' ]['sometimes ' ], 'Field should have "sometimes" flag set ' );
713+ }
714+
715+ /** @test */
716+ public function sometimes_rule_prevents_required_from_accepted_rule ()
717+ {
718+ $ ruleset = [
719+ 'consent_cgu ' => 'sometimes|accepted ' ,
720+ ];
721+
722+ $ results = $ this ->strategy ->parse ($ ruleset );
723+
724+ $ this ->assertTrue ($ results ['consent_cgu ' ]['sometimes ' ], 'Field should have "sometimes" flag set ' );
725+ $ this ->assertFalse ($ results ['consent_cgu ' ]['required ' ], 'Field with "sometimes|accepted" should not be required ' );
726+ }
727+
728+ /** @test */
729+ public function required_before_sometimes_remains_required ()
730+ {
731+ $ ruleset = [
732+ 'should_be_required ' => 'required|sometimes ' ,
733+ ];
734+
735+ $ results = $ this ->strategy ->parse ($ ruleset );
736+
737+ $ this ->assertTrue ($ results ['should_be_required ' ]['required ' ], 'Field with "required|sometimes" should remain required ' );
738+ $ this ->assertTrue ($ results ['should_be_required ' ]['sometimes ' ], 'Field should have "sometimes" flag set ' );
739+ }
740+
741+ /** @test */
742+ public function accepted_before_sometimes_remains_required ()
743+ {
744+ $ ruleset = [
745+ 'should_be_required ' => 'accepted|sometimes ' ,
746+ ];
747+
748+ $ results = $ this ->strategy ->parse ($ ruleset );
749+
750+ $ this ->assertTrue ($ results ['should_be_required ' ]['required ' ], 'Field with "accepted|sometimes" should remain required ' );
751+ $ this ->assertTrue ($ results ['should_be_required ' ]['sometimes ' ], 'Field should have "sometimes" flag set ' );
752+ }
753+
754+ /** @test */
755+ public function sometimes_with_other_validation_rules ()
756+ {
757+ $ ruleset = [
758+ 'sometimes_email ' => 'sometimes|email ' ,
759+ 'sometimes_numeric ' => 'sometimes|numeric|min:5 ' ,
760+ 'sometimes_array ' => 'sometimes|array ' ,
761+ ];
762+
763+ $ results = $ this ->strategy ->parse ($ ruleset );
764+
765+ // All should not be required
766+ $ this ->assertFalse ($ results ['sometimes_email ' ]['required ' ]);
767+ $ this ->assertFalse ($ results ['sometimes_numeric ' ]['required ' ]);
768+ $ this ->assertFalse ($ results ['sometimes_array ' ]['required ' ]);
769+
770+ // All should have sometimes flag
771+ $ this ->assertTrue ($ results ['sometimes_email ' ]['sometimes ' ]);
772+ $ this ->assertTrue ($ results ['sometimes_numeric ' ]['sometimes ' ]);
773+ $ this ->assertTrue ($ results ['sometimes_array ' ]['sometimes ' ]);
774+
775+ // Types should be set correctly
776+ $ this ->assertEquals ('string ' , $ results ['sometimes_email ' ]['type ' ]);
777+ $ this ->assertEquals ('number ' , $ results ['sometimes_numeric ' ]['type ' ]);
778+ $ this ->assertEquals ('object ' , $ results ['sometimes_array ' ]['type ' ]);
779+ }
701780}
702781
703782class DummyValidationRule implements \Illuminate \Contracts \Validation \Rule
0 commit comments