summaryrefslogtreecommitdiff
path: root/tests/test_stream_xep_0060.py
diff options
context:
space:
mode:
Diffstat (limited to 'tests/test_stream_xep_0060.py')
-rw-r--r--tests/test_stream_xep_0060.py794
1 files changed, 794 insertions, 0 deletions
diff --git a/tests/test_stream_xep_0060.py b/tests/test_stream_xep_0060.py
new file mode 100644
index 00000000..e0936660
--- /dev/null
+++ b/tests/test_stream_xep_0060.py
@@ -0,0 +1,794 @@
+import sys
+import time
+import threading
+
+from sleekxmpp.test import *
+from sleekxmpp.stanza.atom import AtomEntry
+from sleekxmpp.xmlstream import register_stanza_plugin
+
+
+class TestStreamPubsub(SleekTest):
+
+ """
+ Test using the XEP-0030 plugin.
+ """
+
+ def setUp(self):
+ self.stream_start()
+
+ def tearDown(self):
+ self.stream_close()
+
+ def testCreateInstantNode(self):
+ """Test creating an instant node"""
+ t = threading.Thread(name='create_node',
+ target=self.xmpp['xep_0060'].create_node,
+ args=('pubsub.example.com', None))
+ t.start()
+
+ self.send("""
+ <iq type="set" id="1" to="pubsub.example.com">
+ <pubsub xmlns="http://jabber.org/protocol/pubsub">
+ <create />
+ </pubsub>
+ </iq>
+ """)
+
+ self.recv("""
+ <iq type="result" id="1"
+ to="tester@localhost" from="pubsub.example.com">
+ <pubsub xmlns="http://jabber.org/protocol/pubsub">
+ <create node="25e3d37dabbab9541f7523321421edc5bfeb2dae" />
+ </pubsub>
+ </iq>
+ """)
+
+ t.join()
+
+ def testCreateNodeNoConfig(self):
+ """Test creating a node without a config"""
+ self.xmpp['xep_0060'].create_node(
+ 'pubsub.example.com',
+ 'princely_musings',
+ block=False)
+ self.send("""
+ <iq type="set" id="1" to="pubsub.example.com">
+ <pubsub xmlns="http://jabber.org/protocol/pubsub">
+ <create node="princely_musings" />
+ </pubsub>
+ </iq>
+ """)
+
+ def testCreateNodeConfig(self):
+ """Test creating a node with a config"""
+ form = self.xmpp['xep_0004'].stanza.Form()
+ form['type'] = 'submit'
+ form.add_field(var='pubsub#access_model', value='whitelist')
+
+ self.xmpp['xep_0060'].create_node(
+ 'pubsub.example.com',
+ 'princely_musings',
+ config=form, block=False)
+
+ self.send("""
+ <iq type="set" id="1" to="pubsub.example.com">
+ <pubsub xmlns="http://jabber.org/protocol/pubsub">
+ <create node="princely_musings" />
+ <configure>
+ <x xmlns="jabber:x:data" type="submit">
+ <field var="pubsub#access_model">
+ <value>whitelist</value>
+ </field>
+ <field var="FORM_TYPE">
+ <value>http://jabber.org/protocol/pubsub#node_config</value>
+ </field>
+ </x>
+ </configure>
+ </pubsub>
+ </iq>
+ """)
+
+ def testDeleteNode(self):
+ """Test deleting a node"""
+ self.xmpp['xep_0060'].delete_node(
+ 'pubsub.example.com',
+ 'some_node',
+ block=False)
+ self.send("""
+ <iq type="set" to="pubsub.example.com" id="1">
+ <pubsub xmlns="http://jabber.org/protocol/pubsub#owner">
+ <delete node="some_node" />
+ </pubsub>
+ </iq>
+ """)
+
+ def testSubscribeCase1(self):
+ """
+ Test subscribing to a node: Case 1:
+ No subscribee, default 'from' JID, bare JID
+ """
+ self.xmpp['xep_0060'].subscribe(
+ 'pubsub.example.com',
+ 'somenode',
+ block=False)
+ self.send("""
+ <iq type="set" id="1" to="pubsub.example.com">
+ <pubsub xmlns="http://jabber.org/protocol/pubsub">
+ <subscribe node="somenode" jid="tester@localhost" />
+ </pubsub>
+ </iq>
+ """)
+
+ def testSubscribeCase2(self):
+ """
+ Test subscribing to a node: Case 2:
+ No subscribee, given 'from' JID, bare JID
+ """
+ self.xmpp['xep_0060'].subscribe(
+ 'pubsub.example.com',
+ 'somenode',
+ ifrom='foo@comp.example.com/bar',
+ block=False)
+ self.send("""
+ <iq type="set" id="1"
+ to="pubsub.example.com" from="foo@comp.example.com/bar">
+ <pubsub xmlns="http://jabber.org/protocol/pubsub">
+ <subscribe node="somenode" jid="foo@comp.example.com" />
+ </pubsub>
+ </iq>
+ """)
+
+ def testSubscribeCase3(self):
+ """
+ Test subscribing to a node: Case 3:
+ No subscribee, given 'from' JID, full JID
+ """
+ self.xmpp['xep_0060'].subscribe(
+ 'pubsub.example.com',
+ 'somenode',
+ ifrom='foo@comp.example.com/bar',
+ bare=False,
+ block=False)
+ self.send("""
+ <iq type="set" id="1"
+ to="pubsub.example.com" from="foo@comp.example.com/bar">
+ <pubsub xmlns="http://jabber.org/protocol/pubsub">
+ <subscribe node="somenode" jid="foo@comp.example.com/bar" />
+ </pubsub>
+ </iq>
+ """)
+
+ def testSubscribeCase4(self):
+ """
+ Test subscribing to a node: Case 4:
+ No subscribee, no 'from' JID, full JID
+ """
+ self.stream_close()
+ self.stream_start(jid='tester@localhost/full')
+
+ self.xmpp['xep_0060'].subscribe(
+ 'pubsub.example.com',
+ 'somenode',
+ bare=False,
+ block=False)
+ self.send("""
+ <iq type="set" id="1"
+ to="pubsub.example.com">
+ <pubsub xmlns="http://jabber.org/protocol/pubsub">
+ <subscribe node="somenode" jid="tester@localhost/full" />
+ </pubsub>
+ </iq>
+ """)
+
+ def testSubscribeCase5(self):
+ """
+ Test subscribing to a node: Case 5:
+ Subscribee given
+ """
+ self.xmpp['xep_0060'].subscribe(
+ 'pubsub.example.com',
+ 'somenode',
+ subscribee='user@example.com/foo',
+ ifrom='foo@comp.example.com/bar',
+ block=False)
+ self.send("""
+ <iq type="set" id="1"
+ to="pubsub.example.com" from="foo@comp.example.com/bar">
+ <pubsub xmlns="http://jabber.org/protocol/pubsub">
+ <subscribe node="somenode" jid="user@example.com/foo" />
+ </pubsub>
+ </iq>
+ """)
+
+ def testSubscribeWithOptions(self):
+ """Test subscribing to a node, with options."""
+ opts = self.xmpp['xep_0004'].make_form()
+ opts.add_field(
+ var='FORM_TYPE',
+ value='http://jabber.org/protocol/pubsub#subscribe_options',
+ ftype='hidden')
+ opts.add_field(
+ var='pubsub#digest',
+ value=False,
+ ftype='boolean')
+ opts['type'] = 'submit'
+
+ self.xmpp['xep_0060'].subscribe(
+ 'pubsub.example.com',
+ 'somenode',
+ options=opts,
+ block=False)
+ self.send("""
+ <iq type="set" id="1" to="pubsub.example.com">
+ <pubsub xmlns="http://jabber.org/protocol/pubsub">
+ <subscribe node="somenode" jid="tester@localhost" />
+ <options>
+ <x xmlns="jabber:x:data" type="submit">
+ <field var="FORM_TYPE">
+ <value>http://jabber.org/protocol/pubsub#subscribe_options</value>
+ </field>
+ <field var="pubsub#digest">
+ <value>0</value>
+ </field>
+ </x>
+ </options>
+ </pubsub>
+ </iq>
+ """)
+
+ def testUnsubscribeCase1(self):
+ """
+ Test unsubscribing from a node: Case 1:
+ No subscribee, default 'from' JID, bare JID
+ """
+ self.xmpp['xep_0060'].unsubscribe(
+ 'pubsub.example.com',
+ 'somenode',
+ block=False)
+ self.send("""
+ <iq type="set" id="1" to="pubsub.example.com">
+ <pubsub xmlns="http://jabber.org/protocol/pubsub">
+ <unsubscribe node="somenode" jid="tester@localhost" />
+ </pubsub>
+ </iq>
+ """)
+
+ def testUnsubscribeCase2(self):
+ """
+ Test unsubscribing from a node: Case 2:
+ No subscribee, given 'from' JID, bare JID
+ """
+ self.xmpp['xep_0060'].unsubscribe(
+ 'pubsub.example.com',
+ 'somenode',
+ ifrom='foo@comp.example.com/bar',
+ block=False)
+ self.send("""
+ <iq type="set" id="1"
+ to="pubsub.example.com" from="foo@comp.example.com/bar">
+ <pubsub xmlns="http://jabber.org/protocol/pubsub">
+ <unsubscribe node="somenode" jid="foo@comp.example.com" />
+ </pubsub>
+ </iq>
+ """)
+
+ def testUnsubscribeCase3(self):
+ """
+ Test unsubscribing from a node: Case 3:
+ No subscribee, given 'from' JID, full JID
+ """
+ self.xmpp['xep_0060'].unsubscribe(
+ 'pubsub.example.com',
+ 'somenode',
+ ifrom='foo@comp.example.com/bar',
+ bare=False,
+ block=False)
+ self.send("""
+ <iq type="set" id="1"
+ to="pubsub.example.com" from="foo@comp.example.com/bar">
+ <pubsub xmlns="http://jabber.org/protocol/pubsub">
+ <unsubscribe node="somenode" jid="foo@comp.example.com/bar" />
+ </pubsub>
+ </iq>
+ """)
+
+ def testUnsubscribeCase4(self):
+ """
+ Test unsubscribing from a node: Case 4:
+ No subscribee, no 'from' JID, full JID
+ """
+ self.stream_close()
+ self.stream_start(jid='tester@localhost/full')
+
+ self.xmpp['xep_0060'].unsubscribe(
+ 'pubsub.example.com',
+ 'somenode',
+ bare=False,
+ block=False)
+ self.send("""
+ <iq type="set" id="1"
+ to="pubsub.example.com">
+ <pubsub xmlns="http://jabber.org/protocol/pubsub">
+ <unsubscribe node="somenode" jid="tester@localhost/full" />
+ </pubsub>
+ </iq>
+ """)
+
+ def testUnsubscribeCase5(self):
+ """
+ Test unsubscribing from a node: Case 5:
+ Subscribee given
+ """
+ self.xmpp['xep_0060'].unsubscribe(
+ 'pubsub.example.com',
+ 'somenode',
+ subscribee='user@example.com/foo',
+ ifrom='foo@comp.example.com/bar',
+ block=False)
+ self.send("""
+ <iq type="set" id="1"
+ to="pubsub.example.com" from="foo@comp.example.com/bar">
+ <pubsub xmlns="http://jabber.org/protocol/pubsub">
+ <unsubscribe node="somenode" jid="user@example.com/foo" />
+ </pubsub>
+ </iq>
+ """)
+
+ def testGetDefaultNodeConfig(self):
+ """Test retrieving the default node config for a pubsub service."""
+ self.xmpp['xep_0060'].get_node_config(
+ 'pubsub.example.com',
+ block=False)
+ self.send("""
+ <iq type="get" id="1" to="pubsub.example.com">
+ <pubsub xmlns="http://jabber.org/protocol/pubsub#owner">
+ <default />
+ </pubsub>
+ </iq>
+ """, use_values=False)
+
+ def testGetNodeConfig(self):
+ """Test getting the config for a given node."""
+ self.xmpp['xep_0060'].get_node_config(
+ 'pubsub.example.com',
+ 'somenode',
+ block=False)
+ self.send("""
+ <iq type="get" id="1" to="pubsub.example.com">
+ <pubsub xmlns="http://jabber.org/protocol/pubsub#owner">
+ <configure node="somenode" />
+ </pubsub>
+ </iq>
+ """, use_values=False)
+
+ def testSetNodeConfig(self):
+ """Test setting the configuration for a node."""
+ form = self.xmpp['xep_0004'].make_form()
+ form.add_field(var='FORM_TYPE', ftype='hidden',
+ value='http://jabber.org/protocol/pubsub#node_config')
+ form.add_field(var='pubsub#title', ftype='text-single',
+ value='This is awesome!')
+ form['type'] = 'submit'
+
+ self.xmpp['xep_0060'].set_node_config(
+ 'pubsub.example.com',
+ 'somenode',
+ form,
+ block=False)
+ self.send("""
+ <iq type="set" id="1" to="pubsub.example.com">
+ <pubsub xmlns="http://jabber.org/protocol/pubsub#owner">
+ <configure node="somenode">
+ <x xmlns="jabber:x:data" type="submit">
+ <field var="FORM_TYPE">
+ <value>http://jabber.org/protocol/pubsub#node_config</value>
+ </field>
+ <field var="pubsub#title">
+ <value>This is awesome!</value>
+ </field>
+ </x>
+ </configure>
+ </pubsub>
+ </iq>
+ """)
+
+ def testPublishNoItems(self):
+ """Test publishing no items (in order to generate events)"""
+ self.xmpp['xep_0060'].publish(
+ 'pubsub.example.com',
+ 'somenode',
+ block=False)
+ self.send("""
+ <iq type="set" id="1" to="pubsub.example.com">
+ <pubsub xmlns="http://jabber.org/protocol/pubsub">
+ <publish node="somenode" />
+ </pubsub>
+ </iq>
+ """)
+
+ def testPublishSingle(self):
+ """Test publishing a single item."""
+ payload = AtomEntry()
+ payload['title'] = 'Test'
+
+ register_stanza_plugin(self.xmpp['xep_0060'].stanza.Item, AtomEntry)
+
+ self.xmpp['xep_0060'].publish(
+ 'pubsub.example.com',
+ 'somenode',
+ id='id42',
+ payload=payload,
+ block=False)
+ self.send("""
+ <iq type="set" id="1" to="pubsub.example.com">
+ <pubsub xmlns="http://jabber.org/protocol/pubsub">
+ <publish node="somenode">
+ <item id="id42">
+ <entry xmlns="http://www.w3.org/2005/Atom">
+ <title>Test</title>
+ </entry>
+ </item>
+ </publish>
+ </pubsub>
+ </iq>
+ """)
+
+ def testPublishSingleOptions(self):
+ """Test publishing a single item, with options."""
+ payload = AtomEntry()
+ payload['title'] = 'Test'
+
+ register_stanza_plugin(self.xmpp['xep_0060'].stanza.Item, AtomEntry)
+
+ options = self.xmpp['xep_0004'].make_form()
+ options.add_field(var='FORM_TYPE', ftype='hidden',
+ value='http://jabber.org/protocol/pubsub#publish-options')
+ options.add_field(var='pubsub#access_model', ftype='text-single',
+ value='presence')
+ options['type'] = 'submit'
+
+ self.xmpp['xep_0060'].publish(
+ 'pubsub.example.com',
+ 'somenode',
+ id='ID42',
+ payload=payload,
+ options=options,
+ block=False)
+ self.send("""
+ <iq type="set" id="1" to="pubsub.example.com">
+ <pubsub xmlns="http://jabber.org/protocol/pubsub">
+ <publish node="somenode">
+ <item id="ID42">
+ <entry xmlns="http://www.w3.org/2005/Atom">
+ <title>Test</title>
+ </entry>
+ </item>
+ </publish>
+ <publish-options>
+ <x xmlns="jabber:x:data" type="submit">
+ <field var="FORM_TYPE">
+ <value>http://jabber.org/protocol/pubsub#publish-options</value>
+ </field>
+ <field var="pubsub#access_model">
+ <value>presence</value>
+ </field>
+ </x>
+ </publish-options>
+ </pubsub>
+ </iq>
+ """, use_values=False)
+
+ def testRetract(self):
+ """Test deleting an item."""
+ self.xmpp['xep_0060'].retract(
+ 'pubsub.example.com',
+ 'somenode',
+ 'ID1',
+ notify=True,
+ block=False)
+ self.send("""
+ <iq type="set" id="1" to="pubsub.example.com">
+ <pubsub xmlns="http://jabber.org/protocol/pubsub">
+ <retract node="somenode" notify="true">
+ <item id="ID1" />
+ </retract>
+ </pubsub>
+ </iq>
+ """)
+
+ def testRetract(self):
+ """Test deleting an item."""
+ self.xmpp['xep_0060'].retract(
+ 'pubsub.example.com',
+ 'somenode',
+ 'ID1',
+ block=False)
+ 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>
+ """)
+
+ def testPurge(self):
+ """Test removing all items from a node."""
+ self.xmpp['xep_0060'].purge(
+ 'pubsub.example.com',
+ 'somenode',
+ block=False)
+ self.send("""
+ <iq type="set" id="1" to="pubsub.example.com">
+ <pubsub xmlns="http://jabber.org/protocol/pubsub#owner">
+ <purge node="somenode" />
+ </pubsub>
+ </iq>
+ """)
+
+ def testGetItem(self):
+ """Test retrieving a single item."""
+ self.xmpp['xep_0060'].get_item(
+ 'pubsub.example.com',
+ 'somenode',
+ 'id42',
+ block=False)
+ self.send("""
+ <iq type="get" id="1" to="pubsub.example.com">
+ <pubsub xmlns="http://jabber.org/protocol/pubsub">
+ <items node="somenode">
+ <item id="id42" />
+ </items>
+ </pubsub>
+ </iq>
+ """)
+
+ def testGetLatestItems(self):
+ """Test retrieving the most recent N items."""
+ self.xmpp['xep_0060'].get_items(
+ 'pubsub.example.com',
+ 'somenode',
+ max_items=3,
+ block=False)
+ self.send("""
+ <iq type="get" id="1" to="pubsub.example.com">
+ <pubsub xmlns="http://jabber.org/protocol/pubsub">
+ <items node="somenode" max_items="3" />
+ </pubsub>
+ </iq>
+ """)
+
+ def testGetAllItems(self):
+ """Test retrieving all items."""
+ self.xmpp['xep_0060'].get_items(
+ 'pubsub.example.com',
+ 'somenode',
+ block=False)
+ self.send("""
+ <iq type="get" id="1" to="pubsub.example.com">
+ <pubsub xmlns="http://jabber.org/protocol/pubsub">
+ <items node="somenode" />
+ </pubsub>
+ </iq>
+ """)
+
+ def testGetSpecificItems(self):
+ """Test retrieving a specific set of items."""
+ self.xmpp['xep_0060'].get_items(
+ 'pubsub.example.com',
+ 'somenode',
+ item_ids=['A', 'B', 'C'],
+ block=False)
+ self.send("""
+ <iq type="get" id="1" to="pubsub.example.com">
+ <pubsub xmlns="http://jabber.org/protocol/pubsub">
+ <items node="somenode">
+ <item id="A" />
+ <item id="B" />
+ <item id="C" />
+ </items>
+ </pubsub>
+ </iq>
+ """)
+
+ def testGetSubscriptionGlobalDefaultOptions(self):
+ """Test getting the subscription options for a node/JID."""
+ self.xmpp['xep_0060'].get_subscription_options(
+ 'pubsub.example.com',
+ block=False)
+ self.send("""
+ <iq type="get" id="1" to="pubsub.example.com">
+ <pubsub xmlns="http://jabber.org/protocol/pubsub">
+ <default />
+ </pubsub>
+ </iq>
+ """, use_values=False)
+
+ def testGetSubscriptionNodeDefaultOptions(self):
+ """Test getting the subscription options for a node/JID."""
+ self.xmpp['xep_0060'].get_subscription_options(
+ 'pubsub.example.com',
+ node='somenode',
+ block=False)
+ self.send("""
+ <iq type="get" id="1" to="pubsub.example.com">
+ <pubsub xmlns="http://jabber.org/protocol/pubsub">
+ <default node="somenode" />
+ </pubsub>
+ </iq>
+ """, use_values=False)
+
+ def testGetSubscriptionOptions(self):
+ """Test getting the subscription options for a node/JID."""
+ self.xmpp['xep_0060'].get_subscription_options(
+ 'pubsub.example.com',
+ 'somenode',
+ 'tester@localhost',
+ block=False)
+ self.send("""
+ <iq type="get" id="1" to="pubsub.example.com">
+ <pubsub xmlns="http://jabber.org/protocol/pubsub">
+ <options node="somenode" jid="tester@localhost" />
+ </pubsub>
+ </iq>
+ """, use_values=False)
+
+ def testSetSubscriptionOptions(self):
+ """Test setting the subscription options for a node/JID."""
+ opts = self.xmpp['xep_0004'].make_form()
+ opts.add_field(
+ var='FORM_TYPE',
+ value='http://jabber.org/protocol/pubsub#subscribe_options',
+ ftype='hidden')
+ opts.add_field(
+ var='pubsub#digest',
+ value=False,
+ ftype='boolean')
+ opts['type'] = 'submit'
+
+ self.xmpp['xep_0060'].set_subscription_options(
+ 'pubsub.example.com',
+ 'somenode',
+ 'tester@localhost',
+ opts,
+ block=False)
+ self.send("""
+ <iq type="get" id="1" to="pubsub.example.com">
+ <pubsub xmlns="http://jabber.org/protocol/pubsub">
+ <options node="somenode" jid="tester@localhost">
+ <x xmlns="jabber:x:data" type="submit">
+ <field var="FORM_TYPE">
+ <value>http://jabber.org/protocol/pubsub#subscribe_options</value>
+ </field>
+ <field var="pubsub#digest">
+ <value>0</value>
+ </field>
+ </x>
+ </options>
+ </pubsub>
+ </iq>
+ """)
+
+ def testGetNodeSubscriptions(self):
+ """Test retrieving all subscriptions for a node."""
+ self.xmpp['xep_0060'].get_node_subscriptions(
+ 'pubsub.example.com',
+ 'somenode',
+ block=False)
+ self.send("""
+ <iq type="get" id="1" to="pubsub.example.com">
+ <pubsub xmlns="http://jabber.org/protocol/pubsub#owner">
+ <subscriptions node="somenode" />
+ </pubsub>
+ </iq>
+ """)
+
+ def testGetSubscriptions(self):
+ """Test retrieving a users's subscriptions."""
+ self.xmpp['xep_0060'].get_subscriptions(
+ 'pubsub.example.com',
+ block=False)
+ self.send("""
+ <iq type="get" id="1" to="pubsub.example.com">
+ <pubsub xmlns="http://jabber.org/protocol/pubsub">
+ <subscriptions />
+ </pubsub>
+ </iq>
+ """)
+
+ def testGetSubscriptionsForNode(self):
+ """Test retrieving a users's subscriptions for a given node."""
+ self.xmpp['xep_0060'].get_subscriptions(
+ 'pubsub.example.com',
+ node='somenode',
+ block=False)
+ self.send("""
+ <iq type="get" id="1" to="pubsub.example.com">
+ <pubsub xmlns="http://jabber.org/protocol/pubsub">
+ <subscriptions node="somenode" />
+ </pubsub>
+ </iq>
+ """)
+
+ def testGetAffiliations(self):
+ """Test retrieving a users's affiliations."""
+ self.xmpp['xep_0060'].get_affiliations(
+ 'pubsub.example.com',
+ block=False)
+ self.send("""
+ <iq type="get" id="1" to="pubsub.example.com">
+ <pubsub xmlns="http://jabber.org/protocol/pubsub">
+ <affiliations />
+ </pubsub>
+ </iq>
+ """)
+
+ def testGetAffiliatinssForNode(self):
+ """Test retrieving a users's affiliations for a given node."""
+ self.xmpp['xep_0060'].get_affiliations(
+ 'pubsub.example.com',
+ node='somenode',
+ block=False)
+ self.send("""
+ <iq type="get" id="1" to="pubsub.example.com">
+ <pubsub xmlns="http://jabber.org/protocol/pubsub">
+ <affiliations node="somenode" />
+ </pubsub>
+ </iq>
+ """)
+
+ def testGetNodeAffiliations(self):
+ """Test getting the affiliations for a node."""
+ self.xmpp['xep_0060'].get_node_affiliations(
+ 'pubsub.example.com',
+ 'somenode',
+ block=False)
+ self.send("""
+ <iq type="get" id="1" to="pubsub.example.com">
+ <pubsub xmlns="http://jabber.org/protocol/pubsub#owner">
+ <affiliations node="somenode" />
+ </pubsub>
+ </iq>
+ """)
+
+ def testModifySubscriptions(self):
+ """Test owner modifying node subscriptions."""
+ self.xmpp['xep_0060'].modify_subscriptions(
+ 'pubsub.example.com',
+ 'somenode',
+ subscriptions=[('user@example.com', 'subscribed'),
+ ('foo@example.net', 'none')],
+ block=False)
+ self.send("""
+ <iq type="set" id="1" to="pubsub.example.com">
+ <pubsub xmlns="http://jabber.org/protocol/pubsub#owner">
+ <subscriptions node="somenode">
+ <subscription jid="user@example.com" subscription="subscribed" />
+ <subscription jid="foo@example.net" subscription="none" />
+ </subscriptions>
+ </pubsub>
+ </iq>
+ """)
+
+ def testModifyAffiliations(self):
+ """Test owner modifying node affiliations."""
+ self.xmpp['xep_0060'].modify_affiliations(
+ 'pubsub.example.com',
+ 'somenode',
+ affiliations=[('user@example.com', 'publisher'),
+ ('foo@example.net', 'none')],
+ block=False)
+ self.send("""
+ <iq type="set" id="1" to="pubsub.example.com">
+ <pubsub xmlns="http://jabber.org/protocol/pubsub#owner">
+ <affiliations node="somenode">
+ <affiliation jid="user@example.com" affiliation="publisher" />
+ <affiliation jid="foo@example.net" affiliation="none" />
+ </affiliations>
+ </pubsub>
+ </iq>
+ """)
+
+
+suite = unittest.TestLoader().loadTestsFromTestCase(TestStreamPubsub)