diff --git a/tests/test_stream_xep_0313.py b/tests/test_stream_xep_0313.py
new file mode 100644
index 00000000..25a3a926
--- /dev/null
+++ b/tests/test_stream_xep_0313.py
@@ -0,0 +1,340 @@
+import unittest
+from datetime import datetime
+from slixmpp.test import SlixTest
+from slixmpp import JID
+
+
+class TestMAM(SlixTest):
+
+ def setUp(self):
+ self.stream_start(plugins=['xep_0313'])
+
+ def tearDown(self):
+ self.stream_close()
+
+ def testRetrieveSimple(self):
+ """Test requesting MAM messages without RSM"""
+
+ msgs = []
+
+ async def test():
+ iq = await self.xmpp['xep_0313'].retrieve()
+ for message in iq['mam']['results']:
+ msgs.append(message)
+
+ fut = self.xmpp.wrap(test())
+ self.wait_()
+ self.send("""
+
+
+
+ """)
+
+ self.recv("""
+
+
+
+
+
+ Hail to thee
+
+
+
+
+ """)
+
+ self.recv("""
+
+
+ 28482-98726-73623
+ 28482-98726-73623
+
+
+ """)
+
+ self.run_coro(fut)
+ self.assertEqual(
+ msgs[0]['mam_result']['forwarded']['message']['body'],
+ "Hail to thee",
+ )
+ self.assertEqual(len(msgs),1)
+
+ def testRetrieveRSM(self):
+ """Test requesting MAM messages with RSM"""
+
+ msgs = []
+
+ async def test():
+ iterator = self.xmpp['xep_0313'].retrieve(
+ with_jid=JID('toto@titi'),
+ start='2010-06-07T00:00:00Z',
+ iterator=True,
+ )
+ async for page in iterator:
+ for message in page['mam']['results']:
+ msgs.append(message)
+
+ fut = self.xmpp.wrap(test())
+ self.wait_()
+ self.send("""
+
+
+
+
+ urn:xmpp:mam:2
+
+
+ toto@titi
+
+
+ 2010-06-07T00:00:00Z
+
+
+
+ 10
+
+
+
+ """)
+
+ self.recv("""
+
+
+
+
+
+ Hail to thee
+
+
+
+
+ """)
+
+ self.recv("""
+
+
+
+ 28482-98726-73623
+ 28482-98726-73623
+ 2
+
+
+
+ """)
+
+ self.send("""
+
+
+
+
+ urn:xmpp:mam:2
+
+
+ toto@titi
+
+
+ 2010-06-07T00:00:00Z
+
+
+
+ 10
+ 28482-98726-73623
+
+
+
+ """)
+
+ self.recv("""
+
+
+
+
+
+ Hi Y'all
+
+
+
+
+ """)
+
+ self.recv("""
+
+
+
+ 28482-98726-73624
+ 28482-98726-73624
+ 2
+
+
+
+ """)
+
+ self.run_coro(fut)
+ self.assertEqual(
+ msgs[0]['mam_result']['forwarded']['message']['body'],
+ "Hail to thee",
+ )
+ self.assertEqual(
+ msgs[1]['mam_result']['forwarded']['message']['body'],
+ "Hi Y'all",
+ )
+ self.assertEqual(len(msgs), 2)
+
+ def testIterate(self):
+ """Test iterating over MAM messages with RSM"""
+
+ msgs = []
+
+ async def test():
+ iterator = self.xmpp['xep_0313'].iterate(
+ with_jid=JID('toto@titi'),
+ start='2010-06-07T00:00:00Z',
+ )
+ async for message in iterator:
+ msgs.append(message)
+
+ fut = self.xmpp.wrap(test())
+ self.wait_()
+ self.send("""
+
+
+
+
+ urn:xmpp:mam:2
+
+
+ toto@titi
+
+
+ 2010-06-07T00:00:00Z
+
+
+
+ 10
+
+
+
+ """)
+
+ self.recv("""
+
+
+
+
+
+ Hail to thee
+
+
+
+
+ """)
+
+ self.recv("""
+
+
+
+ 28482-98726-73623
+ 28482-98726-73623
+ 2
+
+
+
+ """)
+
+ self.send("""
+
+
+
+
+ urn:xmpp:mam:2
+
+
+ toto@titi
+
+
+ 2010-06-07T00:00:00Z
+
+
+
+ 10
+ 28482-98726-73623
+
+
+
+ """)
+
+ self.recv("""
+
+
+
+
+
+ Hi Y'all
+
+
+
+
+ """)
+
+ self.recv("""
+
+
+
+ 28482-98726-73624
+ 28482-98726-73624
+ 2
+
+
+
+ """)
+
+ self.run_coro(fut)
+ self.assertEqual(
+ msgs[0]['mam_result']['forwarded']['message']['body'],
+ "Hail to thee",
+ )
+ self.assertEqual(
+ msgs[1]['mam_result']['forwarded']['message']['body'],
+ "Hi Y'all",
+ )
+ self.assertEqual(len(msgs), 2)
+
+ def test_get_metadata(self):
+ """Test a MAM metadata retrieval"""
+ fut = self.xmpp.wrap(
+ self.xmpp.plugin['xep_0313'].get_archive_metadata()
+ )
+ self.wait_()
+ self.send("""
+
+
+
+ """)
+ self.recv("""
+
+
+
+
+
+
+ """)
+ self.run_coro(fut)
+ result = fut.result()
+ self.assertEqual(result['mam_metadata']['start']['id'], "YWxwaGEg")
+ self.assertEqual(
+ result['mam_metadata']['start']['timestamp'],
+ datetime.fromisoformat('2008-08-22T21:09:04+00:00')
+ )
+
+
+suite = unittest.TestLoader().loadTestsFromTestCase(TestMAM)