@@ -48,13 +48,36 @@ def test_single_failure(self) -> None:
4848 assert result .failures [0 ].rule_name == "b"
4949
5050 def test_multiple_failures (self ) -> None :
51- contract = ValidationContract ("test" , [_FailingRule ("a" ), _FailingRule ("b" )])
51+ contract = ValidationContract (
52+ "test" ,
53+ [_FailingRule ("a" , FailureMode .SOFT_FAIL ), _FailingRule ("b" , FailureMode .SOFT_FAIL )],
54+ )
5255 result = contract .validate ({})
5356 assert result .passed is False
5457 assert len (result .failures ) == 2
5558 assert result .rules_applied == 2
5659 assert result .rules_failed == 2
5760
61+ def test_hard_fail_short_circuits_remaining_rules (self ) -> None :
62+ contract = ValidationContract (
63+ "test" ,
64+ [_FailingRule ("a" , FailureMode .HARD_FAIL ), _FailingRule ("b" , FailureMode .SOFT_FAIL )],
65+ )
66+ result = contract .validate ({})
67+ assert result .has_hard_fail is True
68+ assert result .rules_applied == 1
69+ assert result .rules_failed == 1
70+ assert result .failures [0 ].rule_name == "a"
71+
72+ def test_soft_fail_does_not_short_circuit (self ) -> None :
73+ contract = ValidationContract (
74+ "test" ,
75+ [_FailingRule ("a" , FailureMode .SOFT_FAIL ), _FailingRule ("b" , FailureMode .HARD_FAIL )],
76+ )
77+ result = contract .validate ({})
78+ assert result .rules_applied == 2
79+ assert result .rules_failed == 2
80+
5881 def test_empty_rules_list (self ) -> None :
5982 contract = ValidationContract ("empty" , [])
6083 result = contract .validate ("anything" )
0 commit comments