from datetime import date, datetime, time from streamer.localize.extract_datetime import ( extract_date_from_marker, extract_datetime_from_file_name, extract_datetime_from_marker, extract_datetime_from_marker_list, extract_time_from_marker, ) class TestExtractDateTime: def test_extract_date_from_file_name_valid(self): file_name = "20230101-123456 Some Text.md" assert datetime(2023, 1, 1, 12, 34, 56) == extract_datetime_from_file_name( file_name ) def test_extract_date_from_file_name_invalid(self): file_name = "invalid-file-name.md" assert extract_datetime_from_file_name(file_name) is None def test_extract_date_from_file_name_without_time(self): file_name = "20230101 Some Text.md" assert datetime(2023, 1, 1, 0, 0, 0) == extract_datetime_from_file_name( file_name ) def test_extract_date_from_file_name_short_time(self): file_name = "20230101-1234 Some Text.md" assert datetime(2023, 1, 1, 12, 34, 0) == extract_datetime_from_file_name( file_name ) def test_extract_date_from_file_name_empty_string(self): file_name = "" assert extract_datetime_from_file_name(file_name) is None def test_extract_date_from_file_name_with_full_path(self): file_name = "/path/to/20230101-123456 Some Text.md" assert datetime(2023, 1, 1, 12, 34, 56) == extract_datetime_from_file_name( file_name ) class TestExtractMarkerDateTime: def test_extract_datetime_from_marker_valid(self): marker = "20250101150000" assert datetime(2025, 1, 1, 15, 0, 0) == extract_datetime_from_marker(marker) def test_extract_datetime_from_marker_invalid_format(self): assert extract_datetime_from_marker("2025010115000") is None # too short assert extract_datetime_from_marker("202501011500000") is None # too long assert extract_datetime_from_marker("2025-01-01T150000") is None # separators assert extract_datetime_from_marker("2025010115000a") is None # non-digit assert extract_datetime_from_marker("") is None def test_extract_datetime_from_marker_invalid_values(self): assert extract_datetime_from_marker("20250230120000") is None # Feb 30 assert extract_datetime_from_marker("20250101126000") is None # minute 60 assert extract_datetime_from_marker("20250101240000") is None # hour 24 class TestExtractMarkerDate: def test_extract_date_from_marker_valid(self): marker = "20250101" assert date(2025, 1, 1) == extract_date_from_marker(marker) def test_extract_date_from_marker_invalid_format(self): assert extract_date_from_marker("2025010") is None # too short assert extract_date_from_marker("202501011") is None # too long assert extract_date_from_marker("2025-01-01") is None # separators assert extract_date_from_marker("2025010a") is None # non-digit assert extract_date_from_marker("") is None def test_extract_date_from_marker_invalid_values(self): assert extract_date_from_marker("20250230") is None # Feb 30 assert extract_date_from_marker("20251301") is None # month 13 assert extract_date_from_marker("20250132") is None # day 32 class TestExtractMarkerTime: def test_extract_time_from_marker_valid(self): marker = "150000" assert time(15, 0, 0) == extract_time_from_marker(marker) def test_extract_time_from_marker_invalid_format(self): assert extract_time_from_marker("15000") is None # too short assert extract_time_from_marker("1500000") is None # too long assert extract_time_from_marker("15:00:00") is None # separators assert extract_time_from_marker("15000a") is None # non-digit assert extract_time_from_marker("") is None def test_extract_time_from_marker_invalid_values(self): assert extract_time_from_marker("240000") is None # hour 24 assert extract_time_from_marker("156000") is None # minute 60 assert extract_time_from_marker("150060") is None # second 60 class TestExtractDateTimeFromMarkerList: def test_no_markers_inherits_datetime(self): inherited = datetime(2025, 1, 2, 3, 4, 5) assert inherited == extract_datetime_from_marker_list([], inherited) def test_unrelated_markers_inherits_datetime(self): inherited = datetime(2025, 1, 2, 3, 4, 5) markers = ["not-a-marker", "2025-01-01", "1500", "1234567"] assert inherited == extract_datetime_from_marker_list(markers, inherited) def test_date_only_marker_sets_midnight(self): inherited = datetime(2025, 6, 7, 8, 9, 10) markers = ["20250101"] assert datetime(2025, 1, 1, 0, 0, 0) == extract_datetime_from_marker_list( markers, inherited ) def test_time_only_marker_inherits_date(self): inherited = datetime(2025, 6, 7, 8, 9, 10) markers = ["150000"] assert datetime(2025, 6, 7, 15, 0, 0) == extract_datetime_from_marker_list( markers, inherited ) def test_datetime_marker_overrides_both_date_and_time(self): inherited = datetime(2025, 6, 7, 8, 9, 10) markers = ["20250101150000"] assert datetime(2025, 1, 1, 15, 0, 0) == extract_datetime_from_marker_list( markers, inherited ) def test_combined_date_and_time_markers(self): inherited = datetime(2025, 6, 7, 8, 9, 10) markers = ["20250101", "150000"] assert datetime(2025, 1, 1, 15, 0, 0) == extract_datetime_from_marker_list( markers, inherited ) def test_first_marker_wins_when_multiple_dates_or_times(self): inherited = datetime(2025, 6, 7, 8, 9, 10) markers = ["20250101", "150000", "20250102", "160000"] assert datetime(2025, 1, 1, 15, 0, 0) == extract_datetime_from_marker_list( markers, inherited ) def test_last_separated_date_and_time_win(self): inherited = datetime(2025, 6, 7, 8, 9, 10) markers = ["20250101", "150000", "20250102160000"] assert datetime(2025, 1, 1, 15, 0, 0) == extract_datetime_from_marker_list( markers, inherited ) def test_invalid_date_or_time_markers_are_ignored(self): inherited = datetime(2025, 6, 7, 8, 9, 10) markers = ["20251301", "240000", "20250101", "150000"] assert datetime(2025, 1, 1, 15, 0, 0) == extract_datetime_from_marker_list( markers, inherited )