diff options
-rw-r--r-- | sleekxmpp/stanza/presence.py | 28 | ||||
-rw-r--r-- | tests/test_presencestanzas.py | 52 |
2 files changed, 49 insertions, 31 deletions
diff --git a/sleekxmpp/stanza/presence.py b/sleekxmpp/stanza/presence.py index c66246c9..0da7ffc8 100644 --- a/sleekxmpp/stanza/presence.py +++ b/sleekxmpp/stanza/presence.py @@ -5,36 +5,34 @@ See the file license.txt for copying permission. """ -from .. xmlstream.stanzabase import StanzaBase -from xml.etree import cElementTree as ET + from . error import Error from . rootstanza import RootStanza +from .. xmlstream.stanzabase import StanzaBase, ET + class Presence(RootStanza): - interfaces = set(('type', 'to', 'from', 'id', 'status', 'priority')) + interfaces = set(('type', 'to', 'from', 'id', 'show', 'status', 'priority')) types = set(('available', 'unavailable', 'error', 'probe', 'subscribe', 'subscribed', 'unsubscribe', 'unsubscribed')) showtypes = set(('dnd', 'chat', 'xa', 'away')) - sub_interfaces = set(('status', 'priority')) + sub_interfaces = set(('show', 'status', 'priority')) name = 'presence' plugin_attrib = name namespace = 'jabber:client' - def getShowElement(self): - return self.xml.find("{%s}show" % self.namespace) + def setShow(self, show): + if show in self.showtypes: + self._setSubText('show', text=show) + return self def setType(self, value): - show = self.getShowElement() if value in self.types: - if show is not None: - self.xml.remove(show) + self['show'] = None if value == 'available': value = '' self._setAttr('type', value) elif value in self.showtypes: - if show is None: - show = ET.Element("{%s}show" % self.namespace) - self.xml.append(show) - show.text = value + self['show'] = value return self def setPriority(self, value): @@ -48,9 +46,7 @@ class Presence(RootStanza): def getType(self): out = self._getAttr('type') if not out: - show = self.getShowElement() - if show is not None: - out = show.text + out = self['show'] if not out or out is None: out = 'available' return out diff --git a/tests/test_presencestanzas.py b/tests/test_presencestanzas.py index 23eb911e..02799c8f 100644 --- a/tests/test_presencestanzas.py +++ b/tests/test_presencestanzas.py @@ -1,31 +1,53 @@ -import unittest +import sleekxmpp +from sleektest import * +from sleekxmpp.stanza.presence import Presence -class testpresencestanzas(unittest.TestCase): - - def setUp(self): - import sleekxmpp.stanza.presence as p - self.p = p +class TestPresenceStanzas(SleekTest): - def testPresenceShowRegression(self): - "Regression check presence['type'] = 'dnd' show value working" - p = self.p.Presence() + def testPresenceShowRegression(self): + """Regression check presence['type'] = 'dnd' show value working""" + p = self.Presence() p['type'] = 'dnd' - self.failUnless(str(p) == "<presence><show>dnd</show></presence>") - + self.checkPresence(p, """ + <presence><show>dnd</show></presence> + """) + + def testPresenceType(self): + """Test manipulating presence['type']""" + p = self.Presence() + p['type'] = 'available' + self.checkPresence(p, """ + <presence /> + """) + self.failUnless(p['type'] == 'available', "Incorrect presence['type'] for type 'available'") + + for showtype in ['away', 'chat', 'dnd', 'xa']: + p['type'] = showtype + self.checkPresence(p, """ + <presence><show>%s</show></presence> + """ % showtype) + self.failUnless(p['type'] == showtype, "Incorrect presence['type'] for type '%s'" % showtype) + + p['type'] = None + self.checkPresence(p, """ + <presence /> + """) + def testPresenceUnsolicitedOffline(self): - "Unsolicted offline presence does not spawn changed_status or update roster" - p = self.p.Presence() + """Unsolicted offline presence does not spawn changed_status or update roster""" + p = self.Presence() p['type'] = 'unavailable' p['from'] = 'bill@chadmore.com/gmail15af' - import sleekxmpp + c = sleekxmpp.ClientXMPP('crap@wherever', 'password') happened = [] def handlechangedpresence(event): happened.append(True) c.add_event_handler("changed_status", handlechangedpresence) c._handlePresence(p) + self.failUnless(happened == [], "changed_status event triggered for superfulous unavailable presence") self.failUnless(c.roster == {}, "Roster updated for superfulous unavailable presence") -suite = unittest.TestLoader().loadTestsFromTestCase(testpresencestanzas) +suite = unittest.TestLoader().loadTestsFromTestCase(TestPresenceStanzas) |