from pathlib import Path from serato_doctor.duplicates import find_duplicate_groups from serato_doctor.models.duplicate import DuplicateKind from serato_doctor.models.track import DiskTrack def track(path): path = Path(path) return DiskTrack(path, path.name, 100, path.suffix.lower()) def test_exact_names_in_different_folders_form_a_group(): groups = find_duplicate_groups( [track("/A/Song.mp3"), track("/B/Song.mp3")] ) assert len(groups) == 1 assert groups[0].kind is DuplicateKind.EXACT_NAME assert groups[0].display_name == "Song.mp3" assert groups[0].extra_files == 1 def test_case_only_difference_is_an_exact_name_duplicate(): groups = find_duplicate_groups( [track("/A/SONG.MP3"), track("/B/song.mp3")] ) assert groups[0].kind is DuplicateKind.EXACT_NAME def test_numeric_suffixes_form_a_suspected_cloud_conflict_group(): groups = find_duplicate_groups( [ track("/A/Track.mp3"), track("/B/Track 2.mp3"), track("/C/Track 3.mp3"), ] ) assert len(groups) == 1 assert groups[0].kind is DuplicateKind.CLOUD_CONFLICT assert groups[0].display_name == "Track.mp3" assert groups[0].extra_files == 2 assert [item.path for item in groups[0].tracks] == [ Path("/A/Track.mp3"), Path("/B/Track 2.mp3"), Path("/C/Track 3.mp3"), ] def test_unrelated_and_single_files_are_not_reported(): groups = find_duplicate_groups( [track("/A/First.mp3"), track("/B/Second.mp3")] ) assert groups == ()