File size: 1,724 Bytes
10ec54c
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
"""
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)"