diff --git a/tests/test_stream_xep_0405.py b/tests/test_stream_xep_0405.py
new file mode 100644
index 00000000..9bc01601
--- /dev/null
+++ b/tests/test_stream_xep_0405.py
@@ -0,0 +1,181 @@
+import unittest
+from slixmpp.test import SlixTest
+from slixmpp import JID
+
+
+class TestMIXPAM(SlixTest):
+
+ def setUp(self):
+ self.stream_start(plugins=['xep_0405'])
+
+ def tearDown(self):
+ self.stream_close()
+
+ def testGetRosterEmpty(self):
+ """Test requesting an empty annotated roster"""
+
+ fut = self.xmpp.wrap(self.xmpp['xep_0405'].get_mix_roster())
+
+ self.wait_()
+ self.send("""
+
+
+
+
+
+ """)
+
+ self.recv("""
+
+ """)
+
+ result = self.run_coro(fut)
+
+ def testGetRoster(self):
+ """Test requesting an annotated roster"""
+
+ fut = self.xmpp.wrap(self.xmpp['xep_0405'].get_mix_roster())
+
+ self.wait_()
+ self.send("""
+
+
+
+
+
+ """)
+
+ self.recv("""
+
+
+
+
+ -
+
+
+
+
+ """)
+
+ self.wait_()
+ contacts, channels = fut.result()
+ self.assertEqual(len(contacts), 2)
+ self.assertEqual(contacts[0]['jid'], 'romeo@example.net')
+ self.assertEqual(contacts[1]['jid'], 'juliet@example.net')
+ self.assertEqual(len(channels), 1)
+ self.assertEqual(channels[0]['jid'], 'balcony@example.net')
+ self.assertEqual(
+ channels[0]['channel']['participant-id'],
+ '123456'
+ )
+
+ def testClientJoin(self):
+ """Test a client join"""
+
+ fut = self.xmpp.wrap(self.xmpp['xep_0405'].join_channel(
+ JID('coven@mix.shakespeare.example'),
+ 'toto',
+ ))
+ self.send("""
+
+
+
+ toto
+
+
+
+
+
+
+ """)
+ self.recv("""
+
+
+
+
+
+
+
+
+
+ """)
+ self.wait_()
+ self.assertEqual(fut.result(), set())
+
+ def testClientJoinNotAllNodes(self):
+ """Test a client join where one of the nodes is rejected"""
+
+ fut = self.xmpp.wrap(self.xmpp['xep_0405'].join_channel(
+ JID('coven@mix.shakespeare.example'),
+ 'toto',
+ ))
+ self.send("""
+
+
+
+ toto
+
+
+
+
+
+
+ """)
+ self.recv("""
+
+
+
+
+
+
+
+
+ """)
+ self.wait_()
+ self.assertEqual(fut.result(), {'urn:xmpp:mix:nodes:info'})
+
+ def testClientLeave(self):
+ """Test a client leave"""
+
+ fut = self.xmpp.wrap(self.xmpp['xep_0405'].leave_channel(
+ JID('coven@mix.shakespeare.example'),
+ ))
+ self.send("""
+
+
+
+
+
+ """)
+ self.recv("""
+
+
+
+
+
+ """)
+
+ self.assertEqual(fut.done(), True)
+ self.assertEqual(fut.exception(), None)
+
+
+suite = unittest.TestLoader().loadTestsFromTestCase(TestMIXPAM)