mirror of
https://code.eliotberriot.com/funkwhale/funkwhale.git
synced 2025-10-05 18:05:25 +02:00
Resolve "Per-user libraries" (use !368 instead)
This commit is contained in:
parent
b0ca181016
commit
2ea21994ee
144 changed files with 6749 additions and 5347 deletions
147
api/tests/federation/test_routes.py
Normal file
147
api/tests/federation/test_routes.py
Normal file
|
@ -0,0 +1,147 @@
|
|||
import pytest
|
||||
|
||||
from funkwhale_api.federation import routes, serializers
|
||||
|
||||
|
||||
@pytest.mark.parametrize(
|
||||
"route,handler",
|
||||
[
|
||||
({"type": "Follow"}, routes.inbox_follow),
|
||||
({"type": "Accept"}, routes.inbox_accept),
|
||||
],
|
||||
)
|
||||
def test_inbox_routes(route, handler):
|
||||
for r, h in routes.inbox.routes:
|
||||
if r == route:
|
||||
assert h == handler
|
||||
return
|
||||
|
||||
assert False, "Inbox route {} not found".format(route)
|
||||
|
||||
|
||||
@pytest.mark.parametrize(
|
||||
"route,handler",
|
||||
[
|
||||
({"type": "Accept"}, routes.outbox_accept),
|
||||
({"type": "Follow"}, routes.outbox_follow),
|
||||
],
|
||||
)
|
||||
def test_outbox_routes(route, handler):
|
||||
for r, h in routes.outbox.routes:
|
||||
if r == route:
|
||||
assert h == handler
|
||||
return
|
||||
|
||||
assert False, "Outbox route {} not found".format(route)
|
||||
|
||||
|
||||
def test_inbox_follow_library_autoapprove(factories, mocker):
|
||||
mocked_accept_follow = mocker.patch(
|
||||
"funkwhale_api.federation.activity.accept_follow"
|
||||
)
|
||||
|
||||
local_actor = factories["users.User"]().create_actor()
|
||||
remote_actor = factories["federation.Actor"]()
|
||||
library = factories["music.Library"](actor=local_actor, privacy_level="everyone")
|
||||
ii = factories["federation.InboxItem"](actor=local_actor)
|
||||
|
||||
payload = {
|
||||
"type": "Follow",
|
||||
"id": "https://test.follow",
|
||||
"actor": remote_actor.fid,
|
||||
"object": library.fid,
|
||||
}
|
||||
|
||||
routes.inbox_follow(
|
||||
payload,
|
||||
context={"actor": remote_actor, "inbox_items": [ii], "raise_exception": True},
|
||||
)
|
||||
|
||||
follow = library.received_follows.latest("id")
|
||||
|
||||
assert follow.fid == payload["id"]
|
||||
assert follow.actor == remote_actor
|
||||
assert follow.approved is True
|
||||
|
||||
mocked_accept_follow.assert_called_once_with(follow)
|
||||
|
||||
|
||||
def test_inbox_follow_library_manual_approve(factories, mocker):
|
||||
mocked_accept_follow = mocker.patch(
|
||||
"funkwhale_api.federation.activity.accept_follow"
|
||||
)
|
||||
|
||||
local_actor = factories["users.User"]().create_actor()
|
||||
remote_actor = factories["federation.Actor"]()
|
||||
library = factories["music.Library"](actor=local_actor, privacy_level="me")
|
||||
ii = factories["federation.InboxItem"](actor=local_actor)
|
||||
|
||||
payload = {
|
||||
"type": "Follow",
|
||||
"id": "https://test.follow",
|
||||
"actor": remote_actor.fid,
|
||||
"object": library.fid,
|
||||
}
|
||||
|
||||
routes.inbox_follow(
|
||||
payload,
|
||||
context={"actor": remote_actor, "inbox_items": [ii], "raise_exception": True},
|
||||
)
|
||||
|
||||
follow = library.received_follows.latest("id")
|
||||
|
||||
assert follow.fid == payload["id"]
|
||||
assert follow.actor == remote_actor
|
||||
assert follow.approved is False
|
||||
|
||||
mocked_accept_follow.assert_not_called()
|
||||
|
||||
|
||||
def test_outbox_accept(factories, mocker):
|
||||
remote_actor = factories["federation.Actor"]()
|
||||
follow = factories["federation.LibraryFollow"](actor=remote_actor)
|
||||
|
||||
activity = list(routes.outbox_accept({"follow": follow}))[0]
|
||||
|
||||
serializer = serializers.AcceptFollowSerializer(
|
||||
follow, context={"actor": follow.target.actor}
|
||||
)
|
||||
expected = serializer.data
|
||||
expected["to"] = [follow.actor]
|
||||
|
||||
assert activity["payload"] == expected
|
||||
assert activity["actor"] == follow.target.actor
|
||||
|
||||
|
||||
def test_inbox_accept(factories, mocker):
|
||||
mocked_scan = mocker.patch("funkwhale_api.music.models.Library.schedule_scan")
|
||||
local_actor = factories["users.User"]().create_actor()
|
||||
remote_actor = factories["federation.Actor"]()
|
||||
follow = factories["federation.LibraryFollow"](
|
||||
actor=local_actor, target__actor=remote_actor
|
||||
)
|
||||
assert follow.approved is None
|
||||
serializer = serializers.AcceptFollowSerializer(
|
||||
follow, context={"actor": remote_actor}
|
||||
)
|
||||
ii = factories["federation.InboxItem"](actor=local_actor)
|
||||
routes.inbox_accept(
|
||||
serializer.data,
|
||||
context={"actor": remote_actor, "inbox_items": [ii], "raise_exception": True},
|
||||
)
|
||||
|
||||
follow.refresh_from_db()
|
||||
|
||||
assert follow.approved is True
|
||||
mocked_scan.assert_called_once_with()
|
||||
|
||||
|
||||
def test_outbox_follow_library(factories, mocker):
|
||||
follow = factories["federation.LibraryFollow"]()
|
||||
activity = list(routes.outbox_follow({"follow": follow}))[0]
|
||||
serializer = serializers.FollowSerializer(follow, context={"actor": follow.actor})
|
||||
expected = serializer.data
|
||||
expected["to"] = [follow.target.actor]
|
||||
|
||||
assert activity["payload"] == expected
|
||||
assert activity["actor"] == follow.actor
|
Loading…
Add table
Add a link
Reference in a new issue