diff --git a/sleekxmpp/xmlstream/stanzabase.py b/sleekxmpp/xmlstream/stanzabase.py index af74919e..d38eb295 100644 --- a/sleekxmpp/xmlstream/stanzabase.py +++ b/sleekxmpp/xmlstream/stanzabase.py @@ -478,7 +478,8 @@ class ElementBase(object): tag = components[0] attributes = components[1:] - if tag not in (self.name, self.plugins, self.plugin_attrib): + if tag not in (self.name, "{%s}%s" % (self.namespace, self.name), + self.plugins, self.plugin_attrib): # The requested tag is not in this stanza, so no match. return False @@ -499,7 +500,8 @@ class ElementBase(object): # Attempt to continue matching the XPath using the stanza's plugins. if not matched_substanzas and len(xpath) > 1: - next_tag = xpath[1].split('@')[0] + # Convert {namespace}tag@attribs to just tag + next_tag = xpath[1].split('@')[0].split('}')[-1] if next_tag in self.plugins: return self.plugins[next_tag].match(xpath[1:]) else: diff --git a/tests/test_elementbase.py b/tests/test_elementbase.py index d749f08e..0eddd30b 100644 --- a/tests/test_elementbase.py +++ b/tests/test_elementbase.py @@ -433,7 +433,7 @@ class TestElementBase(SleekTest): class TestSubStanza(ElementBase): name = "sub" - namespace = "foo" + namespace = "baz" interfaces = set(('attrib',)) class TestStanza(ElementBase): @@ -444,7 +444,7 @@ class TestElementBase(SleekTest): class TestStanzaPlugin(ElementBase): name = "plugin" - namespace = "foo" + namespace = "bar" interfaces = set(('attrib',)) registerStanzaPlugin(TestStanza, TestStanzaPlugin) @@ -453,6 +453,9 @@ class TestElementBase(SleekTest): self.failUnless(stanza.match("foo"), "Stanza did not match its own tag name.") + self.failUnless(stanza.match("{foo}foo"), + "Stanza did not match its own namespaced name.") + stanza['bar'] = 'a' self.failUnless(stanza.match("foo@bar=a"), "Stanza did not match its own name with attribute value check.") @@ -465,11 +468,17 @@ class TestElementBase(SleekTest): self.failUnless(stanza.match("foo/plugin@attrib=c"), "Stanza did not match with plugin and attribute.") + self.failUnless(stanza.match("foo/{bar}plugin"), + "Stanza did not match with namespaced plugin.") + substanza = TestSubStanza() substanza['attrib'] = 'd' stanza.append(substanza) self.failUnless(stanza.match("foo/sub@attrib=d"), "Stanza did not match with substanzas and attribute.") + + self.failUnless(stanza.match("foo/{baz}sub"), + "Stanza did not match with namespaced substanza.") suite = unittest.TestLoader().loadTestsFromTestCase(TestElementBase)