diff --git a/api/tests/playlists/test_models.py b/api/tests/playlists/test_models.py index b90f525184b2f4863d8d9f7ab07314ac1e1a1712..d62a7417be2e0b64c1c24862daf9d4d7f41f4b6a 100644 --- a/api/tests/playlists/test_models.py +++ b/api/tests/playlists/test_models.py @@ -123,6 +123,87 @@ def test_insert_many_honor_max_tracks(preferences, factories): with pytest.raises(exceptions.ValidationError): playlist.insert_many([track, track, track]) +def test_cannot_insert_duplicate(factories): + playlist = factories["playlists.Playlist"]() + factories["music.Track"](title="Unique Track", id=14) + track = factories["music.Track"](title="Existing Track", id=15) + + factories["playlists.PlaylistTrack"](playlist=playlist, index=0, track=track) + + with pytest.raises(exceptions.ValidationError) as e: + new = factories["playlists.PlaylistTrack"](playlist=playlist, index=1, track=track) + playlist.insert(new) + + assert e.value.detail["error"] == "tracks_already_exist_in_playlist" + assert e.value.detail["tracks"] == [track.title] + + +def test_can_insert_track_to_playlist_with_existing_duplicates(factories): + playlist = factories["playlists.Playlist"]() + existing_duplicate = factories["music.Track"](id=15) + factories["playlists.PlaylistTrack"](playlist=playlist, index=0, track=existing_duplicate) + factories["playlists.PlaylistTrack"](playlist=playlist, index=1, track=existing_duplicate) + factories["playlists.PlaylistTrack"](playlist=playlist, index=2, track=existing_duplicate) + + new_track = factories["music.Track"](id=51) + new_plt = factories["playlists.PlaylistTrack"](playlist=playlist, index=3, track=new_track) + + # no error + playlist.insert(new_plt, allow_duplicate=False) + +def test_can_insert_duplicate_with_override(factories): + playlist = factories["playlists.Playlist"]() + factories["music.Track"](title="Unique Track", id=14) + track = factories["music.Track"](title="Existing Track", id=15) + factories["playlists.PlaylistTrack"](playlist=playlist, index=0, track=track) + + new = factories["playlists.PlaylistTrack"](playlist=playlist, index=1, track=track) + playlist.insert(new, allow_duplicate=True) + + new.refresh_from_db() + assert new.index == 1 + +def test_cannot_insert_many_duplicates(factories): + playlist = factories["playlists.Playlist"]() + + t1 = factories["music.Track"](title="Existing Track 1", id=1) + factories["playlists.PlaylistTrack"](playlist=playlist, index=0, track=t1) + + t2 = factories["music.Track"](title="Existing Track 2", id=2) + factories["playlists.PlaylistTrack"](playlist=playlist, index=1, track=t2) + + factories["music.Track"](title="Existing Track 3", id=3) + + t4 = factories["music.Track"](title="New Track 4", id=4) + + with pytest.raises(exceptions.ValidationError) as e: + tracks = [t1, t4, t2] + playlist.insert_many(tracks) + + assert e.value.detail["error"] == "tracks_already_exist_in_playlist" + assert e.value.detail["tracks"] == [t1.title, t2.title] + +def test_can_insert_many_duplicates_with_override(factories): + playlist = factories["playlists.Playlist"]() + + t1 = factories["music.Track"](title="Existing Track 1", id=1) + factories["playlists.PlaylistTrack"](playlist=playlist, index=0, track=t1) + + t2 = factories["music.Track"](title="Existing Track 2", id=2) + factories["playlists.PlaylistTrack"](playlist=playlist, index=1, track=t2) + + factories["music.Track"](title="Existing Track 3", id=3) + + t4 = factories["music.Track"](title="New Track 4", id=4) + + tracks = [t1, t4, t2] + + plts = playlist.insert_many(tracks, allow_duplicates=True) + + assert len(plts) == 3 + assert plts[0].track == t1 + assert plts[1].track == t4 + assert plts[2].track == t2 @pytest.mark.parametrize( "privacy_level,expected", [("me", False), ("instance", False), ("everyone", True)]