source:
ralphm-patches/pubsub_resource.patch
@
5:231bc3e8b810
Last change on this file since 5:231bc3e8b810 was 5:231bc3e8b810, checked in by Ralph Meijer <ralphm@…>, 13 years ago | |
---|---|
File size: 59.4 KB |
-
wokkel/iwokkel.py
diff -r 2ea6196efcdc 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 2ea6196efcdc 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.toElement()) 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 2ea6196efcdc wokkel/test/test_pubsub.py
a b 13 13 from twisted.words.protocols.jabber import error 14 14 from twisted.words.protocols.jabber.jid import JID 15 15 16 from wokkel import data_form, iwokkel, pubsub, shim16 from wokkel import data_form, disco, iwokkel, pubsub, shim 17 17 from wokkel.generic import parseXml 18 18 from wokkel.test.helpers import TestableRequestHandlerMixin, XmlStreamStub 19 19 … … 1225 1225 1226 1226 def setUp(self): 1227 1227 self.stub = XmlStreamStub() 1228 self.service = pubsub.PubSubService() 1228 self.resource = pubsub.PubSubResource() 1229 self.service = pubsub.PubSubService(self.resource) 1229 1230 self.service.send = self.stub.xmlstream.send 1230 1231 1231 1232 def test_interface(self): … … 1263 1264 Test getDiscoInfo calls getNodeInfo and returns some minimal info. 1264 1265 """ 1265 1266 def cb(info): 1266 self.assertEqual(2, len(info)) 1267 discoInfo = disco.DiscoInfo() 1268 for item in info: 1269 discoInfo.append(item) 1270 self.assertIn(('pubsub', 'service'), discoInfo.identities) 1271 self.assertIn(disco.NS_DISCO_ITEMS, discoInfo.features) 1267 1272 1268 def getNodeInfo(requestor, target, nodeIdentifier):1269 return defer.succeed(None)1270 1271 self.service.getNodeInfo = getNodeInfo1272 1273 d = self.service.getDiscoInfo(JID('user@example.org/home'), 1273 1274 JID('pubsub.example.org'), '') 1274 1275 d.addCallback(cb) 1275 1276 return d 1276 1277 1277 1278 1278 def test_onPublish(self): 1279 def test_getDiscoInfoNodeType(self): 1280 """ 1281 Test getDiscoInfo calls getNodeInfo and returns some minimal info. 1282 """ 1283 def cb(info): 1284 discoInfo = disco.DiscoInfo() 1285 for item in info: 1286 discoInfo.append(item) 1287 self.assertIn(('pubsub', 'collection'), discoInfo.identities) 1288 1289 def getInfo(requestor, target, nodeIdentifier): 1290 return defer.succeed({'type': 'collection', 1291 'meta-data': {}}) 1292 1293 self.resource.getInfo = getInfo 1294 d = self.service.getDiscoInfo(JID('user@example.org/home'), 1295 JID('pubsub.example.org'), '') 1296 d.addCallback(cb) 1297 return d 1298 1299 1300 def test_getDiscoInfoResourceFeatures(self): 1301 """ 1302 Test getDiscoInfo calls getNodeInfo and returns some minimal info. 1303 """ 1304 def cb(info): 1305 discoInfo = disco.DiscoInfo() 1306 for item in info: 1307 discoInfo.append(item) 1308 self.assertIn('http://jabber.org/protocol/pubsub#publish', 1309 discoInfo.features) 1310 1311 self.resource.features = ['publish'] 1312 d = self.service.getDiscoInfo(JID('user@example.org/home'), 1313 JID('pubsub.example.org'), '') 1314 d.addCallback(cb) 1315 return d 1316 1317 1318 def test_getDiscoItemsRoot(self): 1319 """ 1320 Test getDiscoItems on the root node. 1321 """ 1322 def getNodes(requestor, service, nodeIdentifier): 1323 return defer.succeed(['node1', 'node2']) 1324 1325 def cb(items): 1326 self.assertEqual(2, len(items)) 1327 item1, item2 = items 1328 1329 self.assertEqual(JID('pubsub.example.org'), item1.entity) 1330 self.assertEqual('node1', item1.nodeIdentifier) 1331 1332 self.assertEqual(JID('pubsub.example.org'), item2.entity) 1333 self.assertEqual('node2', item2.nodeIdentifier) 1334 1335 self.resource.getNodes = getNodes 1336 d = self.service.getDiscoItems(JID('user@example.org/home'), 1337 JID('pubsub.example.org'), 1338 '') 1339 d.addCallback(cb) 1340 return d 1341 1342 1343 def test_getDiscoItemsRootHideNodes(self): 1344 """ 1345 Test getDiscoItems on the root node. 1346 """ 1347 def getNodes(requestor, service, nodeIdentifier): 1348 raise Exception("Unexpected call to getNodes") 1349 1350 def cb(items): 1351 self.assertEqual([], items) 1352 1353 self.service.hideNodes = True 1354 self.resource.getNodes = getNodes 1355 d = self.service.getDiscoItems(JID('user@example.org/home'), 1356 JID('pubsub.example.org'), 1357 '') 1358 d.addCallback(cb) 1359 return d 1360 1361 1362 def test_getDiscoItemsNonRoot(self): 1363 """ 1364 Test getDiscoItems on a non-root node. 1365 """ 1366 def getNodes(requestor, service, nodeIdentifier): 1367 return defer.succeed(['node1', 'node2']) 1368 1369 def cb(items): 1370 self.assertEqual(2, len(items)) 1371 1372 self.resource.getNodes = getNodes 1373 d = self.service.getDiscoItems(JID('user@example.org/home'), 1374 JID('pubsub.example.org'), 1375 'test') 1376 d.addCallback(cb) 1377 return d 1378 1379 1380 def test_on_publish(self): 1279 1381 """ 1280 1382 A publish request should result in L{PubSubService.publish} being 1281 1383 called. … … 1293 1395 def publish(request): 1294 1396 return defer.succeed(None) 1295 1397 1296 self. service.publish = publish1297 verify.verifyObject(iwokkel.IPubSub Service, self.service)1398 self.resource.publish = publish 1399 verify.verifyObject(iwokkel.IPubSubResource, self.resource) 1298 1400 return self.handleRequest(xml) 1299 1401 1300 1402 1301 def test_on Subscribe(self):1403 def test_on_subscribe(self): 1302 1404 """ 1303 1405 A successful subscription should return the current subscription. 1304 1406 """ … … 1326 1428 self.assertEqual('user@example.org/Home', subscription['jid']) 1327 1429 self.assertEqual('subscribed', subscription['subscription']) 1328 1430 1329 self. service.subscribe = subscribe1330 verify.verifyObject(iwokkel.IPubSub Service, self.service)1431 self.resource.subscribe = subscribe 1432 verify.verifyObject(iwokkel.IPubSubResource, self.resource) 1331 1433 d = self.handleRequest(xml) 1332 1434 d.addCallback(cb) 1333 1435 return d 1334 1436 1335 1437 1336 def test_on SubscribeEmptyNode(self):1438 def test_on_subscribeEmptyNode(self): 1337 1439 """ 1338 1440 A successful subscription on root node should return no node attribute. 1339 1441 """ … … 1355 1457 def cb(element): 1356 1458 self.assertFalse(element.subscription.hasAttribute('node')) 1357 1459 1358 self. service.subscribe = subscribe1359 verify.verifyObject(iwokkel.IPubSub Service, self.service)1460 self.resource.subscribe = subscribe 1461 verify.verifyObject(iwokkel.IPubSubResource, self.resource) 1360 1462 d = self.handleRequest(xml) 1361 1463 d.addCallback(cb) 1362 1464 return d 1363 1465 1364 1466 1365 def test_on Unsubscribe(self):1467 def test_on_unsubscribe(self): 1366 1468 """ 1367 1469 A successful unsubscription should return an empty response. 1368 1470 """ … … 1382 1484 def cb(element): 1383 1485 self.assertIdentical(None, element) 1384 1486 1385 self. service.unsubscribe = unsubscribe1386 verify.verifyObject(iwokkel.IPubSub Service, self.service)1487 self.resource.unsubscribe = unsubscribe 1488 verify.verifyObject(iwokkel.IPubSubResource, self.resource) 1387 1489 d = self.handleRequest(xml) 1388 1490 d.addCallback(cb) 1389 1491 return d 1390 1492 1391 1493 1392 def test_on OptionsGet(self):1494 def test_on_optionsGet(self): 1393 1495 """ 1394 1496 Getting subscription options is not supported. 1395 1497 """ … … 1414 1516 return d 1415 1517 1416 1518 1417 def test_on OptionsSet(self):1519 def test_on_optionsSet(self): 1418 1520 """ 1419 1521 Setting subscription options is not supported. 1420 1522 """ … … 1446 1548 return d 1447 1549 1448 1550 1449 def test_on Subscriptions(self):1551 def test_on_subscriptions(self): 1450 1552 """ 1451 1553 A subscriptions request should result in 1452 1554 L{PubSubService.subscriptions} being called and the result prepared … … 1462 1564 </iq> 1463 1565 """ 1464 1566 1567 def subscriptions(request): 1568 subscription = pubsub.Subscription('test', JID('user@example.org'), 1569 'subscribed') 1570 return defer.succeed([subscription]) 1571 1465 1572 def cb(element): 1466 1573 self.assertEqual('pubsub', element.name) 1467 1574 self.assertEqual(NS_PUBSUB, element.uri) … … 1475 1582 self.assertEqual('test', subscription['node']) 1476 1583 self.assertEqual('subscribed', subscription['subscription']) 1477 1584 1478 1479 def subscriptions(request): 1480 subscription = pubsub.Subscription('test', JID('user@example.org'), 1481 'subscribed') 1482 return defer.succeed([subscription]) 1483 1484 self.service.subscriptions = subscriptions 1485 verify.verifyObject(iwokkel.IPubSubService, self.service) 1585 self.resource.subscriptions = subscriptions 1586 verify.verifyObject(iwokkel.IPubSubResource, self.resource) 1486 1587 d = self.handleRequest(xml) 1487 1588 d.addCallback(cb) 1488 1589 return d 1489 1590 1490 1591 1491 def test_on Affiliations(self):1592 def test_on_affiliations(self): 1492 1593 """ 1493 1594 A subscriptions request should result in 1494 1595 L{PubSubService.affiliations} being called and the result prepared … … 1504 1605 </iq> 1505 1606 """ 1506 1607 1608 def affiliations(request): 1609 affiliation = ('test', 'owner') 1610 return defer.succeed([affiliation]) 1611 1507 1612 def cb(element): 1508 1613 self.assertEqual('pubsub', element.name) 1509 1614 self.assertEqual(NS_PUBSUB, element.uri) … … 1516 1621 self.assertEqual('test', affiliation['node']) 1517 1622 self.assertEqual('owner', affiliation['affiliation']) 1518 1623 1519 1520 def affiliations(request): 1521 affiliation = ('test', 'owner') 1522 return defer.succeed([affiliation]) 1523 1524 self.service.affiliations = affiliations 1525 verify.verifyObject(iwokkel.IPubSubService, self.service) 1624 self.resource.affiliations = affiliations 1625 verify.verifyObject(iwokkel.IPubSubResource, self.resource) 1526 1626 d = self.handleRequest(xml) 1527 1627 d.addCallback(cb) 1528 1628 return d 1529 1629 1530 1630 1531 def test_on Create(self):1631 def test_on_create(self): 1532 1632 """ 1533 1633 Replies to create node requests don't return the created node. 1534 1634 """ … … 1548 1648 def cb(element): 1549 1649 self.assertIdentical(None, element) 1550 1650 1551 self. service.create = create1552 verify.verifyObject(iwokkel.IPubSub Service, self.service)1651 self.resource.create = create 1652 verify.verifyObject(iwokkel.IPubSubResource, self.resource) 1553 1653 d = self.handleRequest(xml) 1554 1654 d.addCallback(cb) 1555 1655 return d 1556 1656 1557 1657 1558 def test_on CreateChanged(self):1658 def test_on_createChanged(self): 1559 1659 """ 1560 1660 Replies to create node requests return the created node if changed. 1561 1661 """ … … 1579 1679 self.assertEqual(u'myrenamednode', 1580 1680 element.create.getAttribute('node')) 1581 1681 1582 self. service.create = create1583 verify.verifyObject(iwokkel.IPubSub Service, self.service)1682 self.resource.create = create 1683 verify.verifyObject(iwokkel.IPubSubResource, self.resource) 1584 1684 d = self.handleRequest(xml) 1585 1685 d.addCallback(cb) 1586 1686 return d 1587 1687 1588 1688 1589 def test_on CreateInstant(self):1689 def test_on_createInstant(self): 1590 1690 """ 1591 1691 Replies to create instant node requests return the created node. 1592 1692 """ … … 1609 1709 self.assertEqual(NS_PUBSUB, element.create.uri) 1610 1710 self.assertEqual(u'random', element.create.getAttribute('node')) 1611 1711 1612 self. service.create = create1613 verify.verifyObject(iwokkel.IPubSub Service, self.service)1712 self.resource.create = create 1713 verify.verifyObject(iwokkel.IPubSubResource, self.resource) 1614 1714 d = self.handleRequest(xml) 1615 1715 d.addCallback(cb) 1616 1716 return d 1617 1717 1618 1718 1619 def test_on Default(self):1719 def test_on_default(self): 1620 1720 """ 1621 1721 A default request should result in 1622 1722 L{PubSubService.getDefaultConfiguration} being called. … … 1641 1741 "label": "Deliver payloads with event notifications"} 1642 1742 } 1643 1743 1644 def getDefaultConfiguration(request):1744 def default(request): 1645 1745 return defer.succeed({}) 1646 1746 1647 1747 def cb(element): … … 1651 1751 form = data_form.Form.fromElement(element.default.x) 1652 1752 self.assertEqual(NS_PUBSUB_CONFIG, form.formNamespace) 1653 1753 1654 self. service.getConfigurationOptions = getConfigurationOptions1655 self. service.getDefaultConfiguration = getDefaultConfiguration1656 verify.verifyObject(iwokkel.IPubSub Service, self.service)1754 self.resource.getConfigurationOptions = getConfigurationOptions 1755 self.resource.default = default 1756 verify.verifyObject(iwokkel.IPubSubResource, self.resource) 1657 1757 d = self.handleRequest(xml) 1658 1758 d.addCallback(cb) 1659 1759 return d 1660 1760 1661 1761 1662 def test_on DefaultCollection(self):1762 def test_on_defaultCollection(self): 1663 1763 """ 1664 1764 Responses to default requests should depend on passed node type. 1665 1765 """ … … 1690 1790 "label": "Deliver payloads with event notifications"} 1691 1791 } 1692 1792 1693 def getDefaultConfiguration(request):1793 def default(request): 1694 1794 return defer.succeed({}) 1695 1795 1696 self. service.getConfigurationOptions = getConfigurationOptions1697 self. service.getDefaultConfiguration = getDefaultConfiguration1698 verify.verifyObject(iwokkel.IPubSub Service, self.service)1796 self.resource.getConfigurationOptions = getConfigurationOptions 1797 self.resource.default = default 1798 verify.verifyObject(iwokkel.IPubSubResource, self.resource) 1699 1799 return self.handleRequest(xml) 1700 1800 1701 1801 1702 def test_on DefaultUnknownNodeType(self):1802 def test_on_defaultUnknownNodeType(self): 1703 1803 """ 1704 1804 A default request should result in 1705 L{PubSub Service.getDefaultConfiguration} being called.1805 L{PubSubResource.default} being called. 1706 1806 """ 1707 1807 1708 1808 xml = """ … … 1724 1824 </iq> 1725 1825 """ 1726 1826 1727 def getDefaultConfiguration(request):1827 def default(request): 1728 1828 self.fail("Unexpected call to getConfiguration") 1729 1829 1730 1830 def cb(result): 1731 1831 self.assertEquals('not-acceptable', result.condition) 1732 1832 1733 self. service.getDefaultConfiguration = getDefaultConfiguration1734 verify.verifyObject(iwokkel.IPubSub Service, self.service)1833 self.resource.default = default 1834 verify.verifyObject(iwokkel.IPubSubResource, self.resource) 1735 1835 d = self.handleRequest(xml) 1736 1836 self.assertFailure(d, error.StanzaError) 1737 1837 d.addCallback(cb) 1738 1838 return d 1739 1839 1740 1840 1741 def test_on ConfigureGet(self):1841 def test_on_configureGet(self): 1742 1842 """ 1743 On a node configuration get request L{PubSubService.getConfiguration} 1744 is called and results in a data form with the configuration. 1843 On a node configuration get 1844 requestL{PubSubResource.configureGet} is called and results in a 1845 data form with the configuration. 1745 1846 """ 1746 1847 1747 1848 xml = """ … … 1766 1867 "label": "Owner of the node"} 1767 1868 } 1768 1869 1769 def getConfiguration(request):1870 def configureGet(request): 1770 1871 return defer.succeed({'pubsub#deliver_payloads': '0', 1771 1872 'pubsub#persist_items': '1', 1772 1873 'pubsub#owner': JID('user@example.org'), … … 1800 1901 1801 1902 self.assertNotIn('x-myfield', fields) 1802 1903 1803 1804 self.service.getConfigurationOptions = getConfigurationOptions 1805 self.service.getConfiguration = getConfiguration 1806 verify.verifyObject(iwokkel.IPubSubService, self.service) 1904 self.resource.getConfigurationOptions = getConfigurationOptions 1905 self.resource.configureGet = configureGet 1906 verify.verifyObject(iwokkel.IPubSubResource, self.resource) 1807 1907 d = self.handleRequest(xml) 1808 1908 d.addCallback(cb) 1809 1909 return d 1810 1910 1811 1911 1812 def test_on ConfigureSet(self):1912 def test_on_configureSet(self): 1813 1913 """ 1814 1914 On a node configuration set request the Data Form is parsed and 1815 L{PubSub Service.setConfiguration} is called with the passed options.1915 L{PubSubResource.configureSet} is called with the passed options. 1816 1916 """ 1817 1917 1818 1918 xml = """ … … 1842 1942 "label": "Deliver payloads with event notifications"} 1843 1943 } 1844 1944 1845 def setConfiguration(request):1945 def configureSet(request): 1846 1946 self.assertEqual({'pubsub#deliver_payloads': False, 1847 1947 'pubsub#persist_items': True}, request.options) 1848 1948 return defer.succeed(None) 1849 1949 1850 self. service.getConfigurationOptions = getConfigurationOptions1851 self. service.setConfiguration = setConfiguration1852 verify.verifyObject(iwokkel.IPubSub Service, self.service)1950 self.resource.getConfigurationOptions = getConfigurationOptions 1951 self.resource.configureSet = configureSet 1952 verify.verifyObject(iwokkel.IPubSubResource, self.resource) 1853 1953 return self.handleRequest(xml) 1854 1954 1855 1955 1856 def test_on ConfigureSetCancel(self):1956 def test_on_configureSetCancel(self): 1857 1957 """ 1858 The node configuration is cancelled, L{PubSubService.setConfiguration}1859 not called.1958 The node configuration is cancelled, 1959 L{PubSubResource.configureSet} not called. 1860 1960 """ 1861 1961 1862 1962 xml = """ … … 1874 1974 </iq> 1875 1975 """ 1876 1976 1877 def setConfiguration(request):1977 def configureSet(request): 1878 1978 self.fail("Unexpected call to setConfiguration") 1879 1979 1880 self. service.setConfiguration = setConfiguration1881 verify.verifyObject(iwokkel.IPubSub Service, self.service)1980 self.resource.configureSet = configureSet 1981 verify.verifyObject(iwokkel.IPubSubResource, self.resource) 1882 1982 return self.handleRequest(xml) 1883 1983 1884 1984 1885 def test_on ConfigureSetIgnoreUnknown(self):1985 def test_on_configureSetIgnoreUnknown(self): 1886 1986 """ 1887 1987 On a node configuration set request unknown fields should be ignored. 1888 1988 """ … … 1914 2014 "label": "Deliver payloads with event notifications"} 1915 2015 } 1916 2016 1917 def setConfiguration(request):2017 def configureSet(request): 1918 2018 self.assertEquals(['pubsub#deliver_payloads'], 1919 2019 request.options.keys()) 1920 2020 1921 self. service.getConfigurationOptions = getConfigurationOptions1922 self. service.setConfiguration = setConfiguration1923 verify.verifyObject(iwokkel.IPubSub Service, self.service)2021 self.resource.getConfigurationOptions = getConfigurationOptions 2022 self.resource.configureSet = configureSet 2023 verify.verifyObject(iwokkel.IPubSubResource, self.resource) 1924 2024 return self.handleRequest(xml) 1925 2025 1926 2026 1927 def test_on ConfigureSetBadFormType(self):2027 def test_on_configureSetBadFormType(self): 1928 2028 """ 1929 2029 On a node configuration set request unknown fields should be ignored. 1930 2030 """ … … 1955 2055 return d 1956 2056 1957 2057 1958 def test_on Items(self):2058 def test_on_items(self): 1959 2059 """ 1960 2060 On a items request, return all items for the given node. 1961 2061 """ … … 1981 2081 self.assertEqual(NS_PUBSUB, item.uri) 1982 2082 self.assertEqual('current', item['id']) 1983 2083 1984 self.service.items = items 2084 self.resource.items = items 2085 verify.verifyObject(iwokkel.IPubSubResource, self.resource) 1985 2086 d = self.handleRequest(xml) 1986 2087 d.addCallback(cb) 1987 2088 return d 1988 2089 1989 2090 1990 def test_on Retract(self):2091 def test_on_retract(self): 1991 2092 """ 1992 A retract request should result in L{PubSub Service.retract} being1993 called.2093 A retract request should result in L{PubSubResource.retract} 2094 being called. 1994 2095 """ 1995 2096 1996 2097 xml = """ … … 2008 2109 def retract(request): 2009 2110 return defer.succeed(None) 2010 2111 2011 self.service.retract = retract 2112 self.resource.retract = retract 2113 verify.verifyObject(iwokkel.IPubSubResource, self.resource) 2012 2114 return self.handleRequest(xml) 2013 2115 2014 2116 2015 def test_on Purge(self):2117 def test_on_purge(self): 2016 2118 """ 2017 A purge request should result in L{PubSub Service.purge} being2119 A purge request should result in L{PubSubResource.purge} being 2018 2120 called. 2019 2121 """ 2020 2122 … … 2030 2132 def purge(request): 2031 2133 return defer.succeed(None) 2032 2134 2033 self.service.purge = purge 2135 self.resource.purge = purge 2136 verify.verifyObject(iwokkel.IPubSubResource, self.resource) 2034 2137 return self.handleRequest(xml) 2035 2138 2036 2139 2037 def test_on Delete(self):2140 def test_on_delete(self): 2038 2141 """ 2039 A delete request should result in L{PubSub Service.delete} being2142 A delete request should result in L{PubSubResource.delete} being 2040 2143 called. 2041 2144 """ 2042 2145 … … 2052 2155 def delete(request): 2053 2156 return defer.succeed(None) 2054 2157 2055 self.service.delete = delete 2158 self.resource.delete = delete 2159 verify.verifyObject(iwokkel.IPubSubResource, self.resource) 2056 2160 return self.handleRequest(xml) 2057 2161 2058 2162 … … 2103 2207 self.assertEqual(redirectURI, message.event.delete.redirect['uri']) 2104 2208 2105 2209 2106 def test_on SubscriptionsGet(self):2210 def test_on_subscriptionsGet(self): 2107 2211 """ 2108 2212 Getting subscription options is not supported. 2109 2213 """ … … 2130 2234 return d 2131 2235 2132 2236 2133 def test_on SubscriptionsSet(self):2237 def test_on_subscriptionsSet(self): 2134 2238 """ 2135 2239 Setting subscription options is not supported. 2136 2240 """ … … 2157 2261 return d 2158 2262 2159 2263 2160 def test_on AffiliationsGet(self):2264 def test_on_affiliationsGet(self): 2161 2265 """ 2162 2266 Getting subscription options is not supported. 2163 2267 """ … … 2184 2288 return d 2185 2289 2186 2290 2187 def test_on AffiliationsSet(self):2291 def test_on_affiliationsSet(self): 2188 2292 """ 2189 2293 Setting subscription options is not supported. 2190 2294 """ … … 2211 2315 return d 2212 2316 2213 2317 2318 2319 class PubSubResourceTest(unittest.TestCase): 2320 2321 def setUp(self): 2322 self.resource = pubsub.PubSubResource() 2323 2324 2325 def test_interface(self): 2326 """ 2327 Do instances of L{pubsub.PubSubResource} provide L{iwokkel.IPubSubResource}? 2328 """ 2329 verify.verifyObject(iwokkel.IPubSubResource, self.resource) 2330 2331 2332 def test_getNodes(self): 2333 """ 2334 Default getNodes returns an empty list. 2335 """ 2336 def cb(nodes): 2337 self.assertEquals([], nodes) 2338 2339 d = self.resource.getNodes(JID('user@example.org/home'), 2340 JID('pubsub.example.org'), 2341 '') 2342 d.addCallback(cb) 2343 return d 2344 2345 2214 2346 def test_publish(self): 2215 2347 """ 2216 Non-overridden L{PubSubService.publish} yields unsupported error. 2217 """ 2218 2219 xml = """ 2220 <iq type='set' to='pubsub.example.org' 2221 from='user@example.org'> 2222 <pubsub xmlns='http://jabber.org/protocol/pubsub'> 2223 <publish node='mynode'/> 2224 </pubsub> 2225 </iq> 2348 Non-overridden L{PubSubResource.publish} yields unsupported 2349 error. 2226 2350 """ 2227 2351 2228 2352 def cb(result): … … 2231 2355 self.assertEquals(NS_PUBSUB_ERRORS, result.appCondition.uri) 2232 2356 self.assertEquals('publish', result.appCondition['feature']) 2233 2357 2234 d = self. handleRequest(xml)2358 d = self.resource.publish(pubsub.PubSubRequest()) 2235 2359 self.assertFailure(d, error.StanzaError) 2236 2360 d.addCallback(cb) 2237 2361 return d … … 2239 2363 2240 2364 def test_subscribe(self): 2241 2365 """ 2242 Non-overridden L{PubSubService.subscribe} yields unsupported error. 2243 """ 2244 2245 xml = """ 2246 <iq type='set' to='pubsub.example.org' 2247 from='user@example.org'> 2248 <pubsub xmlns='http://jabber.org/protocol/pubsub'> 2249 <subscribe node='test' jid='user@example.org/Home'/> 2250 </pubsub> 2251 </iq> 2366 Non-overridden subscriptions yields unsupported error. 2252 2367 """ 2253 2368 2254 2369 def cb(result): … … 2257 2372 self.assertEquals(NS_PUBSUB_ERRORS, result.appCondition.uri) 2258 2373 self.assertEquals('subscribe', result.appCondition['feature']) 2259 2374 2260 d = self. handleRequest(xml)2375 d = self.resource.subscribe(pubsub.PubSubRequest()) 2261 2376 self.assertFailure(d, error.StanzaError) 2262 2377 d.addCallback(cb) 2263 2378 return d … … 2265 2380 2266 2381 def test_unsubscribe(self): 2267 2382 """ 2268 Non-overridden L{PubSubService.unsubscribe} yields unsupported error. 2269 """ 2270 2271 xml = """ 2272 <iq type='set' to='pubsub.example.org' 2273 from='user@example.org'> 2274 <pubsub xmlns='http://jabber.org/protocol/pubsub'> 2275 <unsubscribe node='test' jid='user@example.org/Home'/> 2276 </pubsub> 2277 </iq> 2383 Non-overridden unsubscribe yields unsupported error. 2278 2384 """ 2279 2385 2280 2386 def cb(result): … … 2283 2389 self.assertEquals(NS_PUBSUB_ERRORS, result.appCondition.uri) 2284 2390 self.assertEquals('subscribe', result.appCondition['feature']) 2285 2391 2286 d = self. handleRequest(xml)2392 d = self.resource.unsubscribe(pubsub.PubSubRequest()) 2287 2393 self.assertFailure(d, error.StanzaError) 2288 2394 d.addCallback(cb) 2289 2395 return d … … 2291 2397 2292 2398 def test_subscriptions(self): 2293 2399 """ 2294 Non-overridden L{PubSubService.subscriptions} yields unsupported error. 2295 """ 2296 2297 xml = """ 2298 <iq type='get' to='pubsub.example.org' 2299 from='user@example.org'> 2300 <pubsub xmlns='http://jabber.org/protocol/pubsub'> 2301 <subscriptions/> 2302 </pubsub> 2303 </iq> 2400 Non-overridden subscriptions yields unsupported error. 2304 2401 """ 2305 2402 2306 2403 def cb(result): … … 2310 2407 self.assertEquals('retrieve-subscriptions', 2311 2408 result.appCondition['feature']) 2312 2409 2313 d = self. handleRequest(xml)2410 d = self.resource.subscriptions(pubsub.PubSubRequest()) 2314 2411 self.assertFailure(d, error.StanzaError) 2315 2412 d.addCallback(cb) 2316 2413 return d … … 2318 2415 2319 2416 def test_affiliations(self): 2320 2417 """ 2321 Non-overridden L{PubSubService.affiliations} yields unsupported error. 2322 """ 2323 2324 xml = """ 2325 <iq type='get' to='pubsub.example.org' 2326 from='user@example.org'> 2327 <pubsub xmlns='http://jabber.org/protocol/pubsub'> 2328 <affiliations/> 2329 </pubsub> 2330 </iq> 2418 Non-overridden affiliations yields unsupported error. 2331 2419 """ 2332 2420 2333 2421 def cb(result): … … 2337 2425 self.assertEquals('retrieve-affiliations', 2338 2426 result.appCondition['feature']) 2339 2427 2340 d = self. handleRequest(xml)2428 d = self.resource.affiliations(pubsub.PubSubRequest()) 2341 2429 self.assertFailure(d, error.StanzaError) 2342 2430 d.addCallback(cb) 2343 2431 return d … … 2345 2433 2346 2434 def test_create(self): 2347 2435 """ 2348 Non-overridden L{PubSubService.create} yields unsupported error. 2349 """ 2350 2351 xml = """ 2352 <iq type='set' to='pubsub.example.org' 2353 from='user@example.org'> 2354 <pubsub xmlns='http://jabber.org/protocol/pubsub'> 2355 <create node='mynode'/> 2356 </pubsub> 2357 </iq> 2436 Non-overridden create yields unsupported error. 2358 2437 """ 2359 2438 2360 2439 def cb(result): … … 2363 2442 self.assertEquals(NS_PUBSUB_ERRORS, result.appCondition.uri) 2364 2443 self.assertEquals('create-nodes', result.appCondition['feature']) 2365 2444 2366 d = self. handleRequest(xml)2445 d = self.resource.create(pubsub.PubSubRequest()) 2367 2446 self.assertFailure(d, error.StanzaError) 2368 2447 d.addCallback(cb) 2369 2448 return d 2370 2449 2371 2450 2372 def test_ getDefaultConfiguration(self):2451 def test_default(self): 2373 2452 """ 2374 Non-overridden L{PubSubService.getDefaultConfiguration} yields 2375 unsupported error. 2376 """ 2377 2378 xml = """ 2379 <iq type='get' to='pubsub.example.org' 2380 from='user@example.org'> 2381 <pubsub xmlns='http://jabber.org/protocol/pubsub#owner'> 2382 <default/> 2383 </pubsub> 2384 </iq> 2453 Non-overridden default yields unsupported error. 2385 2454 """ 2386 2455 2387 2456 def cb(result): 2388 2457 self.assertEquals('feature-not-implemented', result.condition) 2389 2458 self.assertEquals('unsupported', result.appCondition.name) 2390 2459 self.assertEquals(NS_PUBSUB_ERRORS, result.appCondition.uri) 2391 self.assertEquals('retrieve-default', result.appCondition['feature']) 2460 self.assertEquals('retrieve-default', 2461 result.appCondition['feature']) 2392 2462 2393 d = self. handleRequest(xml)2463 d = self.resource.default(pubsub.PubSubRequest()) 2394 2464 self.assertFailure(d, error.StanzaError) 2395 2465 d.addCallback(cb) 2396 2466 return d 2397 2467 2398 2468 2399 def test_ getConfiguration(self):2469 def test_configureGet(self): 2400 2470 """ 2401 Non-overridden L{PubSubService.getConfiguration}yields unsupported2471 Non-overridden configureGet yields unsupported 2402 2472 error. 2403 2473 """ 2404 2474 2405 xml = """2406 <iq type='get' to='pubsub.example.org'2407 from='user@example.org'>2408 <pubsub xmlns='http://jabber.org/protocol/pubsub#owner'>2409 <configure/>2410 </pubsub>2411 </iq>2412 """2413 2414 2475 def cb(result): 2415 2476 self.assertEquals('feature-not-implemented', result.condition) 2416 2477 self.assertEquals('unsupported', result.appCondition.name) 2417 2478 self.assertEquals(NS_PUBSUB_ERRORS, result.appCondition.uri) 2418 2479 self.assertEquals('config-node', result.appCondition['feature']) 2419 2480 2420 d = self. handleRequest(xml)2481 d = self.resource.configureGet(pubsub.PubSubRequest()) 2421 2482 self.assertFailure(d, error.StanzaError) 2422 2483 d.addCallback(cb) 2423 2484 return d 2424 2485 2425 2486 2426 def test_ setConfiguration(self):2487 def test_configureSet(self): 2427 2488 """ 2428 Non-overridden L{PubSubService.setConfiguration} yields unsupported 2429 error. 2430 """ 2431 2432 xml = """ 2433 <iq type='set' to='pubsub.example.org' 2434 from='user@example.org'> 2435 <pubsub xmlns='http://jabber.org/protocol/pubsub#owner'> 2436 <configure node='test'> 2437 <x xmlns='jabber:x:data' type='submit'> 2438 <field var='FORM_TYPE' type='hidden'> 2439 <value>http://jabber.org/protocol/pubsub#node_config</value> 2440 </field> 2441 <field var='pubsub#deliver_payloads'><value>0</value></field> 2442 <field var='pubsub#persist_items'><value>1</value></field> 2443 </x> 2444 </configure> 2445 </pubsub> 2446 </iq> 2489 Non-overridden configureSet yields unsupported error. 2447 2490 """ 2448 2491 2449 2492 def cb(result): … … 2452 2495 self.assertEquals(NS_PUBSUB_ERRORS, result.appCondition.uri) 2453 2496 self.assertEquals('config-node', result.appCondition['feature']) 2454 2497 2455 d = self. handleRequest(xml)2498 d = self.resource.configureSet(pubsub.PubSubRequest()) 2456 2499 self.assertFailure(d, error.StanzaError) 2457 2500 d.addCallback(cb) 2458 2501 return d … … 2460 2503 2461 2504 def test_items(self): 2462 2505 """ 2463 Non-overridden L{PubSubService.items} yields unsupported error. 2464 """ 2465 xml = """ 2466 <iq type='get' to='pubsub.example.org' 2467 from='user@example.org'> 2468 <pubsub xmlns='http://jabber.org/protocol/pubsub'> 2469 <items node='test'/> 2470 </pubsub> 2471 </iq> 2506 Non-overridden items yields unsupported error. 2472 2507 """ 2473 2508 2474 2509 def cb(result): … … 2477 2512 self.assertEquals(NS_PUBSUB_ERRORS, result.appCondition.uri) 2478 2513 self.assertEquals('retrieve-items', result.appCondition['feature']) 2479 2514 2480 d = self. handleRequest(xml)2515 d = self.resource.items(pubsub.PubSubRequest()) 2481 2516 self.assertFailure(d, error.StanzaError) 2482 2517 d.addCallback(cb) 2483 2518 return d … … 2485 2520 2486 2521 def test_retract(self): 2487 2522 """ 2488 Non-overridden L{PubSubService.retract} yields unsupported error. 2489 """ 2490 xml = """ 2491 <iq type='set' to='pubsub.example.org' 2492 from='user@example.org'> 2493 <pubsub xmlns='http://jabber.org/protocol/pubsub'> 2494 <retract node='test'> 2495 <item id='item1'/> 2496 <item id='item2'/> 2497 </retract> 2498 </pubsub> 2499 </iq> 2523 Non-overridden retract yields unsupported error. 2500 2524 """ 2501 2525 2502 2526 def cb(result): … … 2505 2529 self.assertEquals(NS_PUBSUB_ERRORS, result.appCondition.uri) 2506 2530 self.assertEquals('retract-items', result.appCondition['feature']) 2507 2531 2508 d = self. handleRequest(xml)2532 d = self.resource.retract(pubsub.PubSubRequest()) 2509 2533 self.assertFailure(d, error.StanzaError) 2510 2534 d.addCallback(cb) 2511 2535 return d … … 2513 2537 2514 2538 def test_purge(self): 2515 2539 """ 2516 Non-overridden L{PubSubService.purge} yields unsupported error. 2517 """ 2518 xml = """ 2519 <iq type='set' to='pubsub.example.org' 2520 from='user@example.org'> 2521 <pubsub xmlns='http://jabber.org/protocol/pubsub#owner'> 2522 <purge node='test'/> 2523 </pubsub> 2524 </iq> 2540 Non-overridden purge yields unsupported error. 2525 2541 """ 2526 2542 2527 2543 def cb(result): … … 2530 2546 self.assertEquals(NS_PUBSUB_ERRORS, result.appCondition.uri) 2531 2547 self.assertEquals('purge-nodes', result.appCondition['feature']) 2532 2548 2533 d = self. handleRequest(xml)2549 d = self.resource.purge(pubsub.PubSubRequest()) 2534 2550 self.assertFailure(d, error.StanzaError) 2535 2551 d.addCallback(cb) 2536 2552 return d … … 2538 2554 2539 2555 def test_delete(self): 2540 2556 """ 2541 Non-overridden L{PubSubService.delete} yields unsupported error. 2542 """ 2543 xml = """ 2544 <iq type='set' to='pubsub.example.org' 2545 from='user@example.org'> 2546 <pubsub xmlns='http://jabber.org/protocol/pubsub#owner'> 2547 <delete node='test'/> 2548 </pubsub> 2549 </iq> 2557 Non-overridden delete yields unsupported error. 2550 2558 """ 2551 2559 2552 2560 def cb(result): … … 2555 2563 self.assertEquals(NS_PUBSUB_ERRORS, result.appCondition.uri) 2556 2564 self.assertEquals('delete-nodes', result.appCondition['feature']) 2557 2565 2558 d = self. handleRequest(xml)2566 d = self.resource.delete(pubsub.PubSubRequest()) 2559 2567 self.assertFailure(d, error.StanzaError) 2560 2568 d.addCallback(cb) 2561 2569 return d
Note: See TracBrowser
for help on using the repository browser.