Changeset 27:a9704141033a in ralphm-patches


Ignore:
Timestamp:
Jan 2, 2010, 3:32:52 PM (11 years ago)
Author:
Ralph Meijer <ralphm@…>
Branch:
default
Message:

Ensure all modified code has unittests, add setOptions to PubSubClient?.

Files:
6 edited

Legend:

Unmodified
Added
Removed
  • findform.patch

    r26 r27  
    11Move findForm to wokkel.data_form
    22
    3 diff -r ff70bda5117e wokkel/data_form.py
    4 --- a/wokkel/data_form.py       Fri Jan 01 16:03:51 2010 +0100
    5 +++ b/wokkel/data_form.py       Fri Jan 01 16:16:09 2010 +0100
    6 @@ -657,3 +657,24 @@
     3diff -r ff3064cad1af wokkel/data_form.py
     4--- a/wokkel/data_form.py       Fri Jan 01 16:16:57 2010 +0100
     5+++ b/wokkel/data_form.py       Sat Jan 02 13:44:05 2010 +0100
     6@@ -657,3 +657,25 @@
    77 
    88         for field in filtered:
    99             self.removeField(field)
     10+
    1011+
    1112+
     
    2930+
    3031+    return None
    31 diff -r ff70bda5117e wokkel/pubsub.py
    32 --- a/wokkel/pubsub.py  Fri Jan 01 16:03:51 2010 +0100
    33 +++ b/wokkel/pubsub.py  Fri Jan 01 16:16:09 2010 +0100
     32diff -r ff3064cad1af wokkel/pubsub.py
     33--- a/wokkel/pubsub.py  Fri Jan 01 16:16:57 2010 +0100
     34+++ b/wokkel/pubsub.py  Sat Jan 02 13:44:05 2010 +0100
    3435@@ -252,30 +252,6 @@
    3536         self.verb = verb
     
    9091             if form.formType == 'submit':
    9192                 self.options = form.getValues()
     93diff -r ff3064cad1af wokkel/test/test_data_form.py
     94--- a/wokkel/test/test_data_form.py     Fri Jan 01 16:16:57 2010 +0100
     95+++ b/wokkel/test/test_data_form.py     Sat Jan 02 13:44:05 2010 +0100
     96@@ -1064,3 +1064,74 @@
     97         self.assertEqual([], checked)
     98 
     99 
     100+
     101+class FindFormTest(unittest.TestCase):
     102+    """
     103+    Tests for L{data_form.findForm}.
     104+    """
     105+
     106+    def test_findForm(self):
     107+        element = domish.Element((None, 'test'))
     108+        theForm = data_form.Form('submit', formNamespace='myns')
     109+        element.addChild(theForm.toElement())
     110+        form = data_form.findForm(element, 'myns')
     111+        self.assertEqual('myns', form.formNamespace)
     112+
     113+
     114+    def test_noFormType(self):
     115+        element = domish.Element((None, 'test'))
     116+        otherForm = data_form.Form('submit')
     117+        element.addChild(otherForm.toElement())
     118+        form = data_form.findForm(element, 'myns')
     119+        self.assertIdentical(None, form)
     120+
     121+
     122+    def test_noFormTypeCancel(self):
     123+        """
     124+        Cancelled forms don't have a FORM_TYPE field, the first is returned.
     125+        """
     126+        element = domish.Element((None, 'test'))
     127+        cancelledForm = data_form.Form('cancel')
     128+        element.addChild(cancelledForm.toElement())
     129+        form = data_form.findForm(element, 'myns')
     130+        self.assertEqual('cancel', form.formType)
     131+
     132+
     133+    def test_otherFormType(self):
     134+        """
     135+        Forms with other FORM_TYPEs are ignored.
     136+        """
     137+        element = domish.Element((None, 'test'))
     138+        otherForm = data_form.Form('submit', formNamespace='otherns')
     139+        element.addChild(otherForm.toElement())
     140+        form = data_form.findForm(element, 'myns')
     141+        self.assertIdentical(None, form)
     142+
     143+
     144+    def test_otherFormTypeCancel(self):
     145+        """
     146+        Cancelled forms with another FORM_TYPE are ignored.
     147+        """
     148+        element = domish.Element((None, 'test'))
     149+        cancelledForm = data_form.Form('cancel', formNamespace='otherns')
     150+        element.addChild(cancelledForm.toElement())
     151+        form = data_form.findForm(element, 'myns')
     152+        self.assertIdentical(None, form)
     153+
     154+
     155+    def test_noElement(self):
     156+        """
     157+        When None is passed as element, None is returned.
     158+        """
     159+        element = None
     160+        form = data_form.findForm(element, 'myns')
     161+        self.assertIdentical(None, form)
     162+
     163+
     164+    def test_noForm(self):
     165+        """
     166+        When no child element is a form, None is returned.
     167+        """
     168+        element = domish.Element((None, 'test'))
     169+        form = data_form.findForm(element, 'myns')
     170+        self.assertIdentical(None, form)
  • pubsub-create-configure.patch

    r21 r27  
    1 diff -r d64e96596c50 -r 8425a88d49f5 wokkel/pubsub.py
    2 --- a/wokkel/pubsub.py  Wed Dec 30 21:41:55 2009 +0100
    3 +++ b/wokkel/pubsub.py  Wed Dec 30 21:42:27 2009 +0100
     1Add support for configuration options in node creation requests
     2
     3diff -r 259252e5664b wokkel/pubsub.py
     4--- a/wokkel/pubsub.py  Sat Jan 02 14:28:16 2010 +0100
     5+++ b/wokkel/pubsub.py  Sat Jan 02 15:27:24 2010 +0100
    46@@ -234,7 +234,7 @@
    57         'optionsSet': ['nodeOrEmpty', 'jid', 'options'],
     
    2628+                        self.options = form
    2729+                    else:
    28 +                        raise BadRequest(text="Unexpected form type %r" %
     30+                        raise BadRequest(text=u"Unexpected form type '%s'" %
    2931+                                              form.formType)
    3032+                else:
     
    4547     def _parse_itemIdentifiers(self, verbElement):
    4648         """
    47 @@ -602,7 +629,8 @@
     49@@ -607,7 +634,8 @@
    4850         pass
    4951 
     
    5557         Create a publish subscribe node.
    5658 
    57 @@ -610,12 +638,20 @@
     59@@ -615,12 +643,20 @@
    5860         @type service: L{JID}
    5961         @param nodeIdentifier: Optional suggestion for the id of the node.
     
    6870 
    6971+        if options:
    70 +            form = data_form.Form(formType='result',
     72+            form = data_form.Form(formType='submit',
    7173+                                  formNamespace=NS_PUBSUB_NODE_CONFIG)
    7274+            form.makeFields(options)
     
    7678             try:
    7779                 new_node = iq.pubsub.create["node"]
    78 @@ -887,8 +923,6 @@
    79              d = self.getNodes(requestor, target)
    80          else:
    81              d = defer.succeed([])
    82 -           
    83 -
    84  
    85          d.addCallback(lambda nodes: [disco.DiscoItem(target, node)
    86                                       for node in nodes])
    87 @@ -998,6 +1032,12 @@
     80@@ -1001,6 +1037,12 @@
    8881         form.typeCheck(fieldDefs, filterUnknown=True)
    8982 
     
    9891         if request.nodeType not in ('leaf', 'collection'):
    9992             raise error.StanzaError('not-acceptable')
    100 diff -r d64e96596c50 -r 8425a88d49f5 wokkel/test/test_pubsub.py
    101 --- a/wokkel/test/test_pubsub.py        Wed Dec 30 21:41:55 2009 +0100
    102 +++ b/wokkel/test/test_pubsub.py        Wed Dec 30 21:42:27 2009 +0100
     93diff -r 259252e5664b wokkel/test/test_pubsub.py
     94--- a/wokkel/test/test_pubsub.py        Sat Jan 02 14:28:16 2010 +0100
     95+++ b/wokkel/test/test_pubsub.py        Sat Jan 02 15:27:24 2010 +0100
    10396@@ -19,7 +19,7 @@
    10497 from wokkel.test.helpers import TestableRequestHandlerMixin, XmlStreamStub
     
    110103 NS_PUBSUB_EVENT = 'http://jabber.org/protocol/pubsub#event'
    111104 NS_PUBSUB_OWNER = 'http://jabber.org/protocol/pubsub#owner'
    112 @@ -271,6 +271,40 @@
     105@@ -271,6 +271,41 @@
    113106         return d
    114107 
     
    141134+        # check that it has a configuration form
    142135+        form = data_form.findForm(children[0], NS_PUBSUB_NODE_CONFIG)
    143 +        self.assertNotIdentical(None, form)
     136+        self.assertEqual('submit', form.formType)
     137+
    144138+
    145139+        response = toResponse(iq, 'result')
     
    151145         """
    152146         Test sending delete request.
    153 @@ -935,6 +969,7 @@
     147@@ -936,6 +971,7 @@
    154148         self.assertEqual(JID('user@example.org'), request.sender)
    155149         self.assertEqual(JID('pubsub.example.org'), request.recipient)
     
    159153 
    160154     def test_fromElementCreateInstant(self):
    161 @@ -955,6 +990,78 @@
     155@@ -956,6 +992,109 @@
    162156         self.assertIdentical(None, request.nodeIdentifier)
    163157 
     
    235229+
    236230+
     231+    def test_fromElementCreateConfigureBadFormType(self):
     232+        """
     233+        The form of a node creation request should have the right type.
     234+        """
     235+
     236+        xml = """
     237+        <iq type='set' to='pubsub.example.org'
     238+                       from='user@example.org'>
     239+          <pubsub xmlns='http://jabber.org/protocol/pubsub'>
     240+            <create node='mynode'/>
     241+            <configure>
     242+              <x xmlns='jabber:x:data' type='result'>
     243+                <field var='FORM_TYPE' type='hidden'>
     244+                  <value>http://jabber.org/protocol/pubsub#node_config</value>
     245+                </field>
     246+                <field var='pubsub#access_model'><value>open</value></field>
     247+                <field var='pubsub#persist_items'><value>0</value></field>
     248+              </x>
     249+            </configure>
     250+          </pubsub>
     251+        </iq>
     252+        """
     253+
     254+        err = self.assertRaises(error.StanzaError,
     255+                                pubsub.PubSubRequest.fromElement,
     256+                                parseXml(xml))
     257+        self.assertEqual('bad-request', err.condition)
     258+        self.assertEqual("Unexpected form type 'result'", err.text)
     259+        self.assertEqual(None, err.appCondition)
     260+
     261+
    237262     def test_fromElementDefault(self):
    238263         """
    239264         Test parsing a request for the default node configuration.
    240 @@ -1741,6 +1848,52 @@
     265@@ -1080,7 +1219,7 @@
     266 
     267     def test_fromElementConfigureSetBadFormType(self):
     268         """
     269-        On a node configuration set request unknown fields should be ignored.
     270+        The form of a node configuraton set request should have the right type.
     271         """
     272 
     273         xml = """
     274@@ -1743,6 +1882,52 @@
    241275         return d
    242276 
     
    291325         """
    292326         A default request should result in
    293 @@ -1774,7 +1927,7 @@
     327@@ -1776,7 +1961,7 @@
    294328             self.assertEqual(NS_PUBSUB_OWNER, element.uri)
    295329             self.assertEqual(NS_PUBSUB_OWNER, element.default.uri)
     
    300334         self.resource.getConfigurationOptions = getConfigurationOptions
    301335         self.resource.default = default
    302 @@ -1903,7 +2056,7 @@
     336@@ -1905,7 +2090,7 @@
    303337             self.assertEqual(NS_PUBSUB_OWNER, element.uri)
    304338             self.assertEqual(NS_PUBSUB_OWNER, element.configure.uri)
  • pubsub-forms.patch

    r26 r27  
    33diff -r ba58db23e8b9 wokkel/data_form.py
    44--- a/wokkel/data_form.py       Fri Jan 01 15:54:26 2010 +0100
    5 +++ b/wokkel/data_form.py       Fri Jan 01 16:16:57 2010 +0100
     5+++ b/wokkel/data_form.py       Sat Jan 02 13:53:24 2010 +0100
    66@@ -76,6 +76,7 @@
    77             option['label'] = self.label
     
    155155         form['type'] = self.formType
    156156 
    157 @@ -516,3 +604,56 @@
     157@@ -516,3 +604,58 @@
    158158             values[name] = value
    159159 
     
    166166+
    167167+        This method walks all named fields to check their values against their
    168 +        type, and is typically used for forms received from other entities.The
     168+        type, and is typically used for forms received from other entities. The
    169169+        field definition in C{fieldDefs} is used to check the field type.
    170170+
     
    206206+            elif filterUnknown:
    207207+                filtered.append(field)
     208+            elif field.fieldType is not None:
     209+                field.typeCheck()
    208210+            else:
    209 +                # Unknown field, not filtering
     211+                # Unknown field without type, no checking, no filtering
    210212+                pass
    211213+
     
    214216diff -r ba58db23e8b9 wokkel/pubsub.py
    215217--- a/wokkel/pubsub.py  Fri Jan 01 15:54:26 2010 +0100
    216 +++ b/wokkel/pubsub.py  Fri Jan 01 16:16:57 2010 +0100
     218+++ b/wokkel/pubsub.py  Sat Jan 02 13:53:24 2010 +0100
    217219@@ -1,6 +1,6 @@
    218220 # -*- test-case-name: wokkel.test.test_pubsub -*-
     
    258260diff -r ba58db23e8b9 wokkel/test/test_data_form.py
    259261--- a/wokkel/test/test_data_form.py     Fri Jan 01 15:54:26 2010 +0100
    260 +++ b/wokkel/test/test_data_form.py     Fri Jan 01 16:16:57 2010 +0100
     262+++ b/wokkel/test/test_data_form.py     Sat Jan 02 13:53:24 2010 +0100
    261263@@ -787,6 +787,128 @@
    262264         self.assertRaises(data_form.Error, form.addField, field2)
     
    388390         """
    389391         Each named field is represented in the values, keyed by name.
    390 @@ -834,3 +956,111 @@
     392@@ -834,3 +956,126 @@
    391393         form = data_form.Form('submit', fields=fields)
    392394         values = form.getValues()
     
    468470+    def test_typeCheckUnknown(self):
    469471+        """
    470 +        Unkown fields are not checked, but not removed if filterUnknown False.
     472+        Unknown fields are checked, not removed if filterUnknown False.
    471473+        """
    472474+        checked = []
     
    480482+
    481483+        self.assertIn('pubsub#description', form.fields)
     484+        self.assertEqual([None], checked)
     485+
     486+
     487+    def test_typeCheckUnknownNoType(self):
     488+        """
     489+        Unknown fields without type are not checked.
     490+        """
     491+        checked = []
     492+        fieldDefs = {}
     493+        form = data_form.Form('submit')
     494+        form.addField(data_form.Field(None, var='pubsub#description',
     495+                                            value='a node'))
     496+        field = form.fields['pubsub#description']
     497+        field.typeCheck = lambda : checked.append(None)
     498+        form.typeCheck(fieldDefs, filterUnknown=False)
     499+
     500+        self.assertIn('pubsub#description', form.fields)
    482501+        self.assertEqual([], checked)
    483502+
     
    485504+    def test_typeCheckUnknownRemoved(self):
    486505+        """
    487 +        Unkown fields are not checked, and removed if filterUnknown True.
     506+        Unknown fields are not checked, and removed if filterUnknown True.
    488507+        """
    489508+        checked = []
     
    498517+        self.assertNotIn('pubsub#description', form.fields)
    499518+        self.assertEqual([], checked)
    500 +
    501 +
  • pubsub-request-options-form.patch

    r26 r27  
    1 diff -r 459a78aaec20 wokkel/pubsub.py
    2 --- a/wokkel/pubsub.py  Fri Jan 01 16:17:05 2010 +0100
    3 +++ b/wokkel/pubsub.py  Fri Jan 01 16:17:28 2010 +0100
    4 @@ -356,10 +356,8 @@
     1Make PubSubRequest.options be a form and use new form type checking
     2
     3diff -r fac816de459a wokkel/pubsub.py
     4--- a/wokkel/pubsub.py  Sat Jan 02 13:53:26 2010 +0100
     5+++ b/wokkel/pubsub.py  Sat Jan 02 14:28:16 2010 +0100
     6@@ -356,12 +356,10 @@
    57         """
    68         form = data_form.findForm(verbElement, NS_PUBSUB_NODE_CONFIG)
     
    1315+                self.options = form
    1416             else:
    15                  raise BadRequest(text="Unexpected form type %r" % form.formType)
     17-                raise BadRequest(text="Unexpected form type %r" % form.formType)
     18+                raise BadRequest(text=u"Unexpected form type '%s'" % form.formType)
    1619         else:
    17 @@ -415,12 +413,9 @@
     20             raise BadRequest(text="Missing configuration form")
     21 
     22@@ -413,17 +411,19 @@
     23 
     24 
    1825     def _parse_options(self, verbElement):
     26+        """
     27+        Parse options form out of a subscription options request.
     28+        """
    1929         form = data_form.findForm(verbElement, NS_PUBSUB_SUBSCRIBE_OPTIONS)
    2030         if form:
     
    2333-            elif form.formType == 'cancel':
    2434-                self.options = {}
    25 -            else:
    26 +            if form.formType not in ('submit', 'cancel'):
    27                  raise BadRequest(text="Unexpected form type %r" % form.formType)
    28 +            self.options = form
     35+            if form.formType in ('submit', 'cancel'):
     36+                self.options = form
     37             else:
     38-                raise BadRequest(text="Unexpected form type %r" % form.formType)
     39+                raise BadRequest(text=u"Unexpected form type '%s'" % form.formType)
    2940         else:
    3041             raise BadRequest(text="Missing options form")
    3142 
    32 @@ -932,6 +927,8 @@
     43+
     44     def parseElement(self, element):
     45         """
     46         Parse the publish-subscribe verb and parameters out of a request.
     47@@ -892,8 +892,6 @@
     48             d = self.getNodes(requestor, target)
     49         else:
     50             d = defer.succeed([])
     51-           
     52-
     53 
     54         d.addCallback(lambda nodes: [disco.DiscoItem(target, node)
     55                                      for node in nodes])
     56@@ -932,6 +930,8 @@
    3357             handlerName, argNames = self._legacyHandlers[request.verb]
    3458             handler = getattr(self, handlerName)
     
    3963 
    4064         # If needed, translate the result into a response
    41 @@ -996,29 +993,9 @@
     65@@ -996,29 +996,9 @@
    4266         return form
    4367 
     
    7296 
    7397     def _preProcess_default(self, resource, request):
    74 @@ -1049,12 +1026,11 @@
     98@@ -1049,12 +1029,11 @@
    7599 
    76100 
     
    89113 
    90114     def _toResponse_items(self, result, resource, request):
    91 diff -r 459a78aaec20 wokkel/test/test_pubsub.py
    92 --- a/wokkel/test/test_pubsub.py        Fri Jan 01 16:17:05 2010 +0100
    93 +++ b/wokkel/test/test_pubsub.py        Fri Jan 01 16:17:28 2010 +0100
     115diff -r fac816de459a wokkel/test/test_pubsub.py
     116--- a/wokkel/test/test_pubsub.py        Sat Jan 02 13:53:26 2010 +0100
     117+++ b/wokkel/test/test_pubsub.py        Sat Jan 02 14:28:16 2010 +0100
    94118@@ -1,4 +1,4 @@
    95119-# Copyright (c) 2003-2009 Ralph Meijer
     
    116140 
    117141     def test_fromElementOptionsSetBadFormType(self):
    118 @@ -1053,7 +1053,8 @@
     142@@ -840,7 +840,7 @@
     143             <options node='test' jid='user@example.org/Home'>
     144               <x xmlns='jabber:x:data' type='result'>
     145                 <field var='FORM_TYPE' type='hidden'>
     146-                  <value>http://jabber.org/protocol/pubsub#node_config</value>
     147+                  <value>http://jabber.org/protocol/pubsub#subscribe_options</value>
     148                 </field>
     149                 <field var='pubsub#deliver'><value>1</value></field>
     150               </x>
     151@@ -853,6 +853,7 @@
     152                                 pubsub.PubSubRequest.fromElement,
     153                                 parseXml(xml))
     154         self.assertEqual('bad-request', err.condition)
     155+        self.assertEqual("Unexpected form type 'result'", err.text)
     156         self.assertEqual(None, err.appCondition)
     157 
     158 
     159@@ -1053,7 +1054,8 @@
    119160         self.assertEqual(JID('pubsub.example.org'), request.recipient)
    120161         self.assertEqual('test', request.nodeIdentifier)
     
    126167 
    127168     def test_fromElementConfigureSetCancel(self):
    128 @@ -1073,7 +1074,7 @@
     169@@ -1073,7 +1075,7 @@
    129170         """
    130171 
     
    135176 
    136177     def test_fromElementConfigureSetBadFormType(self):
    137 @@ -1895,7 +1896,7 @@
     178@@ -1102,6 +1104,7 @@
     179                                 pubsub.PubSubRequest.fromElement,
     180                                 parseXml(xml))
     181         self.assertEqual('bad-request', err.condition)
     182+        self.assertEqual("Unexpected form type 'result'", err.text)
     183         self.assertEqual(None, err.appCondition)
     184 
     185 
     186@@ -1895,7 +1898,7 @@
    138187             return defer.succeed({'pubsub#deliver_payloads': '0',
    139188                                   'pubsub#persist_items': '1',
     
    144193         def cb(element):
    145194             self.assertEqual('pubsub', element.name)
    146 @@ -1968,7 +1969,8 @@
     195@@ -1968,7 +1971,8 @@
    147196 
    148197         def configureSet(request):
     
    154203 
    155204         self.resource.getConfigurationOptions = getConfigurationOptions
    156 @@ -2040,7 +2042,7 @@
     205@@ -2040,7 +2044,7 @@
    157206 
    158207         def configureSet(request):
     
    163212         self.resource.getConfigurationOptions = getConfigurationOptions
    164213         self.resource.configureSet = configureSet
    165 @@ -2595,6 +2597,48 @@
     214@@ -2072,6 +2076,7 @@
     215 
     216         def cb(result):
     217             self.assertEquals('bad-request', result.condition)
     218+            self.assertEqual("Unexpected form type 'result'", result.text)
     219 
     220         d = self.handleRequest(xml)
     221         self.assertFailure(d, error.StanzaError)
     222@@ -2595,6 +2600,48 @@
    166223         return d
    167224 
  • pubsub-subscription-options.patch

    r21 r27  
    1 diff -r 3f7b69ddecb4 wokkel/pubsub.py
    2 --- a/wokkel/pubsub.py  Wed Dec 30 21:44:18 2009 +0100
    3 +++ b/wokkel/pubsub.py  Wed Dec 30 21:45:01 2009 +0100
     1Add support for subscription options in subscribe requests
     2
     3diff -r 0555c117c086 wokkel/pubsub.py
     4--- a/wokkel/pubsub.py  Sat Jan 02 14:44:23 2010 +0100
     5+++ b/wokkel/pubsub.py  Sat Jan 02 15:25:34 2010 +0100
    46@@ -228,7 +228,7 @@
    57     # Map request verb to parameter handler names
     
    1113         'optionsGet': ['nodeOrEmpty', 'jid'],
    1214         'optionsSet': ['nodeOrEmpty', 'jid', 'options'],
    13 @@ -419,29 +419,65 @@
    14          else:
     15@@ -372,15 +372,13 @@
     16             if element.uri == NS_PUBSUB and element.name == 'configure':
     17                 form = data_form.findForm(element, NS_PUBSUB_NODE_CONFIG)
     18                 if form:
     19-                    if form.formType == 'submit':
     20-                        self.options = form
     21-                    else:
     22+                    if form.formType != 'submit':
     23                         raise BadRequest(text=u"Unexpected form type '%s'" %
     24                                               form.formType)
     25                 else:
     26                     form = data_form.Form('submit',
     27                                           formNamespace=NS_PUBSUB_NODE_CONFIG)
     28-                    self.options = form
     29+                self.options = form
     30 
     31 
     32     def _render_configureOrNone(self, verbElement):
     33@@ -451,29 +449,67 @@
    1534             raise BadRequest(text="Missing options form")
     35 
    1636 
    1737+
     
    2545+                form = data_form.findForm(element,
    2646+                                          NS_PUBSUB_SUBSCRIBE_OPTIONS)
    27 +                if not form:
    28 +                    continue
    29 +
     47+                if form:
     48+                    if form.formType != 'submit':
     49+                        raise BadRequest(text=u"Unexpected form type '%s'" %
     50+                                              form.formType)
     51+                else:
     52+                    form = data_form.Form('submit',
     53+                                          formNamespace=NS_PUBSUB_SUBSCRIBE_OPTIONS)
    3054+                self.options = form
    31 +                if form.formType != 'submit':
    32 +                    BadRequest(text="Unexpected form type %r" % form.formType)
    3355+
    3456+
     
    82104         """
    83105         Send this request to its recipient.
    84 @@ -645,7 +681,8 @@
     106@@ -686,7 +722,8 @@
    85107         return request.send(self.xmlstream)
    86108 
     
    92114         Subscribe to a publish subscribe node.
    93115 
    94 @@ -656,6 +693,8 @@
     116@@ -697,6 +734,8 @@
    95117         @param subscriber: The entity to subscribe to the node. This entity
    96118                            will get notifications of new published items.
     
    101123         request = PubSubRequest('subscribe')
    102124         request.recipient = service
    103 @@ -663,6 +702,12 @@
     125@@ -704,6 +743,12 @@
    104126         request.subscriber = subscriber
    105127         request.sender = sender
    106128 
    107129+        if options:
    108 +            form = data_form.Form(formType='result',
     130+            form = data_form.Form(formType='submit',
    109131+                                  formNamespace=NS_PUBSUB_SUBSCRIBE_OPTIONS)
    110132+            form.makeFields(options)
     
    114136             subscription = iq.pubsub.subscription["subscription"]
    115137 
    116 diff -r 3f7b69ddecb4 wokkel/test/test_pubsub.py
    117 --- a/wokkel/test/test_pubsub.py        Wed Dec 30 21:44:18 2009 +0100
    118 +++ b/wokkel/test/test_pubsub.py        Wed Dec 30 21:45:01 2009 +0100
    119 @@ -447,6 +447,37 @@
     138@@ -790,6 +835,38 @@
     139         return d
     140 
     141 
     142+    def setOptions(self, service, nodeIdentifier, subscriber,
     143+                         options, sender=None):
     144+        """
     145+        Set subscription options.
     146+
     147+        @param service: The publish subscribe service that keeps the node.
     148+        @type service: L{JID}
     149+
     150+        @param nodeIdentifier: The identifier of the node.
     151+        @type nodeIdentifier: C{unicode}
     152+
     153+        @param subscriber: The entity subscribed to the node.
     154+        @type subscriber: L{JID}
     155+
     156+        @param options: Subscription options.
     157+        @type options: C{dict}.
     158+        """
     159+        request = PubSubRequest('optionsSet')
     160+        request.recipient = service
     161+        request.nodeIdentifier = nodeIdentifier
     162+        request.subscriber = subscriber
     163+        request.sender = sender
     164+
     165+        form = data_form.Form(formType='submit',
     166+                              formNamespace=NS_PUBSUB_SUBSCRIBE_OPTIONS)
     167+        form.makeFields(options)
     168+        request.options = form
     169+
     170+        d = request.send(self.xmlstream)
     171+        return d
     172+
     173+
     174 
     175 class PubSubService(XMPPHandler, IQHandlerMixin):
     176     """
     177diff -r 0555c117c086 wokkel/test/test_pubsub.py
     178--- a/wokkel/test/test_pubsub.py        Sat Jan 02 14:44:23 2010 +0100
     179+++ b/wokkel/test/test_pubsub.py        Sat Jan 02 15:25:34 2010 +0100
     180@@ -24,6 +24,7 @@
     181 NS_PUBSUB_EVENT = 'http://jabber.org/protocol/pubsub#event'
     182 NS_PUBSUB_OWNER = 'http://jabber.org/protocol/pubsub#owner'
     183 NS_PUBSUB_META_DATA = 'http://jabber.org/protocol/pubsub#meta-data'
     184+NS_PUBSUB_SUBSCRIBE_OPTIONS = 'http://jabber.org/protocol/pubsub#subscribe_options'
     185 
     186 def calledAsync(fn):
     187     """
     188@@ -481,6 +482,39 @@
    120189         return d
    121190 
     
    136205+
    137206+        self.assertEqual(['subscribe', 'options'], childNames)
    138 +        form = data_form.Form.fromElement(iq.pubsub.options.x)
     207+        form = data_form.findForm(iq.pubsub.options,
     208+                                  NS_PUBSUB_SUBSCRIBE_OPTIONS)
     209+        self.assertEqual('submit', form.formType)
    139210+        form.typeCheck({'pubsub#deliver': {'type': 'boolean'}})
    140211+        self.assertEqual(options, form.getValues())
     
    155226         """
    156227         Test sending subscription request from a specific JID.
    157 @@ -718,6 +749,38 @@
     228@@ -624,9 +658,74 @@
     229         return d
     230 
     231 
     232+    def test_setOptions(self):
     233+        options = {'pubsub#deliver': False}
     234+
     235+        d = self.protocol.setOptions(JID('pubsub.example.org'), 'test',
     236+                                     JID('user@example.org'),
     237+                                     options,
     238+                                     sender=JID('user@example.org'))
     239+
     240+        iq = self.stub.output[-1]
     241+        self.assertEqual('pubsub.example.org', iq.getAttribute('to'))
     242+        self.assertEqual('set', iq.getAttribute('type'))
     243+        self.assertEqual('pubsub', iq.pubsub.name)
     244+        self.assertEqual(NS_PUBSUB, iq.pubsub.uri)
     245+        children = list(domish.generateElementsQNamed(iq.pubsub.children,
     246+                                                      'options', NS_PUBSUB))
     247+        self.assertEqual(1, len(children))
     248+        child = children[0]
     249+        self.assertEqual('test', child['node'])
     250+
     251+        form = data_form.findForm(child, NS_PUBSUB_SUBSCRIBE_OPTIONS)
     252+        self.assertEqual('submit', form.formType)
     253+        form.typeCheck({'pubsub#deliver': {'type': 'boolean'}})
     254+        self.assertEqual(options, form.getValues())
     255+
     256+        response = toResponse(iq, 'result')
     257+        self.stub.send(response)
     258+
     259+        return d
     260+
     261 
     262 class PubSubRequestTest(unittest.TestCase):
     263 
     264+    def test_fromElementUnknown(self):
     265+        """
     266+        An unknown verb raises NotImplementedError.
     267+        """
     268+
     269+        xml = """
     270+        <iq type='set' to='pubsub.example.org'
     271+                       from='user@example.org'>
     272+          <pubsub xmlns='http://jabber.org/protocol/pubsub'>
     273+            <non-existing-verb/>
     274+          </pubsub>
     275+        </iq>
     276+        """
     277+
     278+        self.assertRaises(NotImplementedError,
     279+                          pubsub.PubSubRequest.fromElement, parseXml(xml))
     280+
     281+
     282+    def test_fromElementKnownBadCombination(self):
     283+        """
     284+        Multiple verbs in an unknown configuration raises NotImplementedError.
     285+        """
     286+
     287+        xml = """
     288+        <iq type='set' to='pubsub.example.org'
     289+                       from='user@example.org'>
     290+          <pubsub xmlns='http://jabber.org/protocol/pubsub'>
     291+             <publish/>
     292+             <create/>
     293+          </pubsub>
     294+        </iq>
     295+        """
     296+
     297+        self.assertRaises(NotImplementedError,
     298+                          pubsub.PubSubRequest.fromElement, parseXml(xml))
     299+
     300     def test_fromElementPublish(self):
     301         """
     302         Test parsing a publish request.
     303@@ -752,6 +851,91 @@
    158304         self.assertEqual(NS_PUBSUB_ERRORS, err.appCondition.uri)
    159305         self.assertEqual('jid-required', err.appCondition.name)
     
    191337+
    192338+
     339+    def test_fromElementSubscribeWithOptionsBadFormType(self):
     340+        """
     341+        The options form should have the right type.
     342+        """
     343+
     344+        xml = """
     345+        <iq type='set' to='pubsub.example.org'
     346+                       from='user@example.org'>
     347+          <pubsub xmlns='http://jabber.org/protocol/pubsub'>
     348+            <subscribe node='test' jid='user@example.org/Home'/>
     349+            <options>
     350+              <x xmlns="jabber:x:data" type='result'>
     351+                <field var='FORM_TYPE' type='hidden'>
     352+                  <value>http://jabber.org/protocol/pubsub#subscribe_options</value>
     353+                </field>
     354+                <field var='pubsub#deliver' type='boolean'
     355+                       label='Enable delivery?'>
     356+                  <value>1</value>
     357+                </field>
     358+              </x>
     359+            </options>
     360+          </pubsub>
     361+        </iq>
     362+        """
     363+
     364+        err = self.assertRaises(error.StanzaError,
     365+                                pubsub.PubSubRequest.fromElement,
     366+                                parseXml(xml))
     367+        self.assertEqual('bad-request', err.condition)
     368+        self.assertEqual("Unexpected form type 'result'", err.text)
     369+        self.assertEqual(None, err.appCondition)
     370+
     371+
     372+    def test_fromElementSubscribeWithOptionsEmpty(self):
     373+        """
     374+        When no (suitable) form is found, the options are empty.
     375+        """
     376+
     377+        xml = """
     378+        <iq type='set' to='pubsub.example.org'
     379+                       from='user@example.org'>
     380+          <pubsub xmlns='http://jabber.org/protocol/pubsub'>
     381+            <subscribe node='test' jid='user@example.org/Home'/>
     382+            <options/>
     383+          </pubsub>
     384+        </iq>
     385+        """
     386+
     387+        request = pubsub.PubSubRequest.fromElement(parseXml(xml))
     388+        self.assertEqual('subscribe', request.verb)
     389+        self.assertEqual({}, request.options.getValues())
     390+
     391+
    193392     def test_fromElementUnsubscribe(self):
    194393         """
  • series

    r26 r27  
    33findform.patch
    44pubsub-request-options-form.patch
     5pubsub-create-configure.patch
    56pubsub-subscription-options.patch
    6 pubsub-create-configure.patch
    77pubsub-item.patch
    88s2s-controller.patch
Note: See TracChangeset for help on using the changeset viewer.