Changeset 27:a9704141033a in ralphm-patches
- Timestamp:
- Jan 2, 2010, 3:32:52 PM (12 years ago)
- Branch:
- default
- Files:
-
- 6 edited
Legend:
- Unmodified
- Added
- Removed
-
findform.patch
r26 r27 1 1 Move findForm to wokkel.data_form 2 2 3 diff -r ff 70bda5117ewokkel/data_form.py4 --- a/wokkel/data_form.py Fri Jan 01 16: 03:512010 +01005 +++ b/wokkel/data_form.py Fri Jan 01 16:16:092010 +01006 @@ -657,3 +657,2 4@@3 diff -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 @@ 7 7 8 8 for field in filtered: 9 9 self.removeField(field) 10 + 10 11 + 11 12 + … … 29 30 + 30 31 + return None 31 diff -r ff 70bda5117ewokkel/pubsub.py32 --- a/wokkel/pubsub.py Fri Jan 01 16: 03:512010 +010033 +++ b/wokkel/pubsub.py Fri Jan 01 16:16:092010 +010032 diff -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 34 35 @@ -252,30 +252,6 @@ 35 36 self.verb = verb … … 90 91 if form.formType == 'submit': 91 92 self.options = form.getValues() 93 diff -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 1 Add support for configuration options in node creation requests 2 3 diff -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 4 6 @@ -234,7 +234,7 @@ 5 7 'optionsSet': ['nodeOrEmpty', 'jid', 'options'], … … 26 28 + self.options = form 27 29 + else: 28 + raise BadRequest(text= "Unexpected form type %r" %30 + raise BadRequest(text=u"Unexpected form type '%s'" % 29 31 + form.formType) 30 32 + else: … … 45 47 def _parse_itemIdentifiers(self, verbElement): 46 48 """ 47 @@ -60 2,7 +629,8 @@49 @@ -607,7 +634,8 @@ 48 50 pass 49 51 … … 55 57 Create a publish subscribe node. 56 58 57 @@ -61 0,12 +638,20 @@59 @@ -615,12 +643,20 @@ 58 60 @type service: L{JID} 59 61 @param nodeIdentifier: Optional suggestion for the id of the node. … … 68 70 69 71 + if options: 70 + form = data_form.Form(formType=' result',72 + form = data_form.Form(formType='submit', 71 73 + formNamespace=NS_PUBSUB_NODE_CONFIG) 72 74 + form.makeFields(options) … … 76 78 try: 77 79 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 @@ 88 81 form.typeCheck(fieldDefs, filterUnknown=True) 89 82 … … 98 91 if request.nodeType not in ('leaf', 'collection'): 99 92 raise error.StanzaError('not-acceptable') 100 diff -r d64e96596c50 -r 8425a88d49f5wokkel/test/test_pubsub.py101 --- a/wokkel/test/test_pubsub.py Wed Dec 30 21:41:55 2009+0100102 +++ b/wokkel/test/test_pubsub.py Wed Dec 30 21:42:27 2009+010093 diff -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 103 96 @@ -19,7 +19,7 @@ 104 97 from wokkel.test.helpers import TestableRequestHandlerMixin, XmlStreamStub … … 110 103 NS_PUBSUB_EVENT = 'http://jabber.org/protocol/pubsub#event' 111 104 NS_PUBSUB_OWNER = 'http://jabber.org/protocol/pubsub#owner' 112 @@ -271,6 +271,4 0@@105 @@ -271,6 +271,41 @@ 113 106 return d 114 107 … … 141 134 + # check that it has a configuration form 142 135 + form = data_form.findForm(children[0], NS_PUBSUB_NODE_CONFIG) 143 + self.assertNotIdentical(None, form) 136 + self.assertEqual('submit', form.formType) 137 + 144 138 + 145 139 + response = toResponse(iq, 'result') … … 151 145 """ 152 146 Test sending delete request. 153 @@ -93 5,6 +969,7 @@147 @@ -936,6 +971,7 @@ 154 148 self.assertEqual(JID('user@example.org'), request.sender) 155 149 self.assertEqual(JID('pubsub.example.org'), request.recipient) … … 159 153 160 154 def test_fromElementCreateInstant(self): 161 @@ -95 5,6 +990,78@@155 @@ -956,6 +992,109 @@ 162 156 self.assertIdentical(None, request.nodeIdentifier) 163 157 … … 235 229 + 236 230 + 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 + 237 262 def test_fromElementDefault(self): 238 263 """ 239 264 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 @@ 241 275 return d 242 276 … … 291 325 """ 292 326 A default request should result in 293 @@ -177 4,7 +1927,7 @@327 @@ -1776,7 +1961,7 @@ 294 328 self.assertEqual(NS_PUBSUB_OWNER, element.uri) 295 329 self.assertEqual(NS_PUBSUB_OWNER, element.default.uri) … … 300 334 self.resource.getConfigurationOptions = getConfigurationOptions 301 335 self.resource.default = default 302 @@ -190 3,7 +2056,7 @@336 @@ -1905,7 +2090,7 @@ 303 337 self.assertEqual(NS_PUBSUB_OWNER, element.uri) 304 338 self.assertEqual(NS_PUBSUB_OWNER, element.configure.uri) -
pubsub-forms.patch
r26 r27 3 3 diff -r ba58db23e8b9 wokkel/data_form.py 4 4 --- a/wokkel/data_form.py Fri Jan 01 15:54:26 2010 +0100 5 +++ b/wokkel/data_form.py Fri Jan 01 16:16:572010 +01005 +++ b/wokkel/data_form.py Sat Jan 02 13:53:24 2010 +0100 6 6 @@ -76,6 +76,7 @@ 7 7 option['label'] = self.label … … 155 155 form['type'] = self.formType 156 156 157 @@ -516,3 +604,5 6@@157 @@ -516,3 +604,58 @@ 158 158 values[name] = value 159 159 … … 166 166 + 167 167 + This method walks all named fields to check their values against their 168 + type, and is typically used for forms received from other entities. The168 + type, and is typically used for forms received from other entities. The 169 169 + field definition in C{fieldDefs} is used to check the field type. 170 170 + … … 206 206 + elif filterUnknown: 207 207 + filtered.append(field) 208 + elif field.fieldType is not None: 209 + field.typeCheck() 208 210 + else: 209 + # Unknown field , notfiltering211 + # Unknown field without type, no checking, no filtering 210 212 + pass 211 213 + … … 214 216 diff -r ba58db23e8b9 wokkel/pubsub.py 215 217 --- a/wokkel/pubsub.py Fri Jan 01 15:54:26 2010 +0100 216 +++ b/wokkel/pubsub.py Fri Jan 01 16:16:572010 +0100218 +++ b/wokkel/pubsub.py Sat Jan 02 13:53:24 2010 +0100 217 219 @@ -1,6 +1,6 @@ 218 220 # -*- test-case-name: wokkel.test.test_pubsub -*- … … 258 260 diff -r ba58db23e8b9 wokkel/test/test_data_form.py 259 261 --- 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:572010 +0100262 +++ b/wokkel/test/test_data_form.py Sat Jan 02 13:53:24 2010 +0100 261 263 @@ -787,6 +787,128 @@ 262 264 self.assertRaises(data_form.Error, form.addField, field2) … … 388 390 """ 389 391 Each named field is represented in the values, keyed by name. 390 @@ -834,3 +956,1 11@@392 @@ -834,3 +956,126 @@ 391 393 form = data_form.Form('submit', fields=fields) 392 394 values = form.getValues() … … 468 470 + def test_typeCheckUnknown(self): 469 471 + """ 470 + Unk own fields are not checked, butnot removed if filterUnknown False.472 + Unknown fields are checked, not removed if filterUnknown False. 471 473 + """ 472 474 + checked = [] … … 480 482 + 481 483 + 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) 482 501 + self.assertEqual([], checked) 483 502 + … … 485 504 + def test_typeCheckUnknownRemoved(self): 486 505 + """ 487 + Unk own fields are not checked, and removed if filterUnknown True.506 + Unknown fields are not checked, and removed if filterUnknown True. 488 507 + """ 489 508 + checked = [] … … 498 517 + self.assertNotIn('pubsub#description', form.fields) 499 518 + 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 @@ 1 Make PubSubRequest.options be a form and use new form type checking 2 3 diff -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 @@ 5 7 """ 6 8 form = data_form.findForm(verbElement, NS_PUBSUB_NODE_CONFIG) … … 13 15 + self.options = form 14 16 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) 16 19 else: 17 @@ -415,12 +413,9 @@ 20 raise BadRequest(text="Missing configuration form") 21 22 @@ -413,17 +411,19 @@ 23 24 18 25 def _parse_options(self, verbElement): 26 + """ 27 + Parse options form out of a subscription options request. 28 + """ 19 29 form = data_form.findForm(verbElement, NS_PUBSUB_SUBSCRIBE_OPTIONS) 20 30 if form: … … 23 33 - elif form.formType == 'cancel': 24 34 - 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) 29 40 else: 30 41 raise BadRequest(text="Missing options form") 31 42 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 @@ 33 57 handlerName, argNames = self._legacyHandlers[request.verb] 34 58 handler = getattr(self, handlerName) … … 39 63 40 64 # If needed, translate the result into a response 41 @@ -996,29 +99 3,9 @@65 @@ -996,29 +996,9 @@ 42 66 return form 43 67 … … 72 96 73 97 def _preProcess_default(self, resource, request): 74 @@ -1049,12 +102 6,11 @@98 @@ -1049,12 +1029,11 @@ 75 99 76 100 … … 89 113 90 114 def _toResponse_items(self, result, resource, request): 91 diff -r 459a78aaec20wokkel/test/test_pubsub.py92 --- a/wokkel/test/test_pubsub.py Fri Jan 01 16:17:052010 +010093 +++ b/wokkel/test/test_pubsub.py Fri Jan 01 16:17:282010 +0100115 diff -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 94 118 @@ -1,4 +1,4 @@ 95 119 -# Copyright (c) 2003-2009 Ralph Meijer … … 116 140 117 141 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 @@ 119 160 self.assertEqual(JID('pubsub.example.org'), request.recipient) 120 161 self.assertEqual('test', request.nodeIdentifier) … … 126 167 127 168 def test_fromElementConfigureSetCancel(self): 128 @@ -1073,7 +107 4,7 @@169 @@ -1073,7 +1075,7 @@ 129 170 """ 130 171 … … 135 176 136 177 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 @@ 138 187 return defer.succeed({'pubsub#deliver_payloads': '0', 139 188 'pubsub#persist_items': '1', … … 144 193 def cb(element): 145 194 self.assertEqual('pubsub', element.name) 146 @@ -1968,7 +19 69,8 @@195 @@ -1968,7 +1971,8 @@ 147 196 148 197 def configureSet(request): … … 154 203 155 204 self.resource.getConfigurationOptions = getConfigurationOptions 156 @@ -2040,7 +204 2,7 @@205 @@ -2040,7 +2044,7 @@ 157 206 158 207 def configureSet(request): … … 163 212 self.resource.getConfigurationOptions = getConfigurationOptions 164 213 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 @@ 166 223 return d 167 224 -
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 1 Add support for subscription options in subscribe requests 2 3 diff -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 4 6 @@ -228,7 +228,7 @@ 5 7 # Map request verb to parameter handler names … … 11 13 'optionsGet': ['nodeOrEmpty', 'jid'], 12 14 '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 @@ 15 34 raise BadRequest(text="Missing options form") 35 16 36 17 37 + … … 25 45 + form = data_form.findForm(element, 26 46 + 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) 30 54 + self.options = form 31 + if form.formType != 'submit':32 + BadRequest(text="Unexpected form type %r" % form.formType)33 55 + 34 56 + … … 82 104 """ 83 105 Send this request to its recipient. 84 @@ -6 45,7 +681,8 @@106 @@ -686,7 +722,8 @@ 85 107 return request.send(self.xmlstream) 86 108 … … 92 114 Subscribe to a publish subscribe node. 93 115 94 @@ -6 56,6 +693,8 @@116 @@ -697,6 +734,8 @@ 95 117 @param subscriber: The entity to subscribe to the node. This entity 96 118 will get notifications of new published items. … … 101 123 request = PubSubRequest('subscribe') 102 124 request.recipient = service 103 @@ - 663,6 +702,12 @@125 @@ -704,6 +743,12 @@ 104 126 request.subscriber = subscriber 105 127 request.sender = sender 106 128 107 129 + if options: 108 + form = data_form.Form(formType=' result',130 + form = data_form.Form(formType='submit', 109 131 + formNamespace=NS_PUBSUB_SUBSCRIBE_OPTIONS) 110 132 + form.makeFields(options) … … 114 136 subscription = iq.pubsub.subscription["subscription"] 115 137 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 """ 177 diff -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 @@ 120 189 return d 121 190 … … 136 205 + 137 206 + 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) 139 210 + form.typeCheck({'pubsub#deliver': {'type': 'boolean'}}) 140 211 + self.assertEqual(options, form.getValues()) … … 155 226 """ 156 227 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 @@ 158 304 self.assertEqual(NS_PUBSUB_ERRORS, err.appCondition.uri) 159 305 self.assertEqual('jid-required', err.appCondition.name) … … 191 337 + 192 338 + 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 + 193 392 def test_fromElementUnsubscribe(self): 194 393 """ -
series
r26 r27 3 3 findform.patch 4 4 pubsub-request-options-form.patch 5 pubsub-create-configure.patch 5 6 pubsub-subscription-options.patch 6 pubsub-create-configure.patch7 7 pubsub-item.patch 8 8 s2s-controller.patch
Note: See TracChangeset
for help on using the changeset viewer.