summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--sleekxmpp/basexmpp.py2
-rw-r--r--sleekxmpp/roster/item.py4
-rw-r--r--tests/test_stream_presence.py94
3 files changed, 98 insertions, 2 deletions
diff --git a/sleekxmpp/basexmpp.py b/sleekxmpp/basexmpp.py
index 59a79b78..8f11eefa 100644
--- a/sleekxmpp/basexmpp.py
+++ b/sleekxmpp/basexmpp.py
@@ -778,8 +778,6 @@ class BaseXMPP(XMLStream):
not presence['type'] in presence.showtypes:
return
- self.event("changed_status", presence)
-
def exception(self, exception):
"""
Process any uncaught exceptions, notably IqError and
diff --git a/sleekxmpp/roster/item.py b/sleekxmpp/roster/item.py
index 1520f770..c27f7a78 100644
--- a/sleekxmpp/roster/item.py
+++ b/sleekxmpp/roster/item.py
@@ -345,7 +345,10 @@ class RosterItem(object):
self.xmpp.event('got_online', presence)
if resource not in self.resources:
self.resources[resource] = {}
+ old_show = self.resources[resource].get('show', None)
self.resources[resource].update(data)
+ if old_show != presence['show']:
+ self.xmpp.event('changed_status', presence)
def handle_unavailable(self, presence):
resource = presence['from'].resource
@@ -353,6 +356,7 @@ class RosterItem(object):
return
if resource in self.resources:
del self.resources[resource]
+ self.xmpp.event('changed_status', presence)
if not self.resources:
self.xmpp.event('got_offline', presence)
diff --git a/tests/test_stream_presence.py b/tests/test_stream_presence.py
index 21535dce..b7e6229c 100644
--- a/tests/test_stream_presence.py
+++ b/tests/test_stream_presence.py
@@ -251,5 +251,99 @@ class TestStreamPresence(SleekTest):
self.assertEqual(events, ptypes,
"Not all events raised: %s" % events)
+ def test_changed_status(self):
+ """Test that the changed_status event is handled properly."""
+ events = []
+ self.stream_start()
+
+ def changed_status(presence):
+ events.append(presence['type'])
+
+ self.xmpp.add_event_handler('changed_status', changed_status)
+
+ self.recv("""
+ <presence from="user@example.com" to="tester@localhost" />
+ """)
+
+ self.recv("""
+ <presence from="user@example.com" to="tester@localhost" />
+ """)
+
+ self.recv("""
+ <presence from="user@example.com" to="tester@localhost">
+ <show>away</show>
+ </presence>
+ """)
+
+ self.recv("""
+ <presence from="user@example.com" to="tester@localhost">
+ <show>away</show>
+ </presence>
+ """)
+
+ self.recv("""
+ <presence from="user@example.com" to="tester@localhost">
+ <show>dnd</show>
+ </presence>
+ """)
+
+ self.recv("""
+ <presence from="user@example.com" to="tester@localhost">
+ <show>dnd</show>
+ </presence>
+ """)
+
+ self.recv("""
+ <presence from="user@example.com" to="tester@localhost">
+ <show>chat</show>
+ </presence>
+ """)
+
+ self.recv("""
+ <presence from="user@example.com" to="tester@localhost">
+ <show>chat</show>
+ </presence>
+ """)
+
+ self.recv("""
+ <presence from="user@example.com" to="tester@localhost">
+ <show>xa</show>
+ </presence>
+ """)
+
+ self.recv("""
+ <presence from="user@example.com" to="tester@localhost">
+ <show>xa</show>
+ </presence>
+ """)
+
+ self.recv("""
+ <presence from="user@example.com"
+ to="tester@localhost"
+ type="unavailable" />
+ """)
+
+ self.recv("""
+ <presence from="user@example.com"
+ to="tester@localhost"
+ type="unavailable" />
+ """)
+
+ self.recv("""
+ <presence from="user@example.com" to="tester@localhost" />
+ """)
+
+ self.recv("""
+ <presence from="user@example.com" to="tester@localhost" />
+ """)
+
+
+ time.sleep(0.3)
+
+ self.assertEqual(events, ['available', 'away', 'dnd', 'chat',
+ 'xa', 'unavailable', 'available'],
+ "Changed status events incorrect: %s" % events)
+
+
suite = unittest.TestLoader().loadTestsFromTestCase(TestStreamPresence)