| 1 | import unittest |
| 2 | from datetime import datetime, timedelta, timezone |
| 3 | |
| 4 | from lib import dates |
| 5 | |
| 6 | |
| 7 | class DatesV3Tests(unittest.TestCase): |
| 8 | def test_get_date_range_returns_iso_window(self): |
| 9 | start, end = dates.get_date_range(7) |
| 10 | self.assertRegex(start, r"^\d{4}-\d{2}-\d{2}$") |
| 11 | self.assertRegex(end, r"^\d{4}-\d{2}-\d{2}$") |
| 12 | self.assertEqual(7, (datetime.fromisoformat(end) - datetime.fromisoformat(start)).days) |
| 13 | |
| 14 | def test_parse_date_supports_timestamps_and_iso_variants(self): |
| 15 | unix_parsed = dates.parse_date("1710460800") |
| 16 | self.assertEqual("2024-03-15T00:00:00+00:00", unix_parsed.isoformat()) |
| 17 | |
| 18 | plain = dates.parse_date("2026-03-16") |
| 19 | self.assertEqual("2026-03-16T00:00:00+00:00", plain.isoformat()) |
| 20 | |
| 21 | zulu = dates.parse_date("2026-03-16T12:34:56Z") |
| 22 | self.assertEqual("2026-03-16T12:34:56+00:00", zulu.isoformat()) |
| 23 | |
| 24 | fractional = dates.parse_date("2026-03-16T12:34:56.123456+02:00") |
| 25 | self.assertEqual("2026-03-16T10:34:56.123456+00:00", fractional.isoformat()) |
| 26 | |
| 27 | def test_parse_date_rejects_empty_and_invalid_values(self): |
| 28 | self.assertIsNone(dates.parse_date(None)) |
| 29 | self.assertIsNone(dates.parse_date("")) |
| 30 | self.assertIsNone(dates.parse_date("not-a-date")) |
| 31 | |
| 32 | def test_timestamp_to_date_handles_valid_and_invalid_values(self): |
| 33 | self.assertEqual("2024-03-15", dates.timestamp_to_date(1710460800)) |
| 34 | self.assertIsNone(dates.timestamp_to_date(None)) |
| 35 | self.assertIsNone(dates.timestamp_to_date("bad")) |
| 36 | |
| 37 | def test_get_date_confidence_distinguishes_in_range_and_invalid(self): |
| 38 | self.assertEqual("high", dates.get_date_confidence("2026-03-10", "2026-03-01", "2026-03-16")) |
| 39 | self.assertEqual("low", dates.get_date_confidence("2026-02-10", "2026-03-01", "2026-03-16")) |
| 40 | self.assertEqual("low", dates.get_date_confidence("2026-03-20", "2026-03-01", "2026-03-16")) |
| 41 | self.assertEqual("low", dates.get_date_confidence("bad", "2026-03-01", "2026-03-16")) |
| 42 | self.assertEqual("low", dates.get_date_confidence(None, "2026-03-01", "2026-03-16")) |
| 43 | |
| 44 | def test_days_ago_and_recency_score_cover_edge_cases(self): |
| 45 | today = datetime.now(timezone.utc).date() |
| 46 | old = (today - timedelta(days=45)).isoformat() |
| 47 | future = (today + timedelta(days=1)).isoformat() |
| 48 | |
| 49 | self.assertEqual(0, dates.days_ago(today.isoformat())) |
| 50 | self.assertIsNone(dates.days_ago("bad")) |
| 51 | |
| 52 | self.assertEqual(100, dates.recency_score(today.isoformat())) |
| 53 | self.assertEqual(0, dates.recency_score(old)) |
| 54 | self.assertEqual(100, dates.recency_score(future)) |
| 55 | self.assertEqual(0, dates.recency_score(None)) |
| 56 | |
| 57 | if __name__ == "__main__": |
| 58 | unittest.main() |
| 59 |