"""Test utility functions.""" from datetime import date, datetime, timedelta, timezone import pytest from agenda.utils import as_date, as_datetime, human_readable_delta from freezegun import freeze_time def test_as_date_with_datetime() -> None: """Test converting a datetime object to a date.""" dt = datetime(2024, 7, 7, 12, 0, 0, tzinfo=timezone.utc) result = as_date(dt) assert result == date(2024, 7, 7) def test_as_date_with_date() -> None: """Test passing a date object through as_date.""" d = date(2024, 7, 7) result = as_date(d) assert result == d def test_as_date_with_invalid_type() -> None: """Test as_date with an invalid type, expecting a TypeError.""" with pytest.raises(TypeError): as_date("2024-07-07") def test_as_datetime_with_datetime() -> None: """Test passing a datetime object through as_datetime.""" dt = datetime(2024, 7, 7, 12, 0, 0, tzinfo=timezone.utc) result = as_datetime(dt) assert result == dt def test_as_datetime_with_date() -> None: """Test converting a date object to a datetime.""" d = date(2024, 7, 7) result = as_datetime(d) expected = datetime(2024, 7, 7, 0, 0, 0, tzinfo=timezone.utc) assert result == expected def test_as_datetime_with_invalid_type() -> None: """Test as_datetime with an invalid type, expecting a TypeError.""" with pytest.raises(TypeError): as_datetime("2024-07-07") @freeze_time("2024-07-01") def test_human_readable_delta_future_date() -> None: """Test human_readable_delta with a future date 45 days from today.""" future_date = date.today() + timedelta(days=45) result = human_readable_delta(future_date) assert result == "1 month 2 weeks 1 day" @freeze_time("2024-07-01") def test_human_readable_delta_today() -> None: """Test human_readable_delta with today's date, expecting None.""" today = date.today() result = human_readable_delta(today) assert result is None @freeze_time("2024-07-01") def test_human_readable_delta_past_date() -> None: """Test human_readable_delta with a past date, expecting None.""" past_date = date.today() - timedelta(days=1) result = human_readable_delta(past_date) assert result is None @freeze_time("2024-07-01") def test_human_readable_delta_months_only() -> None: """Test human_readable_delta with a future date 60 days from today.""" future_date = date.today() + timedelta(days=60) result = human_readable_delta(future_date) assert result == "2 months" @freeze_time("2024-07-01") def test_human_readable_delta_weeks_only() -> None: """Test human_readable_delta with a future date 14 days from today.""" future_date = date.today() + timedelta(days=14) result = human_readable_delta(future_date) assert result == "2 weeks" @freeze_time("2024-07-01") def test_human_readable_delta_days_only() -> None: """Test human_readable_delta with a future date 3 days from today.""" future_date = date.today() + timedelta(days=3) result = human_readable_delta(future_date) assert result == "3 days"