File size: 4,531 Bytes
3c5146b
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
"""Tests for core/date_engine.py three-mode logic."""

import os
import sys
import unittest

sys.path.insert(0, os.path.join(os.path.dirname(__file__), ".."))

from core.date_engine import (
    days_between,
    detect_date_mode,
    format_date_range,
    offset_date,
    validate_date_order,
)


class TestDetectDateMode(unittest.TestCase):

    def test_mode_a_both_provided_no_ai(self):
        result = detect_date_mode("2025-01-01", "2025-03-01", False, False)
        self.assertEqual(result, "A")

    def test_mode_b_start_only(self):
        result = detect_date_mode("2025-01-01", "", False, False)
        self.assertEqual(result, "B")

    def test_mode_c_end_only(self):
        result = detect_date_mode("", "2025-03-01", False, False)
        self.assertEqual(result, "C")

    def test_raises_value_error_both_blank(self):
        with self.assertRaises(ValueError) as ctx:
            detect_date_mode("", "", False, False)
        self.assertEqual(str(ctx.exception), "At least one date must be provided.")

    def test_raises_value_error_both_ai(self):
        with self.assertRaises(ValueError):
            detect_date_mode("2025-01-01", "2025-03-01", True, True)

    def test_start_ai_true_treats_as_no_start(self):
        # start_ai=True with start provided -> has_start is False -> Mode C if end is real
        result = detect_date_mode("2025-01-01", "2025-03-01", True, False)
        self.assertEqual(result, "C")

    def test_start_ai_true_no_end_raises(self):
        with self.assertRaises(ValueError):
            detect_date_mode("2025-01-01", "", True, False)


class TestValidateDateOrder(unittest.TestCase):

    def test_valid_order_returns_true(self):
        self.assertTrue(validate_date_order("2025-01-01", "2025-06-01"))

    def test_same_date_returns_true(self):
        self.assertTrue(validate_date_order("2025-03-15", "2025-03-15"))

    def test_reversed_order_returns_false(self):
        self.assertFalse(validate_date_order("2025-06-01", "2025-01-01"))

    def test_empty_start_returns_true(self):
        self.assertTrue(validate_date_order("", "2025-06-01"))

    def test_empty_end_returns_true(self):
        self.assertTrue(validate_date_order("2025-01-01", ""))

    def test_both_empty_returns_true(self):
        self.assertTrue(validate_date_order("", ""))


class TestFormatDateRange(unittest.TestCase):

    def test_formats_both_dates_correctly(self):
        result = format_date_range("2025-01-15", "2025-03-20")
        self.assertEqual(result, "Jan 15, 2025 \u2192 Mar 20, 2025")

    def test_handles_none_start(self):
        result = format_date_range(None, "2025-03-20")
        self.assertEqual(result, "Mar 20, 2025")

    def test_handles_empty_start(self):
        result = format_date_range("", "2025-03-20")
        self.assertEqual(result, "Mar 20, 2025")

    def test_handles_none_end(self):
        result = format_date_range("2025-01-15", None)
        self.assertEqual(result, "Jan 15, 2025")

    def test_handles_both_none(self):
        result = format_date_range(None, None)
        self.assertEqual(result, "")

    def test_handles_both_empty(self):
        result = format_date_range("", "")
        self.assertEqual(result, "")


class TestDaysBetween(unittest.TestCase):

    def test_returns_correct_count(self):
        self.assertEqual(days_between("2025-01-01", "2025-01-11"), 10)

    def test_returns_correct_count_reversed(self):
        self.assertEqual(days_between("2025-01-11", "2025-01-01"), 10)

    def test_same_date_returns_zero(self):
        self.assertEqual(days_between("2025-06-01", "2025-06-01"), 0)

    def test_invalid_start_returns_zero(self):
        self.assertEqual(days_between("not-a-date", "2025-01-01"), 0)

    def test_invalid_end_returns_zero(self):
        self.assertEqual(days_between("2025-01-01", ""), 0)


class TestOffsetDate(unittest.TestCase):

    def test_correctly_advances_date(self):
        self.assertEqual(offset_date("2025-01-01", 30), "2025-01-31")

    def test_advance_across_month_boundary(self):
        self.assertEqual(offset_date("2025-01-15", 20), "2025-02-04")

    def test_negative_offset_goes_back(self):
        self.assertEqual(offset_date("2025-03-01", -1), "2025-02-28")

    def test_zero_offset_returns_same(self):
        self.assertEqual(offset_date("2025-06-15", 0), "2025-06-15")

    def test_invalid_base_raises(self):
        with self.assertRaises(ValueError):
            offset_date("not-a-date", 5)


if __name__ == "__main__":
    unittest.main()