# HG changeset patch # Parent 9afc7ecd4201daf011d4abe5315fc3e1deb9503d Make sure item and subscription elements get the correct namespace. This complements the changes in [f4aa0d507bc8] and [3fe44cf07366] for item and subscription elements that are used in different namespaces. These changesets set the namespace to `None`, which works nicely when the elements are serialized. However, in situations where the DOM representation is passed around (in-process communication) these elements are no longer matched by namespace. This change makes sure the elements get the proper namespace just before they are sent out. diff -r 9afc7ecd4201 wokkel/pubsub.py --- a/wokkel/pubsub.py Mon Feb 28 20:37:55 2011 +0100 +++ b/wokkel/pubsub.py Mon Feb 28 20:38:27 2011 +0100 @@ -138,13 +138,13 @@ subscriptionIdentifier=element.getAttribute('subid')) - def toElement(self): + def toElement(self, defaultUri=None): """ Return the DOM representation of this subscription. @rtype: L{domish.Element} """ - element = domish.Element((None, 'subscription')) + element = domish.Element((defaultUri, 'subscription')) if self.nodeIdentifier: element['node'] = self.nodeIdentifier element['jid'] = unicode(self.subscriber) @@ -358,6 +358,7 @@ """ if self.items: for item in self.items: + item.uri = NS_PUBSUB verbElement.addChild(item) @@ -1213,7 +1214,7 @@ def _toResponse_subscribe(self, result, resource, request): response = domish.Element((NS_PUBSUB, "pubsub")) - response.addChild(result.toElement()) + response.addChild(result.toElement(NS_PUBSUB)) return response @@ -1221,7 +1222,7 @@ response = domish.Element((NS_PUBSUB, 'pubsub')) subscriptions = response.addElement('subscriptions') for subscription in result: - subscriptions.addChild(subscription.toElement()) + subscriptions.addChild(subscription.toElement(NS_PUBSUB)) return response @@ -1307,6 +1308,7 @@ items["node"] = request.nodeIdentifier for item in result: + item.uri = NS_PUBSUB items.addChild(item) return response @@ -1357,7 +1359,9 @@ message = self._createNotification('items', service, nodeIdentifier, subscriber, subscriptions) - message.event.items.children = items + for item in items: + item.uri = NS_PUBSUB_EVENT + message.event.items.addChild(item) self.send(message) diff -r 9afc7ecd4201 wokkel/test/test_pubsub.py --- a/wokkel/test/test_pubsub.py Mon Feb 28 20:37:55 2011 +0100 +++ b/wokkel/test/test_pubsub.py Mon Feb 28 20:38:27 2011 +0100 @@ -462,12 +462,8 @@ self.assertEquals(1, len(children)) child = children[0] self.assertEquals('test', child['node']) - - items = [] - for element in child.elements(): - if element.name == 'item' and element.uri in (NS_PUBSUB, None): - items.append(element) - + items = list(domish.generateElementsQNamed(child.children, + 'item', NS_PUBSUB)) self.assertEquals(1, len(items)) self.assertIdentical(item, items[0]) @@ -2217,7 +2213,7 @@ self.assertEqual('pubsub', element.name) self.assertEqual(NS_PUBSUB, element.uri) subscription = element.subscription - self.assertIn(subscription.uri, (None, NS_PUBSUB)) + self.assertEqual(NS_PUBSUB, subscription.uri) self.assertEqual('test', subscription['node']) self.assertEqual('user@example.org/Home', subscription['jid']) self.assertEqual('subscribed', subscription['subscription']) @@ -2430,7 +2426,7 @@ self.assertEqual(1, len(children)) subscription = children[0] self.assertEqual('subscription', subscription.name) - self.assertIn(subscription.uri, (None, NS_PUBSUB)) + self.assertEqual(NS_PUBSUB, subscription.uri, NS_PUBSUB) self.assertEqual('user@example.org', subscription['jid']) self.assertEqual('test', subscription['node']) self.assertEqual('subscribed', subscription['subscription']) @@ -2980,7 +2976,7 @@ item = element.items.children[-1] self.assertTrue(domish.IElement.providedBy(item)) self.assertEqual('item', item.name) - self.assertIn(item.uri, (NS_PUBSUB, None)) + self.assertEqual(NS_PUBSUB, item.uri) self.assertEqual('current', item['id']) self.resource.items = items @@ -3062,6 +3058,56 @@ return self.handleRequest(xml) + def test_notifyPublish(self): + """ + Publish notifications are sent to the subscribers. + """ + subscriber = JID('user@example.org') + subscriptions = [pubsub.Subscription('test', subscriber, 'subscribed')] + items = [pubsub.Item('current')] + notifications = [(subscriber, subscriptions, items)] + self.service.notifyPublish(JID('pubsub.example.org'), 'test', + notifications) + message = self.stub.output[-1] + + self.assertEquals('message', message.name) + self.assertIdentical(None, message.uri) + self.assertEquals('user@example.org', message['to']) + self.assertEquals('pubsub.example.org', message['from']) + self.assertTrue(message.event) + self.assertEquals(NS_PUBSUB_EVENT, message.event.uri) + self.assertTrue(message.event.items) + self.assertEquals(NS_PUBSUB_EVENT, message.event.items.uri) + self.assertTrue(message.event.items.hasAttribute('node')) + self.assertEquals('test', message.event.items['node']) + itemElements = list(domish.generateElementsQNamed( + message.event.items.children, 'item', NS_PUBSUB_EVENT)) + self.assertEquals(1, len(itemElements)) + self.assertEquals('current', itemElements[0].getAttribute('id')) + + + def test_notifyPublishCollection(self): + """ + Publish notifications are sent to the subscribers of collections. + + The node the item was published to is on the C{items} element, while + the subscribed-to node is in the C{'Collections'} SHIM header. + """ + subscriber = JID('user@example.org') + subscriptions = [pubsub.Subscription('', subscriber, 'subscribed')] + items = [pubsub.Item('current')] + notifications = [(subscriber, subscriptions, items)] + self.service.notifyPublish(JID('pubsub.example.org'), 'test', + notifications) + message = self.stub.output[-1] + + self.assertTrue(message.event.items.hasAttribute('node')) + self.assertEquals('test', message.event.items['node']) + headers = shim.extractHeaders(message) + self.assertIn('Collection', headers) + self.assertIn('', headers['Collection']) + + def test_notifyDelete(self): """ Subscribers should be sent a delete notification.