""" Tests for custom agent tools. Validates the 12 tools that power the agentic system. """ import pytest from tools.case_tools import ( icd_procedure_lookup, hospital_cost_estimator, city_tier_classifier, medical_term_normalizer, ) from tools.policy_tools import irdai_regulation_lookup, rule_validator from tools.explanation_tools import clause_explainer, what_if_analyzer, savings_calculator from tools.audit_tools import audit_trail_logger, get_audit_trail # === ICD Procedure Lookup === class TestICDLookup: def test_exact_match(self): result = icd_procedure_lookup("appendectomy") assert result["found"] is True assert "appendectomy" in result["procedure"]["name"].lower() def test_fuzzy_match(self): result = icd_procedure_lookup("knee replacement") assert result["found"] is True assert result["procedure"]["icd_code"] def test_abbreviation_via_normalizer(self): result = icd_procedure_lookup("CABG") # May or may not match directly, but should return something assert "found" in result def test_unknown_procedure(self): result = icd_procedure_lookup("qqqqzzzzwwww") # Either not found or fuzzy match — both are acceptable tool behavior assert "found" in result def test_cost_ranges_present(self): result = icd_procedure_lookup("cataract") assert result["found"] is True cost = result["procedure"]["cost_range"] assert cost["tier_1"][0] < cost["tier_1"][1] assert cost["tier_1"][0] > cost["tier_3"][0] # Tier 1 costs more # === Hospital Cost Estimator === class TestCostEstimator: def test_known_procedure(self): result = hospital_cost_estimator("appendectomy", "semi_private", "tier_1") assert result["procedure_cost_estimate"]["median"] > 0 assert result["room_cost_per_day"] > 0 assert result["estimated_total"]["low"] < result["estimated_total"]["high"] def test_tier_cost_ordering(self): t1 = hospital_cost_estimator("appendectomy", "private", "tier_1") t3 = hospital_cost_estimator("appendectomy", "private", "tier_3") assert t1["estimated_total"]["median"] > t3["estimated_total"]["median"] def test_custom_stay_days(self): result = hospital_cost_estimator("appendectomy", "general", "tier_2", stay_days=5) assert result["stay_days"] == 5 # === City Tier Classifier === class TestCityTier: def test_tier_1_city(self): result = city_tier_classifier("Mumbai") assert result["tier"] == "tier_1" assert result["confidence"] == "high" def test_tier_2_city(self): result = city_tier_classifier("Jaipur") assert result["tier"] == "tier_2" def test_hospital_chain_detection(self): result = city_tier_classifier("Apollo Hospital") assert result["tier"] == "tier_1" assert result["matched_on"] == "hospital_chain" def test_unknown_defaults_safe(self): result = city_tier_classifier("Some Random Village") assert result["tier"] in ("tier_2", "tier_3") assert result["confidence"] == "low" # === Medical Term Normalizer === class TestMedicalNormalizer: def test_abbreviation_expansion(self): result = medical_term_normalizer("Patient needs CABG surgery") assert "Coronary Artery Bypass Graft" in result["normalized"] assert len(result["resolved_abbreviations"]) > 0 def test_condition_detection(self): result = medical_term_normalizer("Patient with diabetes and hypertension") assert "Diabetes Mellitus" in result["detected_conditions"] assert "Hypertension" in result["detected_conditions"] def test_passthrough_clean_text(self): result = medical_term_normalizer("Laparoscopic Appendectomy") assert result["original"] == "Laparoscopic Appendectomy" # === IRDAI Regulation Lookup === class TestIRDAILookup: def test_waiting_period(self): result = irdai_regulation_lookup("waiting period") assert len(result["regulations"]) > 0 def test_room_rent(self): result = irdai_regulation_lookup("room rent") assert len(result["regulations"]) > 0 def test_exclusions(self): result = irdai_regulation_lookup("exclusions") assert "standard_exclusions" in result assert len(result["standard_exclusions"]) > 0 # === Rule Validator === class TestRuleValidator: def test_valid_rules(self): rules = [ {"category": "room_rent", "condition": "Room rent cap 1% of SI", "limit_type": "percentage", "limit_value": 1.0, "clause_reference": "Section 2.1"}, {"category": "copay", "condition": "20% copay", "limit_type": "copay", "limit_value": 20, "clause_reference": "Section 3.1"}, ] result = rule_validator(rules) assert result["total_rules"] == 2 def test_flags_excessive_waiting(self): rules = [ {"category": "waiting_period_specific", "condition": "60 month waiting", "limit_type": "waiting_period", "limit_value": 60, "clause_reference": "S1"}, ] result = rule_validator(rules) critical = [i for i in result["issues"] if i["severity"] == "critical"] assert len(critical) > 0 # Should flag > 48 months def test_flags_negative_value(self): rules = [ {"category": "deductible", "condition": "Negative deductible", "limit_type": "deductible", "limit_value": -5000, "clause_reference": "S1"}, ] result = rule_validator(rules) assert result["is_valid"] is False # === Clause Explainer === class TestClauseExplainer: def test_room_rent_explanation(self): result = clause_explainer("room_rent", "Room rent capped at 1% SI") assert "room" in result["simple_explanation"].lower() assert result["tip"] def test_unknown_category(self): result = clause_explainer("unknown_xyz", "Some clause") assert result["simple_explanation"] # Should still return something # === What-If Analyzer === class TestWhatIfAnalyzer: def test_room_downgrade_savings(self): rules = [ {"category": "room_rent", "condition": "Cap 5000/day", "limit_type": "absolute", "limit_value": 5000, "clause_reference": "S1"}, ] facts = { "patient_name": "Test", "patient_age": 35, "room_type": "deluxe", "room_cost_per_day": 15000, "stay_duration_days": 5, "admission_type": "planned", "procedure": "Appendectomy", "pre_existing_conditions": [], "city_tier": "tier_1", "total_claimed_amount": 150000, } result = what_if_analyzer(rules, facts, 500000, {"room_cost_per_day": 5000}) assert result["original_verdict"]["denied"] > result["modified_verdict"]["denied"] # === Audit Trail === class TestAuditTrail: def test_log_and_retrieve(self): result = audit_trail_logger( agent_name="TestAgent", action="test_action", input_summary="test input", output_summary="test output", tools_used=["test_tool"], duration_ms=100, ) assert result["logged"] is True assert result["audit_id"].startswith("AUD-") def test_trail_accumulates(self): trail = get_audit_trail() assert len(trail) > 0