795 lines
		
	
	
		
			26 KiB
		
	
	
	
		
			Python
		
	
	
	
	
	
			
		
		
	
	
			795 lines
		
	
	
		
			26 KiB
		
	
	
	
		
			Python
		
	
	
	
	
	
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)
 |