diff src/test/test_plugin_xep_0033.py @ 1278:347aee3a3f5c

test: fix/improve tests for plugins XEP-0033 and XEP-0085 (mainly to return a Deferred)
author souliane <souliane@mailoo.org>
date Thu, 25 Dec 2014 11:49:13 +0100
parents 7fbc858cd1cd
children 069ad98b360d
line wrap: on
line diff
--- a/src/test/test_plugin_xep_0033.py	Fri Dec 19 14:43:42 2014 +0100
+++ b/src/test/test_plugin_xep_0033.py	Thu Dec 25 11:49:13 2014 +0100
@@ -25,7 +25,6 @@
 from sat.plugins import plugin_xep_0033 as plugin
 from sat.core.exceptions import CancelError
 from sat.core.log import getLogger
-from copy import deepcopy
 from twisted.internet import defer
 from wokkel.generic import parseXml
 from twisted.words.protocols.jabber.jid import JID
@@ -71,9 +70,9 @@
             self.assertEqual(data['extra']['addresses'], '%s:%s\n%s:%s\n%s:%s\n' % expected, msg)
 
         treatments.addCallback(cb)
-        treatments.callback(data)
+        return treatments.callback(data)
 
-    def get_mess_data(self):
+    def _get_mess_data(self):
         mess_data = {"to": JID(JID_STR_TO),
                      "type": "chat",
                      "message": "content",
@@ -88,8 +87,10 @@
         mess_data['xml'] = parseXml(original_stanza.encode("utf-8"))
         return mess_data
 
-    def test_sendMessageTrigger(self):
-        expected = self.get_mess_data()['xml']
+    def _assertAddresses(self, mess_data):
+        """The mess_data that we got here has been modified by self.plugin.sendMessageTrigger,
+        check that the addresses element has been added to the stanza."""
+        expected = self._get_mess_data()['xml']
         addresses_extra = """
         <addresses xmlns='http://jabber.org/protocol/address'>
             <address type='%s' jid='%s'/>
@@ -98,100 +99,93 @@
         </addresses>""" % ADDRS
         addresses_element = parseXml(addresses_extra.encode('utf-8'))
         expected.addChild(addresses_element)
-
-        def assertAddresses(mess_data):
-            """The mess_data that we got here has been modified by self.plugin.sendMessageTrigger,
-            check that the addresses element has been added to the stanza."""
-            self.assertEqualXML(mess_data['xml'].toXml().encode("utf-8"), expected.toXml().encode("utf-8"))
+        self.assertEqualXML(mess_data['xml'].toXml().encode("utf-8"), expected.toXml().encode("utf-8"))
 
-        def sendMessageErrback(failure, exception_class):
-            """If the failure does encapsulate the expected exception, it will be silently
-            trapped, otherwise it will be re-raised and will make the test fail"""
-            failure.trap(exception_class)
-
-        def checkSentAndStored():
-            """Check that all the recipients got their messages and that the history has been filled.
-            /!\ see the comments in XEP_0033.sendAndStoreMessage"""
-            sent = []
-            stored = []
-            d_list = []
+    def _checkSentAndStored(self):
+        """Check that all the recipients got their messages and that the history has been filled.
+        /!\ see the comments in XEP_0033.sendAndStoreMessage"""
+        sent = []
+        stored = []
+        d_list = []
 
-            def cb(entities, to_jid, logger, level):
-                if host in entities:
-                    if host not in sent:  # send the message to the entity offering the feature
-                        sent.append(host)
-                        stored.append(host)
-                    stored.append(to_jid)  # store in history for each recipient
-                else:  # feature not supported, use normal behavior
-                    sent.append(to_jid)
-                    stored.append(to_jid)
-                logger.setLevel(level)
+        def cb(entities, to_jid, logger, level):
+            if host in entities:
+                if host not in sent:  # send the message to the entity offering the feature
+                    sent.append(host)
+                    stored.append(host)
+                stored.append(to_jid)  # store in history for each recipient
+            else:  # feature not supported, use normal behavior
+                sent.append(to_jid)
+                stored.append(to_jid)
+            logger.setLevel(level)
 
-            for to_s in (JID_STR_X_TO, JID_STR_X_CC, JID_STR_X_BCC):
-                to_jid = JID(to_s)
-                host = JID(to_jid.host)
-                logger = getLogger()
-                level = logger.getEffectiveLevel()
-                logger.setLevel(ERROR)  # remove log.warning pollution
-                d = self.host.findFeaturesSet([plugin.NS_ADDRESS], jid_=host, profile_key=PROFILE)
-                d.addCallback(cb, to_jid, logger, level)
-                d_list.append(d)
-
-            def cb_list(dummy):
-                msg = "/!\ see the comments in XEP_0033.sendAndStoreMessage"
-                sent_recipients = [JID(elt['to']) for elt in self.host.getSentMessages(PROFILE_INDEX)]
-                self.assertEqualUnsortedList(sent_recipients, sent, msg)
-                self.assertEqualUnsortedList(self.host.stored_messages, stored, msg)
-
-            return defer.DeferredList(d_list).addCallback(cb_list)
-
-        def trigger(data, exception):
-            """Execute self.plugin.sendMessageTrigger with a different logging
-            level to not pollute the output, then check that the plugin did its
-            job. It should abort sending the message or add the extended
-            addressing information to the stanza.
-            @param data: the data to be processed by self.plugin.sendMessageTrigger
-            @param exception: CancelError
-            """
+        for to_s in (JID_STR_X_TO, JID_STR_X_CC, JID_STR_X_BCC):
+            to_jid = JID(to_s)
+            host = JID(to_jid.host)
             logger = getLogger()
             level = logger.getEffectiveLevel()
             logger.setLevel(ERROR)  # remove log.warning pollution
-            pre_treatments = defer.Deferred()
-            post_treatments = defer.Deferred()
-            self.plugin.sendMessageTrigger(data, pre_treatments, post_treatments, PROFILE)
-            post_treatments.callback(data)
-            logger.setLevel(level)
-            post_treatments.addCallbacks(assertAddresses, lambda failure: sendMessageErrback(failure, exception))
-            return post_treatments
+            d = self.host.findFeaturesSet([plugin.NS_ADDRESS], jid_=host, profile_key=PROFILE)
+            d.addCallback(cb, to_jid, logger, level)
+            d_list.append(d)
+
+        def cb_list(dummy):
+            msg = "/!\ see the comments in XEP_0033.sendAndStoreMessage"
+            sent_recipients = [JID(elt['to']) for elt in self.host.getSentMessages(PROFILE_INDEX)]
+            self.assertEqualUnsortedList(sent_recipients, sent, msg)
+            self.assertEqualUnsortedList(self.host.stored_messages, stored, msg)
+
+        return defer.DeferredList(d_list).addCallback(cb_list)
 
+    def _trigger(self, data):
+        """Execute self.plugin.sendMessageTrigger with a different logging
+        level to not pollute the output, then check that the plugin did its
+        job. It should abort sending the message or add the extended
+        addressing information to the stanza.
+        @param data: the data to be processed by self.plugin.sendMessageTrigger
+        """
+        logger = getLogger()
+        level = logger.getEffectiveLevel()
+        logger.setLevel(ERROR)  # remove log.warning pollution
+        pre_treatments = defer.Deferred()
+        post_treatments = defer.Deferred()
+        self.plugin.sendMessageTrigger(data, pre_treatments, post_treatments, PROFILE)
+        post_treatments.callback(data)
+        logger.setLevel(level)
+        post_treatments.addCallbacks(self._assertAddresses, lambda failure: failure.trap(CancelError))
+        return post_treatments
+
+    def test_sendMessageTriggerFeatureNotSupported(self):
         # feature is not supported, abort the message
         self.host.memory.reinit()
-        data = self.get_mess_data()
-        d = trigger(data, CancelError)
+        data = self._get_mess_data()
+        return self._trigger(data)
 
+    def test_sendMessageTriggerFeatureSupported(self):
         # feature is supported by the main target server
         self.host.reinit()
         self.host.addFeature(JID(JID_STR_TO), plugin.NS_ADDRESS, PROFILE)
-        data = self.get_mess_data()
-        d.addCallback(lambda dummy: trigger(data, CancelError))
-        d.addCallback(lambda dummy: checkSentAndStored())
+        data = self._get_mess_data()
+        d = self._trigger(data)
+        return d.addCallback(lambda dummy: self._checkSentAndStored())
 
+    def test_sendMessageTriggerFeatureFullySupported(self):
         # feature is supported by all target servers
         self.host.reinit()
         self.host.addFeature(JID(JID_STR_TO), plugin.NS_ADDRESS, PROFILE)
         for dest in (JID_STR_X_TO, JID_STR_X_CC, JID_STR_X_BCC):
             self.host.addFeature(JID(JID(dest).host), plugin.NS_ADDRESS, PROFILE)
-        data = self.get_mess_data()
-        d.addCallback(lambda dummy: trigger(data, CancelError))
-        d.addCallback(lambda dummy: checkSentAndStored())
+        data = self._get_mess_data()
+        d = self._trigger(data)
+        return d.addCallback(lambda dummy: self._checkSentAndStored())
 
+    def test_sendMessageTriggerFixWrongEntity(self):
         # check that a wrong recipient entity is fixed by the backend
         self.host.reinit()
         self.host.addFeature(JID(JID_STR_TO), plugin.NS_ADDRESS, PROFILE)
         for dest in (JID_STR_X_TO, JID_STR_X_CC, JID_STR_X_BCC):
             self.host.addFeature(JID(JID(dest).host), plugin.NS_ADDRESS, PROFILE)
-        data = self.get_mess_data()
+        data = self._get_mess_data()
         data["to"] = JID(JID_STR_X_TO)
-        d.addCallback(lambda dummy: trigger(data, CancelError))
-        d.addCallback(lambda dummy: checkSentAndStored())
-        return d
+        d = self._trigger(data)
+        return d.addCallback(lambda dummy: self._checkSentAndStored())