diff src/test/helpers.py @ 794:52c4b755aba6

test: make FakeClient profile dependent and add some tools to test MUC
author souliane <souliane@mailoo.org>
date Fri, 10 Jan 2014 18:15:02 +0100
parents 2136be5a44a8
children 1fe00f0c9a91
line wrap: on
line diff
--- a/src/test/helpers.py	Fri Jan 10 18:19:34 2014 +0100
+++ b/src/test/helpers.py	Fri Jan 10 18:15:02 2014 +0100
@@ -63,9 +63,12 @@
         self.init()
 
     def init(self):
-        """This can be called by tests that check for sent and stored messages"""
+        """This can be called by tests that check for sent and stored messages,
+        uses FakeClient or get/set some other data that need to be cleaned"""
         self.sent_messages = []
         self.stored_messages = []
+        self.plugins = {}
+        self.profiles = {}
 
     def delContact(self, to, profile_key):
         #TODO
@@ -81,6 +84,8 @@
         self.sendAndStoreMessage({"to": JID(to_s)})
 
     def sendAndStoreMessage(self, mess_data, skip_send=False, profile=None):
+        """Save the information to check later to whom messages have been sent and
+        if entries have been added to the history"""
         if not skip_send:
             self.sent_messages.append(mess_data["to"])
         self.stored_messages.append(mess_data["to"])
@@ -104,12 +109,50 @@
         return defer.succeed(jid_ if self.memory.hasServerFeature(feature, jid_, profile_key) else None)
 
     def getClientHostJid(self, profile_key):
-        return JID(Const.JID[0].host)
+        return Const.PROFILE_DICT[profile_key].host
+
+    def getClient(self, profile_key):
+        """Convenient method to get client from profile key
+        @return: client or None if it doesn't exist"""
+        profile = self.memory.getProfileName(profile_key)
+        if not profile:
+            return None
+        if profile not in self.profiles:
+            self.profiles[profile] = FakeClient(self, profile)
+            self.profiles[profile].client_initialized.callback(None)
+        return self.profiles[profile]
+
+    def getJidNStream(self, profile_key):
+        """Convenient method to get jid and stream from profile key
+        @return: tuple (jid, xmlstream) from profile, can be None"""
+        return (Const.PROFILE_DICT[profile_key], None)
+
+    def isConnected(self, profile):
+        return True
+
+    def getSentMessage(self, message_index, profile_index):
+        """Called by tests. FakeClient instances associated to each profile must have
+        been previously initialized with the method FakeSAT.getClient.
+        @return: XML representation of the <message_index>th sent message for given profile"""
+        return self.profiles[Const.PROFILE[profile_index]].xmlstream.sent[message_index]
+
+    def countSentMessages(self, profiles=Const.PROFILE):
+        """Called by tests. FakeClient instances associated to each profile must have
+        been previously initialized with the method FakeSAT.getClient.
+        @param profiles: list of profiles
+        @return: a list containing the number of sent messages for each of the specified profiles"""
+        result = []
+        for profile in profiles:
+            result.append(len(self.profiles[profile].xmlstream.sent))
+        return result
 
 
 class FakeBridge(object):
     """Class to simulate and test bridge calls"""
 
+    def __init__(self):
+        self.methods = {}
+
     def expectCall(self, name, *check_args, **check_kwargs):
         def checkCall(*args, **kwargs):
             if args != check_args or kwargs != check_kwargs:
@@ -128,6 +171,13 @@
     def addSignal(self, name, int_suffix, signature):
         pass
 
+    def addTestCallback(self, name, method):
+        """This can be used to register callbacks for bridge methods AND signals.
+        Contrary to expectCall, this will not check if the method or signal is
+        called/sent with the correct arguments, it will instead run the callback
+        of your choice."""
+        setattr(self, name, method)
+
 
 class FakeParams(Params):
     """Class to simulate and test params object. The methods of Params that could
@@ -168,6 +218,7 @@
         # manipulating basic stuff, the others should be overwritten when needed
         self.host = host
         self.params = FakeParams(host, None)
+        self.config = self.parseMainConf()
         self.init()
 
     def init(self):
@@ -218,11 +269,12 @@
 
 
 class FakeRosterProtocol(SatRosterProtocol):
+    """This class is used by FakeClient (one instance per profile)"""
 
     def __init__(self, host, parent):
         SatRosterProtocol.__init__(self, host)
         self.parent = parent
-        self.addItem(Const.JID[0])
+        self.addItem(parent.jid)
 
     def addItem(self, jid, *args, **kwargs):
         if not args and not kwargs:
@@ -237,15 +289,30 @@
         self.onRosterSet(roster_item)
 
 
-class FakeClient(object):
-    def __init__(self, host):
-        self.host = host
-        self.profile = 'test_profile'
-        self.jid = Const.JID[0]
-        self.roster = FakeRosterProtocol(host, self)
+class FakeXmlStream(object):
+    """This class is used by FakeClient (one instance per profile)"""
+
+    def __init__(self):
+        self.sent = []
 
     def send(self, obj):
-        pass
+        """Save the sent messages to compare them later"""
+        self.sent.append(obj.toXml())
+
+
+class FakeClient(object):
+    """Tests involving more than one profile need one instance of this class per profile"""
+
+    def __init__(self, host, profile=None):
+        self.host = host
+        self.profile = profile if profile else Const.PROFILE[0]
+        self.jid = Const.PROFILE_DICT[self.profile]
+        self.roster = FakeRosterProtocol(host, self)
+        self.client_initialized = defer.Deferred()
+        self.xmlstream = FakeXmlStream()
+
+    def send(self, obj):
+        self.xmlstream.send(obj)
 
 
 class SatTestCase(unittest.TestCase):