Spaces:
Running on Zero
Running on Zero
| """ | |
| test_explanation_fallback.py | |
| ----------------------------- | |
| Unit tests for DeterministicFallbackExplainer and automatic fallback execution in RazorShieldExplainer. | |
| """ | |
| import pytest | |
| from src.explanation.explainer import RazorShieldExplainer | |
| from src.explanation.fallback import DeterministicFallbackExplainer | |
| from src.explanation.schemas import ExplanationInput | |
| def test_deterministic_fallback_generator(): | |
| inp = ExplanationInput( | |
| merchant_id="M_FALLBACK", | |
| incident_state="ALERT", | |
| severity="HIGH", | |
| incident_score=0.88, | |
| spike_probability=0.92, | |
| fraud_excess_ratio=8.2, | |
| velocity_ratio=4.1, | |
| suspicious_windows=3, | |
| campaign_active=True, | |
| ) | |
| out = DeterministicFallbackExplainer.generate_fallback_explanation(inp, failure_reason="Test fallback") | |
| assert out.title == "RazorShield Defensive Risk Assessment: ALERT (HIGH Severity)" | |
| assert "8.2x baseline" in out.summary | |
| assert "M_FALLBACK" in out.summary | |
| assert "ALERT" in out.summary | |
| assert len(out.key_signals) == 4 | |
| def test_explainer_uses_fallback_when_model_unloaded(): | |
| explainer = RazorShieldExplainer(model_loader=None) | |
| inp = ExplanationInput( | |
| merchant_id="M_TEST", | |
| incident_state="INVESTIGATE", | |
| severity="MEDIUM", | |
| incident_score=0.45, | |
| spike_probability=0.40, | |
| fraud_excess_ratio=2.1, | |
| velocity_ratio=1.8, | |
| suspicious_windows=1, | |
| campaign_active=False, | |
| ) | |
| out, val_res = explainer.generate_explanation(inp) | |
| assert val_res["used_fallback"] is True | |
| assert val_res["passed"] is True | |
| assert out.title == "RazorShield Defensive Risk Assessment: INVESTIGATE (MEDIUM Severity)" | |