"""Risk formula: deterministic, auditable, edge-case safe.""" from app.risk import clamp, compute_risk def test_no_factors_is_low_risk(): result = compute_risk() assert result["score"] == 0 assert result["level"] == "LOW" def test_heavy_everything_caps_at_100(): result = compute_risk( traffic_delay_pct=2.0, # 200% slower rain_mm=50, event_impact=2, festival_impact=2, advisory_count=10, ) assert result["score"] == 100 assert result["level"] == "HIGH" def test_traffic_only_moderate_delay(): # 25% slower than free flow -> 20 traffic points -> LOW result = compute_risk(traffic_delay_pct=0.25) assert result["breakdown"]["traffic"] == 20.0 assert result["level"] == "LOW" def test_festival_pushes_to_medium(): # City-wide festival (Bada Mangal) + modest traffic = MEDIUM result = compute_risk(traffic_delay_pct=0.25, festival_impact=2) assert result["score"] == 40 assert result["level"] == "MEDIUM" def test_rain_plus_festival_plus_traffic_is_high(): result = compute_risk(traffic_delay_pct=0.4, rain_mm=5, festival_impact=2) # 32 + 15 + 20 = 67 assert result["score"] == 67 assert result["level"] == "HIGH" def test_rain_points_capped_at_20(): result = compute_risk(rain_mm=100) assert result["breakdown"]["rain"] == 20 def test_level_boundaries(): assert compute_risk(traffic_delay_pct=0.36)["level"] == "LOW" # 28.8 -> 29 assert compute_risk(traffic_delay_pct=0.38)["level"] == "MEDIUM" # 30.4 -> 30 assert compute_risk(traffic_delay_pct=0.5, festival_impact=2)["level"] == "HIGH" # 60 def test_clamp(): assert clamp(5, 0, 10) == 5 assert clamp(-1, 0, 10) == 0 assert clamp(99, 0, 10) == 10