from datetime import datetime import pytest from delivery_metadata.utils.datetime import ( convert_date_to_string, get_datetime_from_string, get_datetime_from_string_or_none, seconds_to_iso8601_duration, ) @pytest.mark.parametrize( ("seconds", "expected_duration"), [ (0, "PT0H0M0S"), (1, "PT0H0M1S"), (60, "PT0H1M0S"), (61, "PT0H1M1S"), (3600, "PT1H0M0S"), (3660, "PT1H1M0S"), (3661, "PT1H1M1S"), ], ) def test_seconds_to_iso8601_duration(seconds: int, expected_duration: str) -> None: assert seconds_to_iso8601_duration(seconds) == expected_duration def test_convert_date_to_string() -> None: assert convert_date_to_string(datetime(2025, 2, 10)) == "2025-02-10" @pytest.mark.parametrize( "mock_date_str, expected_datetime", [ (None, None), ("2024-08-10", datetime(2024, 8, 10)), ], ) def test__from_string_or_none( mock_date_str: str | None, expected_datetime: datetime | None, ) -> None: result = get_datetime_from_string_or_none(mock_date_str) assert result == expected_datetime @pytest.mark.parametrize( "mock_date_str, expected_datetime", [ ("2024-08-10", datetime(2024, 8, 10)), ("2026-12-31 14:30:00", datetime(2026, 12, 31, 14, 30)), ("2025-09-23T13:57:00Z", datetime(2025, 9, 23, 13, 57)), ], ) def test_get_datetime_from_string( mock_date_str: str, expected_datetime: datetime, ) -> None: result = get_datetime_from_string(mock_date_str) assert result == expected_datetime @pytest.mark.parametrize( "mock_date_str, expected_error", [ ("08, 10, 2024", "Date '08, 10, 2024' is not in a known format."), ( "2026-12-31 T14:30:00 Z", "Date '2026-12-31 T14:30:00 Z' is not in a known format.", ), ("2025-09-23 13 57 00", "Date '2025-09-23 13 57 00' is not in a known format."), ], ) def test_get_datetime_from_string_exception( mock_date_str: str, expected_error: str, ) -> None: with pytest.raises(ValueError, match=expected_error): get_datetime_from_string(mock_date_str)