Resolve "Support browsing a specific library content"
This commit is contained in:
parent
ecc3ed3ac3
commit
b166182762
47 changed files with 1020 additions and 336 deletions
|
|
@ -286,3 +286,25 @@ def test_fetch_duplicate_bypass_with_force(
|
|||
assert response.status_code == 201
|
||||
assert response.data == api_serializers.FetchSerializer(fetch).data
|
||||
fetch_task.assert_called_once_with(fetch_id=fetch.pk)
|
||||
|
||||
|
||||
def test_library_follow_get_all(factories, logged_in_api_client):
|
||||
actor = logged_in_api_client.user.create_actor()
|
||||
library = factories["music.Library"]()
|
||||
follow = factories["federation.LibraryFollow"](target=library, actor=actor)
|
||||
factories["federation.LibraryFollow"]()
|
||||
factories["music.Library"]()
|
||||
url = reverse("api:v1:federation:library-follows-all")
|
||||
response = logged_in_api_client.get(url)
|
||||
|
||||
assert response.status_code == 200
|
||||
assert response.data == {
|
||||
"results": [
|
||||
{
|
||||
"uuid": str(follow.uuid),
|
||||
"library": str(library.uuid),
|
||||
"approved": follow.approved,
|
||||
}
|
||||
],
|
||||
"count": 1,
|
||||
}
|
||||
|
|
|
|||
|
|
@ -2,7 +2,14 @@ import pytest
|
|||
from django.core.paginator import Paginator
|
||||
from django.urls import reverse
|
||||
|
||||
from funkwhale_api.federation import actors, serializers, webfinger
|
||||
from funkwhale_api.common import utils
|
||||
|
||||
from funkwhale_api.federation import (
|
||||
actors,
|
||||
serializers,
|
||||
webfinger,
|
||||
utils as federation_utils,
|
||||
)
|
||||
|
||||
|
||||
def test_authenticate_skips_anonymous_fetch_when_allow_list_enabled(
|
||||
|
|
@ -159,7 +166,7 @@ def test_wellknown_webfinger_local(factories, api_client, settings, mocker):
|
|||
|
||||
@pytest.mark.parametrize("privacy_level", ["me", "instance", "everyone"])
|
||||
def test_music_library_retrieve(factories, api_client, privacy_level):
|
||||
library = factories["music.Library"](privacy_level=privacy_level)
|
||||
library = factories["music.Library"](privacy_level=privacy_level, actor__local=True)
|
||||
expected = serializers.LibrarySerializer(library).data
|
||||
|
||||
url = reverse("federation:music:libraries-detail", kwargs={"uuid": library.uuid})
|
||||
|
|
@ -170,7 +177,7 @@ def test_music_library_retrieve(factories, api_client, privacy_level):
|
|||
|
||||
|
||||
def test_music_library_retrieve_excludes_channel_libraries(factories, api_client):
|
||||
channel = factories["audio.Channel"]()
|
||||
channel = factories["audio.Channel"](local=True)
|
||||
library = channel.library
|
||||
|
||||
url = reverse("federation:music:libraries-detail", kwargs={"uuid": library.uuid})
|
||||
|
|
@ -180,7 +187,7 @@ def test_music_library_retrieve_excludes_channel_libraries(factories, api_client
|
|||
|
||||
|
||||
def test_music_library_retrieve_page_public(factories, api_client):
|
||||
library = factories["music.Library"](privacy_level="everyone")
|
||||
library = factories["music.Library"](privacy_level="everyone", actor__local=True)
|
||||
upload = factories["music.Upload"](library=library, import_status="finished")
|
||||
id = library.get_federation_id()
|
||||
expected = serializers.CollectionPageSerializer(
|
||||
|
|
@ -253,7 +260,7 @@ def test_channel_upload_retrieve(factories, api_client):
|
|||
|
||||
@pytest.mark.parametrize("privacy_level", ["me", "instance"])
|
||||
def test_music_library_retrieve_page_private(factories, api_client, privacy_level):
|
||||
library = factories["music.Library"](privacy_level=privacy_level)
|
||||
library = factories["music.Library"](privacy_level=privacy_level, actor__local=True)
|
||||
url = reverse("federation:music:libraries-detail", kwargs={"uuid": library.uuid})
|
||||
response = api_client.get(url, {"page": 1})
|
||||
|
||||
|
|
@ -264,7 +271,7 @@ def test_music_library_retrieve_page_private(factories, api_client, privacy_leve
|
|||
def test_music_library_retrieve_page_follow(
|
||||
factories, api_client, authenticated_actor, approved, expected
|
||||
):
|
||||
library = factories["music.Library"](privacy_level="me")
|
||||
library = factories["music.Library"](privacy_level="me", actor__local=True)
|
||||
factories["federation.LibraryFollow"](
|
||||
actor=authenticated_actor, target=library, approved=approved
|
||||
)
|
||||
|
|
@ -344,3 +351,35 @@ def test_music_upload_detail_private_approved_follow(
|
|||
response = api_client.get(url)
|
||||
|
||||
assert response.status_code == 200
|
||||
|
||||
|
||||
@pytest.mark.parametrize(
|
||||
"accept_header,expected",
|
||||
[
|
||||
("text/html,application/xhtml+xml", True),
|
||||
("text/html,application/json", True),
|
||||
("", False),
|
||||
(None, False),
|
||||
("application/json", False),
|
||||
("application/activity+json", False),
|
||||
("application/json,text/html", False),
|
||||
("application/activity+json,text/html", False),
|
||||
],
|
||||
)
|
||||
def test_should_redirect_ap_to_html(accept_header, expected):
|
||||
assert federation_utils.should_redirect_ap_to_html(accept_header) is expected
|
||||
|
||||
|
||||
def test_music_library_retrieve_redirects_to_html_if_header_set(
|
||||
factories, api_client, settings
|
||||
):
|
||||
library = factories["music.Library"](actor__local=True)
|
||||
|
||||
url = reverse("federation:music:libraries-detail", kwargs={"uuid": library.uuid})
|
||||
response = api_client.get(url, HTTP_ACCEPT="text/html")
|
||||
expected_url = utils.join_url(
|
||||
settings.FUNKWHALE_URL,
|
||||
utils.spa_reverse("library_library", kwargs={"uuid": library.uuid}),
|
||||
)
|
||||
assert response.status_code == 302
|
||||
assert response["Location"] == expected_url
|
||||
|
|
|
|||
|
|
@ -142,3 +142,45 @@ def test_channel_filter_album(factories, queryset_equal_list, mocker, anonymous_
|
|||
)
|
||||
|
||||
assert filterset.qs == [upload.track.album]
|
||||
|
||||
|
||||
def test_library_filter_track(factories, queryset_equal_list, mocker, anonymous_user):
|
||||
library = factories["music.Library"](privacy_level="everyone")
|
||||
upload = factories["music.Upload"](library=library, playable=True)
|
||||
factories["music.Track"]()
|
||||
qs = upload.track.__class__.objects.all()
|
||||
filterset = filters.TrackFilter(
|
||||
{"library": library.uuid},
|
||||
request=mocker.Mock(user=anonymous_user, actor=None),
|
||||
queryset=qs,
|
||||
)
|
||||
|
||||
assert filterset.qs == [upload.track]
|
||||
|
||||
|
||||
def test_library_filter_album(factories, queryset_equal_list, mocker, anonymous_user):
|
||||
library = factories["music.Library"](privacy_level="everyone")
|
||||
upload = factories["music.Upload"](library=library, playable=True)
|
||||
factories["music.Album"]()
|
||||
qs = upload.track.album.__class__.objects.all()
|
||||
filterset = filters.AlbumFilter(
|
||||
{"library": library.uuid},
|
||||
request=mocker.Mock(user=anonymous_user, actor=None),
|
||||
queryset=qs,
|
||||
)
|
||||
|
||||
assert filterset.qs == [upload.track.album]
|
||||
|
||||
|
||||
def test_library_filter_artist(factories, queryset_equal_list, mocker, anonymous_user):
|
||||
library = factories["music.Library"](privacy_level="everyone")
|
||||
upload = factories["music.Upload"](library=library, playable=True)
|
||||
factories["music.Artist"]()
|
||||
qs = upload.track.artist.__class__.objects.all()
|
||||
filterset = filters.ArtistFilter(
|
||||
{"library": library.uuid},
|
||||
request=mocker.Mock(user=anonymous_user, actor=None),
|
||||
queryset=qs,
|
||||
)
|
||||
|
||||
assert filterset.qs == [upload.track.artist]
|
||||
|
|
|
|||
|
|
@ -282,3 +282,32 @@ def test_library_playlist_empty(spa_html, no_api_auth, client, factories, settin
|
|||
|
||||
# we only test our custom metas, not the default ones
|
||||
assert metas[: len(expected_metas)] == expected_metas
|
||||
|
||||
|
||||
def test_library_library(spa_html, no_api_auth, client, factories, settings):
|
||||
library = factories["music.Library"]()
|
||||
url = "/library/{}".format(library.uuid)
|
||||
|
||||
response = client.get(url)
|
||||
|
||||
expected_metas = [
|
||||
{
|
||||
"tag": "meta",
|
||||
"property": "og:url",
|
||||
"content": utils.join_url(settings.FUNKWHALE_URL, url),
|
||||
},
|
||||
{"tag": "meta", "property": "og:type", "content": "website"},
|
||||
{"tag": "meta", "property": "og:title", "content": library.name},
|
||||
{"tag": "meta", "property": "og:description", "content": library.description},
|
||||
{
|
||||
"tag": "link",
|
||||
"rel": "alternate",
|
||||
"type": "application/activity+json",
|
||||
"href": library.fid,
|
||||
},
|
||||
]
|
||||
|
||||
metas = utils.parse_meta(response.content.decode())
|
||||
|
||||
# we only test our custom metas, not the default ones
|
||||
assert metas[: len(expected_metas)] == expected_metas
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue