"""Tests for parse_email module.""" import re import pytest from parse_email import parse_email, extract_date, parse_entry, is_label_header, is_section_header class TestExtractDate: def test_parses_m_dd_date(self): result = parse_email("3/27 New Releases\n\nTRACKS\n\nColumbia:\nArtist \u2013 \"Song\"") assert re.match(r"^\d{4}-03-27$", result.release_date) def test_parses_mm_dd_date(self): result = parse_email("12/15 New Releases\n\nTRACKS\n\nRCA:\nArtist \u2013 \"Song\"") assert re.match(r"^\d{4}-12-15$", result.release_date) def test_extracts_date_with_gmail_headers(self): email = ( "Mielcarek, David, Sony Music 2:24 PM (49 minutes ago)\n" "to Weekend, Rob, Atri, Farouk, me\n\n" "4/3 New Releases\n\nTRACKS\n\nColumbia:\nArtist \u2013 \"Song\"" ) result = parse_email(email) assert re.match(r"^\d{4}-04-03$", result.release_date) assert len(result.tracks) == 1 def test_returns_empty_when_no_date(self): result = parse_email("No date here\n\nTRACKS\n\nRCA:\nArtist \u2013 \"Song\"") assert result.release_date == "" class TestSectionParsing: def test_separates_tracks_and_albums(self): email = ( "3/27 New Releases\n\nTRACKS\n\nColumbia:\n" "Central Cee \u2013 \"WAGWAN\"\n\n" "ALBUMS\n\nColumbia:\nCentral Cee - Wild West" ) result = parse_email(email) assert len(result.tracks) == 1 assert len(result.albums) == 1 assert result.tracks[0].title == "WAGWAN" assert result.albums[0].title == "Wild West" def test_ignores_lines_before_section_header(self): email = "3/27 New Releases\n\nSome random preamble\nOn Duty: John\n\nTRACKS\n\nRCA:\nArtist \u2013 \"Song\"" result = parse_email(email) assert len(result.tracks) == 1 assert len(result.albums) == 0 def test_handles_singular_track_header(self): result = parse_email("3/27 New Releases\n\nTRACK\n\nRCA:\nArtist \u2013 \"Song\"") assert len(result.tracks) == 1 def test_handles_singular_album_header(self): result = parse_email("3/27 New Releases\n\nALBUM\n\nRCA:\nArtist - Title") assert len(result.albums) == 1 class TestLabelParsing: def test_assigns_label_from_header(self): email = "3/27 New Releases\n\nTRACKS\n\nColumbia:\nArtist \u2013 \"Song\"\n\nRCA:\nArtist2 \u2013 \"Song2\"" result = parse_email(email) assert result.tracks[0].label == "Columbia" assert result.tracks[1].label == "RCA" def test_multi_word_label(self): result = parse_email("3/27 New Releases\n\nTRACKS\n\nSony Nashville:\nArtist \u2013 \"Song\"") assert result.tracks[0].label == "Sony Nashville" def test_skips_none_label_separate_line(self): email = "3/27 New Releases\n\nTRACKS\n\nAlamo:\nNONE\n\nColumbia:\nArtist \u2013 \"Song\"" result = parse_email(email) assert len(result.tracks) == 1 assert result.tracks[0].label == "Columbia" def test_skips_inline_none_label(self): email = "3/27 New Releases\n\nTRACKS\n\nAlamo: NONE\n\nColumbia:\nArtist \u2013 \"Song\"" result = parse_email(email) assert len(result.tracks) == 1 assert result.tracks[0].label == "Columbia" class TestEntryParsing: def test_en_dash_with_quotes(self): result = parse_email("3/27\n\nTRACKS\n\nLabel:\nCentral Cee \u2013 \"WAGWAN\"") assert result.tracks[0].artist == "Central Cee" assert result.tracks[0].title == "WAGWAN" def test_hyphen_with_quotes(self): result = parse_email("3/27\n\nTRACKS\n\nLabel:\nCentral Cee - \"WAGWAN\"") assert result.tracks[0].artist == "Central Cee" assert result.tracks[0].title == "WAGWAN" def test_no_dash(self): result = parse_email("3/27\n\nTRACKS\n\nLabel:\nCentral Cee \"WAGWAN\"") assert result.tracks[0].artist == "Central Cee" assert result.tracks[0].title == "WAGWAN" def test_no_quotes(self): result = parse_email("3/27\n\nALBUMS\n\nLabel:\nCentral Cee \u2013 Wild West") assert result.albums[0].artist == "Central Cee" assert result.albums[0].title == "Wild West" def test_smart_curly_quotes(self): result = parse_email("3/27\n\nTRACKS\n\nLabel:\nArtist \u2013 \u201CTitle\u201D") assert result.tracks[0].title == "Title" def test_em_dash(self): result = parse_email("3/27\n\nTRACKS\n\nLabel:\nArtist \u2014 \"Title\"") assert result.tracks[0].artist == "Artist" assert result.tracks[0].title == "Title" class TestNotesExtraction: def test_tracking_starting_notes(self): result = parse_email("3/27\n\nTRACKS\n\nLabel:\nArtist \u2013 \"Title\" Tracking Starting Monday") assert result.tracks[0].notes == "Tracking Starting Monday" def test_distro_suffix(self): result = parse_email("3/27\n\nTRACKS\n\nLabel:\nArtist \u2013 \"Title\" - Distro: The Orchard") assert result.tracks[0].notes == "Distro: The Orchard" def test_distro_with_distributor_name(self): result = parse_email( '3/27\n\nTRACKS\n\nLabel:\nGeorge Birge "Whatever That Was" - The Orchard - Distro: RECORDS Nashville' ) assert result.tracks[0].artist == "George Birge" assert result.tracks[0].title == "Whatever That Was" assert result.tracks[0].notes == "Distro: RECORDS Nashville" class TestSkipPatterns: def test_skips_plus_lines(self): result = parse_email("3/27\n\nTRACKS\n\n+ RON PERRY REPORT\n\nColumbia:\nArtist \u2013 \"Song\"") assert len(result.tracks) == 1 def test_skips_on_duty(self): result = parse_email("3/27\n\nOn Duty: Person\n\nTRACKS\n\nLabel:\nArtist \u2013 \"Song\"") assert len(result.tracks) == 1 def test_skips_none_entries(self): result = parse_email("3/27\n\nTRACKS\n\nLabel:\nNONE") assert len(result.tracks) == 0 class TestCollaborators: def test_preserves_ampersand_artist(self): result = parse_email("3/27\n\nTRACKS\n\nLabel:\nBecky G & elkan \u2013 \"Title\"") assert result.tracks[0].artist == "Becky G & elkan" class TestFullEmail: def test_realistic_email(self): email = ( "3/27 New Releases\n\n" "TRACKS\n\n" "Columbia:\n" "Central Cee \u2013 \"WAGWAN\"\n" "Beyonc\u00e9 \u2013 \"TEXAS HOLD \u2018EM\" Tracking Starting Monday\n\n" "RCA:\n" "BIA \u2013 \"LIGHTS OUT\"\n\n" "ALBUMS\n\n" "Columbia:\n" "Central Cee - Wild West\n\n" "RCA:\nNONE" ) result = parse_email(email) assert re.match(r"^\d{4}-03-27$", result.release_date) assert len(result.tracks) == 3 assert len(result.albums) == 1 assert result.tracks[0].artist == "Central Cee" assert result.tracks[0].title == "WAGWAN" assert result.tracks[0].label == "Columbia" assert result.tracks[1].notes == "Tracking Starting Monday" assert result.tracks[2].artist == "BIA" assert result.tracks[2].label == "RCA" assert result.albums[0].title == "Wild West" class TestEdgeCases: def test_empty_string(self): result = parse_email("") assert result.release_date == "" assert len(result.tracks) == 0 assert len(result.albums) == 0 def test_crlf_line_endings(self): email = "3/27 New Releases\r\n\r\nTRACKS\r\n\r\nColumbia:\r\nArtist \u2013 \"Song\"\r\n" result = parse_email(email) assert len(result.tracks) == 1 assert result.tracks[0].artist == "Artist"