changeset 4285:f1d0cde61af7

tests (unit): fix tests + black reformatting.
author Goffi <goffi@goffi.org>
date Sun, 14 Jul 2024 17:42:53 +0200
parents 3a550e9a2b55
children 96fdf4891747
files tests/unit/conftest.py tests/unit/frontends/test_webrtc.py tests/unit/test_ap-gateway.py tests/unit/test_plugin_xep_0082.py tests/unit/test_plugin_xep_0167.py tests/unit/test_plugin_xep_0272.py tests/unit/test_plugin_xep_0293.py tests/unit/test_plugin_xep_0320.py tests/unit/test_plugin_xep_0373.py tests/unit/test_plugin_xep_0420.py tests/unit/test_pubsub-cache.py
diffstat 11 files changed, 233 insertions(+), 198 deletions(-) [+]
line wrap: on
line diff
--- a/tests/unit/conftest.py	Sun Jul 14 16:47:45 2024 +0200
+++ b/tests/unit/conftest.py	Sun Jul 14 17:42:53 2024 +0200
@@ -48,7 +48,7 @@
         self._test_config = {}
         self.profiles = {}
         self.plugins = {}
-        # map for short name to whole namespace,
+        # map for short name to whole namespace,
         # extended by plugins with register_namespace
         self.ns_map = {
             "x-data": xmpp.NS_X_DATA,
--- a/tests/unit/frontends/test_webrtc.py	Sun Jul 14 16:47:45 2024 +0200
+++ b/tests/unit/frontends/test_webrtc.py	Sun Jul 14 17:42:53 2024 +0200
@@ -29,7 +29,6 @@
 from libervia.frontends.tools import webrtc as webrtc_mod
 
 
-
 @pytest.fixture
 def host(monkeypatch):
     host = MagicMock()
@@ -37,6 +36,7 @@
     host.app.expand = lambda s: s
     return host
 
+
 @pytest.fixture(scope="function")
 def webrtc(host):
     """Fixture for WebRTC instantiation."""
@@ -185,7 +185,7 @@
     async def test_setup_call_test_mode(self, host, webrtc, monkeypatch):
         """Test mode use fake video and audio in setup_call."""
         monkeypatch.setattr(data_format, "deserialise", MagicMock(return_value=[]))
-        monkeypatch.setattr(webrtc, "sources", webrtc_mod.SINKS_TEST)
+        monkeypatch.setattr(webrtc, "sources_data", webrtc_mod.SourcesTest())
         await webrtc.setup_call("initiator")
         assert "videotestsrc" in webrtc.gst_pipe_desc
         assert "audiotestsrc" in webrtc.gst_pipe_desc
@@ -194,7 +194,7 @@
     async def test_setup_call_normal_mode(self, host, webrtc, monkeypatch):
         """Normal mode use real video and audio in setup_call."""
         monkeypatch.setattr(data_format, "deserialise", MagicMock(return_value=[]))
-        monkeypatch.setattr(webrtc, "sources", webrtc_mod.SOURCES_AUTO)
+        monkeypatch.setattr(webrtc, "sources_data", webrtc_mod.SourcesAuto())
         await webrtc.setup_call("initiator")
         assert "v4l2src" in webrtc.gst_pipe_desc
         assert "pulsesrc" in webrtc.gst_pipe_desc
--- a/tests/unit/test_ap-gateway.py	Sun Jul 14 16:47:45 2024 +0200
+++ b/tests/unit/test_ap-gateway.py	Sun Jul 14 17:42:53 2024 +0200
@@ -718,8 +718,7 @@
             first_item["id"] == "https://test.example/_ap/item/some_user@test.example/4"
         )
         assert (
-            first_item["actor"]
-            == "https://test.example/_ap/actor/some_user@test.example"
+            first_item["actor"] == "https://test.example/_ap/actor/some_user@test.example"
         )
         assert first_item["type"] == "Create"
         first_item_obj = first_item["object"]
@@ -803,8 +802,7 @@
         )
         assert following["@context"] == ["https://www.w3.org/ns/activitystreams"]
         assert (
-            following["id"]
-            == "https://test.example/_ap/following/some_user@test.example"
+            following["id"] == "https://test.example/_ap/following/some_user@test.example"
         )
         assert following["totalItems"] == len(subscriptions)
         assert following["type"] == "OrderedCollection"
@@ -841,8 +839,7 @@
         )
         assert followers["@context"] == ["https://www.w3.org/ns/activitystreams"]
         assert (
-            followers["id"]
-            == "https://test.example/_ap/followers/some_user@test.example"
+            followers["id"] == "https://test.example/_ap/followers/some_user@test.example"
         )
         assert followers["totalItems"] == len(subscribers)
         assert followers["type"] == "OrderedCollection"
@@ -1398,7 +1395,9 @@
         assert ap_post.called
         url, actor_id, doc = ap_post.call_args.args
         assert url == TEST_USER_DATA["endpoints"]["sharedInbox"]
-        assert actor_id == ap_gateway.build_apurl(ap_const.TYPE_ACTOR, TEST_JID.userhost())
+        assert actor_id == ap_gateway.build_apurl(
+            ap_const.TYPE_ACTOR, TEST_JID.userhost()
+        )
         assert doc["type"] == "Announce"
         assert ap_const.NS_AP_PUBLIC in doc["to"]
         assert doc["object"] == ap_item["id"]
@@ -1434,8 +1433,14 @@
                 ap_gateway.host.memory.storage, "cache_pubsub_items"
             ) as cache_pubsub_items:
                 await ap_gateway.server.resource.handle_announce_activity(
-                    TEST_AP_ACTOR_ID, Request(MagicMock()), announce, None, None, None,
-                    "", TEST_AP_ACTOR_ID
+                    TEST_AP_ACTOR_ID,
+                    Request(MagicMock()),
+                    announce,
+                    None,
+                    None,
+                    None,
+                    "",
+                    TEST_AP_ACTOR_ID,
                 )
 
         assert cache_pubsub_items.called
@@ -1444,7 +1449,10 @@
         extra = mb_data["extra"]
         assert "repeated" in extra
         repeated = extra["repeated"]
-        assert repeated["by"] == ap_gateway.get_local_jid_from_account(TEST_AP_ACCOUNT).full()
+        assert (
+            repeated["by"]
+            == ap_gateway.get_local_jid_from_account(TEST_AP_ACCOUNT).full()
+        )
         xmpp_item_xmpp_url = xmpp_uri.build_xmpp_uri(
             "pubsub",
             path=TEST_JID.full(),
@@ -1487,7 +1495,9 @@
         assert ap_post.called
         url, actor_id, doc = ap_post.call_args.args
         assert url == TEST_USER_DATA["endpoints"]["sharedInbox"]
-        assert actor_id == ap_gateway.build_apurl(ap_const.TYPE_ACTOR, TEST_JID.userhost())
+        assert actor_id == ap_gateway.build_apurl(
+            ap_const.TYPE_ACTOR, TEST_JID.userhost()
+        )
         assert doc["type"] == "Like"
         assert ap_const.NS_AP_PUBLIC in doc["cc"]
         assert doc["object"] == ap_item["id"]
@@ -1748,9 +1758,9 @@
         assert event_data["head-picture"] == {
             "sources": [{"url": "https://example.org/head_picture.jpg"}]
         }
-        assert event_data["descriptions"] ==  [{
-            "description": "<p>meeting for test</p>", "type": "xhtml"
-        }]
+        assert event_data["descriptions"] == [
+            {"description": "<p>meeting for test</p>", "type": "xhtml"}
+        ]
         assert event_data["categories"] == [{"term": "test"}]
         assert event_data["locations"] == [{"description": "somewhere in the world"}]
         assert event_data["rsvp"] == [
--- a/tests/unit/test_plugin_xep_0082.py	Sun Jul 14 16:47:45 2024 +0200
+++ b/tests/unit/test_plugin_xep_0082.py	Sun Jul 14 17:42:53 2024 +0200
@@ -30,7 +30,7 @@
     "test_datetime_formatting",
     "test_datetime_parsing",
     "test_time_formatting",
-    "test_time_parsing"
+    "test_time_parsing",
 ]
 
 
@@ -85,9 +85,10 @@
     # explicit input
     # datetime
     assert isinstance(XEP_0082.parse_datetime(XEP_0082.format_datetime()), datetime)
-    assert isinstance(XEP_0082.parse_datetime(XEP_0082.format_datetime(
-        include_microsecond=True
-    )), datetime)
+    assert isinstance(
+        XEP_0082.parse_datetime(XEP_0082.format_datetime(include_microsecond=True)),
+        datetime,
+    )
     assert XEP_0082.parse_datetime(XEP_0082.format_datetime()).tzinfo == timezone.utc
 
 
@@ -109,16 +110,19 @@
         XEP_0082.parse_datetime("1969-07-21T02:56:15")
 
     # With timezone 'Z', with a fraction of a second consisting of two digits
-    assert XEP_0082.parse_datetime("1969-07-21T02:56:15.12Z") == \
-        value.replace(microsecond=120000)
+    assert XEP_0082.parse_datetime("1969-07-21T02:56:15.12Z") == value.replace(
+        microsecond=120000
+    )
 
     # With timezone 'Z', with a fraction of a second consisting of nine digits
-    assert XEP_0082.parse_datetime("1969-07-21T02:56:15.123456789Z") == \
-        value.replace(microsecond=123456)
+    assert XEP_0082.parse_datetime("1969-07-21T02:56:15.123456789Z") == value.replace(
+        microsecond=123456
+    )
 
     # With timezone '+04:00', with a fraction of a second consisting of six digits
-    assert XEP_0082.parse_datetime("1969-07-21T06:56:15.123456+04:00") == \
-        value.replace(microsecond=123456)
+    assert XEP_0082.parse_datetime("1969-07-21T06:56:15.123456+04:00") == value.replace(
+        microsecond=123456
+    )
 
     # With timezone '-05:00', with a fraction of a second consisting of zero digits
     assert XEP_0082.parse_datetime("1969-07-20T21:56:15.-05:00") == value
@@ -162,9 +166,9 @@
     # Check that a time instance is returned when format_time is called without an
     # explicit input date
     assert isinstance(XEP_0082.parse_time(XEP_0082.format_time()), time)
-    assert isinstance(XEP_0082.parse_time(XEP_0082.format_time(
-        include_microsecond=True
-    )), time)
+    assert isinstance(
+        XEP_0082.parse_time(XEP_0082.format_time(include_microsecond=True)), time
+    )
     assert XEP_0082.parse_time(XEP_0082.format_time()).tzinfo == timezone.utc
 
 
@@ -191,12 +195,14 @@
     assert XEP_0082.parse_time("16:00:00.123456789Z") == value.replace(microsecond=123456)
 
     # With timezone '+04:00', with a fraction of a second consisting of six digits
-    assert XEP_0082.parse_time("20:00:00.123456+04:00") == \
-        value.replace(microsecond=123456)
+    assert XEP_0082.parse_time("20:00:00.123456+04:00") == value.replace(
+        microsecond=123456
+    )
 
     # With timezone '-05:00', with a fraction of a second consisting of zero digits
     assert XEP_0082.parse_time("11:00:00.-05:00") == value
 
     # Without a timezone, with a fraction of a second consisting of six digits
-    assert XEP_0082.parse_time("16:00:00.123456") == \
-        value.replace(microsecond=123456, tzinfo=None)
+    assert XEP_0082.parse_time("16:00:00.123456") == value.replace(
+        microsecond=123456, tzinfo=None
+    )
--- a/tests/unit/test_plugin_xep_0167.py	Sun Jul 14 16:47:45 2024 +0200
+++ b/tests/unit/test_plugin_xep_0167.py	Sun Jul 14 17:42:53 2024 +0200
@@ -25,7 +25,10 @@
 
 from libervia.backend.plugins.plugin_xep_0166 import XEP_0166
 from libervia.backend.plugins.plugin_xep_0167 import XEP_0167, mapping
-from libervia.backend.plugins.plugin_xep_0167.constants import NS_JINGLE_RTP, NS_JINGLE_RTP_INFO
+from libervia.backend.plugins.plugin_xep_0167.constants import (
+    NS_JINGLE_RTP,
+    NS_JINGLE_RTP_INFO,
+)
 from libervia.backend.tools import xml_tools
 from libervia.backend.tools.common import data_format
 
@@ -45,8 +48,8 @@
         """Senders are mapped to SDP attribute"""
         assert mapping.senders_to_sdp("both", {"role": "initiator"}) == "a=sendrecv"
         assert mapping.senders_to_sdp("none", {"role": "initiator"}) == "a=inactive"
-        assert mapping.senders_to_sdp("initiator", {"role": "initiator"}) == "a=sendonly"
-        assert mapping.senders_to_sdp("responder", {"role": "initiator"}) == "a=recvonly"
+        assert mapping.senders_to_sdp("initiator", {"role": "initiator"}) == "a=recvonly"
+        assert mapping.senders_to_sdp("responder", {"role": "initiator"}) == "a=sendonly"
 
     def test_generate_sdp_from_session(self):
         """SDP is correctly generated from session data"""
@@ -134,35 +137,36 @@
                     "media": "audio",
                     "payload_types": {
                         96: {
+                            "clockrate": 48000,
                             "id": 96,
                             "name": "opus",
-                            "clockrate": 48000,
                             "parameters": {"sprop-stereo": "1"},
                         }
                     },
                 },
+                "id": "audio",
+                "senders": "both",
                 "transport_data": {
+                    "candidates": [
+                        {
+                            "address": "10.0.0.1",
+                            "component_id": 1,
+                            "foundation": "1",
+                            "port": 12345,
+                            "priority": 1,
+                            "transport": "UDP",
+                            "type": "host",
+                        }
+                    ],
                     "port": 9999,
                     "pwd": "pwd",
                     "ufrag": "ufrag",
-                    "candidates": [
-                        {
-                            "foundation": "1",
-                            "component_id": 1,
-                            "transport": "UDP",
-                            "priority": 1,
-                            "address": "10.0.0.1",
-                            "port": 12345,
-                            "type": "host",
-                        }
-                    ],
                 },
-                "id": "audio",
             },
             "metadata": {},
         }
 
-        assert mapping.parse_sdp(sdp) == expected_session
+        assert mapping.parse_sdp(sdp, "responder") == expected_session
 
     def test_build_description(self):
         """<description> element is generated from media data"""
--- a/tests/unit/test_plugin_xep_0272.py	Sun Jul 14 16:47:45 2024 +0200
+++ b/tests/unit/test_plugin_xep_0272.py	Sun Jul 14 17:42:53 2024 +0200
@@ -35,7 +35,6 @@
 TEST_ROOM_JID = jid.JID("room@example.com/user")
 
 
-
 @fixture
 def xep_0272(host) -> XEP_0272:
     """Fixture for initializing XEP-0272 plugin."""
@@ -64,11 +63,8 @@
         muji_elt = presence_elt.addElement((NS_MUJI, "muji"))
         muji_elt.addElement("preparing")
 
-        muji_data = {
-            "preparing_jids": set()
-        }
-        with patch.object(
-            xep_0272._muc, "get_room_user_jid", return_value=TEST_ROOM_JID) :
+        muji_data = {"preparing_jids": set()}
+        with patch.object(xep_0272._muc, "get_room_user_jid", return_value=TEST_ROOM_JID):
             with patch.object(xep_0272, "get_muji_data", return_value=muji_data):
                 with patch.object(
                     xep_0272, "try_to_finish_preparation"
@@ -83,11 +79,7 @@
         presence_elt["from"] = "room@example.com/user"
         presence_elt.addElement((NS_MUJI, "muji"))
 
-        muji_data = {
-            "done_preparing": True,
-            "preparing_jids": set(),
-            "to_call": set()
-        }
+        muji_data = {"done_preparing": True, "preparing_jids": set(), "to_call": set()}
         with patch.object(xep_0272, "get_muji_data", return_value=muji_data):
             with patch.object(
                 xep_0272, "try_to_finish_preparation"
--- a/tests/unit/test_plugin_xep_0293.py	Sun Jul 14 16:47:45 2024 +0200
+++ b/tests/unit/test_plugin_xep_0293.py	Sun Jul 14 17:42:53 2024 +0200
@@ -19,9 +19,14 @@
 from twisted.words.xish import domish
 
 from libervia.backend.plugins.plugin_xep_0167.constants import NS_JINGLE_RTP
-from libervia.backend.plugins.plugin_xep_0293 import NS_JINGLE_RTP_RTCP_FB, RTCP_FB_KEY, XEP_0293
+from libervia.backend.plugins.plugin_xep_0293 import (
+    NS_JINGLE_RTP_RTCP_FB,
+    RTCP_FB_KEY,
+    XEP_0293,
+)
 from libervia.backend.tools import xml_tools
 
+
 class TestXEP0293:
 
     def test_parse_sdp_rtcp_fb_general(self, host):
@@ -49,9 +54,7 @@
         """Parsing of a payload-specific RTCP feedback SDP line."""
         xep_0293 = XEP_0293(host)
 
-        application_data = {
-            "payload_types": {96: {}}
-        }
+        application_data = {"payload_types": {96: {}}}
         transport_data = {}
 
         # SDP line: a=rtcp-fb:96 nack
@@ -93,9 +96,7 @@
         """Parsing of a payload-specific RTCP feedback with trr-int SDP line."""
         xep_0293 = XEP_0293(host)
 
-        application_data = {
-            "payload_types": {96: {}}
-        }
+        application_data = {"payload_types": {96: {}}}
         transport_data = {}
 
         # SDP line: a=rtcp-fb-trr-int:96 100
@@ -139,7 +140,9 @@
         sdp_lines = []
         application_data = {}
         media_data = {
-            "payload_types": {96: {RTCP_FB_KEY: [("nack", None, {})], "rtcp-fb-trr-int": 100}}
+            "payload_types": {
+                96: {RTCP_FB_KEY: [("nack", None, {})], "rtcp-fb-trr-int": 100}
+            }
         }
 
         xep_0293._generate_sdp_content_trigger(
@@ -204,10 +207,7 @@
     def test_build_rtcp_fb_elements(self, host):
         """Building the <rtcp-fb> and <rtcp-fb-trr-int> elements."""
         xep_0293 = XEP_0293(host)
-        data = {
-            RTCP_FB_KEY: [("nack", "pli", {})],
-            "rtcp-fb-trr-int": 100
-        }
+        data = {RTCP_FB_KEY: [("nack", "pli", {})], "rtcp-fb-trr-int": 100}
 
         # Test _build_description_trigger
         desc_elt = domish.Element((NS_JINGLE_RTP, "description"))
@@ -219,7 +219,9 @@
         assert rtcp_fb_elt["type"] == "nack"
         assert rtcp_fb_elt["subtype"] == "pli"
 
-        rtcp_fb_trr_int_elts = list(desc_elt.elements(NS_JINGLE_RTP_RTCP_FB, "rtcp-fb-trr-int"))
+        rtcp_fb_trr_int_elts = list(
+            desc_elt.elements(NS_JINGLE_RTP_RTCP_FB, "rtcp-fb-trr-int")
+        )
         assert len(rtcp_fb_trr_int_elts) == 1
         rtcp_fb_trr_int_elt = rtcp_fb_trr_int_elts[0]
         assert int(rtcp_fb_trr_int_elt["value"]) == 100
@@ -227,7 +229,9 @@
         # Test _build_description_payload_type_trigger
         desc_elt = domish.Element((NS_JINGLE_RTP, "description"))
         payload_type_elt = desc_elt.addElement((NS_JINGLE_RTP, "payload-type"))
-        xep_0293._build_description_payload_type_trigger(desc_elt, {}, data, payload_type_elt)
+        xep_0293._build_description_payload_type_trigger(
+            desc_elt, {}, data, payload_type_elt
+        )
 
         rtcp_fb_elts = list(payload_type_elt.elements(NS_JINGLE_RTP_RTCP_FB, "rtcp-fb"))
         assert len(rtcp_fb_elts) == 1
@@ -235,7 +239,9 @@
         assert rtcp_fb_elt["type"] == "nack"
         assert rtcp_fb_elt["subtype"] == "pli"
 
-        rtcp_fb_trr_int_elts = list(payload_type_elt.elements(NS_JINGLE_RTP_RTCP_FB, "rtcp-fb-trr-int"))
+        rtcp_fb_trr_int_elts = list(
+            payload_type_elt.elements(NS_JINGLE_RTP_RTCP_FB, "rtcp-fb-trr-int")
+        )
         assert len(rtcp_fb_trr_int_elts) == 1
         rtcp_fb_trr_int_elt = rtcp_fb_trr_int_elts[0]
         assert int(rtcp_fb_trr_int_elt["value"]) == 100
--- a/tests/unit/test_plugin_xep_0320.py	Sun Jul 14 16:47:45 2024 +0200
+++ b/tests/unit/test_plugin_xep_0320.py	Sun Jul 14 17:42:53 2024 +0200
@@ -40,8 +40,7 @@
             "fingerprint": {
                 "hash": "sha-256",
                 "setup": "active",
-                "fingerprint":
-                "6D:8F:6A:53:A3:7E:10:B2:58:16:AB:A3:92:6F:8A:5B:2D:55:1C:"
+                "fingerprint": "6D:8F:6A:53:A3:7E:10:B2:58:16:AB:A3:92:6F:8A:5B:2D:55:1C:"
                 "FB:2F:E3:6E:94:FE:4F:4E:FE:D4:77:49:B6",
             },
         }
@@ -59,8 +58,7 @@
             "fingerprint": {
                 "hash": "sha-256",
                 "setup": "active",
-                "fingerprint":
-                "6D:8F:6A:53:A3:7E:10:B2:58:16:AB:A3:92:6F:8A:5B:2D:55:1C:"
+                "fingerprint": "6D:8F:6A:53:A3:7E:10:B2:58:16:AB:A3:92:6F:8A:5B:2D:55:1C:"
                 "FB:2F:E3:6E:94:FE:4F:4E:FE:D4:77:49:B6",
             },
         }
@@ -70,7 +68,8 @@
         expected_transport_elt = xml_tools.parse(
             f"<transport><fingerprint xmlns='{NS_JINGLE_DTLS}' hash='sha-256' "
             "setup='active'>6D:8F:6A:53:A3:7E:10:B2:58:16:AB:A3:92:6F:8A:5B:2D:55:1C:FB:"
-            "2F:E3:6E:94:FE:4F:4E:FE:D4:77:49:B6</fingerprint></transport>"""
+            "2F:E3:6E:94:FE:4F:4E:FE:D4:77:49:B6</fingerprint></transport>"
+            ""
         )
 
         assert transport_elt.toXml() == expected_transport_elt.toXml()
--- a/tests/unit/test_plugin_xep_0373.py	Sun Jul 14 16:47:45 2024 +0200
+++ b/tests/unit/test_plugin_xep_0373.py	Sun Jul 14 17:42:53 2024 +0200
@@ -2,6 +2,7 @@
 
 import pytest
 from libervia.backend.core import exceptions
+
 try:
     from libervia.backend.plugins.plugin_xep_0373 import XEP_0373, NS_OX
 except exceptions.MissingModule as e:
@@ -20,7 +21,7 @@
 
 
 def test_signcrypt_element() -> None:
-    signcrypt_elt, payload_elt = XEP_0373.build_signcrypt_element([ a, b ])
+    signcrypt_elt, payload_elt = XEP_0373.build_signcrypt_element([a, b])
     payload_elt.addElement("signcrypt-test-content", content="signcrypt test content")
 
     rpad_elt = next(signcrypt_elt.elements(NS_OX, "rpad"))
@@ -36,11 +37,11 @@
     assert (datetime.now(timezone.utc) - timestamp) < timedelta(seconds=10)
     assert signcrypt_elt.toXml() == (
         "<signcrypt xmlns='urn:xmpp:openpgp:0'>"
-            "<to jid='foo@example.com'/>"
-            "<to jid='bar@example.com'/>"
-            "<payload>"
-                "<signcrypt-test-content>signcrypt test content</signcrypt-test-content>"
-            "</payload>"
+        "<to jid='foo@example.com'/>"
+        "<to jid='bar@example.com'/>"
+        "<payload>"
+        "<signcrypt-test-content>signcrypt test content</signcrypt-test-content>"
+        "</payload>"
         "</signcrypt>"
     )
 
@@ -51,7 +52,7 @@
 
 
 def test_sign_element_with_rpad() -> None:
-    sign_elt, payload_elt = XEP_0373.build_sign_element([ a, b ], True)
+    sign_elt, payload_elt = XEP_0373.build_sign_element([a, b], True)
     payload_elt.addElement("sign-test-content", content="sign test content")
 
     rpad_elt = next(sign_elt.elements(NS_OX, "rpad"))
@@ -67,17 +68,17 @@
     assert (datetime.now(timezone.utc) - timestamp) < timedelta(seconds=10)
     assert sign_elt.toXml() == (
         "<sign xmlns='urn:xmpp:openpgp:0'>"
-            "<to jid='foo@example.com'/>"
-            "<to jid='bar@example.com'/>"
-            "<payload>"
-                "<sign-test-content>sign test content</sign-test-content>"
-            "</payload>"
+        "<to jid='foo@example.com'/>"
+        "<to jid='bar@example.com'/>"
+        "<payload>"
+        "<sign-test-content>sign test content</sign-test-content>"
+        "</payload>"
         "</sign>"
     )
 
 
 def test_sign_element_without_rpad() -> None:
-    sign_elt, payload_elt = XEP_0373.build_sign_element([ a, b ], False)
+    sign_elt, payload_elt = XEP_0373.build_sign_element([a, b], False)
     payload_elt.addElement("sign-test-content", content="sign test content")
 
     rpad_elt = next(sign_elt.elements(NS_OX, "rpad"), None)
@@ -91,17 +92,17 @@
     assert (datetime.now(timezone.utc) - timestamp) < timedelta(seconds=10)
     assert sign_elt.toXml() == (
         "<sign xmlns='urn:xmpp:openpgp:0'>"
-            "<to jid='foo@example.com'/>"
-            "<to jid='bar@example.com'/>"
-            "<payload>"
-                "<sign-test-content>sign test content</sign-test-content>"
-            "</payload>"
+        "<to jid='foo@example.com'/>"
+        "<to jid='bar@example.com'/>"
+        "<payload>"
+        "<sign-test-content>sign test content</sign-test-content>"
+        "</payload>"
         "</sign>"
     )
 
 
 def test_crypt_element_with_recipients() -> None:
-    crypt_elt, payload_elt = XEP_0373.build_crypt_element([ a, b ])
+    crypt_elt, payload_elt = XEP_0373.build_crypt_element([a, b])
     payload_elt.addElement("crypt-test-content", content="crypt test content")
 
     rpad_elt = next(crypt_elt.elements(NS_OX, "rpad"))
@@ -117,11 +118,11 @@
     assert (datetime.now(timezone.utc) - timestamp) < timedelta(seconds=10)
     assert crypt_elt.toXml() == (
         "<crypt xmlns='urn:xmpp:openpgp:0'>"
-            "<to jid='foo@example.com'/>"
-            "<to jid='bar@example.com'/>"
-            "<payload>"
-                "<crypt-test-content>crypt test content</crypt-test-content>"
-            "</payload>"
+        "<to jid='foo@example.com'/>"
+        "<to jid='bar@example.com'/>"
+        "<payload>"
+        "<crypt-test-content>crypt test content</crypt-test-content>"
+        "</payload>"
         "</crypt>"
     )
 
@@ -143,8 +144,8 @@
     assert (datetime.now(timezone.utc) - timestamp) < timedelta(seconds=10)
     assert crypt_elt.toXml() == (
         "<crypt xmlns='urn:xmpp:openpgp:0'>"
-            "<payload>"
-                "<crypt-test-content>crypt test content</crypt-test-content>"
-            "</payload>"
+        "<payload>"
+        "<crypt-test-content>crypt test content</crypt-test-content>"
+        "</payload>"
         "</crypt>"
     )
--- a/tests/unit/test_plugin_xep_0420.py	Sun Jul 14 16:47:45 2024 +0200
+++ b/tests/unit/test_plugin_xep_0420.py	Sun Jul 14 17:42:53 2024 +0200
@@ -24,8 +24,13 @@
 
 from libervia.backend.plugins.plugin_xep_0334 import NS_HINTS
 from libervia.backend.plugins.plugin_xep_0420 import (
-    NS_SCE, XEP_0420, AffixVerificationFailed, ProfileRequirementsNotMet, SCEAffixPolicy,
-    SCECustomAffix, SCEProfile
+    NS_SCE,
+    XEP_0420,
+    AffixVerificationFailed,
+    ProfileRequirementsNotMet,
+    SCEAffixPolicy,
+    SCECustomAffix,
+    SCEProfile,
 )
 from libervia.backend.tools.xml_tools import ElementParser
 from twisted.words.xish import domish
@@ -43,7 +48,7 @@
     "test_custom_affixes",
     "test_namespace_conversion",
     "test_non_encryptable_elements",
-    "test_schema_validation"
+    "test_schema_validation",
 ]
 
 
@@ -110,7 +115,7 @@
         SCEAffixPolicy.OPTIONAL,
         SCEAffixPolicy.NOT_NEEDED,
         SCEAffixPolicy.OPTIONAL,
-        custom_policies={ CustomAffixImpl(): SCEAffixPolicy.NOT_NEEDED }
+        custom_policies={CustomAffixImpl(): SCEAffixPolicy.NOT_NEEDED},
     )
 
     stanza_string = (
@@ -142,19 +147,19 @@
         SCEAffixPolicy.OPTIONAL,
         SCEAffixPolicy.NOT_NEEDED,
         SCEAffixPolicy.OPTIONAL,
-        custom_policies={ custom_affix: SCEAffixPolicy.OPTIONAL }
+        custom_policies={custom_affix: SCEAffixPolicy.OPTIONAL},
     )
 
-    stanza = string_to_domish("""<message from="foo@example.com" to="bar@example.com">
+    stanza = string_to_domish(
+        """<message from="foo@example.com" to="bar@example.com">
         <body>
             Make sure that both the REQUIRED and the OPTIONAL affixes are included.
         </body>
-    </message>""")
+    </message>"""
+    )
 
     affix_values = XEP_0420.unpack_stanza(
-        profile,
-        stanza,
-        XEP_0420.pack_stanza(profile, stanza)
+        profile, stanza, XEP_0420.pack_stanza(profile, stanza)
     )
 
     assert affix_values.rpad is not None
@@ -170,7 +175,7 @@
         SCEAffixPolicy.REQUIRED,
         SCEAffixPolicy.REQUIRED,
         SCEAffixPolicy.REQUIRED,
-        custom_policies={}
+        custom_policies={},
     )
 
     unpacking_profile = SCEProfile(
@@ -178,14 +183,16 @@
         SCEAffixPolicy.NOT_NEEDED,
         SCEAffixPolicy.NOT_NEEDED,
         SCEAffixPolicy.NOT_NEEDED,
-        custom_policies={}
+        custom_policies={},
     )
 
-    stanza = string_to_domish("""<message from="foo@example.com" to="bar@example.com">
+    stanza = string_to_domish(
+        """<message from="foo@example.com" to="bar@example.com">
         <body>
             When unpacking, all affixes are loaded, even those marked as NOT_NEEDED.
         </body>
-    </message>""")
+    </message>"""
+    )
 
     envelope_serialized = XEP_0420.pack_stanza(packing_profile, stanza)
 
@@ -211,7 +218,7 @@
         SCEAffixPolicy.NOT_NEEDED,
         SCEAffixPolicy.NOT_NEEDED,
         SCEAffixPolicy.NOT_NEEDED,
-        custom_policies={}
+        custom_policies={},
     )
 
     unpacking_profile = SCEProfile(
@@ -219,18 +226,18 @@
         SCEAffixPolicy.REQUIRED,
         SCEAffixPolicy.REQUIRED,
         SCEAffixPolicy.REQUIRED,
-        custom_policies={}
+        custom_policies={},
     )
 
-    stanza = string_to_domish("""<message from="foo@example.com" to="bar@example.com">
+    stanza = string_to_domish(
+        """<message from="foo@example.com" to="bar@example.com">
         <body>Check that all affixes REQUIRED by the profile are present.</body>
-    </message>""")
+    </message>"""
+    )
 
     with pytest.raises(ProfileRequirementsNotMet):
         XEP_0420.unpack_stanza(
-            unpacking_profile,
-            stanza,
-            XEP_0420.pack_stanza(packing_profile, stanza)
+            unpacking_profile, stanza, XEP_0420.pack_stanza(packing_profile, stanza)
         )
 
     # Do the same but with a custom affix missing
@@ -241,7 +248,7 @@
         SCEAffixPolicy.NOT_NEEDED,
         SCEAffixPolicy.NOT_NEEDED,
         SCEAffixPolicy.NOT_NEEDED,
-        custom_policies={ custom_affix: SCEAffixPolicy.NOT_NEEDED }
+        custom_policies={custom_affix: SCEAffixPolicy.NOT_NEEDED},
     )
 
     unpacking_profile = SCEProfile(
@@ -249,21 +256,21 @@
         SCEAffixPolicy.NOT_NEEDED,
         SCEAffixPolicy.NOT_NEEDED,
         SCEAffixPolicy.NOT_NEEDED,
-        custom_policies={ custom_affix: SCEAffixPolicy.REQUIRED }
+        custom_policies={custom_affix: SCEAffixPolicy.REQUIRED},
     )
 
-    stanza = string_to_domish("""<message from="foo@example.com" to="bar@example.com">
+    stanza = string_to_domish(
+        """<message from="foo@example.com" to="bar@example.com">
         <body>
             Check that all affixes REQUIRED by the profile are present, including custom
             affixes.
         </body>
-    </message>""")
+    </message>"""
+    )
 
     with pytest.raises(ProfileRequirementsNotMet):
         XEP_0420.unpack_stanza(
-            unpacking_profile,
-            stanza,
-            XEP_0420.pack_stanza(packing_profile, stanza)
+            unpacking_profile, stanza, XEP_0420.pack_stanza(packing_profile, stanza)
         )
 
 
@@ -273,18 +280,18 @@
         SCEAffixPolicy.NOT_NEEDED,
         SCEAffixPolicy.NOT_NEEDED,
         SCEAffixPolicy.NOT_NEEDED,
-        custom_policies={}
+        custom_policies={},
     )
 
     for _ in range(100):
-        stanza = string_to_domish("""<message from="foo@example.com" to="bar@example.com">
+        stanza = string_to_domish(
+            """<message from="foo@example.com" to="bar@example.com">
             <body>OK</body>
-        </message>""")
+        </message>"""
+        )
 
         affix_values = XEP_0420.unpack_stanza(
-            profile,
-            stanza,
-            XEP_0420.pack_stanza(profile, stanza)
+            profile, stanza, XEP_0420.pack_stanza(profile, stanza)
         )
 
         # Test that the rpad exists and that the content elements are always padded to at
@@ -299,7 +306,7 @@
         SCEAffixPolicy.REQUIRED,
         SCEAffixPolicy.NOT_NEEDED,
         SCEAffixPolicy.NOT_NEEDED,
-        custom_policies={}
+        custom_policies={},
     )
 
     stanza = string_to_domish(
@@ -314,7 +321,9 @@
             </body>
         </content>
         <time stamp="1969-07-21T02:56:15Z"/>
-    </envelope>""".encode("utf-8")
+    </envelope>""".encode(
+        "utf-8"
+    )
 
     affix_values = XEP_0420.unpack_stanza(profile, stanza, envelope_serialized)
     assert affix_values.timestamp == datetime(1969, 7, 21, 2, 56, 15, tzinfo=timezone.utc)
@@ -326,12 +335,14 @@
         SCEAffixPolicy.NOT_NEEDED,
         SCEAffixPolicy.REQUIRED,
         SCEAffixPolicy.NOT_NEEDED,
-        custom_policies={}
+        custom_policies={},
     )
 
-    stanza = string_to_domish("""<message from="foo@example.com" to="bar@example.com">
+    stanza = string_to_domish(
+        """<message from="foo@example.com" to="bar@example.com">
         <body>Check that the ``to`` affix is correctly added.</body>
-    </message>""")
+    </message>"""
+    )
 
     envelope_serialized = XEP_0420.pack_stanza(profile, stanza)
     affix_values = XEP_0420.unpack_stanza(profile, stanza, envelope_serialized)
@@ -355,11 +366,13 @@
     assert affix_values.recipient is not None
     assert affix_values.recipient.userhost() == "bar@example.com"
 
-    stanza = string_to_domish("""<message from="foo@example.com">
+    stanza = string_to_domish(
+        """<message from="foo@example.com">
         <body>
             Check that a missing "to" attribute on the stanza fails stanza packing.
         </body>
-    </message>""")
+    </message>"""
+    )
 
     with pytest.raises(ValueError):
         XEP_0420.pack_stanza(profile, stanza)
@@ -371,12 +384,14 @@
         SCEAffixPolicy.NOT_NEEDED,
         SCEAffixPolicy.NOT_NEEDED,
         SCEAffixPolicy.REQUIRED,
-        custom_policies={}
+        custom_policies={},
     )
 
-    stanza = string_to_domish("""<message from="foo@example.com" to="bar@example.com">
+    stanza = string_to_domish(
+        """<message from="foo@example.com" to="bar@example.com">
         <body>Check that the ``from`` affix is correctly added.</body>
-    </message>""")
+    </message>"""
+    )
 
     envelope_serialized = XEP_0420.pack_stanza(profile, stanza)
     affix_values = XEP_0420.unpack_stanza(profile, stanza, envelope_serialized)
@@ -400,11 +415,13 @@
     assert affix_values.sender is not None
     assert affix_values.sender.userhost() == "foo@example.com"
 
-    stanza = string_to_domish("""<message to="bar@example.com">
+    stanza = string_to_domish(
+        """<message to="bar@example.com">
         <body>
             Check that a missing "from" attribute on the stanza fails stanza packing.
         </body>
-    </message>""")
+    </message>"""
+    )
 
     with pytest.raises(ValueError):
         XEP_0420.pack_stanza(profile, stanza)
@@ -418,7 +435,7 @@
         SCEAffixPolicy.NOT_NEEDED,
         SCEAffixPolicy.NOT_NEEDED,
         SCEAffixPolicy.NOT_NEEDED,
-        custom_policies={ custom_affix: SCEAffixPolicy.REQUIRED }
+        custom_policies={custom_affix: SCEAffixPolicy.REQUIRED},
     )
 
     unpacking_profile = SCEProfile(
@@ -426,41 +443,45 @@
         SCEAffixPolicy.NOT_NEEDED,
         SCEAffixPolicy.NOT_NEEDED,
         SCEAffixPolicy.NOT_NEEDED,
-        custom_policies={}
+        custom_policies={},
     )
 
-    stanza = string_to_domish("""<message from="foo@example.com" to="bar@example.com">
+    stanza = string_to_domish(
+        """<message from="foo@example.com" to="bar@example.com">
         <body>
             If a custom affix is included in the envelope, but not excpected by the
             recipient, the schema validation should fail.
         </body>
-    </message>""")
+    </message>"""
+    )
 
     with pytest.raises(exceptions.ParsingError):
         XEP_0420.unpack_stanza(
-            unpacking_profile,
-            stanza,
-            XEP_0420.pack_stanza(packing_profile, stanza)
+            unpacking_profile, stanza, XEP_0420.pack_stanza(packing_profile, stanza)
         )
 
     profile = packing_profile
 
-    stanza = string_to_domish("""<message from="foo@example.com/device0"
+    stanza = string_to_domish(
+        """<message from="foo@example.com/device0"
         to="bar@example.com/Libervia.123">
         <body>The affix element should be returned as part of the affix values.</body>
-    </message>""")
+    </message>"""
+    )
 
     affix_values = XEP_0420.unpack_stanza(
-        profile,
-        stanza,
-        XEP_0420.pack_stanza(profile, stanza)
+        profile, stanza, XEP_0420.pack_stanza(profile, stanza)
     )
 
     assert custom_affix in affix_values.custom
-    assert affix_values.custom[custom_affix].getAttribute("recipient") == \
-        "bar@example.com/Libervia.123"
-    assert affix_values.custom[custom_affix].getAttribute("sender") == \
-        "foo@example.com/device0"
+    assert (
+        affix_values.custom[custom_affix].getAttribute("recipient")
+        == "bar@example.com/Libervia.123"
+    )
+    assert (
+        affix_values.custom[custom_affix].getAttribute("sender")
+        == "foo@example.com/device0"
+    )
 
 
 def test_namespace_conversion() -> None:  # pylint: disable=missing-function-docstring
@@ -469,7 +490,7 @@
         SCEAffixPolicy.NOT_NEEDED,
         SCEAffixPolicy.NOT_NEEDED,
         SCEAffixPolicy.NOT_NEEDED,
-        custom_policies={}
+        custom_policies={},
     )
 
     stanza = domish.Element((None, "message"))
@@ -480,7 +501,7 @@
         content=(
             "This body element has namespace ``None``, which has to be replaced with"
             " jabber:client."
-        )
+        ),
     )
 
     envelope_serialized = XEP_0420.pack_stanza(profile, stanza)
@@ -502,13 +523,15 @@
         SCEAffixPolicy.NOT_NEEDED,
         SCEAffixPolicy.NOT_NEEDED,
         SCEAffixPolicy.NOT_NEEDED,
-        custom_policies={}
+        custom_policies={},
     )
 
-    stanza = string_to_domish("""<message from="foo@example.com" to="bar@example.com">
+    stanza = string_to_domish(
+        """<message from="foo@example.com" to="bar@example.com">
         <body>This stanza includes a store hint which must not be encrypted.</body>
         <store xmlns="urn:xmpp:hints"/>
-    </message>""")
+    </message>"""
+    )
 
     envelope_serialized = XEP_0420.pack_stanza(profile, stanza)
     envelope = string_to_domish(envelope_serialized.decode("utf-8"))
@@ -529,7 +552,9 @@
             </body>
             <store xmlns="urn:xmpp:hints"/>
         </content>
-    </envelope>""".encode("utf-8")
+    </envelope>""".encode(
+        "utf-8"
+    )
 
     XEP_0420.unpack_stanza(profile, stanza, envelope_serialized)
 
@@ -542,7 +567,7 @@
         SCEAffixPolicy.NOT_NEEDED,
         SCEAffixPolicy.NOT_NEEDED,
         SCEAffixPolicy.NOT_NEEDED,
-        custom_policies={}
+        custom_policies={},
     )
 
     stanza = string_to_domish(
@@ -557,7 +582,9 @@
             <store xmlns="urn:xmpp:hints"/>
         </content>
         <unknown-affix unknown-attr="unknown"/>
-    </envelope>""".encode("utf-8")
+    </envelope>""".encode(
+        "utf-8"
+    )
 
     with pytest.raises(exceptions.ParsingError):
         XEP_0420.unpack_stanza(profile, stanza, envelope_serialized)
--- a/tests/unit/test_pubsub-cache.py	Sun Jul 14 16:47:45 2024 +0200
+++ b/tests/unit/test_pubsub-cache.py	Sun Jul 14 17:42:53 2024 +0200
@@ -33,7 +33,7 @@
         client.pubsub_client.items = MagicMock(return_value=items_ret)
         host.memory.storage.get_pubsub_node.return_value = None
         pubsub_node = host.memory.storage.set_pubsub_node.return_value = PubsubNode(
-            sync_state = None
+            sync_state=None
         )
         with patch.object(host.plugins["PUBSUB_CACHE"], "cache_node") as cache_node:
             await host.plugins["XEP-0060"].get_items(
@@ -51,15 +51,10 @@
         items_ret.callback(([], {}))
         client.pubsub_client.items = MagicMock(return_value=items_ret)
         host.memory.storage.get_pubsub_node.return_value = None
-        host.memory.storage.set_pubsub_node.return_value = PubsubNode(
-            sync_state = None
-        )
+        host.memory.storage.set_pubsub_node.return_value = PubsubNode(sync_state=None)
         with patch.object(host.plugins["PUBSUB_CACHE"], "cache_node") as cache_node:
             await host.plugins["XEP-0060"].get_items(
-                client,
-                None,
-                "urn:xmpp:microblog:0",
-                extra = {C.KEY_USE_CACHE: False}
+                client, None, "urn:xmpp:microblog:0", extra={C.KEY_USE_CACHE: False}
             )
             assert not cache_node.called
 
@@ -71,9 +66,7 @@
             items_ret.callback(([], {}))
             client.pubsub_client.items = MagicMock(return_value=items_ret)
             host.memory.storage.get_pubsub_node.return_value = None
-            host.memory.storage.set_pubsub_node.return_value = PubsubNode(
-                sync_state = None
-            )
+            host.memory.storage.set_pubsub_node.return_value = PubsubNode(sync_state=None)
             with patch.object(host.plugins["PUBSUB_CACHE"], "cache_node") as cache_node:
                 await host.plugins["XEP-0060"].get_items(
                     client,
@@ -82,7 +75,6 @@
                 )
                 assert not cache_node.called
 
-
     @ed
     async def test_no_pubsub_get_when_cache_completed(self, host, client):
         """No pubsub get is emitted when items are fully cached"""
@@ -90,11 +82,10 @@
         items_ret.callback(([], {}))
         client.pubsub_client.items = MagicMock(return_value=items_ret)
         host.memory.storage.get_pubsub_node.return_value = PubsubNode(
-            sync_state = SyncState.COMPLETED
+            sync_state=SyncState.COMPLETED
         )
         with patch.object(
-            host.plugins["PUBSUB_CACHE"],
-            "get_items_from_cache"
+            host.plugins["PUBSUB_CACHE"], "get_items_from_cache"
         ) as get_items_from_cache:
             get_items_from_cache.return_value = ([], {})
             await host.plugins["XEP-0060"].get_items(
@@ -112,13 +103,12 @@
         items_ret.callback(([], {}))
         client.pubsub_client.items = MagicMock(return_value=items_ret)
         host.memory.storage.get_pubsub_node.return_value = PubsubNode(
-            sync_state = SyncState.IN_PROGRESS
+            sync_state=SyncState.IN_PROGRESS
         )
         with patch.object(host.plugins["PUBSUB_CACHE"], "analyse_node") as analyse_node:
             analyse_node.return_value = {"to_sync": True}
             with patch.object(
-                host.plugins["PUBSUB_CACHE"],
-                "get_items_from_cache"
+                host.plugins["PUBSUB_CACHE"], "get_items_from_cache"
             ) as get_items_from_cache:
                 get_items_from_cache.return_value = ([], {})
                 assert client.pubsub_client.items.call_count == 0