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)
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)
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
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()
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
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
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
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
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 )