diff --git a/itests/test_disco.py b/itests/test_disco.py new file mode 100644 index 00000000..95a07b17 --- /dev/null +++ b/itests/test_disco.py @@ -0,0 +1,33 @@ +import unittest +from slixmpp.test.integration import SlixIntegration + + +class TestDisco(SlixIntegration): + async def asyncSetUp(self): + await super().asyncSetUp() + self.add_client( + self.envjid('CI_ACCOUNT1'), + self.envstr('CI_ACCOUNT1_PASSWORD'), + ) + self.add_client( + self.envjid('CI_ACCOUNT2'), + self.envstr('CI_ACCOUNT2_PASSWORD'), + ) + self.register_plugins(['xep_0030']) + await self.connect_clients() + + async def test_features(self): + """Check we can add, get and delete a feature""" + self.clients[0]['xep_0030'].add_feature('urn:xmpp:fake:0') + info = await self.clients[1]['xep_0030'].get_info( + self.clients[0].boundjid.full + ) + self.assertIn('urn:xmpp:fake:0', info['disco_info']['features']) + self.clients[0]['xep_0030'].del_feature(feature='urn:xmpp:fake:0') + info = await self.clients[1]['xep_0030'].get_info( + self.clients[0].boundjid.full + ) + self.assertNotIn('urn:xmpp:fake:0', info['disco_info']['features']) + + +suite = unittest.TestLoader().loadTestsFromTestCase(TestDisco) diff --git a/itests/test_mam.py b/itests/test_mam.py new file mode 100644 index 00000000..f61bc1e6 --- /dev/null +++ b/itests/test_mam.py @@ -0,0 +1,55 @@ +import unittest +from random import randint +from slixmpp import JID +from slixmpp.test.integration import SlixIntegration + + +class TestMAM(SlixIntegration): + async def asyncSetUp(self): + await super().asyncSetUp() + self.add_client( + self.envjid('CI_ACCOUNT1'), + self.envstr('CI_ACCOUNT1_PASSWORD'), + ) + self.add_client( + self.envjid('CI_ACCOUNT2'), + self.envstr('CI_ACCOUNT2_PASSWORD'), + ) + self.register_plugins(['xep_0313']) + await self.connect_clients() + + async def test_mam_retrieve(self): + """Make sure we can get messages from our archive""" + # send messages first + tok = randint(1, 999999) + self.clients[0].make_message(mto=self.clients[1].boundjid, mbody='coucou').send() + await self.clients[1].wait_until('message') + self.clients[1].make_message( + mto=self.clients[0].boundjid, + mbody='coucou coucou %s' % tok, + ).send() + await self.clients[0].wait_until('message') + + # Get archive + retrieve = self.clients[0]['xep_0313'].retrieve( + with_jid=JID(self.envjid('CI_ACCOUNT2')), + iterator=True, + reverse=True, + rsm={'max': 2} + ) + msgs = [] + count = 0 + async for rsm in retrieve: + for msg in rsm['mam']['results']: + msgs.append( + msg['mam_result']['forwarded']['stanza'] + ) + count += 1 + if count >= 2: + break + + self.assertEqual(msgs[0]['body'], 'coucou') + self.assertEqual(msgs[1]['body'], 'coucou coucou %s' % tok) + + +suite = unittest.TestLoader().loadTestsFromTestCase(TestMAM) diff --git a/itests/test_muc.py b/itests/test_muc.py index 3dc91955..91073863 100644 --- a/itests/test_muc.py +++ b/itests/test_muc.py @@ -7,7 +7,7 @@ from slixmpp.test.integration import SlixIntegration UNIQUE = uuid4().hex -class TestConnect(SlixIntegration): +class TestMUC(SlixIntegration): async def asyncSetUp(self): self.mucserver = self.envjid('CI_MUC_SERVER') @@ -75,4 +75,4 @@ class TestConnect(SlixIntegration): ) -suite = unittest.TestLoader().loadTestsFromTestCase(TestConnect) +suite = unittest.TestLoader().loadTestsFromTestCase(TestMUC) diff --git a/itests/test_ping.py b/itests/test_ping.py new file mode 100644 index 00000000..fd190e03 --- /dev/null +++ b/itests/test_ping.py @@ -0,0 +1,21 @@ +import unittest +from slixmpp.test.integration import SlixIntegration + + +class TestPing(SlixIntegration): + async def asyncSetUp(self): + await super().asyncSetUp() + self.add_client( + self.envjid('CI_ACCOUNT1'), + self.envstr('CI_ACCOUNT1_PASSWORD'), + ) + self.register_plugins(['xep_0199']) + await self.connect_clients() + + async def test_ping(self): + """Check we can ping our own server""" + rtt = await self.clients[0]['xep_0199'].ping() + self.assertGreater(10, rtt) + + +suite = unittest.TestLoader().loadTestsFromTestCase(TestPing) diff --git a/itests/test_privatestorage.py b/itests/test_privatestorage.py new file mode 100644 index 00000000..fd7f3f1b --- /dev/null +++ b/itests/test_privatestorage.py @@ -0,0 +1,35 @@ +import unittest +from slixmpp import ET +from slixmpp.test.integration import SlixIntegration +from slixmpp.plugins.xep_0048.stanza import Bookmarks + + +class TestPrivateStorage(SlixIntegration): + async def asyncSetUp(self): + self.add_client( + self.envjid('CI_ACCOUNT1'), + self.envstr('CI_ACCOUNT1_PASSWORD'), + ) + self.register_plugins(['xep_0048', 'xep_0049']) + await self.connect_clients() + + async def test_privatestorage(self): + """Check we can set, get, and delete private in xml storage""" + # Set a bookmark using private storage + el = Bookmarks() + el.add_conference('test@example.com', 'toto') + await self.clients[0]['xep_0049'].store( + el, + ) + result = await self.clients[0]['xep_0049'].retrieve('bookmarks') + self.assertEqual(str(result['private']['bookmarks']), str(el)) + + # Purge bookmarks + await self.clients[0]['xep_0049'].store( + Bookmarks(), + ) + result = await self.clients[0]['xep_0049'].retrieve('bookmarks') + self.assertEqual(result['private']['bookmarks'], Bookmarks()) + + +suite = unittest.TestLoader().loadTestsFromTestCase(TestPrivateStorage) diff --git a/itests/test_reactions.py b/itests/test_reactions.py new file mode 100644 index 00000000..2358ecff --- /dev/null +++ b/itests/test_reactions.py @@ -0,0 +1,32 @@ +import unittest +from slixmpp.test.integration import SlixIntegration + + +class TestReactions(SlixIntegration): + async def asyncSetUp(self): + self.add_client( + self.envjid('CI_ACCOUNT1'), + self.envstr('CI_ACCOUNT1_PASSWORD'), + ) + self.add_client( + self.envjid('CI_ACCOUNT2'), + self.envstr('CI_ACCOUNT2_PASSWORD'), + ) + self.register_plugins(['xep_0444']) + await self.connect_clients() + + async def test_send_reaction(self): + """Make sure we can send and receive reactions""" + self.clients[0]['xep_0444'].send_reactions( + self.clients[1].boundjid.full, + to_id='toto', + reactions=['🦙', '🦦'], + ) + msg = await self.clients[1].wait_until('reactions') + self.assertEqual( + msg['reactions'].get_values(), + {'🦙', '🦦'}, + ) + self.assertEqual(msg['reactions']['id'], 'toto') + +suite = unittest.TestLoader().loadTestsFromTestCase(TestReactions) diff --git a/itests/test_retract.py b/itests/test_retract.py new file mode 100644 index 00000000..55f79fa9 --- /dev/null +++ b/itests/test_retract.py @@ -0,0 +1,29 @@ +import unittest +from slixmpp.test.integration import SlixIntegration + + +class TestRetract(SlixIntegration): + async def asyncSetUp(self): + self.add_client( + self.envjid('CI_ACCOUNT1'), + self.envstr('CI_ACCOUNT1_PASSWORD'), + ) + self.add_client( + self.envjid('CI_ACCOUNT2'), + self.envstr('CI_ACCOUNT2_PASSWORD'), + ) + self.register_plugins(['xep_0424']) + await self.connect_clients() + + async def test_retract_msg(self): + """Try to retract a message""" + self.clients[0]['xep_0424'].send_retraction( + self.clients[1].boundjid.full, + id='toto', + fallback_text='Twas a mistake', + ) + msg = await self.clients[1].wait_until('message') + self.assertEqual(msg['apply_to']['id'], 'toto') + self.assertTrue(msg['apply_to']['retract']) + +suite = unittest.TestLoader().loadTestsFromTestCase(TestRetract) diff --git a/slixmpp/plugins/xep_0444/reactions.py b/slixmpp/plugins/xep_0444/reactions.py index e65f5e8f..37ab7d55 100644 --- a/slixmpp/plugins/xep_0444/reactions.py +++ b/slixmpp/plugins/xep_0444/reactions.py @@ -38,7 +38,7 @@ class XEP_0444(BasePlugin): def plugin_end(self): self.xmpp.remove_handler('Reaction received') - self.xmpp['xep_0030'].del_feature(stanza.NS) + self.xmpp['xep_0030'].del_feature(feature=stanza.NS) def _handle_reactions(self, message: Message): self.xmpp.event('reactions', message) diff --git a/slixmpp/test/integration.py b/slixmpp/test/integration.py index d15019cc..758ad239 100644 --- a/slixmpp/test/integration.py +++ b/slixmpp/test/integration.py @@ -53,7 +53,8 @@ class SlixIntegration(IsolatedAsyncioTestCase): """Connect all clients""" for client in self.clients: client.connect() - await client.wait_until('session_start') + wait = [client.wait_until('session_start') for client in self.clients] + await asyncio.gather(*wait) async def _destroy(self): """Kill all clients"""