refactor playlist duplicate error structure
- use non_field_errors struct when writing duplicate track errors - generalize frontend error handler and update frontend error parsing
This commit is contained in:
parent
31d990499d
commit
22f0235045
9 changed files with 285 additions and 22 deletions
|
|
@ -124,6 +124,139 @@ def test_insert_many_honor_max_tracks(preferences, factories):
|
|||
playlist.insert_many([track, track, track])
|
||||
|
||||
|
||||
def test_can_insert_duplicate_by_default(factories):
|
||||
playlist = factories["playlists.Playlist"]()
|
||||
track = factories["music.Track"]()
|
||||
factories["playlists.PlaylistTrack"](playlist=playlist, index=0, track=track)
|
||||
|
||||
new = factories["playlists.PlaylistTrack"](playlist=playlist, index=1, track=track)
|
||||
playlist.insert(new)
|
||||
|
||||
new.refresh_from_db()
|
||||
assert new.index == 1
|
||||
|
||||
|
||||
def test_cannot_insert_duplicate(factories):
|
||||
playlist = factories["playlists.Playlist"](name="playlist")
|
||||
track = factories["music.Track"]()
|
||||
|
||||
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, allow_duplicates=False)
|
||||
|
||||
errors = e.value.detail["non_field_errors"]
|
||||
assert len(errors) == 1
|
||||
|
||||
err = errors[0]
|
||||
assert err["code"] == "tracks_already_exist_in_playlist"
|
||||
assert err["playlist_name"] == "playlist"
|
||||
assert err["tracks"] == [track.title]
|
||||
|
||||
|
||||
def test_can_insert_track_to_playlist_with_existing_duplicates(factories):
|
||||
playlist = factories["playlists.Playlist"]()
|
||||
existing_duplicate = factories["music.Track"]()
|
||||
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"]()
|
||||
new_plt = factories["playlists.PlaylistTrack"](
|
||||
playlist=playlist, index=3, track=new_track
|
||||
)
|
||||
|
||||
# no error
|
||||
playlist.insert(new_plt, allow_duplicates=False)
|
||||
|
||||
|
||||
def test_can_insert_duplicate_with_override(factories):
|
||||
playlist = factories["playlists.Playlist"]()
|
||||
track = factories["music.Track"]()
|
||||
factories["playlists.PlaylistTrack"](playlist=playlist, index=0, track=track)
|
||||
|
||||
new = factories["playlists.PlaylistTrack"](playlist=playlist, index=1, track=track)
|
||||
playlist.insert(new, allow_duplicates=True)
|
||||
|
||||
new.refresh_from_db()
|
||||
assert new.index == 1
|
||||
|
||||
|
||||
def test_can_insert_many_duplicates_by_default(factories):
|
||||
playlist = factories["playlists.Playlist"]()
|
||||
|
||||
t1 = factories["music.Track"]()
|
||||
factories["playlists.PlaylistTrack"](playlist=playlist, index=0, track=t1)
|
||||
|
||||
t2 = factories["music.Track"]()
|
||||
factories["playlists.PlaylistTrack"](playlist=playlist, index=1, track=t2)
|
||||
|
||||
t4 = factories["music.Track"]()
|
||||
|
||||
tracks = [t1, t4, t2]
|
||||
|
||||
plts = playlist.insert_many(tracks)
|
||||
|
||||
assert len(plts) == 3
|
||||
assert plts[0].track == t1
|
||||
assert plts[1].track == t4
|
||||
assert plts[2].track == t2
|
||||
|
||||
|
||||
def test_cannot_insert_many_duplicates(factories):
|
||||
playlist = factories["playlists.Playlist"](name="playlist")
|
||||
|
||||
t1 = factories["music.Track"]()
|
||||
factories["playlists.PlaylistTrack"](playlist=playlist, index=0, track=t1)
|
||||
|
||||
t2 = factories["music.Track"]()
|
||||
factories["playlists.PlaylistTrack"](playlist=playlist, index=1, track=t2)
|
||||
|
||||
t4 = factories["music.Track"]()
|
||||
|
||||
with pytest.raises(exceptions.ValidationError) as e:
|
||||
tracks = [t1, t4, t2]
|
||||
playlist.insert_many(tracks, allow_duplicates=False)
|
||||
|
||||
errors = e.value.detail["non_field_errors"]
|
||||
assert len(errors) == 1
|
||||
|
||||
err = errors[0]
|
||||
assert err["code"] == "tracks_already_exist_in_playlist"
|
||||
assert err["playlist_name"] == "playlist"
|
||||
assert err["tracks"] == [t1.title, t2.title]
|
||||
|
||||
|
||||
def test_can_insert_many_duplicates_with_override(factories):
|
||||
playlist = factories["playlists.Playlist"]()
|
||||
|
||||
t1 = factories["music.Track"]()
|
||||
factories["playlists.PlaylistTrack"](playlist=playlist, index=0, track=t1)
|
||||
|
||||
t2 = factories["music.Track"]()
|
||||
factories["playlists.PlaylistTrack"](playlist=playlist, index=1, track=t2)
|
||||
|
||||
t4 = factories["music.Track"]()
|
||||
|
||||
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)]
|
||||
)
|
||||
|
|
|
|||
|
|
@ -24,7 +24,7 @@ def test_create_insert_is_called_when_index_is_None(factories, mocker):
|
|||
assert serializer.is_valid() is True
|
||||
|
||||
plt = serializer.save()
|
||||
insert.assert_called_once_with(playlist, plt, None)
|
||||
insert.assert_called_once_with(playlist, plt, None, True)
|
||||
assert plt.index == 0
|
||||
|
||||
|
||||
|
|
@ -41,7 +41,7 @@ def test_create_insert_is_called_when_index_is_provided(factories, mocker):
|
|||
|
||||
plt = serializer.save()
|
||||
first.refresh_from_db()
|
||||
insert.assert_called_once_with(playlist, plt, 0)
|
||||
insert.assert_called_once_with(playlist, plt, 0, True)
|
||||
assert plt.index == 0
|
||||
assert first.index == 1
|
||||
|
||||
|
|
@ -60,11 +60,35 @@ def test_update_insert_is_called_when_index_is_provided(factories, mocker):
|
|||
|
||||
plt = serializer.save()
|
||||
first.refresh_from_db()
|
||||
insert.assert_called_once_with(playlist, plt, 0)
|
||||
insert.assert_called_once_with(playlist, plt, 0, True)
|
||||
assert plt.index == 0
|
||||
assert first.index == 1
|
||||
|
||||
|
||||
def test_update_insert_is_called_with_duplicate_override_when_duplicates_allowed(
|
||||
factories, mocker
|
||||
):
|
||||
playlist = factories["playlists.Playlist"]()
|
||||
plt = factories["playlists.PlaylistTrack"](playlist=playlist, index=0)
|
||||
insert = mocker.spy(models.Playlist, "insert")
|
||||
factories["playlists.Playlist"]()
|
||||
factories["music.Track"]()
|
||||
|
||||
serializer = serializers.PlaylistTrackWriteSerializer(
|
||||
plt,
|
||||
data={
|
||||
"playlist": playlist.pk,
|
||||
"track": plt.track.pk,
|
||||
"index": 0,
|
||||
"allow_duplicates": True,
|
||||
},
|
||||
)
|
||||
assert serializer.is_valid() is True
|
||||
plt = serializer.save()
|
||||
|
||||
insert.assert_called_once_with(playlist, plt, 0, True)
|
||||
|
||||
|
||||
def test_playlist_serializer_include_covers(factories, api_request):
|
||||
playlist = factories["playlists.Playlist"]()
|
||||
t1 = factories["music.Track"]()
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue