source: ralphm-patches/pubsub-request-options-form.patch @ 27:a9704141033a

Last change on this file since 27:a9704141033a was 27:a9704141033a, checked in by Ralph Meijer <ralphm@…>, 11 years ago

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

File size: 9.9 KB
  • wokkel/pubsub.py

    Make PubSubRequest.options be a form and use new form type checking
    
    diff -r fac816de459a wokkel/pubsub.py
    a b  
    356356        """
    357357        form = data_form.findForm(verbElement, NS_PUBSUB_NODE_CONFIG)
    358358        if form:
    359             if form.formType == 'submit':
    360                 self.options = form.getValues()
    361             elif form.formType == 'cancel':
    362                 self.options = {}
     359            if form.formType in ('submit', 'cancel'):
     360                self.options = form
    363361            else:
    364                 raise BadRequest(text="Unexpected form type %r" % form.formType)
     362                raise BadRequest(text=u"Unexpected form type '%s'" % form.formType)
    365363        else:
    366364            raise BadRequest(text="Missing configuration form")
    367365
     
    413411
    414412
    415413    def _parse_options(self, verbElement):
     414        """
     415        Parse options form out of a subscription options request.
     416        """
    416417        form = data_form.findForm(verbElement, NS_PUBSUB_SUBSCRIBE_OPTIONS)
    417418        if form:
    418             if form.formType == 'submit':
    419                 self.options = form.getValues()
    420             elif form.formType == 'cancel':
    421                 self.options = {}
     419            if form.formType in ('submit', 'cancel'):
     420                self.options = form
    422421            else:
    423                 raise BadRequest(text="Unexpected form type %r" % form.formType)
     422                raise BadRequest(text=u"Unexpected form type '%s'" % form.formType)
    424423        else:
    425424            raise BadRequest(text="Missing options form")
    426425
     426
    427427    def parseElement(self, element):
    428428        """
    429429        Parse the publish-subscribe verb and parameters out of a request.
     
    892892            d = self.getNodes(requestor, target)
    893893        else:
    894894            d = defer.succeed([])
    895            
    896 
    897895
    898896        d.addCallback(lambda nodes: [disco.DiscoItem(target, node)
    899897                                     for node in nodes])
     
    932930            handlerName, argNames = self._legacyHandlers[request.verb]
    933931            handler = getattr(self, handlerName)
    934932            args = [getattr(request, arg) for arg in argNames]
     933            if 'options' in argNames:
     934                args[argNames.index('options')] = request.options.getValues()
    935935            d = handler(*args)
    936936
    937937        # If needed, translate the result into a response
     
    996996        return form
    997997
    998998
    999     def _checkConfiguration(self, resource, values):
    1000         options = resource.getConfigurationOptions()
    1001         processedValues = {}
    1002 
    1003         for key, value in values.iteritems():
    1004             if key not in options:
    1005                 continue
    1006 
    1007             option = {'var': key}
    1008             option.update(options[key])
    1009             field = data_form.Field.fromDict(option)
    1010             if isinstance(value, list):
    1011                 field.values = value
    1012             else:
    1013                 field.value = value
    1014             field.typeCheck()
    1015 
    1016             if isinstance(value, list):
    1017                 processedValues[key] = field.values
    1018             else:
    1019                 processedValues[key] = field.value
    1020 
    1021         return processedValues
     999    def _checkConfiguration(self, resource, form):
     1000        fieldDefs = resource.getConfigurationOptions()
     1001        form.typeCheck(fieldDefs, filterUnknown=True)
    10221002
    10231003
    10241004    def _preProcess_default(self, resource, request):
     
    10491029
    10501030
    10511031    def _preProcess_configureSet(self, resource, request):
    1052         if request.options:
    1053             request.options = self._checkConfiguration(resource,
    1054                                                        request.options)
     1032        if request.options.formType == 'cancel':
     1033            return None
     1034        else:
     1035            self._checkConfiguration(resource, request.options)
    10551036            return request
    1056         else:
    1057             return None
    10581037
    10591038
    10601039    def _toResponse_items(self, result, resource, request):
  • wokkel/test/test_pubsub.py

    diff -r fac816de459a wokkel/test/test_pubsub.py
    a b  
    1 # Copyright (c) 2003-2009 Ralph Meijer
     1# Copyright (c) 2003-2010 Ralph Meijer
    22# See LICENSE for details.
    33
    44"""
     
    805805        self.assertEqual(JID('pubsub.example.org'), request.recipient)
    806806        self.assertEqual('test', request.nodeIdentifier)
    807807        self.assertEqual(JID('user@example.org/Home'), request.subscriber)
    808         self.assertEqual({'pubsub#deliver': '1'}, request.options)
     808        self.assertEqual({'pubsub#deliver': '1'}, request.options.getValues())
    809809
    810810
    811811    def test_fromElementOptionsSetCancel(self):
     
    825825        """
    826826
    827827        request = pubsub.PubSubRequest.fromElement(parseXml(xml))
    828         self.assertEqual({}, request.options)
     828        self.assertEqual('cancel', request.options.formType)
    829829
    830830
    831831    def test_fromElementOptionsSetBadFormType(self):
     
    840840            <options node='test' jid='user@example.org/Home'>
    841841              <x xmlns='jabber:x:data' type='result'>
    842842                <field var='FORM_TYPE' type='hidden'>
    843                   <value>http://jabber.org/protocol/pubsub#node_config</value>
     843                  <value>http://jabber.org/protocol/pubsub#subscribe_options</value>
    844844                </field>
    845845                <field var='pubsub#deliver'><value>1</value></field>
    846846              </x>
     
    853853                                pubsub.PubSubRequest.fromElement,
    854854                                parseXml(xml))
    855855        self.assertEqual('bad-request', err.condition)
     856        self.assertEqual("Unexpected form type 'result'", err.text)
    856857        self.assertEqual(None, err.appCondition)
    857858
    858859
     
    10531054        self.assertEqual(JID('pubsub.example.org'), request.recipient)
    10541055        self.assertEqual('test', request.nodeIdentifier)
    10551056        self.assertEqual({'pubsub#deliver_payloads': '0',
    1056                           'pubsub#persist_items': '1'}, request.options)
     1057                          'pubsub#persist_items': '1'},
     1058                         request.options.getValues())
    10571059
    10581060
    10591061    def test_fromElementConfigureSetCancel(self):
     
    10731075        """
    10741076
    10751077        request = pubsub.PubSubRequest.fromElement(parseXml(xml))
    1076         self.assertEqual({}, request.options)
     1078        self.assertEqual('cancel', request.options.formType)
    10771079
    10781080
    10791081    def test_fromElementConfigureSetBadFormType(self):
     
    11021104                                pubsub.PubSubRequest.fromElement,
    11031105                                parseXml(xml))
    11041106        self.assertEqual('bad-request', err.condition)
     1107        self.assertEqual("Unexpected form type 'result'", err.text)
    11051108        self.assertEqual(None, err.appCondition)
    11061109
    11071110
     
    18951898            return defer.succeed({'pubsub#deliver_payloads': '0',
    18961899                                  'pubsub#persist_items': '1',
    18971900                                  'pubsub#owner': JID('user@example.org'),
    1898                                   'x-myfield': ['a', 'b']})
     1901                                  'x-myfield': 'a'})
    18991902
    19001903        def cb(element):
    19011904            self.assertEqual('pubsub', element.name)
     
    19681971
    19691972        def configureSet(request):
    19701973            self.assertEqual({'pubsub#deliver_payloads': False,
    1971                               'pubsub#persist_items': True}, request.options)
     1974                              'pubsub#persist_items': True},
     1975                             request.options.getValues())
    19721976            return defer.succeed(None)
    19731977
    19741978        self.resource.getConfigurationOptions = getConfigurationOptions
     
    20402044
    20412045        def configureSet(request):
    20422046            self.assertEquals(['pubsub#deliver_payloads'],
    2043                               request.options.keys())
     2047                              request.options.fields.keys())
    20442048
    20452049        self.resource.getConfigurationOptions = getConfigurationOptions
    20462050        self.resource.configureSet = configureSet
     
    20722076
    20732077        def cb(result):
    20742078            self.assertEquals('bad-request', result.condition)
     2079            self.assertEqual("Unexpected form type 'result'", result.text)
    20752080
    20762081        d = self.handleRequest(xml)
    20772082        self.assertFailure(d, error.StanzaError)
     
    25952600        return d
    25962601
    25972602
     2603    def test_setConfigurationOptionsDict(self):
     2604        """
     2605        Options should be passed as a dictionary, not a form.
     2606        """
     2607
     2608        xml = """
     2609        <iq type='set' to='pubsub.example.org'
     2610                       from='user@example.org'>
     2611          <pubsub xmlns='http://jabber.org/protocol/pubsub#owner'>
     2612            <configure node='test'>
     2613              <x xmlns='jabber:x:data' type='submit'>
     2614                <field var='FORM_TYPE' type='hidden'>
     2615                  <value>http://jabber.org/protocol/pubsub#node_config</value>
     2616                </field>
     2617                <field var='pubsub#deliver_payloads'><value>0</value></field>
     2618                <field var='pubsub#persist_items'><value>1</value></field>
     2619              </x>
     2620            </configure>
     2621          </pubsub>
     2622        </iq>
     2623        """
     2624
     2625        def getConfigurationOptions():
     2626            return {
     2627                "pubsub#persist_items":
     2628                    {"type": "boolean",
     2629                     "label": "Persist items to storage"},
     2630                "pubsub#deliver_payloads":
     2631                    {"type": "boolean",
     2632                     "label": "Deliver payloads with event notifications"}
     2633                }
     2634
     2635        def setConfiguration(requestor, service, nodeIdentifier, options):
     2636            self.assertEquals({'pubsub#deliver_payloads': False,
     2637                               'pubsub#persist_items': True}, options)
     2638
     2639
     2640        self.service.getConfigurationOptions = getConfigurationOptions
     2641        self.service.setConfiguration = setConfiguration
     2642        return self.handleRequest(xml)
     2643
     2644
    25982645    def test_items(self):
    25992646        """
    26002647        Non-overridden L{PubSubService.items} yields unsupported error.
Note: See TracBrowser for help on using the repository browser.