Spaces:
Running on Zero
Running on Zero
| """ | |
| test_risk_engine.py | |
| ------------------- | |
| Unit tests for RiskDecisionEngine and end-to-end processing. | |
| Verifies probability bounds, combined risk score, malformed input handling, | |
| and deterministic replay. | |
| """ | |
| from datetime import datetime | |
| import pytest | |
| from src.risk_engine.decision_engine import RiskDecisionEngine | |
| from src.risk_engine.schemas import TransactionInput | |
| def engine(): | |
| return RiskDecisionEngine(policy_mode="BALANCED") | |
| def test_probability_bounds_and_combined_risk(engine): | |
| tx = TransactionInput( | |
| transaction_id="TX_TEST_01", | |
| merchant_id="M_TEST", | |
| event_time=datetime(2026, 1, 1, 12, 0, 0), | |
| amount=250.0, | |
| ) | |
| decision = engine.process_transaction(tx) | |
| assert 0.0 <= decision.calibrated_fraud_probability <= 1.0 | |
| assert 0.0 <= decision.spike_probability <= 1.0 | |
| assert 0.0 <= decision.combined_risk_score <= 1.0 | |
| assert decision.decision in ["APPROVE", "VERIFY", "ALERT"] | |
| def test_deterministic_replay(engine): | |
| engine.reset_state() | |
| tx = TransactionInput( | |
| transaction_id="TX_DET_01", | |
| merchant_id="M_DET", | |
| event_time=datetime(2026, 1, 1, 12, 0, 0), | |
| amount=150.0, | |
| ) | |
| dec1 = engine.process_transaction(tx) | |
| engine.reset_state() | |
| dec2 = engine.process_transaction(tx) | |
| assert dec1.calibrated_fraud_probability == dec2.calibrated_fraud_probability | |
| assert dec1.spike_probability == dec2.spike_probability | |
| assert dec1.combined_risk_score == dec2.combined_risk_score | |
| assert dec1.decision == dec2.decision | |