Resolve "Support browsing a specific library content"

This commit is contained in:
Eliot Berriot 2020-03-04 22:18:28 +01:00
commit b166182762
47 changed files with 1020 additions and 336 deletions

View file

@ -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,
}

View file

@ -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

View file

@ -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]

View file

@ -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