# HG changeset patch # User Goffi # Date 1663797708 -7200 # Node ID 755920bd30dab75a91558fe8f7acd8debd74db73 # Parent d8baf92cb92159af26aa19358e9b3f3201d969ba tests (unit/AP gateway): fix tests: rel 372 diff -r d8baf92cb921 -r 755920bd30da tests/unit/test_ap-gateway.py --- a/tests/unit/test_ap-gateway.py Thu Sep 22 00:01:48 2022 +0200 +++ b/tests/unit/test_ap-gateway.py Thu Sep 22 00:01:48 2022 +0200 @@ -62,25 +62,22 @@ f"resource=acct:{parse.quote(TEST_AP_ACCOUNT)}": { "aliases": [ f"{TEST_BASE_URL}/@{TEST_USER}", - f"{TEST_BASE_URL}/users/{TEST_USER}" + f"{TEST_BASE_URL}/users/{TEST_USER}", ], "links": [ { "href": f"{TEST_BASE_URL}/users/{TEST_USER}", "rel": "self", - "type": "application/activity+json" + "type": "application/activity+json", }, ], - "subject": f"acct:{TEST_AP_ACCOUNT}" + "subject": f"acct:{TEST_AP_ACCOUNT}", }, - f"{TEST_BASE_URL}/users/{TEST_USER}": { "@context": [ "https://www.w3.org/ns/activitystreams", ], - "endpoints": { - "sharedInbox": f"{TEST_BASE_URL}/inbox" - }, + "endpoints": {"sharedInbox": f"{TEST_BASE_URL}/inbox"}, "followers": f"{TEST_BASE_URL}/users/{TEST_USER}/followers", "following": f"{TEST_BASE_URL}/users/{TEST_USER}/following", "id": f"{TEST_BASE_URL}/users/{TEST_USER}", @@ -90,30 +87,25 @@ "outbox": f"{TEST_BASE_URL}/users/{TEST_USER}/outbox", "preferredUsername": f"{TEST_USER}", "type": "Person", - "url": f"{TEST_BASE_URL}/@{TEST_USER}" + "url": f"{TEST_BASE_URL}/@{TEST_USER}", }, f"{TEST_BASE_URL}/.well-known/webfinger?" f"resource=acct:{parse.quote('ext_user@example.org')}": { - "aliases": [ - f"{TEST_BASE_URL}/@ext_user", - f"{TEST_BASE_URL}/users/ext_user" - ], + "aliases": [f"{TEST_BASE_URL}/@ext_user", f"{TEST_BASE_URL}/users/ext_user"], "links": [ { "href": f"{TEST_BASE_URL}/users/ext_user", "rel": "self", - "type": "application/activity+json" + "type": "application/activity+json", }, ], - "subject": f"acct:ext_user@example.org" + "subject": f"acct:ext_user@example.org", }, f"{TEST_BASE_URL}/users/ext_user": { "@context": [ "https://www.w3.org/ns/activitystreams", ], - "endpoints": { - "sharedInbox": f"{TEST_BASE_URL}/inbox" - }, + "endpoints": {"sharedInbox": f"{TEST_BASE_URL}/inbox"}, "followers": f"{TEST_BASE_URL}/users/ext_user/followers", "following": f"{TEST_BASE_URL}/users/ext_user/following", "id": f"{TEST_BASE_URL}/users/ext_user", @@ -122,7 +114,7 @@ "outbox": f"{TEST_BASE_URL}/users/ext_user/outbox", "preferredUsername": f"ext_user", "type": "Person", - "url": f"{TEST_BASE_URL}/@ext_user" + "url": f"{TEST_BASE_URL}/@ext_user", }, f"{TEST_BASE_URL}/users/{TEST_USER}/outbox": { "@context": "https://www.w3.org/ns/activitystreams", @@ -130,7 +122,7 @@ "id": f"{TEST_BASE_URL}/users/{TEST_USER}/outbox", "last": f"{TEST_BASE_URL}/users/{TEST_USER}/outbox?page=true", "totalItems": 4, - "type": "OrderedCollection" + "type": "OrderedCollection", }, f"{TEST_BASE_URL}/users/{TEST_USER}/outbox?page=true": { "@context": [ @@ -150,26 +142,20 @@ f"{TEST_BASE_URL}/users/{TEST_USER}/followers", ], "content": "

test message 1

", - "contentMap": { - "en": "

test message 1

" - }, + "contentMap": {"en": "

test message 1

"}, "id": f"{TEST_BASE_URL}/users/{TEST_USER}/statuses/1", "inReplyTo": None, "published": "2021-12-16T17:28:03Z", "sensitive": False, "summary": None, "tag": [], - "to": [ - "https://www.w3.org/ns/activitystreams#Public" - ], + "to": ["https://www.w3.org/ns/activitystreams#Public"], "type": "Note", - "url": f"{TEST_BASE_URL}/@{TEST_USER}/1" + "url": f"{TEST_BASE_URL}/@{TEST_USER}/1", }, "published": "2021-12-16T17:28:03Z", - "to": [ - "https://www.w3.org/ns/activitystreams#Public" - ], - "type": "Create" + "to": ["https://www.w3.org/ns/activitystreams#Public"], + "type": "Create", }, { "actor": f"{TEST_BASE_URL}/users/{TEST_USER}", @@ -183,26 +169,20 @@ f"{TEST_BASE_URL}/users/{TEST_USER}/followers", ], "content": "

test message 2

", - "contentMap": { - "en": "

test message 2

" - }, + "contentMap": {"en": "

test message 2

"}, "id": f"{TEST_BASE_URL}/users/{TEST_USER}/statuses/2", "inReplyTo": None, "published": "2021-12-16T17:27:03Z", "sensitive": False, "summary": None, "tag": [], - "to": [ - "https://www.w3.org/ns/activitystreams#Public" - ], + "to": ["https://www.w3.org/ns/activitystreams#Public"], "type": "Note", - "url": f"{TEST_BASE_URL}/@{TEST_USER}/2" + "url": f"{TEST_BASE_URL}/@{TEST_USER}/2", }, "published": "2021-12-16T17:27:03Z", - "to": [ - "https://www.w3.org/ns/activitystreams#Public" - ], - "type": "Create" + "to": ["https://www.w3.org/ns/activitystreams#Public"], + "type": "Create", }, { "actor": f"{TEST_BASE_URL}/users/{TEST_USER}", @@ -216,26 +196,20 @@ f"{TEST_BASE_URL}/users/{TEST_USER}/followers", ], "content": "

test message 3

", - "contentMap": { - "en": "

test message 3

" - }, + "contentMap": {"en": "

test message 3

"}, "id": f"{TEST_BASE_URL}/users/{TEST_USER}/statuses/3", "inReplyTo": None, "published": "2021-12-16T17:26:03Z", "sensitive": False, "summary": None, "tag": [], - "to": [ - "https://www.w3.org/ns/activitystreams#Public" - ], + "to": ["https://www.w3.org/ns/activitystreams#Public"], "type": "Note", - "url": f"{TEST_BASE_URL}/@{TEST_USER}/3" + "url": f"{TEST_BASE_URL}/@{TEST_USER}/3", }, "published": "2021-12-16T17:26:03Z", - "to": [ - "https://www.w3.org/ns/activitystreams#Public" - ], - "type": "Create" + "to": ["https://www.w3.org/ns/activitystreams#Public"], + "type": "Create", }, { "actor": f"{TEST_BASE_URL}/users/{TEST_USER}", @@ -249,38 +223,32 @@ f"{TEST_BASE_URL}/users/{TEST_USER}/followers", ], "content": "

test message 4

", - "contentMap": { - "en": "

test message 4

" - }, + "contentMap": {"en": "

test message 4

"}, "id": f"{TEST_BASE_URL}/users/{TEST_USER}/statuses/4", "inReplyTo": None, "published": "2021-12-16T17:25:03Z", "sensitive": False, "summary": None, "tag": [], - "to": [ - "https://www.w3.org/ns/activitystreams#Public" - ], + "to": ["https://www.w3.org/ns/activitystreams#Public"], "type": "Note", - "url": f"{TEST_BASE_URL}/@{TEST_USER}/4" + "url": f"{TEST_BASE_URL}/@{TEST_USER}/4", }, "published": "2021-12-16T17:25:03Z", - "to": [ - "https://www.w3.org/ns/activitystreams#Public" - ], - "type": "Create" + "to": ["https://www.w3.org/ns/activitystreams#Public"], + "type": "Create", }, - ], + ], "partOf": f"{TEST_BASE_URL}/users/{TEST_USER}/outbox", "prev": None, - "type": "OrderedCollectionPage" + "type": "OrderedCollectionPage", }, f"{TEST_BASE_URL}/users/{TEST_USER}/following": { "@context": "https://www.w3.org/ns/activitystreams", "first": f"{TEST_BASE_URL}/users/{TEST_USER}/following?page=1", "id": f"{TEST_BASE_URL}/users/{TEST_USER}/following", "totalItems": 2, - "type": "OrderedCollection" + "type": "OrderedCollection", }, f"{TEST_BASE_URL}/users/{TEST_USER}/following?page=1": { "@context": "https://www.w3.org/ns/activitystreams", @@ -291,14 +259,14 @@ ], "partOf": "{TEST_BASE_URL}/users/{TEST_USER}/following", "totalItems": 2, - "type": "OrderedCollectionPage" + "type": "OrderedCollectionPage", }, f"{TEST_BASE_URL}/users/{TEST_USER}/followers": { "@context": "https://www.w3.org/ns/activitystreams", "first": f"{TEST_BASE_URL}/users/{TEST_USER}/followers?page=1", "id": f"{TEST_BASE_URL}/users/{TEST_USER}/followers", "totalItems": 2, - "type": "OrderedCollection" + "type": "OrderedCollection", }, f"{TEST_BASE_URL}/users/{TEST_USER}/followers?page=1": { "@context": "https://www.w3.org/ns/activitystreams", @@ -309,9 +277,8 @@ ], "partOf": "{TEST_BASE_URL}/users/{TEST_USER}/followers", "totalItems": 2, - "type": "OrderedCollectionPage" + "type": "OrderedCollectionPage", }, - } XMPP_ITEM_TPL = """ @@ -352,14 +319,15 @@ XMPP_ITEMS = [ xml_tools.parse( "".join( - l.strip() for l in XMPP_ITEM_TPL.format( + l.strip() + for l in XMPP_ITEM_TPL.format( id=i, publisher_jid="some_user@test.example", updated=xmpp_date(ITEM_BASE_TS + i * 60), published=xmpp_date(ITEM_BASE_TS + i * 60), ).split("\n") ), - namespace=pubsub.NS_PUBSUB + namespace=pubsub.NS_PUBSUB, ) for i in range(1, 5) ] @@ -394,10 +362,7 @@ raise StanzaError("item-not-found") ret_items = kwargs.pop("ret_items", XMPP_ITEMS) rsm_resp = rsm.RSMResponse( - first=ret_items[0]["id"], - last=ret_items[-1]["id"], - index=0, - count=len(ret_items) + first=ret_items[0]["id"], last=ret_items[-1]["id"], index=0, count=len(ret_items) ) return ret_items, {"rsm": rsm_resp.toDict(), "complete": True} @@ -440,11 +405,10 @@ gateway.client = client gateway.local_only = True gateway.public_url = PUBLIC_URL - gateway.ap_path = '_ap' + gateway.ap_path = "_ap" gateway.auto_mentions = True gateway.base_ap_url = parse.urljoin( - f"https://{gateway.public_url}", - f"{gateway.ap_path}/" + f"https://{gateway.public_url}", f"{gateway.ap_path}/" ) gateway.server = HTTPServer(gateway) gateway.public_key_pem = None @@ -452,52 +416,51 @@ class TestActivityPubGateway: - def getTitleXHTML(self, item_elt: domish.Element) -> domish.Element: return next( - t for t in item_elt.entry.elements(NS_ATOM, "title") + t + for t in item_elt.entry.elements(NS_ATOM, "title") if t.getAttribute("type") == "xhtml" ) - @ed async def test_jid_and_node_convert_to_ap_handle(self, ap_gateway): """JID and pubsub node are converted correctly to an AP actor handle""" get_account = ap_gateway.getAPAccountFromJidAndNode # local jid - assert await get_account( - jid_ = jid.JID("simple@test.example"), - node = None - ) == "simple@test.example" + assert ( + await get_account(jid_=jid.JID("simple@test.example"), node=None) + == "simple@test.example" + ) # non local jid - assert await get_account( - jid_ = jid.JID("simple@example.org"), - node = None - ) == "___simple.40example.2eorg@ap.test.example" + assert ( + await get_account(jid_=jid.JID("simple@example.org"), node=None) + == "___simple.40example.2eorg@ap.test.example" + ) # local jid with non microblog node - assert await get_account( - jid_ = jid.JID("simple@test.example"), - node = "some_other_node" - ) == "some_other_node---simple@test.example" + assert ( + await get_account(jid_=jid.JID("simple@test.example"), node="some_other_node") + == "some_other_node---simple@test.example" + ) # local pubsub node with patch.object(ap_gateway, "isPubsub") as isPubsub: isPubsub.return_value = True - assert await get_account( - jid_ = jid.JID("pubsub.test.example"), - node = "some_node" - ) == "some_node@pubsub.test.example" + assert ( + await get_account(jid_=jid.JID("pubsub.test.example"), node="some_node") + == "some_node@pubsub.test.example" + ) # non local pubsub node with patch.object(ap_gateway, "isPubsub") as isPubsub: isPubsub.return_value = True - assert await get_account( - jid_ = jid.JID("pubsub.example.org"), - node = "some_node" - ) == "___some_node.40pubsub.2eexample.2eorg@ap.test.example" + assert ( + await get_account(jid_=jid.JID("pubsub.example.org"), node="some_node") + == "___some_node.40pubsub.2eexample.2eorg@ap.test.example" + ) @ed async def test_ap_handle_convert_to_jid_and_node(self, ap_gateway, monkeypatch): @@ -509,9 +472,10 @@ isPubsub.return_value = False # simple local jid - assert await get_jid_node( - "toto@test.example" - ) == (jid.JID("toto@test.example"), None) + assert await get_jid_node("toto@test.example") == ( + jid.JID("toto@test.example"), + None, + ) # simple external jid @@ -522,23 +486,26 @@ ## with "local_only" unset, it should work with monkeypatch.context() as m: m.setattr(ap_gateway, "local_only", False, raising=True) - assert await get_jid_node( - "toto@example.org" - ) == (jid.JID("toto@example.org"), None) + assert await get_jid_node("toto@example.org") == ( + jid.JID("toto@example.org"), + None, + ) # explicit node - assert await get_jid_node( - "tata---toto@test.example" - ) == (jid.JID("toto@test.example"), "tata") + assert await get_jid_node("tata---toto@test.example") == ( + jid.JID("toto@test.example"), + "tata", + ) # for following assertion, host is a pubsub service with patch.object(ap_gateway, "isPubsub") as isPubsub: isPubsub.return_value = True # simple local node - assert await get_jid_node( - "toto@pubsub.test.example" - ) == (jid.JID("pubsub.test.example"), "toto") + assert await get_jid_node("toto@pubsub.test.example") == ( + jid.JID("pubsub.test.example"), + "toto", + ) # encoded local node assert await get_jid_node( @@ -620,11 +587,7 @@ assert author_uri == "xmpp:test_user\\40example.org@ap.test.example" assert str(items[1].entry.published) == "2021-12-16T17:28:03Z" - items, rsm_resp = await ap_gateway.getAPItems( - outbox, - max_items=1, - start_index=2 - ) + items, rsm_resp = await ap_gateway.getAPItems(outbox, max_items=1, start_index=2) assert rsm_resp.count == 4 assert rsm_resp.index == 2 @@ -641,9 +604,7 @@ assert str(items[0].entry.published) == "2021-12-16T17:27:03Z" items, rsm_resp = await ap_gateway.getAPItems( - outbox, - max_items=3, - chronological_pagination=False + outbox, max_items=3, chronological_pagination=False ) assert rsm_resp.count == 4 assert rsm_resp.index == 1 @@ -670,7 +631,7 @@ url: Optional[str] = None, doc: Optional[Any] = None, query_data: Optional[dict] = None, - signing_actor: Optional[str] = None + signing_actor: Optional[str] = None, ) -> Dict[str, Any]: """Generate parameters for HTTPAPGServer's AP*Request @@ -703,17 +664,14 @@ if doc is not None: request.content = io.BytesIO(json.dumps(doc).encode()) - ap_url = parse.urljoin( - f"https://{ap_gateway.public_url}", - path - ) + ap_url = parse.urljoin(f"https://{ap_gateway.public_url}", path) kwargs = { "request": request, "account_jid": test_jid, "node": None, "ap_account": test_jid.full(), "ap_url": ap_url, - "signing_actor": signing_actor + "signing_actor": signing_actor, } if type_ == "outbox" and query_data: kwargs["query_data"] = query_data @@ -728,7 +686,7 @@ outbox = await ap_gateway.server.resource.APOutboxRequest( **self.ap_request_params(ap_gateway, "outbox") ) - assert outbox["@context"] == "https://www.w3.org/ns/activitystreams" + assert outbox["@context"] == ["https://www.w3.org/ns/activitystreams"] assert outbox["id"] == "https://test.example/_ap/outbox/some_user%40test.example" assert outbox["totalItems"] == len(XMPP_ITEMS) assert outbox["type"] == "OrderedCollection" @@ -738,15 +696,23 @@ first_page = await ap_gateway.server.resource.APOutboxPageRequest( **self.ap_request_params(ap_gateway, url=outbox["first"]) ) - assert first_page["@context"] == "https://www.w3.org/ns/activitystreams" - assert first_page["id"] == "https://test.example/_ap/outbox/some_user%40test.example?page=first" + assert first_page["@context"] == ["https://www.w3.org/ns/activitystreams"] + assert ( + first_page["id"] + == "https://test.example/_ap/outbox/some_user%40test.example?page=first" + ) assert first_page["type"] == "OrderedCollectionPage" assert first_page["partOf"] == outbox["id"] assert len(first_page["orderedItems"]) == len(XMPP_ITEMS) first_item = first_page["orderedItems"][0] - assert first_item["@context"] == "https://www.w3.org/ns/activitystreams" - assert first_item["id"] == "https://test.example/_ap/item/some_user%40test.example/4" - assert first_item["actor"] == "https://test.example/_ap/actor/some_user%40test.example" + assert first_item["@context"] == ["https://www.w3.org/ns/activitystreams"] + assert ( + first_item["id"] == "https://test.example/_ap/item/some_user%40test.example/4" + ) + assert ( + first_item["actor"] + == "https://test.example/_ap/actor/some_user%40test.example" + ) assert first_item["type"] == "Create" first_item_obj = first_item["object"] assert first_item_obj["id"] == first_item["id"] @@ -769,13 +735,12 @@ ap_gateway._pps.subscriptions_node, None, None, - None + None, ) assert len(items) == 2 - for idx, entity in enumerate(( - "local_user@test.example", - "ext_user\\40example.org@ap.test.example" - )): + for idx, entity in enumerate( + ("local_user@test.example", "ext_user\\40example.org@ap.test.example") + ): subscription_elt = next(items[idx].elements(NS_PPS, "subscription"), None) assert subscription_elt is not None assert subscription_elt["node"] == ap_gateway._m.namespace @@ -794,13 +759,12 @@ ap_gateway._pps.getPublicSubscribersNode(ap_gateway._m.namespace), None, None, - None + None, ) assert len(items) == 2 - for idx, entity in enumerate(( - "local_user@test.example", - "ext_user\\40example.org@ap.test.example" - )): + for idx, entity in enumerate( + ("local_user@test.example", "ext_user\\40example.org@ap.test.example") + ): subscriber_elt = next(items[idx].elements(NS_PPS, "subscriber"), None) assert subscriber_elt is not None assert subscriber_elt["jid"] == entity @@ -811,28 +775,29 @@ subscriptions = [ pubsub.Item( id="subscription_1", - payload = ap_gateway._pps.buildSubscriptionElt( - ap_gateway._m.namespace, - jid.JID("local_user@test.example") - ) + payload=ap_gateway._pps.buildSubscriptionElt( + ap_gateway._m.namespace, jid.JID("local_user@test.example") + ), ), pubsub.Item( id="subscription_2", - payload = ap_gateway._pps.buildSubscriptionElt( + payload=ap_gateway._pps.buildSubscriptionElt( ap_gateway._m.namespace, - jid.JID("ext_user\\40example.org@ap.test.example") - ) - ) + jid.JID("ext_user\\40example.org@ap.test.example"), + ), + ), ] - monkeypatch.setattr(ap_gateway._p, "getItems", partial( - mock_getItems, - ret_items=subscriptions - )) + monkeypatch.setattr( + ap_gateway._p, "getItems", partial(mock_getItems, ret_items=subscriptions) + ) following = await ap_gateway.server.resource.APFollowingRequest( **self.ap_request_params(ap_gateway, "following") ) - assert following["@context"] == "https://www.w3.org/ns/activitystreams" - assert following["id"] == "https://test.example/_ap/following/some_user%40test.example" + assert following["@context"] == ["https://www.w3.org/ns/activitystreams"] + assert ( + following["id"] + == "https://test.example/_ap/following/some_user%40test.example" + ) assert following["totalItems"] == len(subscriptions) assert following["type"] == "OrderedCollection" assert following.get("first") @@ -841,7 +806,7 @@ assert first_page["type"] == "OrderedCollectionPage" assert len(first_page["orderedItems"]) == len(subscriptions) items = first_page["orderedItems"] - assert items == ['local_user@test.example', 'ext_user@example.org'] + assert items == ["local_user@test.example", "ext_user@example.org"] @ed async def test_pps_to_followers(self, ap_gateway, monkeypatch): @@ -849,26 +814,28 @@ subscribers = [ pubsub.Item( id="subscriber_1", - payload = ap_gateway._pps.buildSubscriberElt( + payload=ap_gateway._pps.buildSubscriberElt( jid.JID("local_user@test.example") - ) + ), ), pubsub.Item( id="subscriber_2", - payload = ap_gateway._pps.buildSubscriberElt( + payload=ap_gateway._pps.buildSubscriberElt( jid.JID("ext_user\\40example.org@ap.test.example") - ) - ) + ), + ), ] - monkeypatch.setattr(ap_gateway._p, "getItems", partial( - mock_getItems, - ret_items=subscribers - )) + monkeypatch.setattr( + ap_gateway._p, "getItems", partial(mock_getItems, ret_items=subscribers) + ) followers = await ap_gateway.server.resource.APFollowersRequest( **self.ap_request_params(ap_gateway, "followers") ) - assert followers["@context"] == "https://www.w3.org/ns/activitystreams" - assert followers["id"] == "https://test.example/_ap/followers/some_user%40test.example" + assert followers["@context"] == ["https://www.w3.org/ns/activitystreams"] + assert ( + followers["id"] + == "https://test.example/_ap/followers/some_user%40test.example" + ) assert followers["totalItems"] == len(subscribers) assert followers["type"] == "OrderedCollection" assert followers.get("first") @@ -877,7 +844,7 @@ assert first_page["type"] == "OrderedCollectionPage" assert len(first_page["orderedItems"]) == len(subscribers) items = first_page["orderedItems"] - assert items == ['local_user@test.example', 'ext_user@example.org'] + assert items == ["local_user@test.example", "ext_user@example.org"] @ed async def test_xmpp_message_to_ap_direct_message(self, ap_gateway, monkeypatch): @@ -890,9 +857,7 @@ "to": ap_gateway.getLocalJIDFromAccount(TEST_AP_ACCOUNT), "type": "chat", "message": {"": "This is a test message."}, - "extra": { - "origin-id": "123" - } + "extra": {"origin-id": "123"}, } with patch.object(ap_gateway, "signAndPost") as signAndPost: await ap_gateway.onMessage(ap_gateway.client, mess_data) @@ -900,7 +865,7 @@ assert url == "https://example.org/users/test_user/inbox" assert actor_id == "https://test.example/_ap/actor/some_user%40test.example" obj = doc["object"] - assert doc["@context"] == "https://www.w3.org/ns/activitystreams" + assert doc["@context"] == ["https://www.w3.org/ns/activitystreams"] assert doc["actor"] == "https://test.example/_ap/actor/some_user%40test.example" assert obj["type"] == "Note" assert obj["content"] == "This is a test message." @@ -926,14 +891,14 @@ xmpp_actor_id = ap_gateway.buildAPURL(ap_const.TYPE_ACTOR, TEST_JID.userhost()) direct_ap_message = { - 'attributedTo': TEST_AP_ACTOR_ID, - 'cc': [], - 'content': '

test direct message

', - 'contentMap': {'en': '

test direct message

'}, - 'id': f'{TEST_AP_ACTOR_ID}/statuses/123', - 'published': '2022-05-20T08:14:39Z', - 'to': [xmpp_actor_id], - 'type': 'Note', + "attributedTo": TEST_AP_ACTOR_ID, + "cc": [], + "content": "

test direct message

", + "contentMap": {"en": "

test direct message

"}, + "id": f"{TEST_AP_ACTOR_ID}/statuses/123", + "published": "2022-05-20T08:14:39Z", + "to": [xmpp_actor_id], + "type": "Note", } client = ap_gateway.client.getVirtualClient( ap_gateway.getLocalJIDFromAccount(TEST_AP_ACCOUNT) @@ -963,7 +928,7 @@ recipient=ap_gateway.getLocalJIDFromAccount(TEST_AP_ACCOUNT), nodeIdentifier=ap_gateway._m.namespace, items=[retract_elt], - headers={} + headers={}, ) with patch.object(ap_gateway, "signAndPost") as signAndPost: signAndPost.return_value = FakeTReqPostResponse() @@ -993,9 +958,8 @@ "actor": TEST_AP_ACTOR_ID, "id": "https://test.example/retract_123", "type": "Delete", - "object": {"id": f"{TEST_AP_ACTOR_ID}/item/123", - "type": "Tombstone"}, - "to": ["https://www.w3.org/ns/activitystreams#Public"] + "object": {"id": f"{TEST_AP_ACTOR_ID}/item/123", "type": "Tombstone"}, + "to": ["https://www.w3.org/ns/activitystreams#Public"], } with patch.multiple( ap_gateway.host.memory.storage, @@ -1003,9 +967,9 @@ getPubsubNode=DEFAULT, deletePubsubItems=DEFAULT, ) as mock_objs: - mock_objs["get"].return_value=None + mock_objs["get"].return_value = None cached_node = MagicMock() - mock_objs["getPubsubNode"].return_value=cached_node + mock_objs["getPubsubNode"].return_value = cached_node subscription = MagicMock() subscription.state = SubscriptionState.SUBSCRIBED subscription.subscriber = TEST_JID @@ -1018,7 +982,7 @@ client=client, destinee=None, node=ap_gateway._m.namespace, - item=ap_item + item=ap_item, ) # item is deleted from database @@ -1066,10 +1030,7 @@ # we simulate the reception of a retract event using the message element that # we generated above await ap_gateway._onMessageRetract( - ap_gateway.client, - message_retract_elt, - retract_elt, - fake_fastened_elts + ap_gateway.client, message_retract_elt, retract_elt, fake_fastened_elts ) url, actor_id, doc = signAndPost.call_args[0] @@ -1108,9 +1069,8 @@ "actor": TEST_AP_ACTOR_ID, "id": "https://test.example/retract_123", "type": "Delete", - "object": {"id": f"{TEST_AP_ACTOR_ID}/item/123", - "type": "Tombstone"}, - "to": ["https://www.w3.org/ns/activitystreams#Public"] + "object": {"id": f"{TEST_AP_ACTOR_ID}/item/123", "type": "Tombstone"}, + "to": ["https://www.w3.org/ns/activitystreams#Public"], } with patch.object(ap_gateway.host.memory.storage, "get") as storage_get: fake_history = MagicMock() @@ -1120,10 +1080,7 @@ storage_get.return_value = fake_history # we simulate a received Delete activity await ap_gateway.newAPDeleteItem( - client=client, - destinee=None, - node=ap_gateway._m.namespace, - item=ap_item + client=client, destinee=None, node=ap_gateway._m.namespace, item=ap_item ) # item is deleted from database @@ -1157,7 +1114,7 @@ ap_gateway._v.node, None, None, - None + None, ) assert len(items) == 1 vcard_elt = next(items[0].elements(ap_gateway._v.namespace, "vcard")) @@ -1172,8 +1129,8 @@ # XEPs/locations (vCard4, vcard-tmp, etc) with patch.object(ap_gateway._i, "getIdentity") as getIdentity: getIdentity.return_value = { - "nicknames": ["nick1", "nick2"], - "description": "test description" + "nicknames": ["nick1", "nick2"], + "description": "test description", } actor_data = await ap_gateway.server.resource.APActorRequest( **self.ap_request_params(ap_gateway, ap_const.TYPE_ACTOR) @@ -1193,13 +1150,13 @@ xmpp_actor_id = ap_gateway.buildAPURL(ap_const.TYPE_ACTOR, TEST_JID.userhost()) direct_addr_mention = { - 'attributedTo': TEST_AP_ACTOR_ID, - 'cc': [], - 'content': '

test mention by direct addressing

', - 'id': f'{TEST_AP_ACTOR_ID}/statuses/direct_addr_123', - 'published': '2022-05-20T08:14:39Z', - 'to': [ap_const.NS_AP_PUBLIC, xmpp_actor_id], - 'type': 'Note' + "attributedTo": TEST_AP_ACTOR_ID, + "cc": [], + "content": "

test mention by direct addressing

", + "id": f"{TEST_AP_ACTOR_ID}/statuses/direct_addr_123", + "published": "2022-05-20T08:14:39Z", + "to": [ap_const.NS_AP_PUBLIC, xmpp_actor_id], + "type": "Note", } client = ap_gateway.client.getVirtualClient( ap_gateway.getLocalJIDFromAccount(TEST_AP_ACCOUNT) @@ -1219,7 +1176,7 @@ "pubsub", path=local_actor_jid.full(), node=ap_gateway._m.namespace, - item=direct_addr_mention["id"] + item=direct_addr_mention["id"], ) assert sendReference.call_args.kwargs["anchor"] == expected_anchor @@ -1234,20 +1191,14 @@ xmpp_actor_id = ap_gateway.buildAPURL(ap_const.TYPE_ACTOR, TEST_JID.userhost()) direct_addr_mention = { - 'attributedTo': TEST_AP_ACTOR_ID, - 'cc': [], - 'content': '

test mention by tag

', - 'id': f'{TEST_AP_ACTOR_ID}/statuses/tag_123', - 'published': '2022-05-20T08:14:39Z', - 'to': [ap_const.NS_AP_PUBLIC], - "tag": [ - { - "type": "Mention", - "href": xmpp_actor_id, - "name": f"@{TEST_JID}'" - } - ], - 'type': 'Note' + "attributedTo": TEST_AP_ACTOR_ID, + "cc": [], + "content": "

test mention by tag

", + "id": f"{TEST_AP_ACTOR_ID}/statuses/tag_123", + "published": "2022-05-20T08:14:39Z", + "to": [ap_const.NS_AP_PUBLIC], + "tag": [{"type": "Mention", "href": xmpp_actor_id, "name": f"@{TEST_JID}'"}], + "type": "Note", } client = ap_gateway.client.getVirtualClient( ap_gateway.getLocalJIDFromAccount(TEST_AP_ACCOUNT) @@ -1267,7 +1218,7 @@ "pubsub", path=local_actor_jid.full(), node=ap_gateway._m.namespace, - item=direct_addr_mention["id"] + item=direct_addr_mention["id"], ) assert sendReference.call_args.kwargs["anchor"] == expected_anchor @@ -1283,16 +1234,18 @@ "author_jid": TEST_JID.full(), "content": f"mention of @{TEST_AP_ACCOUNT}", "service": TEST_JID.full(), - "node": ap_gateway._m.namespace + "node": ap_gateway._m.namespace, } - ap_item = await ap_gateway.mbdata2APitem(ap_gateway.client, mb_data, public=True) + ap_item = await ap_gateway.mb_data_2_ap_item( + ap_gateway.client, mb_data, public=True + ) ap_object = ap_item["object"] assert TEST_AP_ACTOR_ID in ap_object["to"] expected_mention = { "type": ap_const.TYPE_MENTION, "href": TEST_AP_ACTOR_ID, - "name": f"@{TEST_AP_ACCOUNT}" + "name": f"@{TEST_AP_ACCOUNT}", } assert expected_mention in ap_object["tag"] @@ -1300,7 +1253,7 @@ async def test_no_auto_mentions_when_not_public(self, ap_gateway, monkeypatch): """Check that no mention is send when the message is not public""" # this is the same test as test_auto_mentions above, except that public is not set - # in mbdata2APitem + # in mb_data_2_ap_item monkeypatch.setattr(plugin_comp_ap_gateway.treq, "get", mock_ap_get) monkeypatch.setattr(plugin_comp_ap_gateway.treq, "json_content", mock_treq_json) monkeypatch.setattr(ap_gateway, "apGet", mock_ap_get) @@ -1309,9 +1262,11 @@ "author_jid": TEST_JID.full(), "content": f"mention of @{TEST_AP_ACCOUNT}", "service": TEST_JID.full(), - "node": ap_gateway._m.namespace + "node": ap_gateway._m.namespace, } - ap_item = await ap_gateway.mbdata2APitem(ap_gateway.client, mb_data, public=False) + ap_item = await ap_gateway.mb_data_2_ap_item( + ap_gateway.client, mb_data, public=False + ) ap_object = ap_item["object"] assert "to" not in ap_object @@ -1330,13 +1285,13 @@ "pubsub", path=TEST_JID.full(), node=ap_gateway._m.namespace, - item=item_elt["id"] + item=item_elt["id"], ) ref_data: Dict[str, Union[str, int, dict]] = { "uri": xmpp_uri.buildXMPPUri(None, path=local_actor_jid.full()), "type_": "mention", - "anchor": anchor + "anchor": anchor, } reference_elt = ap_gateway._refs.buildRefElement(**ref_data) @@ -1361,7 +1316,9 @@ getItems.return_value = ([mock_pubsub_item], {}) with patch.object(ap_gateway, "signAndPost") as signAndPost: signAndPost.return_value.code = 202 - await ap_gateway._onReferenceReceived(ap_gateway.client, message_elt, ref_data) + await ap_gateway._onReferenceReceived( + ap_gateway.client, message_elt, ref_data + ) # when reference is received, the referencing item must be sent to referenced # actor, and they must be in "to" field and in "tag" @@ -1374,7 +1331,7 @@ "href": TEST_AP_ACTOR_ID, # we don't have a prefixing "@" here, because it's not needed in referencing # item with XMPP - "name": f"{TEST_AP_ACCOUNT}" + "name": f"{TEST_AP_ACCOUNT}", } assert expected_mention in ap_object["tag"] @@ -1393,9 +1350,10 @@ "pubsub", path=recipient_jid.full(), node=ap_gateway._m.namespace, - item=ap_item["id"] + item=ap_item["id"], ) - item_elt = xml_tools.parse(f""" + item_elt = xml_tools.parse( + f""" test message 1 @@ -1414,7 +1372,8 @@ - """) + """ + ) item_elt.uri = pubsub.NS_PUBSUB_EVENT with patch.object(ap_gateway, "signAndPost") as signAndPost: @@ -1424,7 +1383,7 @@ TEST_AP_ACCOUNT, TEST_JID, ap_gateway._m.namespace, - [item_elt] + [item_elt], ) assert signAndPost.called @@ -1452,30 +1411,21 @@ "@context": "https://www.w3.org/ns/activitystreams", "type": "Announce", "actor": TEST_AP_ACTOR_ID, - "cc": [ - xmpp_actor_id, - TEST_USER_DATA["followers"] - ], + "cc": [xmpp_actor_id, TEST_USER_DATA["followers"]], "id": "https://example.org/announce/123", "object": xmpp_item_url, "published": "2022-07-22T09:24:12Z", - "to": [ap_const.NS_AP_PUBLIC] + "to": [ap_const.NS_AP_PUBLIC], } with patch.object(ap_gateway.host.memory.storage, "getItems") as getItems: mock_pubsub_item = MagicMock mock_pubsub_item.data = xmpp_item getItems.return_value = ([mock_pubsub_item], {}) with patch.object( - ap_gateway.host.memory.storage, - "cachePubsubItems") as cachePubsubItems: + ap_gateway.host.memory.storage, "cachePubsubItems" + ) as cachePubsubItems: await ap_gateway.server.resource.handleAnnounceActivity( - Request(MagicMock()), - announce, - None, - None, - None, - "", - TEST_AP_ACTOR_ID + Request(MagicMock()), announce, None, None, None, "", TEST_AP_ACTOR_ID ) assert cachePubsubItems.called @@ -1489,7 +1439,7 @@ "pubsub", path=TEST_JID.full(), node=ap_gateway._m.namespace, - item=xmpp_item["id"] + item=xmpp_item["id"], ) assert repeated["uri"] == xmpp_item_xmpp_url @@ -1504,32 +1454,25 @@ # noticed item ap_item = TEST_AP_ITEMS[0] attachment_node = ap_gateway._pa.getAttachmentNodeName( - recipient_jid, - ap_gateway._m.namespace, - ap_item["id"] + recipient_jid, ap_gateway._m.namespace, ap_item["id"] ) - item_elt = xml_tools.parse(f""" + item_elt = xml_tools.parse( + f""" - """) + """ + ) item_elt.uri = pubsub.NS_PUBSUB_EVENT items_event = pubsub.ItemsEvent( - TEST_JID, - recipient_jid, - attachment_node, - [item_elt], - {} + TEST_JID, recipient_jid, attachment_node, [item_elt], {} ) with patch.object(ap_gateway, "signAndPost") as signAndPost: signAndPost.return_value.code = 202 - await ap_gateway._itemsReceived( - ap_gateway.client, - items_event - ) + await ap_gateway._itemsReceived(ap_gateway.client, items_event) assert signAndPost.called url, actor_id, doc = signAndPost.call_args.args @@ -1556,24 +1499,18 @@ "@context": "https://www.w3.org/ns/activitystreams", "type": "Like", "actor": TEST_AP_ACTOR_ID, - "cc": [ - xmpp_actor_id, - TEST_USER_DATA["followers"] - ], + "cc": [xmpp_actor_id, TEST_USER_DATA["followers"]], "id": "https://example.org/like/123", "object": xmpp_item_url, "published": "2022-07-22T09:24:12Z", - "to": [ap_const.NS_AP_PUBLIC] + "to": [ap_const.NS_AP_PUBLIC], } with patch.object(ap_gateway.host.memory.storage, "getItems") as getItems: getItems.return_value = ([], {}) with patch.object(ap_gateway._p, "sendItems") as sendItems: await ap_gateway.server.resource.APInboxRequest( **self.ap_request_params( - ap_gateway, - "inbox", - doc=like, - signing_actor=TEST_AP_ACTOR_ID + ap_gateway, "inbox", doc=like, signing_actor=TEST_AP_ACTOR_ID ) ) @@ -1603,15 +1540,14 @@ "pubsub", path=recipient_jid.full(), node=ap_gateway._m.namespace, - item=ap_item["id"] + item=ap_item["id"], ) attachment_node = ap_gateway._pa.getAttachmentNodeName( - recipient_jid, - ap_gateway._m.namespace, - ap_item["id"] + recipient_jid, ap_gateway._m.namespace, ap_item["id"] ) reactions = ["🦁", "🥜", "🎻"] - item_elt = xml_tools.parse(f""" + item_elt = xml_tools.parse( + f""" @@ -1621,22 +1557,16 @@ - """) + """ + ) item_elt.uri = pubsub.NS_PUBSUB_EVENT items_event = pubsub.ItemsEvent( - TEST_JID, - recipient_jid, - attachment_node, - [item_elt], - {} + TEST_JID, recipient_jid, attachment_node, [item_elt], {} ) with patch.object(ap_gateway, "signAndPost") as signAndPost: signAndPost.return_value.code = 202 - await ap_gateway._itemsReceived( - ap_gateway.client, - items_event - ) + await ap_gateway._itemsReceived(ap_gateway.client, items_event) assert signAndPost.call_count == 3 for idx, call_args in enumerate(signAndPost.call_args_list): @@ -1672,25 +1602,19 @@ "@context": "https://www.w3.org/ns/activitystreams", "type": "EmojiReact", "actor": TEST_AP_ACTOR_ID, - "cc": [ - xmpp_actor_id, - TEST_USER_DATA["followers"] - ], + "cc": [xmpp_actor_id, TEST_USER_DATA["followers"]], "id": "https://example.org/like/123", "object": xmpp_item_url, "content": "🐅", "published": "2022-07-22T09:24:12Z", - "to": [ap_const.NS_AP_PUBLIC] + "to": [ap_const.NS_AP_PUBLIC], } with patch.object(ap_gateway.host.memory.storage, "getItems") as getItems: getItems.return_value = ([], {}) with patch.object(ap_gateway._p, "sendItems") as sendItems: await ap_gateway.server.resource.APInboxRequest( **self.ap_request_params( - ap_gateway, - "inbox", - doc=like, - signing_actor=TEST_AP_ACTOR_ID + ap_gateway, "inbox", doc=like, signing_actor=TEST_AP_ACTOR_ID ) )