source:
ralphm-patches/pubsub_resource.patch
@
12:fc40892815eb
Last change on this file since 12:fc40892815eb was 12:fc40892815eb, checked in by Ralph Meijer <ralphm@…>, 13 years ago | |
---|---|
File size: 59.7 KB |
-
wokkel/iwokkel.py
diff -r ce121b9d0797 wokkel/iwokkel.py
a b 297 297 """ 298 298 299 299 300 def publish(request): 300 class IPubSubResource(Interface): 301 302 def locateResource(request): 301 303 """ 302 Called when a publish request has been received.304 Locate a resource that will handle the request. 303 305 304 306 @param request: The publish-subscribe request. 305 307 @type request: L{wokkel.pubsub.PubSubRequest} 306 @return: deferred that fires on success. 308 """ 309 310 311 def getInfo(requestor, service, nodeIdentifier): 312 """ 313 Get node type and meta data. 314 315 @param requestor: The entity the request originated from. 316 @type requestor: L{jid.JID} 317 @param service: The publish-subscribe service entity. 318 @type service: L{jid.JID} 319 @param nodeIdentifier: Identifier of the node to request the info for. 320 @type nodeIdentifier: L{unicode} 321 @return: A deferred that fires with a dictionary. If not empty, 322 it must have the keys C{'type'} and C{'meta-data'} to keep 323 respectively the node type and a dictionary with the meta 324 data for that node. 307 325 @rtype: L{defer.Deferred} 308 326 """ 309 327 310 328 311 def subscribe(request):329 def getNodes(requestor, service, nodeIdentifier): 312 330 """ 313 Called when a subscribe request has been received.331 Get all nodes contained by this node. 314 332 315 @param request: The publish-subscribe request. 316 @type request: L{wokkel.pubsub.PubSubRequest} 317 @return: A deferred that fires with a 318 L{Subscription<wokkel.pubsub.Subscription>}. 319 @rtype: L{defer.Deferred} 320 """ 321 322 323 def unsubscribe(request): 324 """ 325 Called when a subscribe request has been received. 326 327 @param request: The publish-subscribe request. 328 @type request: L{wokkel.pubsub.PubSubRequest} 329 @return: A deferred that fires with C{None} when unsubscription has 330 succeeded. 331 @rtype: L{defer.Deferred} 332 """ 333 334 335 def subscriptions(request): 336 """ 337 Called when a subscriptions retrieval request has been received. 338 339 @param request: The publish-subscribe request. 340 @type request: L{wokkel.pubsub.PubSubRequest} 341 @return: A deferred that fires with a C{list} of subscriptions as 342 L{Subscription<wokkel.pubsub.Subscription>}. 343 @rtype: L{defer.Deferred} 344 """ 345 346 347 def affiliations(request): 348 """ 349 Called when a affiliations retrieval request has been received. 350 351 @param request: The publish-subscribe request. 352 @type request: L{wokkel.pubsub.PubSubRequest} 353 @return: A deferred that fires with a C{list} of affiliations as 354 C{tuple}s of (node identifier as C{unicode}, affiliation state 355 as C{str}). The affiliation can be C{'owner'}, C{'publisher'}, 356 or C{'outcast'}. 357 @rtype: L{defer.Deferred} 358 """ 359 360 361 def create(request): 362 """ 363 Called when a node creation request has been received. 364 365 @param request: The publish-subscribe request. 366 @type request: L{wokkel.pubsub.PubSubRequest} 367 @return: A deferred that fires with a C{unicode} that represents 368 the identifier of the new node. 333 @param requestor: The entity the request originated from. 334 @type requestor: L{jid.JID} 335 @param service: The publish-subscribe service entity. 336 @type service: L{jid.JID} 337 @param nodeIdentifier: Identifier of the node to request the childs for. 338 @type nodeIdentifier: L{unicode} 339 @return: A deferred that fires with a list of child node identifiers. 369 340 @rtype: L{defer.Deferred} 370 341 """ 371 342 … … 406 377 """ 407 378 408 379 409 def getDefaultConfiguration(request): 380 def publish(request): 381 """ 382 Called when a publish request has been received. 383 384 @param request: The publish-subscribe request. 385 @type request: L{wokkel.pubsub.PubSubRequest} 386 @return: deferred that fires on success. 387 @rtype: L{defer.Deferred} 388 """ 389 390 391 def subscribe(request): 392 """ 393 Called when a subscribe request has been received. 394 395 @param request: The publish-subscribe request. 396 @type request: L{wokkel.pubsub.PubSubRequest} 397 @return: A deferred that fires with a 398 L{Subscription<wokkel.pubsub.Subscription>}. 399 @rtype: L{defer.Deferred} 400 """ 401 402 403 def unsubscribe(request): 404 """ 405 Called when a subscribe request has been received. 406 407 @param request: The publish-subscribe request. 408 @type request: L{wokkel.pubsub.PubSubRequest} 409 @return: A deferred that fires with C{None} when unsubscription has 410 succeeded. 411 @rtype: L{defer.Deferred} 412 """ 413 414 415 def subscriptions(request): 416 """ 417 Called when a subscriptions retrieval request has been received. 418 419 @param request: The publish-subscribe request. 420 @type request: L{wokkel.pubsub.PubSubRequest} 421 @return: A deferred that fires with a C{list} of subscriptions as 422 L{Subscription<wokkel.pubsub.Subscription>}. 423 @rtype: L{defer.Deferred} 424 """ 425 426 427 def affiliations(request): 428 """ 429 Called when a affiliations retrieval request has been received. 430 431 @param request: The publish-subscribe request. 432 @type request: L{wokkel.pubsub.PubSubRequest} 433 @return: A deferred that fires with a C{list} of affiliations as 434 C{tuple}s of (node identifier as C{unicode}, affiliation state 435 as C{str}). The affiliation can be C{'owner'}, C{'publisher'}, 436 or C{'outcast'}. 437 @rtype: L{defer.Deferred} 438 """ 439 440 441 def create(request): 442 """ 443 Called when a node creation request has been received. 444 445 @param request: The publish-subscribe request. 446 @type request: L{wokkel.pubsub.PubSubRequest} 447 @return: A deferred that fires with a C{unicode} that represents 448 the identifier of the new node. 449 @rtype: L{defer.Deferred} 450 """ 451 452 453 def default(request): 410 454 """ 411 455 Called when a default node configuration request has been received. 412 456 … … 420 464 """ 421 465 422 466 423 def getConfiguration(request):467 def configureGet(request): 424 468 """ 425 469 Called when a node configuration retrieval request has been received. 426 470 … … 433 477 """ 434 478 435 479 436 def setConfiguration(request):480 def configureSet(request): 437 481 """ 438 482 Called when a node configuration change request has been received. 439 483 -
wokkel/pubsub.py
diff -r ce121b9d0797 wokkel/pubsub.py
a b 13 13 from zope.interface import implements 14 14 15 15 from twisted.internet import defer 16 from twisted.python import log 16 17 from twisted.words.protocols.jabber import jid, error, xmlstream 17 18 from twisted.words.xish import domish 18 19 19 20 from wokkel import disco, data_form, generic, shim 20 21 from wokkel.subprotocols import IQHandlerMixin, XMPPHandler 21 from wokkel.iwokkel import IPubSubClient, IPubSubService 22 from wokkel.iwokkel import IPubSubClient, IPubSubService, IPubSubResource 22 23 23 24 # Iq get and set XPath queries 24 25 IQ_GET = '/iq[@type="get"]' … … 84 85 85 86 class Unsupported(PubSubError): 86 87 def __init__(self, feature, text=None): 88 self.feature = feature 87 89 PubSubError.__init__(self, 'feature-not-implemented', 88 90 'unsupported', 89 91 feature, 90 92 text) 91 93 94 def __str__(self): 95 message = PubSubError.__str__(self) 96 message += ', feature %r' % self.feature 97 return message 92 98 93 99 94 100 class Subscription(object): … … 235 241 'retract': ['node', 'itemIdentifiers'], 236 242 'purge': ['node'], 237 243 'delete': ['node'], 238 'affiliationsGet': [ ],244 'affiliationsGet': ['nodeOrEmpty'], 239 245 'affiliationsSet': [], 240 'subscriptionsGet': [ ],246 'subscriptionsGet': ['nodeOrEmpty'], 241 247 'subscriptionsSet': [], 242 248 } 243 249 … … 806 812 '/*': '_onPubSubRequest', 807 813 } 808 814 815 hideNodes = False 809 816 810 def __init__(self): 811 self.discoIdentity = {'category': 'pubsub', 812 'type': 'generic', 813 'name': 'Generic Publish-Subscribe Service'} 814 815 self.pubSubFeatures = [] 817 def __init__(self, resource): 818 self.resource = resource 816 819 817 820 818 821 def connectionMade(self): … … 820 823 821 824 822 825 def getDiscoInfo(self, requestor, target, nodeIdentifier): 823 info = [] 824 825 if not nodeIdentifier: 826 category, idType, name = self.discoIdentity 827 info.append(disco.DiscoIdentity(category, idType, name)) 828 829 info.append(disco.DiscoFeature(disco.NS_DISCO_ITEMS)) 830 info.extend([disco.DiscoFeature("%s#%s" % (NS_PUBSUB, feature)) 831 for feature in self.pubSubFeatures]) 832 833 def toInfo(nodeInfo): 826 def toInfo(nodeInfo, info): 834 827 if not nodeInfo: 835 return 828 return info 836 829 837 830 (nodeType, metaData) = nodeInfo['type'], nodeInfo['meta-data'] 838 831 info.append(disco.DiscoIdentity('pubsub', nodeType)) … … 852 845 853 846 info.append(form) 854 847 855 d = self.getNodeInfo(requestor, target, nodeIdentifier or '') 856 d.addCallback(toInfo) 857 d.addBoth(lambda result: info) 848 return info 849 850 info = [] 851 852 request = PubSubRequest('discoInfo') 853 resource = self.resource.locateResource(request) 854 855 if not nodeIdentifier: 856 info.append(resource.discoIdentity) 857 info.append(disco.DiscoFeature(disco.NS_DISCO_ITEMS)) 858 info.extend([disco.DiscoFeature("%s#%s" % (NS_PUBSUB, feature)) 859 for feature in resource.features]) 860 861 d = resource.getInfo(requestor, target, nodeIdentifier or '') 862 d.addCallback(toInfo, info) 863 d.addErrback(log.err) 858 864 return d 859 865 860 866 861 867 def getDiscoItems(self, requestor, target, nodeIdentifier): 862 if nodeIdentifier or self.hideNodes: 868 request = PubSubRequest('discoInfo') 869 resource = self.resource.locateResource(request) 870 871 if self.hideNodes: 863 872 return defer.succeed([]) 864 873 865 d = self.getNodes(requestor, target)874 d = resource.getNodes(requestor, target, nodeIdentifier) 866 875 d.addCallback(lambda nodes: [disco.DiscoItem(target, node) 867 876 for node in nodes]) 868 877 return d … … 870 879 871 880 def _onPubSubRequest(self, iq): 872 881 request = PubSubRequest.fromElement(iq) 873 handler = getattr(self, '_on_%s' % request.verb) 874 return handler(request) 882 resource = self.resource.locateResource(request) 875 883 884 # Preprocess the request, knowing the handling resource 885 try: 886 preProcessor = getattr(self, '_preProcess_%s' % request.verb) 887 except AttributeError: 888 pass 889 else: 890 request = preProcessor(resource, request) 891 if request is None: 892 return defer.succeed(None) 876 893 877 def _on_publish(self, request): 878 return self.publish(request) 894 # Process the request itself, 895 try: 896 handler = getattr(resource, request.verb) 897 except AttributeError: 898 # fix lookup feature 899 text = "Request verb: %s" % request.verb 900 return defer.fail(Unsupported('', text)) 879 901 902 d = handler(request) 880 903 881 def _on_subscribe(self, request): 904 # If needed, translate the result into a response 905 try: 906 cb = getattr(self, '_toResponse_%s' % request.verb) 907 except AttributeError: 908 pass 909 else: 910 d.addCallback(cb, resource, request) 882 911 883 def toResponse(result):884 response = domish.Element((NS_PUBSUB, "pubsub"))885 subscription = response.addElement("subscription")886 if result.nodeIdentifier:887 subscription["node"] = result.nodeIdentifier888 subscription["jid"] = result.subscriber.full()889 subscription["subscription"] = result.state890 return response891 892 d = self.subscribe(request)893 d.addCallback(toResponse)894 912 return d 895 913 896 914 897 def _on_unsubscribe(self, request): 898 return self.unsubscribe(request) 915 def _toResponse_subscribe(self, result, resource, request): 916 response = domish.Element((NS_PUBSUB, "pubsub")) 917 subscription = response.addElement("subscription") 918 if result.nodeIdentifier: 919 subscription["node"] = result.nodeIdentifier 920 subscription["jid"] = result.subscriber.full() 921 subscription["subscription"] = result.state 922 return response 899 923 900 924 901 def _on_optionsGet(self, request): 902 raise Unsupported('subscription-options') 925 def _toResponse_subscriptions(self, result, resource, request): 926 response = domish.Element((NS_PUBSUB, 'pubsub')) 927 subscriptions = response.addElement('subscriptions') 928 for subscription in result: 929 item = subscriptions.addElement('subscription') 930 item['node'] = subscription.nodeIdentifier 931 item['jid'] = subscription.subscriber.full() 932 item['subscription'] = subscription.state 933 return response 903 934 904 935 905 def _on_optionsSet(self, request): 906 raise Unsupported('subscription-options') 936 def _toResponse_affiliations(self, result, resource, request): 937 response = domish.Element((NS_PUBSUB, 'pubsub')) 938 affiliations = response.addElement('affiliations') 907 939 940 for nodeIdentifier, affiliation in result: 941 item = affiliations.addElement('affiliation') 942 item['node'] = nodeIdentifier 943 item['affiliation'] = affiliation 908 944 909 def _on_subscriptions(self, request):945 return response 910 946 911 def toResponse(result): 947 948 def _toResponse_create(self, result, resource, request): 949 if not request.nodeIdentifier or request.nodeIdentifier != result: 912 950 response = domish.Element((NS_PUBSUB, 'pubsub')) 913 subscriptions = response.addElement('subscriptions') 914 for subscription in result: 915 item = subscriptions.addElement('subscription') 916 item['node'] = subscription.nodeIdentifier 917 item['jid'] = subscription.subscriber.full() 918 item['subscription'] = subscription.state 951 create = response.addElement('create') 952 create['node'] = result 919 953 return response 920 921 d = self.subscriptions(request) 922 d.addCallback(toResponse) 923 return d 924 925 926 def _on_affiliations(self, request): 927 928 def toResponse(result): 929 response = domish.Element((NS_PUBSUB, 'pubsub')) 930 affiliations = response.addElement('affiliations') 931 932 for nodeIdentifier, affiliation in result: 933 item = affiliations.addElement('affiliation') 934 item['node'] = nodeIdentifier 935 item['affiliation'] = affiliation 936 937 return response 938 939 d = self.affiliations(request) 940 d.addCallback(toResponse) 941 return d 942 943 944 def _on_create(self, request): 945 946 def toResponse(result): 947 if not request.nodeIdentifier or request.nodeIdentifier != result: 948 response = domish.Element((NS_PUBSUB, 'pubsub')) 949 create = response.addElement('create') 950 create['node'] = result 951 return response 952 else: 953 return None 954 955 d = self.create(request) 956 d.addCallback(toResponse) 957 return d 954 else: 955 return None 958 956 959 957 960 958 def _makeFields(self, options, values): … … 973 971 return fields 974 972 975 973 976 def _formFromConfiguration(self, values):977 options = self.getConfigurationOptions()974 def _formFromConfiguration(self, resource, values): 975 options = resource.getConfigurationOptions() 978 976 fields = self._makeFields(options, values) 979 977 form = data_form.Form(formType="form", 980 978 formNamespace=NS_PUBSUB_NODE_CONFIG, … … 983 981 return form 984 982 985 983 986 def _checkConfiguration(self, values):987 options = self.getConfigurationOptions()984 def _checkConfiguration(self, resource, values): 985 options = resource.getConfigurationOptions() 988 986 processedValues = {} 989 987 990 988 for key, value in values.iteritems(): … … 1008 1006 return processedValues 1009 1007 1010 1008 1011 def _on_default(self, request): 1009 def _preProcess_default(self, resource, request): 1010 if request.nodeType not in ('leaf', 'collection'): 1011 raise error.StanzaError('not-acceptable') 1012 else: 1013 return request 1012 1014 1013 def toResponse(options):1014 response = domish.Element((NS_PUBSUB_OWNER, "pubsub"))1015 default = response.addElement("default")1016 default.addChild(self._formFromConfiguration(options).toElement())1017 return response1018 1015 1019 if request.nodeType not in ('leaf', 'collection'): 1020 return defer.fail(error.StanzaError('not-acceptable')) 1016 def _toResponse_default(self, options, resource, request): 1017 response = domish.Element((NS_PUBSUB_OWNER, "pubsub")) 1018 default = response.addElement("default") 1019 form = self._formFromConfiguration(resource, options) 1020 default.addChild(form.toElement()) 1021 return response 1021 1022 1022 d = self.getDefaultConfiguration(request)1023 d.addCallback(toResponse)1024 return d1025 1023 1024 def _toResponse_configureGet(self, options, resource, request): 1025 response = domish.Element((NS_PUBSUB_OWNER, "pubsub")) 1026 configure = response.addElement("configure") 1027 form = self._formFromConfiguration(resource, options) 1028 configure.addChild(form.toElement()) 1026 1029 1027 def _on_configureGet(self, request): 1028 def toResponse(options): 1029 response = domish.Element((NS_PUBSUB_OWNER, "pubsub")) 1030 configure = response.addElement("configure") 1031 form = self._formFromConfiguration(options) 1032 configure.addChild(form.toElement()) 1030 if request.nodeIdentifier: 1031 configure["node"] = request.nodeIdentifier 1033 1032 1034 if request.nodeIdentifier: 1035 configure["node"] = request.nodeIdentifier 1033 return response 1036 1034 1037 return response1038 1035 1039 d = self.getConfiguration(request) 1040 d.addCallback(toResponse) 1041 return d 1042 1043 1044 def _on_configureSet(self, request): 1036 def _preProcess_configureSet(self, resource, request): 1045 1037 if request.options: 1046 request.options = self._checkConfiguration(request.options) 1047 return self.setConfiguration(request) 1038 request.options = self._checkConfiguration(resource, 1039 request.options) 1040 return request 1048 1041 else: 1049 1042 return None 1050 1043 1051 1044 1045 def _toResponse_items(self, result, resource, request): 1046 response = domish.Element((NS_PUBSUB, 'pubsub')) 1047 items = response.addElement('items') 1048 items["node"] = request.nodeIdentifier 1052 1049 1053 def _on_items(self, request): 1050 for item in result: 1051 items.addChild(item) 1054 1052 1055 def toResponse(result): 1056 response = domish.Element((NS_PUBSUB, 'pubsub')) 1057 items = response.addElement('items') 1058 items["node"] = request.nodeIdentifier 1053 return response 1059 1054 1060 for item in result:1061 items.addChild(item)1062 1063 return response1064 1065 d = self.items(request)1066 d.addCallback(toResponse)1067 return d1068 1069 1070 def _on_retract(self, request):1071 return self.retract(request)1072 1073 1074 def _on_purge(self, request):1075 return self.purge(request)1076 1077 1078 def _on_delete(self, request):1079 return self.delete(request)1080 1081 1082 def _on_affiliationsGet(self, iq):1083 raise Unsupported('modify-affiliations')1084 1085 1086 def _on_affiliationsSet(self, iq):1087 raise Unsupported('modify-affiliations')1088 1089 1090 def _on_subscriptionsGet(self, iq):1091 raise Unsupported('manage-subscriptions')1092 1093 1094 def _on_subscriptionsSet(self, iq):1095 raise Unsupported('manage-subscriptions')1096 1097 # public methods1098 1055 1099 1056 def _createNotification(self, eventType, service, nodeIdentifier, 1100 1057 subscriber, subscriptions=None): … … 1118 1075 1119 1076 return message 1120 1077 1078 # public methods 1079 1121 1080 def notifyPublish(self, service, nodeIdentifier, notifications): 1122 1081 for subscriber, subscriptions, items in notifications: 1123 1082 message = self._createNotification('items', service, … … 1139 1098 self.send(message) 1140 1099 1141 1100 1142 def getNodeInfo(self, requestor, service, nodeIdentifier):1143 return None1144 1101 1102 class PubSubResource(object): 1145 1103 1146 def getNodes(self, requestor, service): 1147 return [] 1104 implements(IPubSubResource) 1148 1105 1106 features = [] 1107 discoIdentity = disco.DiscoIdentity('pubsub', 1108 'service', 1109 'Publish-Subscribe Service') 1149 1110 1150 def publish(self, request):1151 raise Unsupported('publish')1152 1111 1112 def locateResource(self, request): 1113 return self 1153 1114 1154 def subscribe(self, request):1155 raise Unsupported('subscribe')1156 1115 1116 def getInfo(self, requestor, service, nodeIdentifier): 1117 return defer.succeed(None) 1157 1118 1158 def unsubscribe(self, request):1159 raise Unsupported('subscribe')1160 1119 1161 1162 def subscriptions(self, request): 1163 raise Unsupported('retrieve-subscriptions') 1164 1165 1166 def affiliations(self, request): 1167 raise Unsupported('retrieve-affiliations') 1168 1169 1170 def create(self, request): 1171 raise Unsupported('create-nodes') 1120 def getNodes(self, requestor, service, nodeIdentifier): 1121 return defer.succeed([]) 1172 1122 1173 1123 1174 1124 def getConfigurationOptions(self): 1175 1125 return {} 1176 1126 1177 1127 1178 def getDefaultConfiguration(self, request):1179 r aise Unsupported('retrieve-default')1128 def publish(self, request): 1129 return defer.fail(Unsupported('publish')) 1180 1130 1181 1131 1182 def getConfiguration(self, request):1183 r aise Unsupported('config-node')1132 def subscribe(self, request): 1133 return defer.fail(Unsupported('subscribe')) 1184 1134 1185 1135 1186 def setConfiguration(self, request): 1187 raise Unsupported('config-node') 1136 def unsubscribe(self, request): 1137 return defer.fail(Unsupported('subscribe')) 1138 1139 1140 def subscriptions(self, request): 1141 return defer.fail(Unsupported('retrieve-subscriptions')) 1142 1143 1144 def affiliations(self, request): 1145 return defer.fail(Unsupported('retrieve-affiliations')) 1146 1147 1148 def create(self, request): 1149 return defer.fail(Unsupported('create-nodes')) 1150 1151 1152 def default(self, request): 1153 return defer.fail(Unsupported('retrieve-default')) 1154 1155 1156 def configureGet(self, request): 1157 return defer.fail(Unsupported('config-node')) 1158 1159 1160 def configureSet(self, request): 1161 return defer.fail(Unsupported('config-node')) 1188 1162 1189 1163 1190 1164 def items(self, request): 1191 r aise Unsupported('retrieve-items')1165 return defer.fail(Unsupported('retrieve-items')) 1192 1166 1193 1167 1194 1168 def retract(self, request): 1195 r aise Unsupported('retract-items')1169 return defer.fail(Unsupported('retract-items')) 1196 1170 1197 1171 1198 1172 def purge(self, request): 1199 r aise Unsupported('purge-nodes')1173 return defer.fail(Unsupported('purge-nodes')) 1200 1174 1201 1175 1202 1176 def delete(self, request): 1203 raise Unsupported('delete-nodes') 1177 return defer.fail(Unsupported('delete-nodes')) 1178 1179 1180 def affiliationsGet(self, request): 1181 return defer.fail(Unsupported('modify-affiliations')) 1182 1183 1184 def affiliationsSet(self, request): 1185 return defer.fail(Unsupported('modify-affiliations')) 1186 1187 1188 def subscriptionsGet(self, request): 1189 return defer.fail(Unsupported('manage-subscriptions')) 1190 1191 1192 def subscriptionsSet(self, request): 1193 return defer.fail(Unsupported('manage-subscriptions')) -
wokkel/test/test_pubsub.py
diff -r ce121b9d0797 wokkel/test/test_pubsub.py
a b 1222 1222 1223 1223 def setUp(self): 1224 1224 self.stub = XmlStreamStub() 1225 self.service = pubsub.PubSubService() 1225 self.resource = pubsub.PubSubResource() 1226 self.service = pubsub.PubSubService(self.resource) 1226 1227 self.service.send = self.stub.xmlstream.send 1227 1228 1228 1229 def test_interface(self): … … 1260 1261 Test getDiscoInfo calls getNodeInfo and returns some minimal info. 1261 1262 """ 1262 1263 def cb(info): 1263 self.assertEqual(2, len(info)) 1264 discoInfo = disco.DiscoInfo() 1265 for item in info: 1266 discoInfo.append(item) 1267 self.assertIn(('pubsub', 'service'), discoInfo.identities) 1268 self.assertIn(disco.NS_DISCO_ITEMS, discoInfo.features) 1264 1269 1265 def getNodeInfo(requestor, target, nodeIdentifier):1266 return defer.succeed(None)1267 1268 self.service.getNodeInfo = getNodeInfo1269 1270 d = self.service.getDiscoInfo(JID('user@example.org/home'), 1270 1271 JID('pubsub.example.org'), '') 1271 1272 d.addCallback(cb) … … 1282 1283 discoInfo.append(item) 1283 1284 self.assertIn(('pubsub', 'collection'), discoInfo.identities) 1284 1285 1285 def get NodeInfo(requestor, target, nodeIdentifier):1286 def getInfo(requestor, target, nodeIdentifier): 1286 1287 return defer.succeed({'type': 'collection', 1287 1288 'meta-data': {}}) 1288 1289 1289 self. service.getNodeInfo = getNodeInfo1290 self.resource.getInfo = getInfo 1290 1291 d = self.service.getDiscoInfo(JID('user@example.org/home'), 1291 1292 JID('pubsub.example.org'), '') 1292 1293 d.addCallback(cb) … … 1307 1308 form = discoInfo.extensions[NS_PUBSUB_META_DATA] 1308 1309 self.assertIn('pubsub#node_type', form.fields) 1309 1310 1310 def get NodeInfo(requestor, target, nodeIdentifier):1311 def getInfo(requestor, target, nodeIdentifier): 1311 1312 metaData = [{'var': 'pubsub#persist_items', 1312 1313 'label': 'Persist items to storage', 1313 1314 'value': True}] 1314 1315 return defer.succeed({'type': 'leaf', 'meta-data': metaData}) 1315 1316 1316 self. service.getNodeInfo = getNodeInfo1317 self.resource.getInfo = getInfo 1317 1318 d = self.service.getDiscoInfo(JID('user@example.org/home'), 1318 1319 JID('pubsub.example.org'), '') 1319 1320 d.addCallback(cb) 1320 1321 return d 1321 1322 1322 1323 1323 def test_onPublish(self): 1324 def test_getDiscoInfoResourceFeatures(self): 1325 """ 1326 Test getDiscoInfo with the resource features. 1327 """ 1328 def cb(info): 1329 discoInfo = disco.DiscoInfo() 1330 for item in info: 1331 discoInfo.append(item) 1332 self.assertIn('http://jabber.org/protocol/pubsub#publish', 1333 discoInfo.features) 1334 1335 self.resource.features = ['publish'] 1336 d = self.service.getDiscoInfo(JID('user@example.org/home'), 1337 JID('pubsub.example.org'), '') 1338 d.addCallback(cb) 1339 return d 1340 1341 1342 def test_getDiscoItemsRoot(self): 1343 """ 1344 Test getDiscoItems on the root node. 1345 """ 1346 def getNodes(requestor, service, nodeIdentifier): 1347 return defer.succeed(['node1', 'node2']) 1348 1349 def cb(items): 1350 self.assertEqual(2, len(items)) 1351 item1, item2 = items 1352 1353 self.assertEqual(JID('pubsub.example.org'), item1.entity) 1354 self.assertEqual('node1', item1.nodeIdentifier) 1355 1356 self.assertEqual(JID('pubsub.example.org'), item2.entity) 1357 self.assertEqual('node2', item2.nodeIdentifier) 1358 1359 self.resource.getNodes = getNodes 1360 d = self.service.getDiscoItems(JID('user@example.org/home'), 1361 JID('pubsub.example.org'), 1362 '') 1363 d.addCallback(cb) 1364 return d 1365 1366 1367 def test_getDiscoItemsRootHideNodes(self): 1368 """ 1369 Test getDiscoItems on the root node. 1370 """ 1371 def getNodes(requestor, service, nodeIdentifier): 1372 raise Exception("Unexpected call to getNodes") 1373 1374 def cb(items): 1375 self.assertEqual([], items) 1376 1377 self.service.hideNodes = True 1378 self.resource.getNodes = getNodes 1379 d = self.service.getDiscoItems(JID('user@example.org/home'), 1380 JID('pubsub.example.org'), 1381 '') 1382 d.addCallback(cb) 1383 return d 1384 1385 1386 def test_getDiscoItemsNonRoot(self): 1387 """ 1388 Test getDiscoItems on a non-root node. 1389 """ 1390 def getNodes(requestor, service, nodeIdentifier): 1391 return defer.succeed(['node1', 'node2']) 1392 1393 def cb(items): 1394 self.assertEqual(2, len(items)) 1395 1396 self.resource.getNodes = getNodes 1397 d = self.service.getDiscoItems(JID('user@example.org/home'), 1398 JID('pubsub.example.org'), 1399 'test') 1400 d.addCallback(cb) 1401 return d 1402 1403 1404 def test_on_publish(self): 1324 1405 """ 1325 1406 A publish request should result in L{PubSubService.publish} being 1326 1407 called. … … 1338 1419 def publish(request): 1339 1420 return defer.succeed(None) 1340 1421 1341 self. service.publish = publish1342 verify.verifyObject(iwokkel.IPubSub Service, self.service)1422 self.resource.publish = publish 1423 verify.verifyObject(iwokkel.IPubSubResource, self.resource) 1343 1424 return self.handleRequest(xml) 1344 1425 1345 1426 1346 def test_on Subscribe(self):1427 def test_on_subscribe(self): 1347 1428 """ 1348 1429 A successful subscription should return the current subscription. 1349 1430 """ … … 1371 1452 self.assertEqual('user@example.org/Home', subscription['jid']) 1372 1453 self.assertEqual('subscribed', subscription['subscription']) 1373 1454 1374 self. service.subscribe = subscribe1375 verify.verifyObject(iwokkel.IPubSub Service, self.service)1455 self.resource.subscribe = subscribe 1456 verify.verifyObject(iwokkel.IPubSubResource, self.resource) 1376 1457 d = self.handleRequest(xml) 1377 1458 d.addCallback(cb) 1378 1459 return d 1379 1460 1380 1461 1381 def test_on SubscribeEmptyNode(self):1462 def test_on_subscribeEmptyNode(self): 1382 1463 """ 1383 1464 A successful subscription on root node should return no node attribute. 1384 1465 """ … … 1400 1481 def cb(element): 1401 1482 self.assertFalse(element.subscription.hasAttribute('node')) 1402 1483 1403 self. service.subscribe = subscribe1404 verify.verifyObject(iwokkel.IPubSub Service, self.service)1484 self.resource.subscribe = subscribe 1485 verify.verifyObject(iwokkel.IPubSubResource, self.resource) 1405 1486 d = self.handleRequest(xml) 1406 1487 d.addCallback(cb) 1407 1488 return d 1408 1489 1409 1490 1410 def test_on Unsubscribe(self):1491 def test_on_unsubscribe(self): 1411 1492 """ 1412 1493 A successful unsubscription should return an empty response. 1413 1494 """ … … 1427 1508 def cb(element): 1428 1509 self.assertIdentical(None, element) 1429 1510 1430 self. service.unsubscribe = unsubscribe1431 verify.verifyObject(iwokkel.IPubSub Service, self.service)1511 self.resource.unsubscribe = unsubscribe 1512 verify.verifyObject(iwokkel.IPubSubResource, self.resource) 1432 1513 d = self.handleRequest(xml) 1433 1514 d.addCallback(cb) 1434 1515 return d 1435 1516 1436 1517 1437 def test_on OptionsGet(self):1518 def test_on_optionsGet(self): 1438 1519 """ 1439 1520 Getting subscription options is not supported. 1440 1521 """ … … 1459 1540 return d 1460 1541 1461 1542 1462 def test_on OptionsSet(self):1543 def test_on_optionsSet(self): 1463 1544 """ 1464 1545 Setting subscription options is not supported. 1465 1546 """ … … 1491 1572 return d 1492 1573 1493 1574 1494 def test_on Subscriptions(self):1575 def test_on_subscriptions(self): 1495 1576 """ 1496 1577 A subscriptions request should result in 1497 1578 L{PubSubService.subscriptions} being called and the result prepared … … 1507 1588 </iq> 1508 1589 """ 1509 1590 1591 def subscriptions(request): 1592 subscription = pubsub.Subscription('test', JID('user@example.org'), 1593 'subscribed') 1594 return defer.succeed([subscription]) 1595 1510 1596 def cb(element): 1511 1597 self.assertEqual('pubsub', element.name) 1512 1598 self.assertEqual(NS_PUBSUB, element.uri) … … 1520 1606 self.assertEqual('test', subscription['node']) 1521 1607 self.assertEqual('subscribed', subscription['subscription']) 1522 1608 1523 1524 def subscriptions(request): 1525 subscription = pubsub.Subscription('test', JID('user@example.org'), 1526 'subscribed') 1527 return defer.succeed([subscription]) 1528 1529 self.service.subscriptions = subscriptions 1530 verify.verifyObject(iwokkel.IPubSubService, self.service) 1609 self.resource.subscriptions = subscriptions 1610 verify.verifyObject(iwokkel.IPubSubResource, self.resource) 1531 1611 d = self.handleRequest(xml) 1532 1612 d.addCallback(cb) 1533 1613 return d 1534 1614 1535 1615 1536 def test_on Affiliations(self):1616 def test_on_affiliations(self): 1537 1617 """ 1538 1618 A subscriptions request should result in 1539 1619 L{PubSubService.affiliations} being called and the result prepared … … 1549 1629 </iq> 1550 1630 """ 1551 1631 1632 def affiliations(request): 1633 affiliation = ('test', 'owner') 1634 return defer.succeed([affiliation]) 1635 1552 1636 def cb(element): 1553 1637 self.assertEqual('pubsub', element.name) 1554 1638 self.assertEqual(NS_PUBSUB, element.uri) … … 1561 1645 self.assertEqual('test', affiliation['node']) 1562 1646 self.assertEqual('owner', affiliation['affiliation']) 1563 1647 1564 1565 def affiliations(request): 1566 affiliation = ('test', 'owner') 1567 return defer.succeed([affiliation]) 1568 1569 self.service.affiliations = affiliations 1570 verify.verifyObject(iwokkel.IPubSubService, self.service) 1648 self.resource.affiliations = affiliations 1649 verify.verifyObject(iwokkel.IPubSubResource, self.resource) 1571 1650 d = self.handleRequest(xml) 1572 1651 d.addCallback(cb) 1573 1652 return d 1574 1653 1575 1654 1576 def test_on Create(self):1655 def test_on_create(self): 1577 1656 """ 1578 1657 Replies to create node requests don't return the created node. 1579 1658 """ … … 1593 1672 def cb(element): 1594 1673 self.assertIdentical(None, element) 1595 1674 1596 self. service.create = create1597 verify.verifyObject(iwokkel.IPubSub Service, self.service)1675 self.resource.create = create 1676 verify.verifyObject(iwokkel.IPubSubResource, self.resource) 1598 1677 d = self.handleRequest(xml) 1599 1678 d.addCallback(cb) 1600 1679 return d 1601 1680 1602 1681 1603 def test_on CreateChanged(self):1682 def test_on_createChanged(self): 1604 1683 """ 1605 1684 Replies to create node requests return the created node if changed. 1606 1685 """ … … 1624 1703 self.assertEqual(u'myrenamednode', 1625 1704 element.create.getAttribute('node')) 1626 1705 1627 self. service.create = create1628 verify.verifyObject(iwokkel.IPubSub Service, self.service)1706 self.resource.create = create 1707 verify.verifyObject(iwokkel.IPubSubResource, self.resource) 1629 1708 d = self.handleRequest(xml) 1630 1709 d.addCallback(cb) 1631 1710 return d 1632 1711 1633 1712 1634 def test_on CreateInstant(self):1713 def test_on_createInstant(self): 1635 1714 """ 1636 1715 Replies to create instant node requests return the created node. 1637 1716 """ … … 1654 1733 self.assertEqual(NS_PUBSUB, element.create.uri) 1655 1734 self.assertEqual(u'random', element.create.getAttribute('node')) 1656 1735 1657 self. service.create = create1658 verify.verifyObject(iwokkel.IPubSub Service, self.service)1736 self.resource.create = create 1737 verify.verifyObject(iwokkel.IPubSubResource, self.resource) 1659 1738 d = self.handleRequest(xml) 1660 1739 d.addCallback(cb) 1661 1740 return d 1662 1741 1663 1742 1664 def test_on Default(self):1743 def test_on_default(self): 1665 1744 """ 1666 1745 A default request should result in 1667 1746 L{PubSubService.getDefaultConfiguration} being called. … … 1686 1765 "label": "Deliver payloads with event notifications"} 1687 1766 } 1688 1767 1689 def getDefaultConfiguration(request):1768 def default(request): 1690 1769 return defer.succeed({}) 1691 1770 1692 1771 def cb(element): … … 1696 1775 form = data_form.Form.fromElement(element.default.x) 1697 1776 self.assertEqual(NS_PUBSUB_CONFIG, form.formNamespace) 1698 1777 1699 self. service.getConfigurationOptions = getConfigurationOptions1700 self. service.getDefaultConfiguration = getDefaultConfiguration1701 verify.verifyObject(iwokkel.IPubSub Service, self.service)1778 self.resource.getConfigurationOptions = getConfigurationOptions 1779 self.resource.default = default 1780 verify.verifyObject(iwokkel.IPubSubResource, self.resource) 1702 1781 d = self.handleRequest(xml) 1703 1782 d.addCallback(cb) 1704 1783 return d 1705 1784 1706 1785 1707 def test_on DefaultCollection(self):1786 def test_on_defaultCollection(self): 1708 1787 """ 1709 1788 Responses to default requests should depend on passed node type. 1710 1789 """ … … 1735 1814 "label": "Deliver payloads with event notifications"} 1736 1815 } 1737 1816 1738 def getDefaultConfiguration(request):1817 def default(request): 1739 1818 return defer.succeed({}) 1740 1819 1741 self. service.getConfigurationOptions = getConfigurationOptions1742 self. service.getDefaultConfiguration = getDefaultConfiguration1743 verify.verifyObject(iwokkel.IPubSub Service, self.service)1820 self.resource.getConfigurationOptions = getConfigurationOptions 1821 self.resource.default = default 1822 verify.verifyObject(iwokkel.IPubSubResource, self.resource) 1744 1823 return self.handleRequest(xml) 1745 1824 1746 1825 1747 def test_on DefaultUnknownNodeType(self):1826 def test_on_defaultUnknownNodeType(self): 1748 1827 """ 1749 1828 A default request should result in 1750 L{PubSub Service.getDefaultConfiguration} being called.1829 L{PubSubResource.default} being called. 1751 1830 """ 1752 1831 1753 1832 xml = """ … … 1769 1848 </iq> 1770 1849 """ 1771 1850 1772 def getDefaultConfiguration(request):1851 def default(request): 1773 1852 self.fail("Unexpected call to getConfiguration") 1774 1853 1775 1854 def cb(result): 1776 1855 self.assertEquals('not-acceptable', result.condition) 1777 1856 1778 self. service.getDefaultConfiguration = getDefaultConfiguration1779 verify.verifyObject(iwokkel.IPubSub Service, self.service)1857 self.resource.default = default 1858 verify.verifyObject(iwokkel.IPubSubResource, self.resource) 1780 1859 d = self.handleRequest(xml) 1781 1860 self.assertFailure(d, error.StanzaError) 1782 1861 d.addCallback(cb) 1783 1862 return d 1784 1863 1785 1864 1786 def test_on ConfigureGet(self):1865 def test_on_configureGet(self): 1787 1866 """ 1788 On a node configuration get request L{PubSubService.getConfiguration} 1789 is called and results in a data form with the configuration. 1867 On a node configuration get 1868 requestL{PubSubResource.configureGet} is called and results in a 1869 data form with the configuration. 1790 1870 """ 1791 1871 1792 1872 xml = """ … … 1811 1891 "label": "Owner of the node"} 1812 1892 } 1813 1893 1814 def getConfiguration(request):1894 def configureGet(request): 1815 1895 return defer.succeed({'pubsub#deliver_payloads': '0', 1816 1896 'pubsub#persist_items': '1', 1817 1897 'pubsub#owner': JID('user@example.org'), … … 1845 1925 1846 1926 self.assertNotIn('x-myfield', fields) 1847 1927 1848 1849 self.service.getConfigurationOptions = getConfigurationOptions 1850 self.service.getConfiguration = getConfiguration 1851 verify.verifyObject(iwokkel.IPubSubService, self.service) 1928 self.resource.getConfigurationOptions = getConfigurationOptions 1929 self.resource.configureGet = configureGet 1930 verify.verifyObject(iwokkel.IPubSubResource, self.resource) 1852 1931 d = self.handleRequest(xml) 1853 1932 d.addCallback(cb) 1854 1933 return d 1855 1934 1856 1935 1857 def test_on ConfigureSet(self):1936 def test_on_configureSet(self): 1858 1937 """ 1859 1938 On a node configuration set request the Data Form is parsed and 1860 L{PubSub Service.setConfiguration} is called with the passed options.1939 L{PubSubResource.configureSet} is called with the passed options. 1861 1940 """ 1862 1941 1863 1942 xml = """ … … 1887 1966 "label": "Deliver payloads with event notifications"} 1888 1967 } 1889 1968 1890 def setConfiguration(request):1969 def configureSet(request): 1891 1970 self.assertEqual({'pubsub#deliver_payloads': False, 1892 1971 'pubsub#persist_items': True}, request.options) 1893 1972 return defer.succeed(None) 1894 1973 1895 self. service.getConfigurationOptions = getConfigurationOptions1896 self. service.setConfiguration = setConfiguration1897 verify.verifyObject(iwokkel.IPubSub Service, self.service)1974 self.resource.getConfigurationOptions = getConfigurationOptions 1975 self.resource.configureSet = configureSet 1976 verify.verifyObject(iwokkel.IPubSubResource, self.resource) 1898 1977 return self.handleRequest(xml) 1899 1978 1900 1979 1901 def test_on ConfigureSetCancel(self):1980 def test_on_configureSetCancel(self): 1902 1981 """ 1903 The node configuration is cancelled, L{PubSubService.setConfiguration}1904 not called.1982 The node configuration is cancelled, 1983 L{PubSubResource.configureSet} not called. 1905 1984 """ 1906 1985 1907 1986 xml = """ … … 1919 1998 </iq> 1920 1999 """ 1921 2000 1922 def setConfiguration(request):2001 def configureSet(request): 1923 2002 self.fail("Unexpected call to setConfiguration") 1924 2003 1925 self. service.setConfiguration = setConfiguration1926 verify.verifyObject(iwokkel.IPubSub Service, self.service)2004 self.resource.configureSet = configureSet 2005 verify.verifyObject(iwokkel.IPubSubResource, self.resource) 1927 2006 return self.handleRequest(xml) 1928 2007 1929 2008 1930 def test_on ConfigureSetIgnoreUnknown(self):2009 def test_on_configureSetIgnoreUnknown(self): 1931 2010 """ 1932 2011 On a node configuration set request unknown fields should be ignored. 1933 2012 """ … … 1959 2038 "label": "Deliver payloads with event notifications"} 1960 2039 } 1961 2040 1962 def setConfiguration(request):2041 def configureSet(request): 1963 2042 self.assertEquals(['pubsub#deliver_payloads'], 1964 2043 request.options.keys()) 1965 2044 1966 self. service.getConfigurationOptions = getConfigurationOptions1967 self. service.setConfiguration = setConfiguration1968 verify.verifyObject(iwokkel.IPubSub Service, self.service)2045 self.resource.getConfigurationOptions = getConfigurationOptions 2046 self.resource.configureSet = configureSet 2047 verify.verifyObject(iwokkel.IPubSubResource, self.resource) 1969 2048 return self.handleRequest(xml) 1970 2049 1971 2050 1972 def test_on ConfigureSetBadFormType(self):2051 def test_on_configureSetBadFormType(self): 1973 2052 """ 1974 2053 On a node configuration set request unknown fields should be ignored. 1975 2054 """ … … 2000 2079 return d 2001 2080 2002 2081 2003 def test_on Items(self):2082 def test_on_items(self): 2004 2083 """ 2005 2084 On a items request, return all items for the given node. 2006 2085 """ … … 2026 2105 self.assertEqual(NS_PUBSUB, item.uri) 2027 2106 self.assertEqual('current', item['id']) 2028 2107 2029 self.service.items = items 2108 self.resource.items = items 2109 verify.verifyObject(iwokkel.IPubSubResource, self.resource) 2030 2110 d = self.handleRequest(xml) 2031 2111 d.addCallback(cb) 2032 2112 return d 2033 2113 2034 2114 2035 def test_on Retract(self):2115 def test_on_retract(self): 2036 2116 """ 2037 A retract request should result in L{PubSub Service.retract} being2038 called.2117 A retract request should result in L{PubSubResource.retract} 2118 being called. 2039 2119 """ 2040 2120 2041 2121 xml = """ … … 2053 2133 def retract(request): 2054 2134 return defer.succeed(None) 2055 2135 2056 self.service.retract = retract 2136 self.resource.retract = retract 2137 verify.verifyObject(iwokkel.IPubSubResource, self.resource) 2057 2138 return self.handleRequest(xml) 2058 2139 2059 2140 2060 def test_on Purge(self):2141 def test_on_purge(self): 2061 2142 """ 2062 A purge request should result in L{PubSub Service.purge} being2143 A purge request should result in L{PubSubResource.purge} being 2063 2144 called. 2064 2145 """ 2065 2146 … … 2075 2156 def purge(request): 2076 2157 return defer.succeed(None) 2077 2158 2078 self.service.purge = purge 2159 self.resource.purge = purge 2160 verify.verifyObject(iwokkel.IPubSubResource, self.resource) 2079 2161 return self.handleRequest(xml) 2080 2162 2081 2163 2082 def test_on Delete(self):2164 def test_on_delete(self): 2083 2165 """ 2084 A delete request should result in L{PubSub Service.delete} being2166 A delete request should result in L{PubSubResource.delete} being 2085 2167 called. 2086 2168 """ 2087 2169 … … 2097 2179 def delete(request): 2098 2180 return defer.succeed(None) 2099 2181 2100 self.service.delete = delete 2182 self.resource.delete = delete 2183 verify.verifyObject(iwokkel.IPubSubResource, self.resource) 2101 2184 return self.handleRequest(xml) 2102 2185 2103 2186 … … 2148 2231 self.assertEqual(redirectURI, message.event.delete.redirect['uri']) 2149 2232 2150 2233 2151 def test_on SubscriptionsGet(self):2234 def test_on_subscriptionsGet(self): 2152 2235 """ 2153 2236 Getting subscription options is not supported. 2154 2237 """ … … 2175 2258 return d 2176 2259 2177 2260 2178 def test_on SubscriptionsSet(self):2261 def test_on_subscriptionsSet(self): 2179 2262 """ 2180 2263 Setting subscription options is not supported. 2181 2264 """ … … 2202 2285 return d 2203 2286 2204 2287 2205 def test_on AffiliationsGet(self):2288 def test_on_affiliationsGet(self): 2206 2289 """ 2207 2290 Getting subscription options is not supported. 2208 2291 """ … … 2229 2312 return d 2230 2313 2231 2314 2232 def test_on AffiliationsSet(self):2315 def test_on_affiliationsSet(self): 2233 2316 """ 2234 2317 Setting subscription options is not supported. 2235 2318 """ … … 2256 2339 return d 2257 2340 2258 2341 2342 2343 class PubSubResourceTest(unittest.TestCase): 2344 2345 def setUp(self): 2346 self.resource = pubsub.PubSubResource() 2347 2348 2349 def test_interface(self): 2350 """ 2351 Do instances of L{pubsub.PubSubResource} provide L{iwokkel.IPubSubResource}? 2352 """ 2353 verify.verifyObject(iwokkel.IPubSubResource, self.resource) 2354 2355 2356 def test_getNodes(self): 2357 """ 2358 Default getNodes returns an empty list. 2359 """ 2360 def cb(nodes): 2361 self.assertEquals([], nodes) 2362 2363 d = self.resource.getNodes(JID('user@example.org/home'), 2364 JID('pubsub.example.org'), 2365 '') 2366 d.addCallback(cb) 2367 return d 2368 2369 2259 2370 def test_publish(self): 2260 2371 """ 2261 Non-overridden L{PubSubService.publish} yields unsupported error. 2262 """ 2263 2264 xml = """ 2265 <iq type='set' to='pubsub.example.org' 2266 from='user@example.org'> 2267 <pubsub xmlns='http://jabber.org/protocol/pubsub'> 2268 <publish node='mynode'/> 2269 </pubsub> 2270 </iq> 2372 Non-overridden L{PubSubResource.publish} yields unsupported 2373 error. 2271 2374 """ 2272 2375 2273 2376 def cb(result): … … 2276 2379 self.assertEquals(NS_PUBSUB_ERRORS, result.appCondition.uri) 2277 2380 self.assertEquals('publish', result.appCondition['feature']) 2278 2381 2279 d = self. handleRequest(xml)2382 d = self.resource.publish(pubsub.PubSubRequest()) 2280 2383 self.assertFailure(d, error.StanzaError) 2281 2384 d.addCallback(cb) 2282 2385 return d … … 2284 2387 2285 2388 def test_subscribe(self): 2286 2389 """ 2287 Non-overridden L{PubSubService.subscribe} yields unsupported error. 2288 """ 2289 2290 xml = """ 2291 <iq type='set' to='pubsub.example.org' 2292 from='user@example.org'> 2293 <pubsub xmlns='http://jabber.org/protocol/pubsub'> 2294 <subscribe node='test' jid='user@example.org/Home'/> 2295 </pubsub> 2296 </iq> 2390 Non-overridden subscriptions yields unsupported error. 2297 2391 """ 2298 2392 2299 2393 def cb(result): … … 2302 2396 self.assertEquals(NS_PUBSUB_ERRORS, result.appCondition.uri) 2303 2397 self.assertEquals('subscribe', result.appCondition['feature']) 2304 2398 2305 d = self. handleRequest(xml)2399 d = self.resource.subscribe(pubsub.PubSubRequest()) 2306 2400 self.assertFailure(d, error.StanzaError) 2307 2401 d.addCallback(cb) 2308 2402 return d … … 2310 2404 2311 2405 def test_unsubscribe(self): 2312 2406 """ 2313 Non-overridden L{PubSubService.unsubscribe} yields unsupported error. 2314 """ 2315 2316 xml = """ 2317 <iq type='set' to='pubsub.example.org' 2318 from='user@example.org'> 2319 <pubsub xmlns='http://jabber.org/protocol/pubsub'> 2320 <unsubscribe node='test' jid='user@example.org/Home'/> 2321 </pubsub> 2322 </iq> 2407 Non-overridden unsubscribe yields unsupported error. 2323 2408 """ 2324 2409 2325 2410 def cb(result): … … 2328 2413 self.assertEquals(NS_PUBSUB_ERRORS, result.appCondition.uri) 2329 2414 self.assertEquals('subscribe', result.appCondition['feature']) 2330 2415 2331 d = self. handleRequest(xml)2416 d = self.resource.unsubscribe(pubsub.PubSubRequest()) 2332 2417 self.assertFailure(d, error.StanzaError) 2333 2418 d.addCallback(cb) 2334 2419 return d … … 2336 2421 2337 2422 def test_subscriptions(self): 2338 2423 """ 2339 Non-overridden L{PubSubService.subscriptions} yields unsupported error. 2340 """ 2341 2342 xml = """ 2343 <iq type='get' to='pubsub.example.org' 2344 from='user@example.org'> 2345 <pubsub xmlns='http://jabber.org/protocol/pubsub'> 2346 <subscriptions/> 2347 </pubsub> 2348 </iq> 2424 Non-overridden subscriptions yields unsupported error. 2349 2425 """ 2350 2426 2351 2427 def cb(result): … … 2355 2431 self.assertEquals('retrieve-subscriptions', 2356 2432 result.appCondition['feature']) 2357 2433 2358 d = self. handleRequest(xml)2434 d = self.resource.subscriptions(pubsub.PubSubRequest()) 2359 2435 self.assertFailure(d, error.StanzaError) 2360 2436 d.addCallback(cb) 2361 2437 return d … … 2363 2439 2364 2440 def test_affiliations(self): 2365 2441 """ 2366 Non-overridden L{PubSubService.affiliations} yields unsupported error. 2367 """ 2368 2369 xml = """ 2370 <iq type='get' to='pubsub.example.org' 2371 from='user@example.org'> 2372 <pubsub xmlns='http://jabber.org/protocol/pubsub'> 2373 <affiliations/> 2374 </pubsub> 2375 </iq> 2442 Non-overridden affiliations yields unsupported error. 2376 2443 """ 2377 2444 2378 2445 def cb(result): … … 2382 2449 self.assertEquals('retrieve-affiliations', 2383 2450 result.appCondition['feature']) 2384 2451 2385 d = self. handleRequest(xml)2452 d = self.resource.affiliations(pubsub.PubSubRequest()) 2386 2453 self.assertFailure(d, error.StanzaError) 2387 2454 d.addCallback(cb) 2388 2455 return d … … 2390 2457 2391 2458 def test_create(self): 2392 2459 """ 2393 Non-overridden L{PubSubService.create} yields unsupported error. 2394 """ 2395 2396 xml = """ 2397 <iq type='set' to='pubsub.example.org' 2398 from='user@example.org'> 2399 <pubsub xmlns='http://jabber.org/protocol/pubsub'> 2400 <create node='mynode'/> 2401 </pubsub> 2402 </iq> 2460 Non-overridden create yields unsupported error. 2403 2461 """ 2404 2462 2405 2463 def cb(result): … … 2408 2466 self.assertEquals(NS_PUBSUB_ERRORS, result.appCondition.uri) 2409 2467 self.assertEquals('create-nodes', result.appCondition['feature']) 2410 2468 2411 d = self. handleRequest(xml)2469 d = self.resource.create(pubsub.PubSubRequest()) 2412 2470 self.assertFailure(d, error.StanzaError) 2413 2471 d.addCallback(cb) 2414 2472 return d 2415 2473 2416 2474 2417 def test_ getDefaultConfiguration(self):2475 def test_default(self): 2418 2476 """ 2419 Non-overridden L{PubSubService.getDefaultConfiguration} yields 2420 unsupported error. 2421 """ 2422 2423 xml = """ 2424 <iq type='get' to='pubsub.example.org' 2425 from='user@example.org'> 2426 <pubsub xmlns='http://jabber.org/protocol/pubsub#owner'> 2427 <default/> 2428 </pubsub> 2429 </iq> 2477 Non-overridden default yields unsupported error. 2430 2478 """ 2431 2479 2432 2480 def cb(result): 2433 2481 self.assertEquals('feature-not-implemented', result.condition) 2434 2482 self.assertEquals('unsupported', result.appCondition.name) 2435 2483 self.assertEquals(NS_PUBSUB_ERRORS, result.appCondition.uri) 2436 self.assertEquals('retrieve-default', result.appCondition['feature']) 2484 self.assertEquals('retrieve-default', 2485 result.appCondition['feature']) 2437 2486 2438 d = self. handleRequest(xml)2487 d = self.resource.default(pubsub.PubSubRequest()) 2439 2488 self.assertFailure(d, error.StanzaError) 2440 2489 d.addCallback(cb) 2441 2490 return d 2442 2491 2443 2492 2444 def test_ getConfiguration(self):2493 def test_configureGet(self): 2445 2494 """ 2446 Non-overridden L{PubSubService.getConfiguration}yields unsupported2495 Non-overridden configureGet yields unsupported 2447 2496 error. 2448 2497 """ 2449 2498 2450 xml = """2451 <iq type='get' to='pubsub.example.org'2452 from='user@example.org'>2453 <pubsub xmlns='http://jabber.org/protocol/pubsub#owner'>2454 <configure/>2455 </pubsub>2456 </iq>2457 """2458 2459 2499 def cb(result): 2460 2500 self.assertEquals('feature-not-implemented', result.condition) 2461 2501 self.assertEquals('unsupported', result.appCondition.name) 2462 2502 self.assertEquals(NS_PUBSUB_ERRORS, result.appCondition.uri) 2463 2503 self.assertEquals('config-node', result.appCondition['feature']) 2464 2504 2465 d = self. handleRequest(xml)2505 d = self.resource.configureGet(pubsub.PubSubRequest()) 2466 2506 self.assertFailure(d, error.StanzaError) 2467 2507 d.addCallback(cb) 2468 2508 return d 2469 2509 2470 2510 2471 def test_ setConfiguration(self):2511 def test_configureSet(self): 2472 2512 """ 2473 Non-overridden L{PubSubService.setConfiguration} yields unsupported 2474 error. 2475 """ 2476 2477 xml = """ 2478 <iq type='set' to='pubsub.example.org' 2479 from='user@example.org'> 2480 <pubsub xmlns='http://jabber.org/protocol/pubsub#owner'> 2481 <configure node='test'> 2482 <x xmlns='jabber:x:data' type='submit'> 2483 <field var='FORM_TYPE' type='hidden'> 2484 <value>http://jabber.org/protocol/pubsub#node_config</value> 2485 </field> 2486 <field var='pubsub#deliver_payloads'><value>0</value></field> 2487 <field var='pubsub#persist_items'><value>1</value></field> 2488 </x> 2489 </configure> 2490 </pubsub> 2491 </iq> 2513 Non-overridden configureSet yields unsupported error. 2492 2514 """ 2493 2515 2494 2516 def cb(result): … … 2497 2519 self.assertEquals(NS_PUBSUB_ERRORS, result.appCondition.uri) 2498 2520 self.assertEquals('config-node', result.appCondition['feature']) 2499 2521 2500 d = self. handleRequest(xml)2522 d = self.resource.configureSet(pubsub.PubSubRequest()) 2501 2523 self.assertFailure(d, error.StanzaError) 2502 2524 d.addCallback(cb) 2503 2525 return d … … 2505 2527 2506 2528 def test_items(self): 2507 2529 """ 2508 Non-overridden L{PubSubService.items} yields unsupported error. 2509 """ 2510 xml = """ 2511 <iq type='get' to='pubsub.example.org' 2512 from='user@example.org'> 2513 <pubsub xmlns='http://jabber.org/protocol/pubsub'> 2514 <items node='test'/> 2515 </pubsub> 2516 </iq> 2530 Non-overridden items yields unsupported error. 2517 2531 """ 2518 2532 2519 2533 def cb(result): … … 2522 2536 self.assertEquals(NS_PUBSUB_ERRORS, result.appCondition.uri) 2523 2537 self.assertEquals('retrieve-items', result.appCondition['feature']) 2524 2538 2525 d = self. handleRequest(xml)2539 d = self.resource.items(pubsub.PubSubRequest()) 2526 2540 self.assertFailure(d, error.StanzaError) 2527 2541 d.addCallback(cb) 2528 2542 return d … … 2530 2544 2531 2545 def test_retract(self): 2532 2546 """ 2533 Non-overridden L{PubSubService.retract} yields unsupported error. 2534 """ 2535 xml = """ 2536 <iq type='set' to='pubsub.example.org' 2537 from='user@example.org'> 2538 <pubsub xmlns='http://jabber.org/protocol/pubsub'> 2539 <retract node='test'> 2540 <item id='item1'/> 2541 <item id='item2'/> 2542 </retract> 2543 </pubsub> 2544 </iq> 2547 Non-overridden retract yields unsupported error. 2545 2548 """ 2546 2549 2547 2550 def cb(result): … … 2550 2553 self.assertEquals(NS_PUBSUB_ERRORS, result.appCondition.uri) 2551 2554 self.assertEquals('retract-items', result.appCondition['feature']) 2552 2555 2553 d = self. handleRequest(xml)2556 d = self.resource.retract(pubsub.PubSubRequest()) 2554 2557 self.assertFailure(d, error.StanzaError) 2555 2558 d.addCallback(cb) 2556 2559 return d … … 2558 2561 2559 2562 def test_purge(self): 2560 2563 """ 2561 Non-overridden L{PubSubService.purge} yields unsupported error. 2562 """ 2563 xml = """ 2564 <iq type='set' to='pubsub.example.org' 2565 from='user@example.org'> 2566 <pubsub xmlns='http://jabber.org/protocol/pubsub#owner'> 2567 <purge node='test'/> 2568 </pubsub> 2569 </iq> 2564 Non-overridden purge yields unsupported error. 2570 2565 """ 2571 2566 2572 2567 def cb(result): … … 2575 2570 self.assertEquals(NS_PUBSUB_ERRORS, result.appCondition.uri) 2576 2571 self.assertEquals('purge-nodes', result.appCondition['feature']) 2577 2572 2578 d = self. handleRequest(xml)2573 d = self.resource.purge(pubsub.PubSubRequest()) 2579 2574 self.assertFailure(d, error.StanzaError) 2580 2575 d.addCallback(cb) 2581 2576 return d … … 2583 2578 2584 2579 def test_delete(self): 2585 2580 """ 2586 Non-overridden L{PubSubService.delete} yields unsupported error. 2587 """ 2588 xml = """ 2589 <iq type='set' to='pubsub.example.org' 2590 from='user@example.org'> 2591 <pubsub xmlns='http://jabber.org/protocol/pubsub#owner'> 2592 <delete node='test'/> 2593 </pubsub> 2594 </iq> 2581 Non-overridden delete yields unsupported error. 2595 2582 """ 2596 2583 2597 2584 def cb(result): … … 2600 2587 self.assertEquals(NS_PUBSUB_ERRORS, result.appCondition.uri) 2601 2588 self.assertEquals('delete-nodes', result.appCondition['feature']) 2602 2589 2603 d = self. handleRequest(xml)2590 d = self.resource.delete(pubsub.PubSubRequest()) 2604 2591 self.assertFailure(d, error.StanzaError) 2605 2592 d.addCallback(cb) 2606 2593 return d
Note: See TracBrowser
for help on using the repository browser.