"""Tests for matching module.""" import pytest from parse_email import Track, Album from matching import ( bigram_similarity, artist_matches, find_track_match, find_album_match, TrackMatch, AlbumMatch, ) class TestBigramSimilarity: def test_identical_strings(self): assert bigram_similarity("hello", "hello") == 1.0 def test_completely_different(self): score = bigram_similarity("abc", "xyz") assert score < 0.1 def test_similar_strings(self): score = bigram_similarity("CENTRAL CEE", "CENTRAL CER") assert score > 0.8 def test_short_strings(self): assert bigram_similarity("a", "a") == 1.0 assert bigram_similarity("a", "b") == 0.0 def test_empty_vs_empty(self): assert bigram_similarity("", "") == 1.0 class TestArtistMatches: def test_exact_match(self): assert artist_matches("BIA", "BIA") is True def test_db_has_collaborator_ampersand(self): assert artist_matches("BUNT. & MALOU", "BUNT.") is True def test_db_has_collaborator_x(self): assert artist_matches("ARTIST X OTHER", "ARTIST") is True def test_email_has_collaborator_ampersand(self): assert artist_matches("BUNT.", "BUNT. & MALOU") is True def test_email_has_collaborator_x(self): assert artist_matches("ARTIST", "ARTIST X OTHER") is True def test_no_match(self): assert artist_matches("BIA", "CENTRAL CEE") is False def test_partial_name_no_false_positive(self): # "BIA" should not match "AGORAPHOBIA" assert artist_matches("AGORAPHOBIA", "BIA") is False class TestFindTrackMatch: def setup_method(self): self.tracks = [ Track(artist="BIA", title="LIGHTS OUT"), Track(artist="Central Cee", title="WAGWAN"), Track(artist="BUNT. & Malou", title="i need u"), ] def test_exact_match(self): row = {"ARTISTNAME": "BIA", "TRACKNAME": "LIGHTS OUT"} assert find_track_match(row, self.tracks, "exact") == 0 def test_exact_match_case_insensitive(self): row = {"ARTISTNAME": "bia", "TRACKNAME": "lights out"} assert find_track_match(row, self.tracks, "exact") == 0 def test_partial_match(self): row = {"ARTISTNAME": "CENTRAL CEE", "TRACKNAME": "WAGWAN (REMIX)"} assert find_track_match(row, self.tracks, "partial") == 1 def test_fuzzy_match(self): row = {"ARTISTNAME": "CENTRAL CER", "TRACKNAME": "WAGWAM"} idx = find_track_match(row, self.tracks, "fuzzy") assert idx == 1 def test_no_match(self): row = {"ARTISTNAME": "UNKNOWN", "TRACKNAME": "UNKNOWN SONG"} assert find_track_match(row, self.tracks, "exact") == -1 def test_collaborator_reverse_match(self): # DB has "BUNT." but email has "BUNT. & Malou" row = {"ARTISTNAME": "BUNT.", "TRACKNAME": "I NEED U"} assert find_track_match(row, self.tracks, "exact") == 2 class TestFindAlbumMatch: def setup_method(self): self.albums = [ Album(artist="Central Cee", title="Wild West"), Album(artist="Taylor Swift", title="Midnights"), ] def test_exact_match(self): row = {"ARTISTNAME": "CENTRAL CEE", "RELEASENAME": "WILD WEST"} assert find_album_match(row, self.albums, "exact") == 0 def test_partial_match(self): row = {"ARTISTNAME": "TAYLOR SWIFT", "RELEASENAME": "MIDNIGHTS (DELUXE)"} assert find_album_match(row, self.albums, "partial") == 1 def test_no_match(self): row = {"ARTISTNAME": "UNKNOWN", "RELEASENAME": "UNKNOWN"} assert find_album_match(row, self.albums, "exact") == -1 class TestTrackMatchDataclass: def test_default_values(self): m = TrackMatch(email_artist="BIA", email_title="LIGHTS OUT") assert m.match_tier == "not_found" assert m.db_artist is None assert m.isrc is None def test_update_on_match(self): m = TrackMatch(email_artist="BIA", email_title="LIGHTS OUT") m.match_tier = "exact" m.db_artist = "BIA" m.isrc = "USRC12345678" assert m.match_tier == "exact" assert m.isrc == "USRC12345678" class TestAlbumMatchDataclass: def test_default_values(self): m = AlbumMatch(email_artist="Central Cee", email_title="Wild West") assert m.match_tier == "not_found" assert m.upc is None def test_update_on_match(self): m = AlbumMatch(email_artist="Central Cee", email_title="Wild West") m.match_tier = "exact" m.upc = "1234567890" assert m.match_tier == "exact"