tests minor issues

This commit is contained in:
Petitminion 2025-03-18 13:17:55 +01:00
parent 9d37d69a1d
commit 86b66bb6cc
7 changed files with 30 additions and 26 deletions

View File

@ -944,6 +944,9 @@ def get_additional_fields(data):
v = data.get(field, UNSET) v = data.get(field, UNSET)
if v == UNSET: if v == UNSET:
continue continue
# in some cases we use the serializer context to pass objects instances, we don't want to add them
if not isinstance(v, str) or isinstance(v, dict):
continue
additional_fields[field] = v additional_fields[field] = v
return additional_fields return additional_fields
@ -2434,7 +2437,7 @@ class PlaylistSerializer(jsonld.JsonLdSerializer):
if not actor.is_local: if not actor.is_local:
ap_to_fw_data["privacy_level"] = ( ap_to_fw_data["privacy_level"] = (
contexts.AS.Public contexts.AS.Public
if validated_data["privacy_level"] == "everyone" if validated_data.get("privacy_level", "") == "everyone"
else "" else ""
) )

View File

@ -144,7 +144,7 @@ def check_succefull_migration(apps, schema_editor):
not_build_in_libs = len(actor.playlists.all()) + len( not_build_in_libs = len(actor.playlists.all()) + len(
actor.libraries.filter(channel__isnull=False) actor.libraries.filter(channel__isnull=False)
) )
if len(actor.libraries.all()) - 2 != not_build_in_libs: if len(actor.libraries.all()) - 3 != not_build_in_libs:
raise Exception( raise Exception(
"Incoherent library database state, check for errors in log and share them to the funkwhale team. Migration was abordted to prevent data loss" "Incoherent library database state, check for errors in log and share them to the funkwhale team. Migration was abordted to prevent data loss"
) )

View File

@ -15,7 +15,7 @@ class PlaylistXspfRenderer(renderers.BaseRenderer):
if isinstance(data, bytes): if isinstance(data, bytes):
return data return data
fw_playlist = Playlist.objects.get(id=data["id"]) fw_playlist = Playlist.objects.get(uuid=data["uuid"])
plt_tracks = fw_playlist.playlist_tracks.prefetch_related("track") plt_tracks = fw_playlist.playlist_tracks.prefetch_related("track")
top = Element("playlist", version="1", xmlns="http://xspf.org/ns/0/") top = Element("playlist", version="1", xmlns="http://xspf.org/ns/0/")
title_xspf = SubElement(top, "title") title_xspf = SubElement(top, "title")

View File

@ -22,7 +22,7 @@ def test_mutation_fid_is_populated(factories, model, factory_args, namespace):
("music.Artist", "/library/artists/{obj.pk}"), ("music.Artist", "/library/artists/{obj.pk}"),
("music.Album", "/library/albums/{obj.pk}"), ("music.Album", "/library/albums/{obj.pk}"),
("music.Track", "/library/tracks/{obj.pk}"), ("music.Track", "/library/tracks/{obj.pk}"),
("playlists.Playlist", "/library/playlists/{obj.pk}"), ("playlists.Playlist", "/library/playlists/{obj.uuid}"),
], ],
) )
def test_get_absolute_url(factory_name, factories, expected): def test_get_absolute_url(factory_name, factories, expected):

View File

@ -75,7 +75,8 @@ def test_playlist_serializer(factories, to_api_date):
actor = playlist.actor actor = playlist.actor
expected = { expected = {
"id": playlist.pk, "uuid": playlist.uuid,
"fid": playlist.fid,
"name": playlist.name, "name": playlist.name,
"privacy_level": playlist.privacy_level, "privacy_level": playlist.privacy_level,
"is_playable": False, "is_playable": False,

View File

@ -24,7 +24,7 @@ def test_can_get_playlists_octet_stream(factories, logged_in_api_client):
factories["playlists.PlaylistTrack"](playlist=pl) factories["playlists.PlaylistTrack"](playlist=pl)
factories["playlists.PlaylistTrack"](playlist=pl) factories["playlists.PlaylistTrack"](playlist=pl)
url = reverse("api:v2:playlists-detail", kwargs={"pk": pl.pk}) url = reverse("api:v2:playlists-detail", kwargs={"uuid": pl.uuid})
headers = {"Accept": "application/octet-stream"} headers = {"Accept": "application/octet-stream"}
response = logged_in_api_client.get(url, headers=headers) response = logged_in_api_client.get(url, headers=headers)
el = etree.fromstring(response.content) el = etree.fromstring(response.content)
@ -36,7 +36,7 @@ def test_can_get_playlists_octet_stream(factories, logged_in_api_client):
def test_can_get_playlists_json(factories, logged_in_api_client): def test_can_get_playlists_json(factories, logged_in_api_client):
logged_in_api_client.user.create_actor() logged_in_api_client.user.create_actor()
pl = factories["playlists.Playlist"]() pl = factories["playlists.Playlist"]()
url = reverse("api:v2:playlists-detail", kwargs={"pk": pl.pk}) url = reverse("api:v2:playlists-detail", kwargs={"uuid": pl.uuid})
response = logged_in_api_client.get(url, format="json") response = logged_in_api_client.get(url, format="json")
assert response.status_code == 200 assert response.status_code == 200
assert response.data["name"] == pl.name assert response.data["name"] == pl.name
@ -105,7 +105,7 @@ def test_can_patch_playlists_octet_stream(factories, logged_in_api_client):
track = factories["music.Track"]( track = factories["music.Track"](
title="Opinel 12", artist_credit__artist=artist, album=album title="Opinel 12", artist_credit__artist=artist, album=album
) )
url = reverse("api:v2:playlists-detail", kwargs={"pk": pl.pk}) url = reverse("api:v2:playlists-detail", kwargs={"uuid": pl.uuid})
data = open("./tests/playlists/test.xspf", "rb").read() data = open("./tests/playlists/test.xspf", "rb").read()
response = logged_in_api_client.patch(url, data=data, format="xspf") response = logged_in_api_client.patch(url, data=data, format="xspf")
pl.refresh_from_db() pl.refresh_from_db()
@ -118,7 +118,7 @@ def test_can_get_playlists_track(factories, logged_in_api_client):
logged_in_api_client.user.create_actor() logged_in_api_client.user.create_actor()
pl = factories["playlists.Playlist"]() pl = factories["playlists.Playlist"]()
plt = factories["playlists.PlaylistTrack"](playlist=pl) plt = factories["playlists.PlaylistTrack"](playlist=pl)
url = reverse("api:v2:playlists-tracks", kwargs={"pk": pl.pk}) url = reverse("api:v2:playlists-tracks", kwargs={"uuid": pl.uuid})
response = logged_in_api_client.get(url) response = logged_in_api_client.get(url)
data = json.loads(response.content.decode("utf-8")) data = json.loads(response.content.decode("utf-8"))
assert response.status_code == 200 assert response.status_code == 200
@ -130,7 +130,7 @@ def test_can_get_playlists_releases(factories, logged_in_api_client):
logged_in_api_client.user.create_actor() logged_in_api_client.user.create_actor()
playlist = factories["playlists.Playlist"]() playlist = factories["playlists.Playlist"]()
plt = factories["playlists.PlaylistTrack"](playlist=playlist) plt = factories["playlists.PlaylistTrack"](playlist=playlist)
url = reverse("api:v2:playlists-albums", kwargs={"pk": playlist.pk}) url = reverse("api:v2:playlists-albums", kwargs={"uuid": playlist.uuid})
response = logged_in_api_client.get(url) response = logged_in_api_client.get(url)
data = json.loads(response.content) data = json.loads(response.content)
assert response.status_code == 200 assert response.status_code == 200
@ -141,7 +141,7 @@ def test_can_get_playlists_artists(factories, logged_in_api_client):
logged_in_api_client.user.create_actor() logged_in_api_client.user.create_actor()
playlist = factories["playlists.Playlist"]() playlist = factories["playlists.Playlist"]()
plt = factories["playlists.PlaylistTrack"](playlist=playlist) plt = factories["playlists.PlaylistTrack"](playlist=playlist)
url = reverse("api:v2:playlists-artists", kwargs={"pk": playlist.pk}) url = reverse("api:v2:playlists-artists", kwargs={"uuid": playlist.uuid})
response = logged_in_api_client.get(url) response = logged_in_api_client.get(url)
data = json.loads(response.content) data = json.loads(response.content)
assert response.status_code == 200 assert response.status_code == 200

View File

@ -21,7 +21,7 @@ def test_serializer_includes_tracks_count(factories, logged_in_api_client):
actor = logged_in_api_client.user.create_actor() actor = logged_in_api_client.user.create_actor()
playlist = factories["playlists.Playlist"](actor=actor) playlist = factories["playlists.Playlist"](actor=actor)
factories["playlists.PlaylistTrack"](playlist=playlist) factories["playlists.PlaylistTrack"](playlist=playlist)
url = reverse("api:v1:playlists-detail", kwargs={"pk": playlist.pk}) url = reverse("api:v1:playlists-detail", kwargs={"uuid": playlist.uuid})
response = logged_in_api_client.get(url, content_type="application/json") response = logged_in_api_client.get(url, content_type="application/json")
assert response.data["tracks_count"] == 1 assert response.data["tracks_count"] == 1
@ -34,7 +34,7 @@ def test_serializer_includes_tracks_count_986(factories, logged_in_api_client):
factories["music.Upload"].create_batch( factories["music.Upload"].create_batch(
3, track=plt.track, library__privacy_level="everyone", import_status="finished" 3, track=plt.track, library__privacy_level="everyone", import_status="finished"
) )
url = reverse("api:v1:playlists-detail", kwargs={"pk": playlist.pk}) url = reverse("api:v1:playlists-detail", kwargs={"uuid": playlist.uuid})
response = logged_in_api_client.get(url, content_type="application/json") response = logged_in_api_client.get(url, content_type="application/json")
assert response.data["tracks_count"] == 1 assert response.data["tracks_count"] == 1
@ -45,7 +45,7 @@ def test_serializer_includes_is_playable(factories, logged_in_api_client):
playlist = factories["playlists.Playlist"]() playlist = factories["playlists.Playlist"]()
factories["playlists.PlaylistTrack"](playlist=playlist) factories["playlists.PlaylistTrack"](playlist=playlist)
url = reverse("api:v1:playlists-detail", kwargs={"pk": playlist.pk}) url = reverse("api:v1:playlists-detail", kwargs={"uuid": playlist.uuid})
response = logged_in_api_client.get(url, content_type="application/json") response = logged_in_api_client.get(url, content_type="application/json")
assert response.data["is_playable"] is False assert response.data["is_playable"] is False
@ -81,7 +81,7 @@ def test_only_can_add_track_on_own_playlist_via_api(factories, logged_in_api_cli
logged_in_api_client.user.create_actor() logged_in_api_client.user.create_actor()
track = factories["music.Track"]() track = factories["music.Track"]()
playlist = factories["playlists.Playlist"]() playlist = factories["playlists.Playlist"]()
url = reverse("api:v1:playlists-add", kwargs={"pk": playlist.pk}) url = reverse("api:v1:playlists-add", kwargs={"uuid": playlist.uuid})
data = {"tracks": [track.pk]} data = {"tracks": [track.pk]}
response = logged_in_api_client.post(url, data, content_type="application/json") response = logged_in_api_client.post(url, data, content_type="application/json")
@ -96,7 +96,7 @@ def test_deleting_plt_updates_indexes(mocker, factories, logged_in_api_client):
playlist = factories["playlists.Playlist"](actor=actor) playlist = factories["playlists.Playlist"](actor=actor)
plt0 = factories["playlists.PlaylistTrack"](index=0, playlist=playlist) plt0 = factories["playlists.PlaylistTrack"](index=0, playlist=playlist)
plt1 = factories["playlists.PlaylistTrack"](index=1, playlist=playlist) plt1 = factories["playlists.PlaylistTrack"](index=1, playlist=playlist)
url = reverse("api:v1:playlists-remove", kwargs={"pk": playlist.pk}) url = reverse("api:v1:playlists-remove", kwargs={"uuid": playlist.uuid})
response = logged_in_api_client.delete(url, {"index": 0}) response = logged_in_api_client.delete(url, {"index": 0})
@ -125,7 +125,7 @@ def test_deleting_plt_updates_pl_lib(mocker, factories, logged_in_api_client):
) )
track_ids = [t.id for t in tracks] track_ids = [t.id for t in tracks]
url = reverse("api:v1:playlists-add", kwargs={"pk": playlist.pk}) url = reverse("api:v1:playlists-add", kwargs={"uuid": playlist.uuid})
logged_in_api_client.post(url, {"tracks": track_ids}) logged_in_api_client.post(url, {"tracks": track_ids})
assert not_user_upload not in playlist.library.uploads.all() assert not_user_upload not in playlist.library.uploads.all()
@ -133,7 +133,7 @@ def test_deleting_plt_updates_pl_lib(mocker, factories, logged_in_api_client):
for upload in playlist.library.uploads.all(): for upload in playlist.library.uploads.all():
assert upload.tracks.filter(id=plt.track.id).exists() assert upload.tracks.filter(id=plt.track.id).exists()
url = reverse("api:v1:playlists-remove", kwargs={"pk": playlist.pk}) url = reverse("api:v1:playlists-remove", kwargs={"uuid": playlist.uuid})
logged_in_api_client.delete(url, {"index": 0}) logged_in_api_client.delete(url, {"index": 0})
playlist.library.refresh_from_db() playlist.library.refresh_from_db()
@ -158,7 +158,7 @@ def test_playlist_privacy_respected_in_list_anon(
def test_only_owner_can_edit_playlist(method, factories, logged_in_api_client): def test_only_owner_can_edit_playlist(method, factories, logged_in_api_client):
logged_in_api_client.user.create_actor() logged_in_api_client.user.create_actor()
playlist = factories["playlists.Playlist"]() playlist = factories["playlists.Playlist"]()
url = reverse("api:v1:playlists-detail", kwargs={"pk": playlist.pk}) url = reverse("api:v1:playlists-detail", kwargs={"uuid": playlist.uuid})
response = getattr(logged_in_api_client, method.lower())(url) response = getattr(logged_in_api_client, method.lower())(url)
assert response.status_code == 404 assert response.status_code == 404
@ -172,7 +172,7 @@ def test_can_add_multiple_tracks_at_once_via_api(
tracks = factories["music.Track"].create_batch(size=5) tracks = factories["music.Track"].create_batch(size=5)
track_ids = [t.id for t in tracks] track_ids = [t.id for t in tracks]
mocker.spy(playlist, "insert_many") mocker.spy(playlist, "insert_many")
url = reverse("api:v1:playlists-add", kwargs={"pk": playlist.pk}) url = reverse("api:v1:playlists-add", kwargs={"uuid": playlist.uuid})
response = logged_in_api_client.post(url, {"tracks": track_ids}) response = logged_in_api_client.post(url, {"tracks": track_ids})
assert response.status_code == 201 assert response.status_code == 201
@ -207,7 +207,7 @@ def test_add_multiple_tracks_at_once_update_pl_library(
track_ids.append(not_user_track.id) track_ids.append(not_user_track.id)
track_ids.append(track_already_in_playlist.id) track_ids.append(track_already_in_playlist.id)
mocker.spy(playlist, "insert_many") mocker.spy(playlist, "insert_many")
url = reverse("api:v1:playlists-add", kwargs={"pk": playlist.pk}) url = reverse("api:v1:playlists-add", kwargs={"uuid": playlist.uuid})
response = logged_in_api_client.post(url, {"tracks": track_ids}) response = logged_in_api_client.post(url, {"tracks": track_ids})
assert response.status_code == 201 assert response.status_code == 201
@ -229,7 +229,7 @@ def test_honor_max_playlist_size(factories, mocker, logged_in_api_client, prefer
) )
track_ids = [t.id for t in tracks] track_ids = [t.id for t in tracks]
mocker.spy(playlist, "insert_many") mocker.spy(playlist, "insert_many")
url = reverse("api:v1:playlists-add", kwargs={"pk": playlist.pk}) url = reverse("api:v1:playlists-add", kwargs={"uuid": playlist.uuid})
response = logged_in_api_client.post(url, {"tracks": track_ids}) response = logged_in_api_client.post(url, {"tracks": track_ids})
assert response.status_code == 400 assert response.status_code == 400
@ -239,7 +239,7 @@ def test_can_clear_playlist_from_api(factories, mocker, logged_in_api_client):
actor = logged_in_api_client.user.create_actor() actor = logged_in_api_client.user.create_actor()
playlist = factories["playlists.Playlist"](actor=actor) playlist = factories["playlists.Playlist"](actor=actor)
factories["playlists.PlaylistTrack"].create_batch(size=5, playlist=playlist) factories["playlists.PlaylistTrack"].create_batch(size=5, playlist=playlist)
url = reverse("api:v1:playlists-clear", kwargs={"pk": playlist.pk}) url = reverse("api:v1:playlists-clear", kwargs={"uuid": playlist.uuid})
response = logged_in_api_client.delete(url) response = logged_in_api_client.delete(url)
assert response.status_code == 204 assert response.status_code == 204
@ -255,7 +255,7 @@ def test_clear_playlist_from_api_remove_pl_lib_uploads(
for upload in playlist.library.uploads.all(): for upload in playlist.library.uploads.all():
assert upload.playlist_libraries.filter(playlist=playlist).exists() assert upload.playlist_libraries.filter(playlist=playlist).exists()
assert upload.playlist_libraries.get(playlist=playlist).actor == actor assert upload.playlist_libraries.get(playlist=playlist).actor == actor
url = reverse("api:v1:playlists-clear", kwargs={"pk": playlist.pk}) url = reverse("api:v1:playlists-clear", kwargs={"uuid": playlist.uuid})
response = logged_in_api_client.delete(url) response = logged_in_api_client.delete(url)
assert response.status_code == 204 assert response.status_code == 204
@ -266,7 +266,7 @@ def test_update_playlist_from_api(factories, mocker, logged_in_api_client):
actor = logged_in_api_client.user.create_actor() actor = logged_in_api_client.user.create_actor()
playlist = factories["playlists.Playlist"](actor=actor) playlist = factories["playlists.Playlist"](actor=actor)
factories["playlists.PlaylistTrack"].create_batch(size=5, playlist=playlist) factories["playlists.PlaylistTrack"].create_batch(size=5, playlist=playlist)
url = reverse("api:v1:playlists-detail", kwargs={"pk": playlist.pk}) url = reverse("api:v1:playlists-detail", kwargs={"uuid": playlist.uuid})
response = logged_in_api_client.patch(url, {"name": "test"}) response = logged_in_api_client.patch(url, {"name": "test"})
playlist.refresh_from_db() playlist.refresh_from_db()
@ -279,7 +279,7 @@ def test_move_plt_updates_indexes(mocker, factories, logged_in_api_client):
playlist = factories["playlists.Playlist"](actor=actor) playlist = factories["playlists.Playlist"](actor=actor)
plt0 = factories["playlists.PlaylistTrack"](index=0, playlist=playlist) plt0 = factories["playlists.PlaylistTrack"](index=0, playlist=playlist)
plt1 = factories["playlists.PlaylistTrack"](index=1, playlist=playlist) plt1 = factories["playlists.PlaylistTrack"](index=1, playlist=playlist)
url = reverse("api:v1:playlists-move", kwargs={"pk": playlist.pk}) url = reverse("api:v1:playlists-move", kwargs={"uuid": playlist.uuid})
response = logged_in_api_client.post(url, {"from": 1, "to": 0}) response = logged_in_api_client.post(url, {"from": 1, "to": 0})