diff options
-rw-r--r-- | sleekxmpp/plugins/xep_0060/pubsub.py | 9 | ||||
-rw-r--r-- | sleekxmpp/plugins/xep_0060/stanza/pubsub.py | 8 | ||||
-rw-r--r-- | tests/test_stream_xep_0060.py | 28 |
3 files changed, 33 insertions, 12 deletions
diff --git a/sleekxmpp/plugins/xep_0060/pubsub.py b/sleekxmpp/plugins/xep_0060/pubsub.py index fadcf652..e1f20254 100644 --- a/sleekxmpp/plugins/xep_0060/pubsub.py +++ b/sleekxmpp/plugins/xep_0060/pubsub.py @@ -305,11 +305,10 @@ class xep_0060(base_plugin): item['id'] = id item['payload'] = payload iq['pubsub']['publish'].append(item) - if options is not None: - iq['pubsub']['publish_options'] = options + iq['pubsub']['publish_options'] = options return iq.send(block=block, callback=callback, timeout=timeout) - def retract(self, jid, node, item, ifrom=None, block=True, + def retract(self, jid, node, item_id, ifrom=None, block=True, callback=None, timeout=None): """ Delete a single item from a node. @@ -317,9 +316,7 @@ class xep_0060(base_plugin): iq = self.xmpp.Iq(sto=jid, sfrom=ifrom, stype='set') iq['pubsub']['retract']['node'] = node - item = stanza.pubsub.Item() - item['id'] = item - iq['pubsub']['retract'].append(item) + iq['pubsub']['retract']['item']['id'] = item_id return iq.send(block=block, callback=callback, timeout=timeout) def purge(self, jid, node, ifrom=None, block=True, callback=None, diff --git a/sleekxmpp/plugins/xep_0060/stanza/pubsub.py b/sleekxmpp/plugins/xep_0060/stanza/pubsub.py index 6a9a3df9..c370aeb9 100644 --- a/sleekxmpp/plugins/xep_0060/stanza/pubsub.py +++ b/sleekxmpp/plugins/xep_0060/stanza/pubsub.py @@ -151,7 +151,7 @@ class Publish(Items): registerStanzaPlugin(Pubsub, Publish) -class Retract(Items): +class Retract(ElementBase): namespace = 'http://jabber.org/protocol/pubsub' name = 'retract' plugin_attrib = name @@ -160,6 +160,7 @@ class Retract(Items): plugin_tag_map = {} registerStanzaPlugin(Pubsub, Retract) +registerStanzaPlugin(Retract, Item) class Unsubscribe(ElementBase): namespace = 'http://jabber.org/protocol/pubsub' @@ -253,12 +254,14 @@ class PublishOptions(ElementBase): def get_publish_options(self): config = self.xml.find('{jabber:x:data}x') + if config is None: + return None form = xep_0004.Form(xml=config) return form def set_publish_options(self, value): if value is None: - del self['publish_options'] + self.del_publish_options() else: self.xml.append(value.getXML()) return self @@ -267,6 +270,7 @@ class PublishOptions(ElementBase): config = self.xml.find('{jabber:x:data}x') if config is not None: self.xml.remove(config) + self.parent().xml.remove(self.xml) registerStanzaPlugin(Pubsub, PublishOptions) diff --git a/tests/test_stream_xep_0060.py b/tests/test_stream_xep_0060.py index 50bbe37a..2207cd96 100644 --- a/tests/test_stream_xep_0060.py +++ b/tests/test_stream_xep_0060.py @@ -430,7 +430,7 @@ class TestStreamPubsub(SleekTest): value='presence') options['type'] = 'submit' - t = threading.Thread(name='publish_single', + t = threading.Thread(name='publish_single_options', target=self.xmpp['xep_0060'].publish, args=('pubsub.example.com', 'somenode'), kwargs={'item_id': 'ID42', @@ -479,7 +479,7 @@ class TestStreamPubsub(SleekTest): register_stanza_plugin(self.xmpp['xep_0060'].stanza.Item, AtomEntry) - t = threading.Thread(name='publish_single', + t = threading.Thread(name='publish_multi', target=self.xmpp['xep_0060'].publish, args=('pubsub.example.com', 'somenode'), kwargs={'items': [('ID1', payload1), @@ -529,7 +529,7 @@ class TestStreamPubsub(SleekTest): value='presence') options['type'] = 'submit' - t = threading.Thread(name='publish_single', + t = threading.Thread(name='publish_multi_options', target=self.xmpp['xep_0060'].publish, args=('pubsub.example.com', 'somenode'), kwargs={'items': [('ID1', payload1), @@ -575,7 +575,27 @@ class TestStreamPubsub(SleekTest): def testRetract(self): """Test deleting an item.""" - pass + t = threading.Thread(name='retract', + target=self.xmpp['xep_0060'].retract, + args=('pubsub.example.com', 'somenode', 'ID1')) + t.start() + + self.send(""" + <iq type="set" id="1" to="pubsub.example.com"> + <pubsub xmlns="http://jabber.org/protocol/pubsub"> + <retract node="somenode"> + <item id="ID1" /> + </retract> + </pubsub> + </iq> + """, use_values=False) + + self.recv(""" + <iq type="result" id="1" + to="tester@localhost" from="pubsub.example.com" /> + """) + + t.join() def testPurge(self): """Test removing all items from a node.""" |