#!/usr/bin/env python3 """Regression test for one-email-per-provider segment assignment. Verifies assign_segment() routes each provider to their single MOST-URGENT matching segment (lowest priority number), so a provider who qualifies for several segments gets exactly one email -- the most important one -- and everyone else falls through to the free NPI compliance check (the catch-all default). Run: python3 scripts/test_segment_assignment.py (exit 0 = pass) """ import sys, os sys.path.insert(0, os.path.dirname(os.path.abspath(__file__))) import build_healthcare_campaigns_cron as cron # noqa: E402 ACTIVE = ["npi_reactivation", "revalidation_overdue", "revalidation_due_soon", "nppes_outdated", "compliance_bundle"] def row(**kw): base = {"email": "x@p.com", "verify_ok": "Y", "reval_status": "", "days_overdue": "", "leie_excluded": "", "optout_ending": "", "nppes_deactivated": "", "nppes_years_stale": ""} base.update(kw) return base CASES = [ ("plain verified institutional -> free check", row(reval_status="no_reval_flag"), "nppes_outdated"), ("overdue 30d -> revalidation_overdue beats free check", row(reval_status="overdue", days_overdue="30"), "revalidation_overdue"), ("due soon 30d -> revalidation_due_soon", row(reval_status="upcoming", days_overdue="-30"), "revalidation_due_soon"), ("OIG excluded -> reactivation (most urgent), beats overdue", row(leie_excluded="Y", reval_status="overdue", days_overdue="20"), "npi_reactivation"), ("NPPES deactivated -> reactivation", row(nppes_deactivated="Y", reval_status="no_reval_flag"), "npi_reactivation"), ("overdue AND stale -> overdue wins, NOT free check", row(reval_status="overdue", days_overdue="30", nppes_years_stale="9"), "revalidation_overdue"), ("deactivated -> NOT free check even though verified", row(nppes_deactivated="Y"), "npi_reactivation"), ("optout ending + nothing urgent -> bundle beats free check", row(optout_ending="2025-12-01", reval_status="no_reval_flag"), "compliance_bundle"), ("not verified + nothing -> no assignment", row(verify_ok="N", reval_status="no_reval_flag"), None), ("heavily overdue 400d (out of window) -> free check", row(reval_status="overdue", days_overdue="400"), "nppes_outdated"), ] def main() -> int: failures = 0 for desc, r, exp in CASES: got = cron.assign_segment(r, ACTIVE) ok = got == exp if not ok: failures += 1 print(f" [{'ok' if ok else 'FAIL'}] {desc:58} -> {got} (exp {exp})") # Sanity: every provider gets AT MOST one segment (assign_all is a dict). rows = [r for _, r, _ in CASES] a = cron.assign_all(rows, ACTIVE) assert all(isinstance(v, str) for v in a.values()), "assignment must be single-valued" print(f"\n{'PASS' if not failures else f'{failures} FAILED'}") return 1 if failures else 0 if __name__ == "__main__": sys.exit(main())