kopia lustrzana https://dev.funkwhale.audio/funkwhale/funkwhale
				
				
				
			
		
			
				
	
	
		
			289 wiersze
		
	
	
		
			9.2 KiB
		
	
	
	
		
			Python
		
	
	
			
		
		
	
	
			289 wiersze
		
	
	
		
			9.2 KiB
		
	
	
	
		
			Python
		
	
	
| import pytest
 | |
| from rest_framework import exceptions
 | |
| 
 | |
| 
 | |
| def test_can_insert_plt(factories):
 | |
|     plt = factories["playlists.PlaylistTrack"]()
 | |
|     modification_date = plt.playlist.modification_date
 | |
| 
 | |
|     assert plt.index is None
 | |
| 
 | |
|     plt.playlist.insert(plt)
 | |
|     plt.refresh_from_db()
 | |
| 
 | |
|     assert plt.index == 0
 | |
|     assert plt.playlist.modification_date > modification_date
 | |
| 
 | |
| 
 | |
| def test_insert_use_last_idx_by_default(factories):
 | |
|     playlist = factories["playlists.Playlist"]()
 | |
|     plts = factories["playlists.PlaylistTrack"].create_batch(size=3, playlist=playlist)
 | |
| 
 | |
|     for i, plt in enumerate(plts):
 | |
|         index = playlist.insert(plt)
 | |
|         plt.refresh_from_db()
 | |
| 
 | |
|         assert index == i
 | |
|         assert plt.index == i
 | |
| 
 | |
| 
 | |
| def test_can_insert_at_index(factories):
 | |
|     playlist = factories["playlists.Playlist"]()
 | |
|     first = factories["playlists.PlaylistTrack"](playlist=playlist)
 | |
|     playlist.insert(first)
 | |
|     new_first = factories["playlists.PlaylistTrack"](playlist=playlist)
 | |
|     index = playlist.insert(new_first, index=0)
 | |
|     first.refresh_from_db()
 | |
|     new_first.refresh_from_db()
 | |
| 
 | |
|     assert index == 0
 | |
|     assert first.index == 1
 | |
|     assert new_first.index == 0
 | |
| 
 | |
| 
 | |
| def test_can_insert_and_move(factories):
 | |
|     playlist = factories["playlists.Playlist"]()
 | |
|     first = factories["playlists.PlaylistTrack"](playlist=playlist, index=0)
 | |
|     second = factories["playlists.PlaylistTrack"](playlist=playlist, index=1)
 | |
|     third = factories["playlists.PlaylistTrack"](playlist=playlist, index=2)
 | |
| 
 | |
|     playlist.insert(second, index=0)
 | |
| 
 | |
|     first.refresh_from_db()
 | |
|     second.refresh_from_db()
 | |
|     third.refresh_from_db()
 | |
| 
 | |
|     assert third.index == 2
 | |
|     assert second.index == 0
 | |
|     assert first.index == 1
 | |
| 
 | |
| 
 | |
| def test_can_insert_and_move_last_to_0(factories):
 | |
|     playlist = factories["playlists.Playlist"]()
 | |
|     first = factories["playlists.PlaylistTrack"](playlist=playlist, index=0)
 | |
|     second = factories["playlists.PlaylistTrack"](playlist=playlist, index=1)
 | |
|     third = factories["playlists.PlaylistTrack"](playlist=playlist, index=2)
 | |
| 
 | |
|     playlist.insert(third, index=0)
 | |
| 
 | |
|     first.refresh_from_db()
 | |
|     second.refresh_from_db()
 | |
|     third.refresh_from_db()
 | |
| 
 | |
|     assert third.index == 0
 | |
|     assert first.index == 1
 | |
|     assert second.index == 2
 | |
| 
 | |
| 
 | |
| def test_cannot_insert_at_wrong_index(factories):
 | |
|     plt = factories["playlists.PlaylistTrack"]()
 | |
|     new = factories["playlists.PlaylistTrack"](playlist=plt.playlist)
 | |
|     with pytest.raises(exceptions.ValidationError):
 | |
|         plt.playlist.insert(new, 2)
 | |
| 
 | |
| 
 | |
| def test_cannot_insert_at_negative_index(factories):
 | |
|     plt = factories["playlists.PlaylistTrack"]()
 | |
|     new = factories["playlists.PlaylistTrack"](playlist=plt.playlist)
 | |
|     with pytest.raises(exceptions.ValidationError):
 | |
|         plt.playlist.insert(new, -1)
 | |
| 
 | |
| 
 | |
| def test_remove_update_indexes(factories):
 | |
|     playlist = factories["playlists.Playlist"]()
 | |
|     first = factories["playlists.PlaylistTrack"](playlist=playlist, index=0)
 | |
|     second = factories["playlists.PlaylistTrack"](playlist=playlist, index=1)
 | |
|     third = factories["playlists.PlaylistTrack"](playlist=playlist, index=2)
 | |
| 
 | |
|     second.delete(update_indexes=True)
 | |
| 
 | |
|     first.refresh_from_db()
 | |
|     third.refresh_from_db()
 | |
| 
 | |
|     assert first.index == 0
 | |
|     assert third.index == 1
 | |
| 
 | |
| 
 | |
| def test_can_insert_many(factories):
 | |
|     playlist = factories["playlists.Playlist"]()
 | |
|     factories["playlists.PlaylistTrack"](playlist=playlist, index=0)
 | |
|     tracks = factories["music.Track"].create_batch(size=3)
 | |
|     plts = playlist.insert_many(tracks)
 | |
|     for i, plt in enumerate(plts):
 | |
|         assert plt.index == i + 1
 | |
|         assert plt.track == tracks[i]
 | |
|         assert plt.playlist == playlist
 | |
| 
 | |
| 
 | |
| def test_insert_many_honor_max_tracks(preferences, factories):
 | |
|     preferences["playlists__max_tracks"] = 4
 | |
|     playlist = factories["playlists.Playlist"]()
 | |
|     factories["playlists.PlaylistTrack"].create_batch(size=2, playlist=playlist)
 | |
|     track = factories["music.Track"]()
 | |
|     with pytest.raises(exceptions.ValidationError):
 | |
|         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)]
 | |
| )
 | |
| def test_playlist_track_playable_by_anonymous(privacy_level, expected, factories):
 | |
|     plt = factories["playlists.PlaylistTrack"]()
 | |
|     track = plt.track
 | |
|     factories["music.Upload"](
 | |
|         track=track, library__privacy_level=privacy_level, import_status="finished"
 | |
|     )
 | |
|     queryset = plt.__class__.objects.playable_by(None).annotate_playable_by_actor(None)
 | |
|     match = plt in list(queryset)
 | |
|     assert match is expected
 | |
|     if expected:
 | |
|         assert bool(queryset.first().is_playable_by_actor) is expected
 | |
| 
 | |
| 
 | |
| @pytest.mark.parametrize(
 | |
|     "privacy_level,expected", [("me", False), ("instance", False), ("everyone", True)]
 | |
| )
 | |
| def test_playlist_playable_by_anonymous(privacy_level, expected, factories):
 | |
|     plt = factories["playlists.PlaylistTrack"]()
 | |
|     playlist = plt.playlist
 | |
|     track = plt.track
 | |
|     factories["music.Upload"](
 | |
|         track=track, library__privacy_level=privacy_level, import_status="finished"
 | |
|     )
 | |
|     queryset = playlist.__class__.objects.playable_by(None).with_playable_plts(None)
 | |
|     match = playlist in list(queryset)
 | |
|     assert match is expected
 |