예제 #1
0
def test_receive_invalid_data(factories):
    remote_actor = factories["federation.Actor"]()
    a = {
        "@context": [],
        "actor": remote_actor.fid,
        "id": "https://test.activity"
    }

    with pytest.raises(serializers.serializers.ValidationError):
        activity.receive(activity=a, on_behalf_of=remote_actor)
예제 #2
0
def test_receive_actor_mismatch(factories):
    remote_actor = factories["federation.Actor"]()
    a = {
        "@context": [],
        "type": "Noop",
        "actor": "https://hello",
        "id": "https://test.activity",
    }

    with pytest.raises(serializers.serializers.ValidationError):
        activity.receive(activity=a, on_behalf_of=remote_actor)
예제 #3
0
def test_receive_validates_basic_attributes_and_stores_activity(
        factories, now, mocker):
    mocked_dispatch = mocker.patch("funkwhale_api.common.utils.on_commit")
    local_to_actor = factories["users.User"]().create_actor()
    local_cc_actor = factories["users.User"]().create_actor()
    remote_actor = factories["federation.Actor"]()
    a = {
        "@context": [],
        "actor": remote_actor.fid,
        "type": "Noop",
        "id": "https://test.activity",
        "to": [local_to_actor.fid, remote_actor.fid],
        "cc": [local_cc_actor.fid, activity.PUBLIC_ADDRESS],
    }

    copy = activity.receive(activity=a, on_behalf_of=remote_actor)

    assert copy.payload == a
    assert copy.creation_date >= now
    assert copy.actor == remote_actor
    assert copy.fid == a["id"]
    assert copy.type == "Noop"
    mocked_dispatch.assert_called_once_with(tasks.dispatch_inbox.delay,
                                            activity_id=copy.pk)

    assert models.InboxItem.objects.count() == 2
    for actor, t in [(local_to_actor, "to"), (local_cc_actor, "cc")]:
        ii = models.InboxItem.objects.get(actor=actor)
        assert ii.type == t
        assert ii.activity == copy
        assert ii.is_read is False
예제 #4
0
def test_receive_uses_follow_object_if_no_audience_provided(
    mrf_inbox_registry, factories, now, mocker
):
    mocker.patch.object(
        activity.InboxRouter, "get_matching_handlers", return_value=True
    )
    mocker.patch("funkwhale_api.common.utils.on_commit")
    local_to_actor = factories["users.User"]().create_actor()
    remote_actor = factories["federation.Actor"]()
    a = {
        "@context": [],
        "actor": remote_actor.fid,
        "type": "Follow",
        "id": "https://test.activity",
        "object": local_to_actor.fid,
    }

    activity.receive(activity=a, on_behalf_of=remote_actor, inbox_actor=None)

    assert models.InboxItem.objects.filter(actor=local_to_actor, type="to").exists()
예제 #5
0
def test_receive_validates_basic_attributes_and_stores_activity(
    mrf_inbox_registry, factories, now, mocker
):

    mocker.patch.object(
        activity.InboxRouter, "get_matching_handlers", return_value=True
    )
    mrf_inbox_registry_apply = mocker.spy(mrf_inbox_registry, "apply")
    serializer_init = mocker.spy(serializers.BaseActivitySerializer, "__init__")
    mocked_dispatch = mocker.patch("funkwhale_api.common.utils.on_commit")
    inbox_actor = factories["federation.Actor"]()
    local_to_actor = factories["users.User"]().create_actor()
    local_cc_actor = factories["users.User"]().create_actor()
    remote_actor = factories["federation.Actor"]()
    a = {
        "@context": [],
        "actor": remote_actor.fid,
        "type": "Noop",
        "id": "https://test.activity",
        "to": [local_to_actor.fid, remote_actor.fid],
        "cc": [local_cc_actor.fid, activity.PUBLIC_ADDRESS],
    }

    copy = activity.receive(
        activity=a, on_behalf_of=remote_actor, inbox_actor=inbox_actor
    )
    mrf_inbox_registry_apply.assert_called_once_with(a, sender_id=a["actor"])

    assert copy.payload == a
    assert copy.creation_date >= now
    assert copy.actor == remote_actor
    assert copy.fid == a["id"]
    assert copy.type == "Noop"
    mocked_dispatch.assert_called_once_with(
        tasks.dispatch_inbox.delay, activity_id=copy.pk
    )

    assert models.InboxItem.objects.count() == 3
    for actor, t in [
        (local_to_actor, "to"),
        (inbox_actor, "to"),
        (local_cc_actor, "cc"),
    ]:
        ii = models.InboxItem.objects.get(actor=actor)
        assert ii.type == t
        assert ii.activity == copy
        assert ii.is_read is False

    assert serializer_init.call_args[1]["context"] == {
        "actor": remote_actor,
        "local_recipients": True,
        "recipients": [inbox_actor],
    }
    assert serializer_init.call_args[1]["data"] == a
예제 #6
0
def test_receive_mrf_skip(mrf_inbox_registry, factories, now, mocker):
    mocker.patch.object(
        activity.InboxRouter, "get_matching_handlers", return_value=True
    )
    mocker.patch.object(mrf_inbox_registry, "apply", return_value=(None, False))
    local_to_actor = factories["users.User"]().create_actor()
    remote_actor = factories["federation.Actor"]()
    a = {
        "@context": [],
        "actor": remote_actor.fid,
        "type": "Noop",
        "id": "https://test.activity",
        "to": [local_to_actor.fid],
    }

    copy = activity.receive(activity=a, on_behalf_of=remote_actor)
    assert copy is None
예제 #7
0
def test_receive_skips_if_no_matching_route(factories, now, mocker):
    get_matching_handlers = mocker.patch.object(
        activity.InboxRouter, "get_matching_handlers", return_value=[]
    )
    local_to_actor = factories["users.User"]().create_actor()
    remote_actor = factories["federation.Actor"]()
    a = {
        "@context": [],
        "actor": remote_actor.fid,
        "type": "Noop",
        "id": "https://test.activity",
        "to": [local_to_actor.fid, remote_actor.fid],
    }

    copy = activity.receive(activity=a, on_behalf_of=remote_actor)
    get_matching_handlers.assert_called_once_with(a)
    assert copy is None
    assert models.Activity.objects.count() == 0
예제 #8
0
def test_receive_calls_should_reject(factories, now, mocker):
    should_reject = mocker.patch.object(activity, "should_reject", return_value=True)
    mocker.patch.object(
        activity.InboxRouter, "get_matching_handlers", return_value=True
    )
    local_to_actor = factories["users.User"]().create_actor()
    remote_actor = factories["federation.Actor"]()
    a = {
        "@context": [],
        "actor": remote_actor.fid,
        "type": "Noop",
        "id": "https://test.activity",
        "to": [local_to_actor.fid, remote_actor.fid],
    }

    copy = activity.receive(activity=a, on_behalf_of=remote_actor)
    should_reject.assert_called_once_with(
        fid=a["id"], actor_id=remote_actor.fid, payload=a
    )
    assert copy is None
예제 #9
0
def test_receive_uses_mrf_returned_payload(mrf_inbox_registry, factories, now, mocker):
    mocker.patch.object(
        activity.InboxRouter, "get_matching_handlers", return_value=True
    )

    def patched_apply(payload, **kwargs):
        payload["type"] = "SomethingElse"
        return payload, True

    mrf_inbox_registry_apply = mocker.patch.object(
        mrf_inbox_registry, "apply", side_effect=patched_apply
    )
    mocked_dispatch = mocker.patch("funkwhale_api.common.utils.on_commit")
    local_to_actor = factories["users.User"]().create_actor()
    remote_actor = factories["federation.Actor"]()
    a = {
        "@context": [],
        "actor": remote_actor.fid,
        "type": "Noop",
        "id": "https://test.activity",
        "to": [local_to_actor.fid],
    }

    copy = activity.receive(activity=a, on_behalf_of=remote_actor)
    mrf_inbox_registry_apply.assert_called_once_with(a, sender_id=a["actor"])

    expected = a.copy()
    expected["type"] = "SomethingElse"
    assert copy.payload == expected
    assert copy.creation_date >= now
    assert copy.actor == remote_actor
    assert copy.fid == a["id"]
    assert copy.type == "SomethingElse"
    mocked_dispatch.assert_called_once_with(
        tasks.dispatch_inbox.delay, activity_id=copy.pk
    )