ProjectCraft / tests /test_date_engine.py
yania-n's picture
Claude Sonnet 4.6
Initial deployment of ProjectCraft
3c5146b
Raw History Blame Contribute Delete
4.53 kB
"""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()