summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorLance Stout <lancestout@gmail.com>2011-05-20 16:48:13 -0400
committerLance Stout <lancestout@gmail.com>2011-05-20 16:48:13 -0400
commit6b274a2543744f9b94823f5bd2a6c23ec8cc3f75 (patch)
tree6272aac508277e9ce0f14c8c15912719d616a575
parent6a07e7cbe3e995f44ca3ba75a0ff83616269cf5a (diff)
downloadslixmpp-6b274a2543744f9b94823f5bd2a6c23ec8cc3f75.tar.gz
slixmpp-6b274a2543744f9b94823f5bd2a6c23ec8cc3f75.tar.bz2
slixmpp-6b274a2543744f9b94823f5bd2a6c23ec8cc3f75.tar.xz
slixmpp-6b274a2543744f9b94823f5bd2a6c23ec8cc3f75.zip
Fix double roster entry issue with Unicode.
JIDs with Unicode values were being encoded by the JID class instead of leaving them as just Unicode strings. It may still be a good idea to use from __future__ import unicode_literals pretty much everywhere though. Fixes issue #88.
-rw-r--r--sleekxmpp/test/sleektest.py7
-rw-r--r--sleekxmpp/xmlstream/jid.py11
-rw-r--r--tests/test_stream_roster.py48
3 files changed, 60 insertions, 6 deletions
diff --git a/sleekxmpp/test/sleektest.py b/sleekxmpp/test/sleektest.py
index fd47a87e..24af1e7a 100644
--- a/sleekxmpp/test/sleektest.py
+++ b/sleekxmpp/test/sleektest.py
@@ -16,7 +16,8 @@ import sleekxmpp
from sleekxmpp import ClientXMPP, ComponentXMPP
from sleekxmpp.stanza import Message, Iq, Presence
from sleekxmpp.test import TestSocket, TestLiveSocket
-from sleekxmpp.xmlstream import StanzaBase, ET, register_stanza_plugin
+from sleekxmpp.xmlstream import ET, register_stanza_plugin
+from sleekxmpp.xmlstream import ElementBase, StanzaBase
from sleekxmpp.xmlstream.tostring import tostring
from sleekxmpp.xmlstream.matcher import StanzaPath, MatcherId
from sleekxmpp.xmlstream.matcher import MatchXMLMask, MatchXPath
@@ -201,7 +202,7 @@ class SleekTest(unittest.TestCase):
"Stanza:\n%s" % str(stanza))
else:
stanza_class = stanza.__class__
- if isinstance(criteria, str):
+ if not isinstance(criteria, ElementBase):
xml = self.parse_xml(criteria)
else:
xml = criteria.xml
@@ -606,7 +607,7 @@ class SleekTest(unittest.TestCase):
self.fail("Stanza data was sent: %s" % sent)
if sent is None:
self.fail("No stanza was sent.")
-
+
xml = self.parse_xml(sent)
self.fix_namespaces(xml, 'jabber:client')
sent = self.xmpp._build_stanza(xml, 'jabber:client')
diff --git a/sleekxmpp/xmlstream/jid.py b/sleekxmpp/xmlstream/jid.py
index 5019a25e..36b33056 100644
--- a/sleekxmpp/xmlstream/jid.py
+++ b/sleekxmpp/xmlstream/jid.py
@@ -6,6 +6,8 @@
See the file LICENSE for copying permission.
"""
+from __future__ import unicode_literals
+
class JID(object):
"""
@@ -42,7 +44,9 @@ class JID(object):
Arguments:
jid - The new JID value.
"""
- self._full = self._jid = str(jid)
+ if isinstance(jid, JID):
+ jid = jid.full
+ self._full = self._jid = jid
self._domain = None
self._resource = None
self._user = None
@@ -123,10 +127,11 @@ class JID(object):
return self.full
def __repr__(self):
- return str(self)
+ return self.full
def __eq__(self, other):
"""
Two JIDs are considered equal if they have the same full JID value.
"""
- return str(other) == str(self)
+ other = JID(other)
+ return self.full == other.full
diff --git a/tests/test_stream_roster.py b/tests/test_stream_roster.py
index 731d1145..d86ff955 100644
--- a/tests/test_stream_roster.py
+++ b/tests/test_stream_roster.py
@@ -1,3 +1,7 @@
+# -*- encoding:utf-8 -*-
+
+from __future__ import unicode_literals
+
from sleekxmpp.test import *
import time
import threading
@@ -162,6 +166,50 @@ class TestStreamRoster(SleekTest):
self.failUnless(events == ['roster_callback'],
"Roster timeout event not triggered: %s." % events)
+ def testRosterUnicode(self):
+ """Test that JIDs with Unicode values are handled properly."""
+ self.stream_start()
+ self.recv("""
+ <iq to="tester@localhost" type="set" id="1">
+ <query xmlns="jabber:iq:roster">
+ <item jid="andré@foo" subscription="both">
+ <group>Unicode</group>
+ </item>
+ </query>
+ </iq>
+ """)
+
+ # Give the event queue time to process.
+ time.sleep(.1)
+
+ roster = {'andré@foo': {
+ 'name': '',
+ 'subscription': 'both',
+ 'groups': ['Unicode'],
+ 'presence': {},
+ 'in_roster': True}}
+ self.failUnless(self.xmpp.roster == roster,
+ "Unexpected roster values: %s" % self.xmpp.roster)
+
+ self.recv("""
+ <presence from="andré@foo/bar" />
+ """)
+
+ # Give the event queue time to process.
+ time.sleep(.1)
+
+ roster = {'andré@foo': {
+ 'name': '',
+ 'subscription': 'both',
+ 'groups': ['Unicode'],
+ 'presence': {
+ 'bar':{'priority':0,
+ 'status':'',
+ 'show':'available'}},
+ 'in_roster': True}}
+ self.failUnless(self.xmpp.roster == roster,
+ "Unexpected roster values: %s" % self.xmpp.roster)
+
suite = unittest.TestLoader().loadTestsFromTestCase(TestStreamRoster)