Expose public libraries and channels in standard API

This commit is contained in:
Agate 2020-07-28 14:21:15 +02:00
parent 91dbfde3ea
commit eb66d4e3d2
8 changed files with 311 additions and 55 deletions

View file

@ -517,3 +517,113 @@ def test_artist_retrieve_redirects_to_html_if_header_set(
)
assert response.status_code == 302
assert response["Location"] == expected_url
@pytest.mark.parametrize("index", ["channels", "libraries"])
def test_public_index_disabled(index, api_client, preferences):
preferences["federation__public_index"] = False
url = reverse("federation:index:index-{}".format(index))
response = api_client.get(url)
assert response.status_code == 405
def test_index_channels_retrieve(factories, api_client):
channels = [
factories["audio.Channel"](actor__local=True),
factories["audio.Channel"](actor__local=True),
factories["audio.Channel"](actor__local=True),
]
expected = serializers.IndexSerializer(
{
"id": federation_utils.full_url(reverse("federation:index:index-channels")),
"items": channels[0].__class__.objects.order_by("creation_date"),
"page_size": 100,
},
).data
url = reverse("federation:index:index-channels",)
response = api_client.get(url)
assert response.status_code == 200
assert response.data == expected
def test_index_channels_page(factories, api_client, preferences):
preferences["federation__collection_page_size"] = 1
remote_actor = factories["federation.Actor"]()
channels = [
factories["audio.Channel"](actor__local=True),
factories["audio.Channel"](actor__local=True),
factories["audio.Channel"](actor__local=True),
factories["audio.Channel"](actor=remote_actor),
]
id = federation_utils.full_url(reverse("federation:index:index-channels"))
expected = serializers.CollectionPageSerializer(
{
"id": id,
"item_serializer": serializers.ActorSerializer,
"page": Paginator([c.actor for c in channels][:3], 1).page(1),
"actor": None,
}
).data
url = reverse("federation:index:index-channels")
response = api_client.get(url, {"page": 1})
assert response.status_code == 200
assert response.data == expected
def test_index_libraries_retrieve(factories, api_client):
remote_actor = factories["federation.Actor"]()
libraries = [
factories["music.Library"](actor__local=True, privacy_level="everyone"),
factories["music.Library"](actor__local=True, privacy_level="everyone"),
factories["music.Library"](actor__local=True, privacy_level="me"),
factories["music.Library"](actor=remote_actor, privacy_level="everyone"),
]
expected = serializers.IndexSerializer(
{
"id": federation_utils.full_url(
reverse("federation:index:index-libraries")
),
"items": libraries[0]
.__class__.objects.local()
.filter(privacy_level="everyone")
.order_by("creation_date"),
"page_size": 100,
},
).data
url = reverse("federation:index:index-libraries")
response = api_client.get(url)
assert response.status_code == 200
assert response.data == expected
def test_index_libraries_page(factories, api_client, preferences):
preferences["federation__collection_page_size"] = 1
remote_actor = factories["federation.Actor"]()
libraries = [
factories["music.Library"](actor__local=True, privacy_level="everyone"),
factories["music.Library"](actor__local=True, privacy_level="everyone"),
factories["music.Library"](actor__local=True, privacy_level="me"),
factories["music.Library"](actor=remote_actor, privacy_level="everyone"),
]
id = federation_utils.full_url(reverse("federation:index:index-libraries"))
expected = serializers.CollectionPageSerializer(
{
"id": id,
"item_serializer": serializers.LibrarySerializer,
"page": Paginator(libraries[:2], 1).page(1),
"actor": None,
}
).data
url = reverse("federation:index:index-libraries")
response = api_client.get(url, {"page": 1})
assert response.status_code == 200
assert response.data == expected

View file

@ -93,9 +93,17 @@ def test_nodeinfo_dump(preferences, mocker, avatar):
"instance__funkwhale_support_message_enabled"
],
"instanceSupportMessage": preferences["instance__support_message"],
"knownNodesListUrl": federation_utils.full_url(
reverse("api:v1:federation:domains-list")
),
"endpoints": {
"knownNodes": federation_utils.full_url(
reverse("api:v1:federation:domains-list")
),
"libraries": federation_utils.full_url(
reverse("federation:index:index-libraries")
),
"channels": federation_utils.full_url(
reverse("federation:index:index-channels")
),
},
},
}
assert nodeinfo.get() == expected
@ -103,6 +111,7 @@ def test_nodeinfo_dump(preferences, mocker, avatar):
def test_nodeinfo_dump_stats_disabled(preferences, mocker):
preferences["instance__nodeinfo_stats_enabled"] = False
preferences["federation__public_index"] = False
preferences["moderation__unauthenticated_report_types"] = [
"takedown_request",
"other",
@ -161,7 +170,7 @@ def test_nodeinfo_dump_stats_disabled(preferences, mocker):
"instance__funkwhale_support_message_enabled"
],
"instanceSupportMessage": preferences["instance__support_message"],
"knownNodesListUrl": None,
"endpoints": {"knownNodes": None, "libraries": None, "channels": None},
},
}
assert nodeinfo.get() == expected