Mercurial > libervia-backend
view src/test/helpers.py @ 693:65b30bc7f1b3
tests: added XML comparaison method to helpers
author | Goffi <goffi@goffi.org> |
---|---|
date | Tue, 12 Nov 2013 14:16:11 +0100 |
parents | ffb716804580 |
children | 4284b6ad8aa3 |
line wrap: on
line source
#!/usr/bin/python # -*- coding: utf-8 -*- # SAT: a jabber client # Copyright (C) 2009, 2010, 2011, 2012, 2013 Jérôme Poisson (goffi@goffi.org) # This program is free software: you can redistribute it and/or modify # it under the terms of the GNU Affero General Public License as published by # the Free Software Foundation, either version 3 of the License, or # (at your option) any later version. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU Affero General Public License for more details. # You should have received a copy of the GNU Affero General Public License # along with this program. If not, see <http://www.gnu.org/licenses/>. import __builtin__ from twisted.words.protocols.jabber.jid import JID from wokkel.xmppim import RosterItem from sat.core.xmpp import SatRosterProtocol from twisted.trial.unittest import FailTest from twisted.trial import unittest from xml.etree import cElementTree as etree import re TEST_JID_STR = u"test@example.org/SàT" TEST_JID = JID(u"test@example.org/SàT") TEST_PROFILE = 'test_profile' def b2s(value): """Convert a bool to a unicode string used in bridge @param value: boolean value @return: unicode conversion, according to bridge convention """ return u"True" if value else u"False" class DifferentArgsException(FailTest): pass class DifferentXMLException(FailTest): pass class FakeSAT(object): """Class to simulate a SAT instance""" def __init__(self): self.bridge = FakeBridge() self.memory = FakeMemory() self.trigger = FakeTriggerManager() def delContact(self, to, profile_key): #TODO pass class FakeBridge(object): """Class to simulate and test bridge calls""" def expectCall(self, name, *check_args, **check_kwargs): def checkCall(*args, **kwargs): if args != check_args or kwargs != check_kwargs: print "\n\n--------------------" print "Args are not equals:" print "args\n----\n%s (sent)\n%s (wanted)" % (args, check_args) print "kwargs\n------\n%s (sent)\n%s (wanted)" % (kwargs, check_kwargs) print "--------------------\n\n" raise DifferentArgsException setattr(self, name, checkCall) class FakeMemory(object): """Class to simulate and test memory object""" def getProfileName(self, profile_key): return profile_key def addToHistory(self, from_jid, to_jid, message, _type='chat', extra=None, timestamp=None, profile="@NONE@"): pass def addContact(self, contact_jid, attributes, groups, profile_key='@DEFAULT@'): pass def setPresenceStatus(self, contact_jid, show, priority, statuses, profile_key='@DEFAULT@'): pass def addWaitingSub(self, type, contact_jid, profile_key): pass def delWaitingSub(self, contact_jid, profile_key): pass class FakeTriggerManager(object): def add(self, point_name, callback): pass def point(self, point_name, *args, **kwargs): """We always return true to continue the action""" return True class FakeRosterProtocol(SatRosterProtocol): def __init__(self, host, parent): SatRosterProtocol.__init__(self, host) self.parent = parent self.addItem(TEST_JID) def addItem(self, jid, *args, **kwargs): if not args and not kwargs: # defaults values setted for the tests only kwargs["subscriptionTo"] = True kwargs["subscriptionFrom"] = True roster_item = RosterItem(jid, *args, **kwargs) attrs = {'to': b2s(roster_item.subscriptionTo), 'from': b2s(roster_item.subscriptionFrom), 'ask': b2s(roster_item.pendingOut)} if roster_item.name: attrs['name'] = roster_item.name self.host.bridge.expectCall("newContact", jid.full(), attrs, roster_item.groups, self.parent.profile) self.onRosterSet(roster_item) class FakeClient(object): def __init__(self, host): self.host = host self.profile = 'test_profile' self.jid = TEST_JID self.roster = FakeRosterProtocol(host, self) def send(self, obj): pass class SatTestCase(unittest.TestCase): def assertEqualXML(self, xml, expected, ignore_blank = False): def equalElt(got_elt, exp_elt): if (got_elt.tag != exp_elt.tag): print "XML are not equals (elt %s/%s):" % (got_elt, exp_elt) print "tag: got [%s] expected: [%s]" % (got_elt.tag, exp_elt.tag) return False if (got_elt.attrib != exp_elt.attrib): print "XML are not equals (elt %s/%s):" % (got_elt, exp_elt) print "attribs: got %s expected %s" % (got_elt.attrib, exp_elt.attrib) return False if (got_elt.tail != exp_elt.tail or got_elt.text != exp_elt.text): print "XML are not equals (elt %s/%s):" % (got_elt, exp_elt) print "text: got [%s] expected: [%s]" % (got_elt.text, exp_elt.text) print "tail: got [%s] expected: [%s]" % (got_elt.tail, exp_elt.tail) return False if (len(got_elt) != len(exp_elt)): print "XML are not equals (elt %s/%s):" % (got_elt, exp_elt) print "children len: got %d expected: %d" % (len(got_elt), len(exp_elt)) return False for idx, child in enumerate(got_elt): if not equalElt(child, exp_elt[idx]): return False return True def remove_blank(xml): lines = [line.strip() for line in re.sub(r'[ \t\r\f\v]+',' ',xml).split('\n')] return '\n'.join([line for line in lines if line]) xml_elt = etree.fromstring(remove_blank(xml) if ignore_blank else xml) expected_elt = etree.fromstring(remove_blank(expected) if ignore_blank else expected) if not equalElt(xml_elt, expected_elt): print "---" print "XML are not equals:" print "got:\n-\n%s\n-\n\n" % etree.tostring(xml_elt, encoding='utf-8') print "was expecting:\n-\n%s\n-\n\n" % etree.tostring(expected_elt, encoding='utf-8') print "---" raise DifferentXMLException def _(text): return text __builtin__.__dict__['_'] = _