summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--sleekxmpp/plugins/xep_0060/pubsub.py9
-rw-r--r--sleekxmpp/plugins/xep_0060/stanza/pubsub.py8
-rw-r--r--tests/test_stream_xep_0060.py28
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."""