Skip to content
Snippets Groups Projects
test_routes.py 4.33 KiB
Newer Older
  • Learn to ignore specific revisions
  • 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