"""Run: python3 -m unittest test_transition_dates.py (or: pytest)""" import unittest from datetime import date as d from transition_dates import (FLAG, LABEL, cap_gap_eligibility, cap_gap_end, grace_period_end, grace_period_report, iso_or_none) class GracePeriod(unittest.TestCase): def test_sixty_days_counted_from_day_after(self): self.assertEqual(grace_period_end(d(2026, 3, 15), d(2028, 9, 30)), d(2026, 5, 14)) def test_validity_end_comes_first(self): self.assertEqual(grace_period_end(d(2026, 3, 15), d(2026, 4, 30)), d(2026, 4, 30)) def test_crosses_year_boundary(self): self.assertEqual(grace_period_end(d(2026, 12, 20), d(2029, 1, 1)), d(2027, 2, 18)) def test_validity_before_last_day_rejected(self): with self.assertRaises(ValueError): grace_period_end(d(2026, 3, 15), d(2026, 3, 1)) def test_report_paid_differs_shows_both_and_flag(self): r = grace_period_report(d(2026, 3, 15), d(2028, 9, 30), last_day_paid=d(2026, 3, 31)) self.assertEqual(r["by_last_day_worked"], d(2026, 5, 14)) self.assertEqual(r["by_last_day_paid"], d(2026, 5, 30)) self.assertEqual(r["flag"], FLAG) self.assertEqual(r["label"], LABEL) def test_report_paid_same_no_flag(self): r = grace_period_report(d(2026, 3, 15), d(2028, 9, 30), last_day_paid=d(2026, 3, 15)) self.assertNotIn("flag", r) self.assertNotIn("by_last_day_paid", r) self.assertEqual(r["label"], LABEL) def test_report_paid_past_validity_end(self): r = grace_period_report(d(2026, 3, 15), d(2026, 4, 30), last_day_paid=d(2026, 5, 15)) self.assertEqual(r["by_last_day_paid"], d(2026, 4, 30)) class CapGapEnd(unittest.TestCase): def test_validity_start_oct_1(self): self.assertEqual(cap_gap_end(2027, d(2026, 10, 1)), d(2026, 10, 1)) def test_pending(self): self.assertEqual(cap_gap_end(2027, None), d(2027, 4, 1)) self.assertEqual(cap_gap_end(2027), d(2027, 4, 1)) def test_later_validity_start(self): self.assertEqual(cap_gap_end(2027, d(2026, 11, 15)), d(2026, 11, 15)) class CapGapEligibility(unittest.TestCase): def test_filed_during_opt(self): r = cap_gap_eligibility(d(2026, 4, 3), d(2026, 6, 30), d(2025, 5, 15), True, True) self.assertTrue(r["status_extended"]) self.assertTrue(r["work_extended"]) self.assertEqual(r["label"], LABEL) def test_filed_in_grace_period_status_only(self): r = cap_gap_eligibility(d(2026, 4, 3), d(2026, 3, 20), d(2025, 5, 15), True, True) self.assertTrue(r["status_extended"]) self.assertFalse(r["work_extended"]) self.assertIn("2026-05-19", r["reason"]) def test_last_day_of_grace_period(self): r = cap_gap_eligibility(d(2026, 5, 19), d(2026, 3, 20), d(2025, 5, 15), True, True) self.assertTrue(r["status_extended"]) self.assertFalse(r["work_extended"]) def test_filed_after_grace_period(self): r = cap_gap_eligibility(d(2026, 5, 20), d(2026, 3, 20), d(2025, 5, 15), True, True) self.assertFalse(r["status_extended"]) self.assertFalse(r["work_extended"]) def test_filed_on_ead_end_date(self): r = cap_gap_eligibility(d(2026, 6, 30), d(2026, 6, 30), d(2025, 5, 15), True, True) self.assertTrue(r["work_extended"]) def test_consular_processing(self): r = cap_gap_eligibility(d(2026, 4, 3), d(2026, 6, 30), d(2025, 5, 15), False, True) self.assertFalse(r["status_extended"]) self.assertFalse(r["work_extended"]) self.assertEqual(r["reason"], "consular processing is not cap-gap eligible") def test_cap_exempt(self): r = cap_gap_eligibility(d(2026, 4, 3), d(2026, 6, 30), d(2025, 5, 15), True, False) self.assertFalse(r["status_extended"]) self.assertEqual(r["reason"], "cap-exempt petitions are not cap-gap eligible") def test_no_opt_filed_during_study(self): r = cap_gap_eligibility(d(2026, 4, 3), None, d(2026, 5, 15), True, True) self.assertTrue(r["status_extended"]) self.assertFalse(r["work_extended"]) class CliAndWording(unittest.TestCase): def test_iso_or_none(self): self.assertIsNone(iso_or_none("none")) self.assertIsNone(iso_or_none("NONE")) self.assertEqual(iso_or_none("2026-03-20"), d(2026, 3, 20)) def test_no_opt_filed_in_f1_grace(self): # Never had OPT: program ended 2026-05-15, F-1 grace runs to 2026-07-14. r = cap_gap_eligibility(d(2026, 6, 1), None, d(2026, 5, 15), True, True) self.assertEqual((r["status_extended"], r["work_extended"]), (True, False)) def test_flag_quotes_only_the_official_page(self): self.assertIn("last day for which a salary or wage is paid", FLAG) self.assertNotIn("attorneys read", FLAG) if __name__ == "__main__": unittest.main()