mirror of
https://github.com/correl/SleekXMPP.git
synced 2024-11-24 03:00:15 +00:00
Added a generic checkStanza method to SleekTest. Updated the other check methods to use it.
This commit is contained in:
parent
415520200e
commit
c721fb4126
1 changed files with 86 additions and 82 deletions
|
@ -13,6 +13,7 @@ try:
|
||||||
except ImportError:
|
except ImportError:
|
||||||
import Queue as queue
|
import Queue as queue
|
||||||
|
|
||||||
|
import sleekxmpp
|
||||||
from sleekxmpp import ClientXMPP
|
from sleekxmpp import ClientXMPP
|
||||||
from sleekxmpp.stanza import Message, Iq, Presence
|
from sleekxmpp.stanza import Message, Iq, Presence
|
||||||
from sleekxmpp.xmlstream.stanzabase import registerStanzaPlugin, ET
|
from sleekxmpp.xmlstream.stanzabase import registerStanzaPlugin, ET
|
||||||
|
@ -210,6 +211,84 @@ class SleekTest(unittest.TestCase):
|
||||||
# ------------------------------------------------------------------
|
# ------------------------------------------------------------------
|
||||||
# Methods for comparing stanza objects to XML strings
|
# Methods for comparing stanza objects to XML strings
|
||||||
|
|
||||||
|
def checkStanza(self, stanza_class, stanza, xml_string,
|
||||||
|
defaults=None, use_values=True):
|
||||||
|
"""
|
||||||
|
Create and compare several stanza objects to a correct XML string.
|
||||||
|
|
||||||
|
If use_values is False, test using getStanzaValues() and
|
||||||
|
setStanzaValues() will not be used.
|
||||||
|
|
||||||
|
Some stanzas provide default values for some interfaces, but
|
||||||
|
these defaults can be problematic for testing since they can easily
|
||||||
|
be forgotten when supplying the XML string. A list of interfaces that
|
||||||
|
use defaults may be provided and the generated stanzas will use the
|
||||||
|
default values for those interfaces if needed.
|
||||||
|
|
||||||
|
However, correcting the supplied XML is not possible for interfaces
|
||||||
|
that add or remove XML elements. Only interfaces that map to XML
|
||||||
|
attributes may be set using the defaults parameter. The supplied XML
|
||||||
|
must take into account any extra elements that are included by default.
|
||||||
|
|
||||||
|
Arguments:
|
||||||
|
stanza_class -- The class of the stanza being tested.
|
||||||
|
stanza -- The stanza object to test.
|
||||||
|
xml_string -- A string version of the correct XML expected.
|
||||||
|
defaults -- A list of stanza interfaces that have default
|
||||||
|
values. These interfaces will be set to their
|
||||||
|
defaults for the given and generated stanzas to
|
||||||
|
prevent unexpected test failures.
|
||||||
|
use_values -- Indicates if testing using getStanzaValues() and
|
||||||
|
setStanzaValues() should be used. Defaults to
|
||||||
|
True.
|
||||||
|
"""
|
||||||
|
xml = ET.fromstring(xml_string)
|
||||||
|
|
||||||
|
# Ensure that top level namespaces are used, even if they
|
||||||
|
# were not provided.
|
||||||
|
self.fix_namespaces(stanza.xml, 'jabber:client')
|
||||||
|
self.fix_namespaces(xml, 'jabber:client')
|
||||||
|
|
||||||
|
stanza2 = stanza_class(xml=xml)
|
||||||
|
|
||||||
|
if use_values:
|
||||||
|
# Using getStanzaValues() and setStanzaValues() will add
|
||||||
|
# XML for any interface that has a default value. We need
|
||||||
|
# to set those defaults on the existing stanzas and XML
|
||||||
|
# so that they will compare correctly.
|
||||||
|
default_stanza = stanza_class()
|
||||||
|
if defaults is None:
|
||||||
|
defaults = []
|
||||||
|
for interface in defaults:
|
||||||
|
stanza[interface] = stanza[interface]
|
||||||
|
stanza2[interface] = stanza2[interface]
|
||||||
|
# Can really only automatically add defaults for top
|
||||||
|
# level attribute values. Anything else must be accounted
|
||||||
|
# for in the provided XML string.
|
||||||
|
if interface not in xml.attrib:
|
||||||
|
if interface in default_stanza.xml.attrib:
|
||||||
|
value = default_stanza.xml.attrib[interface]
|
||||||
|
xml.attrib[interface] = value
|
||||||
|
|
||||||
|
values = stanza2.getStanzaValues()
|
||||||
|
stanza3 = stanza_class()
|
||||||
|
stanza3.setStanzaValues(values)
|
||||||
|
|
||||||
|
debug = "Three methods for creating stanzas do not match.\n"
|
||||||
|
debug += "Given XML:\n%s\n" % tostring(xml)
|
||||||
|
debug += "Given stanza:\n%s\n" % tostring(stanza.xml)
|
||||||
|
debug += "Generated stanza:\n%s\n" % tostring(stanza2.xml)
|
||||||
|
debug += "Second generated stanza:\n%s\n" % tostring(stanza3.xml)
|
||||||
|
result = self.compare(xml, stanza.xml, stanza2.xml, stanza3.xml)
|
||||||
|
else:
|
||||||
|
debug = "Two methods for creating stanzas do not match.\n"
|
||||||
|
debug += "Given XML:\n%s\n" % tostring(xml)
|
||||||
|
debug += "Given stanza:\n%s\n" % tostring(stanza.xml)
|
||||||
|
debug += "Generated stanza:\n%s\n" % tostring(stanza2.xml)
|
||||||
|
result = self.compare(xml, stanza.xml, stanza2.xml)
|
||||||
|
|
||||||
|
self.failUnless(result, debug)
|
||||||
|
|
||||||
def checkMessage(self, msg, xml_string, use_values=True):
|
def checkMessage(self, msg, xml_string, use_values=True):
|
||||||
"""
|
"""
|
||||||
Create and compare several message stanza objects to a
|
Create and compare several message stanza objects to a
|
||||||
|
@ -226,36 +305,9 @@ class SleekTest(unittest.TestCase):
|
||||||
to True.
|
to True.
|
||||||
"""
|
"""
|
||||||
|
|
||||||
self.fix_namespaces(msg.xml, 'jabber:client')
|
return self.checkStanza(Message, msg, xml_string,
|
||||||
debug = "Given Stanza:\n%s\n" % tostring(msg.xml)
|
defaults=['type'],
|
||||||
|
use_values = use_values)
|
||||||
xml = ET.fromstring(xml_string)
|
|
||||||
self.fix_namespaces(xml, 'jabber:client')
|
|
||||||
|
|
||||||
debug += "XML String:\n%s\n" % tostring(xml)
|
|
||||||
|
|
||||||
msg2 = self.Message(xml)
|
|
||||||
debug += "Constructed Stanza:\n%s\n" % tostring(msg2.xml)
|
|
||||||
|
|
||||||
if use_values:
|
|
||||||
# Ugly, but need to make sure the type attribute is set.
|
|
||||||
msg['type'] = msg['type']
|
|
||||||
if xml.attrib.get('type', None) is None:
|
|
||||||
xml.attrib['type'] = 'normal'
|
|
||||||
msg2['type'] = msg2['type']
|
|
||||||
debug += "XML String:\n%s\n" % tostring(xml)
|
|
||||||
|
|
||||||
values = msg2.getStanzaValues()
|
|
||||||
msg3 = self.Message()
|
|
||||||
msg3.setStanzaValues(values)
|
|
||||||
|
|
||||||
debug += "Second Constructed Stanza:\n%s\n" % tostring(msg3.xml)
|
|
||||||
debug = "Three methods for creating stanza do not match:\n" + debug
|
|
||||||
self.failUnless(self.compare(xml, msg.xml, msg2.xml, msg3.xml),
|
|
||||||
debug)
|
|
||||||
else:
|
|
||||||
debug = "Two methods for creating stanza do not match:\n" + debug
|
|
||||||
self.failUnless(self.compare(xml, msg.xml, msg2.xml), debug)
|
|
||||||
|
|
||||||
def checkIq(self, iq, xml_string, use_values=True):
|
def checkIq(self, iq, xml_string, use_values=True):
|
||||||
"""
|
"""
|
||||||
|
@ -272,29 +324,7 @@ class SleekTest(unittest.TestCase):
|
||||||
and setStanzaValues should be used. Defaults
|
and setStanzaValues should be used. Defaults
|
||||||
to True.
|
to True.
|
||||||
"""
|
"""
|
||||||
|
return self.checkStanza(Iq, iq, xml_string, use_values=use_values)
|
||||||
self.fix_namespaces(iq.xml, 'jabber:client')
|
|
||||||
debug = "Given Stanza:\n%s\n" % tostring(iq.xml)
|
|
||||||
|
|
||||||
xml = ET.fromstring(xml_string)
|
|
||||||
self.fix_namespaces(xml, 'jabber:client')
|
|
||||||
debug += "XML String:\n%s\n" % tostring(xml)
|
|
||||||
|
|
||||||
iq2 = self.Iq(xml)
|
|
||||||
debug += "Constructed Stanza:\n%s\n" % tostring(iq2.xml)
|
|
||||||
|
|
||||||
if use_values:
|
|
||||||
values = iq.getStanzaValues()
|
|
||||||
iq3 = self.Iq()
|
|
||||||
iq3.setStanzaValues(values)
|
|
||||||
|
|
||||||
debug += "Second Constructed Stanza:\n%s\n" % tostring(iq3.xml)
|
|
||||||
debug = "Three methods for creating stanza do not match:\n" + debug
|
|
||||||
self.failUnless(self.compare(xml, iq.xml, iq2.xml, iq3.xml),
|
|
||||||
debug)
|
|
||||||
else:
|
|
||||||
debug = "Two methods for creating stanza do not match:\n" + debug
|
|
||||||
self.failUnless(self.compare(xml, iq.xml, iq2.xml), debug)
|
|
||||||
|
|
||||||
def checkPresence(self, pres, xml_string, use_values=True):
|
def checkPresence(self, pres, xml_string, use_values=True):
|
||||||
"""
|
"""
|
||||||
|
@ -311,35 +341,9 @@ class SleekTest(unittest.TestCase):
|
||||||
and setStanzaValues should be used. Defaults
|
and setStanzaValues should be used. Defaults
|
||||||
to True.
|
to True.
|
||||||
"""
|
"""
|
||||||
|
return self.checkStanza(Presence, pres, xml_string,
|
||||||
self.fix_namespaces(pres.xml, 'jabber:client')
|
defaults=['priority'],
|
||||||
|
use_values=use_values)
|
||||||
xml = ET.fromstring(xml_string)
|
|
||||||
self.fix_namespaces(xml, 'jabber:client')
|
|
||||||
|
|
||||||
pres2 = self.Presence(xml)
|
|
||||||
|
|
||||||
# Ugly, but 'priority' has a default value and need to make
|
|
||||||
# sure it is set
|
|
||||||
pres['priority'] = pres['priority']
|
|
||||||
pres2['priority'] = pres2['priority']
|
|
||||||
|
|
||||||
debug = "Given Stanza:\n%s\n" % tostring(pres.xml)
|
|
||||||
debug += "XML String:\n%s\n" % tostring(xml)
|
|
||||||
debug += "Constructed Stanza:\n%s\n" % tostring(pres2.xml)
|
|
||||||
|
|
||||||
if use_values:
|
|
||||||
values = pres.getStanzaValues()
|
|
||||||
pres3 = self.Presence()
|
|
||||||
pres3.setStanzaValues(values)
|
|
||||||
|
|
||||||
debug += "Second Constructed Stanza:\n%s\n" % tostring(pres3.xml)
|
|
||||||
debug = "Three methods for creating stanza do not match:\n" + debug
|
|
||||||
self.failUnless(self.compare(xml, pres.xml, pres2.xml, pres3.xml),
|
|
||||||
debug)
|
|
||||||
else:
|
|
||||||
debug = "Two methods for creating stanza do not match:\n" + debug
|
|
||||||
self.failUnless(self.compare(xml, pres.xml, pres2.xml), debug)
|
|
||||||
|
|
||||||
# ------------------------------------------------------------------
|
# ------------------------------------------------------------------
|
||||||
# Methods for simulating stanza streams.
|
# Methods for simulating stanza streams.
|
||||||
|
|
Loading…
Reference in a new issue