summaryrefslogtreecommitdiff
path: root/tests/test_stanza_element.py
diff options
context:
space:
mode:
authorLance Stout <lancestout@gmail.com>2011-03-24 12:25:17 -0400
committerLance Stout <lancestout@gmail.com>2011-03-24 12:25:17 -0400
commit6d45971411f88f134abc28051c678986db8e9df8 (patch)
treea7e71c34ef8e539b262249f3bcc514975c314332 /tests/test_stanza_element.py
parent84e2589f2205eb0b88fca92418c17950ab3a3f1b (diff)
downloadslixmpp-6d45971411f88f134abc28051c678986db8e9df8.tar.gz
slixmpp-6d45971411f88f134abc28051c678986db8e9df8.tar.bz2
slixmpp-6d45971411f88f134abc28051c678986db8e9df8.tar.xz
slixmpp-6d45971411f88f134abc28051c678986db8e9df8.zip
Allow a stanza plugin to override a parent's interfaces.
Each interface, say foo, may be overridden in three ways: set_foo get_foo del_foo To declare an override in a plugin, add the class field overrides as so: overrides = ['set_foo', 'del_foo'] Each override must have a matching set_foo(), etc method for implementing the new behaviour. To enable the overrides for a particular parent stanza, pass the option overrides=True to register_stanza_plugin. register_stanza_plugin(Stanza, Plugin, overrides=True) Example code: class Test(ElementBase): name = 'test' namespace = 'testing' interfaces = set(('foo', 'bar')) sub_interfaces = set(('bar',)) class TestOverride(ElementBase): name = 'test-override' namespace = 'testing' plugin_attrib = 'override' interfaces = set(('foo',)) overrides = ['set_foo'] def setup(self, xml): # Don't include an XML element in the parent stanza # since we're adding just an attribute. # If adding a regular subelement, no need to do this. self.xml = ET.Element('') def set_foo(self, value): print("overrides!") self.parent()._set_attr('foo', 'override-%s' % value) register_stanza_plugin(Test, TestOverride, overrides=True) Example usage: >>> t = TestStanza() >>> t['foo'] = 'bar' >>> t['foo'] 'override-bar'
Diffstat (limited to 'tests/test_stanza_element.py')
-rw-r--r--tests/test_stanza_element.py97
1 files changed, 90 insertions, 7 deletions
diff --git a/tests/test_stanza_element.py b/tests/test_stanza_element.py
index f7387d36..dc67d1c5 100644
--- a/tests/test_stanza_element.py
+++ b/tests/test_stanza_element.py
@@ -53,9 +53,8 @@ class TestElementBase(SleekTest):
name = "foo"
namespace = "foo"
interfaces = set(('bar', 'baz'))
- subitem = set((TestSubStanza,))
- register_stanza_plugin(TestStanza, TestStanzaPlugin)
+ register_stanza_plugin(TestStanza, TestStanzaPlugin, iterable=True)
stanza = TestStanza()
stanza['bar'] = 'a'
@@ -100,8 +99,8 @@ class TestElementBase(SleekTest):
name = "foo"
namespace = "foo"
interfaces = set(('bar', 'baz'))
- subitem = set((TestSubStanza,))
+ register_stanza_plugin(TestStanza, TestSubStanza, iterable=True)
register_stanza_plugin(TestStanza, TestStanzaPlugin)
register_stanza_plugin(TestStanza, TestStanzaPlugin2)
@@ -115,7 +114,7 @@ class TestElementBase(SleekTest):
'substanzas': [{'__childtag__': '{foo}subfoo',
'bar': 'c',
'baz': ''}]}
- stanza.setStanzaValues(values)
+ stanza.values = values
self.check(stanza, """
<foo xmlns="foo" bar="a">
@@ -143,7 +142,7 @@ class TestElementBase(SleekTest):
plugin_attrib = "foobar"
interfaces = set(('fizz',))
- TestStanza.subitem = (TestStanza,)
+ register_stanza_plugin(TestStanza, TestStanza, iterable=True)
register_stanza_plugin(TestStanza, TestStanzaPlugin)
stanza = TestStanza()
@@ -457,7 +456,6 @@ class TestElementBase(SleekTest):
namespace = "foo"
interfaces = set(('bar','baz', 'qux'))
sub_interfaces = set(('qux',))
- subitem = (TestSubStanza,)
def setQux(self, value):
self._set_sub_text('qux', text=value)
@@ -470,6 +468,7 @@ class TestElementBase(SleekTest):
namespace = "http://test/slash/bar"
interfaces = set(('attrib',))
+ register_stanza_plugin(TestStanza, TestSubStanza, iterable=True)
register_stanza_plugin(TestStanza, TestStanzaPlugin)
stanza = TestStanza()
@@ -590,7 +589,8 @@ class TestElementBase(SleekTest):
name = "foo"
namespace = "foo"
interfaces = set(('bar', 'baz'))
- subitem = (TestSubStanza,)
+
+ register_stanza_plugin(TestStanza, TestSubStanza, iterable=True)
stanza = TestStanza()
substanza1 = TestSubStanza()
@@ -657,4 +657,87 @@ class TestElementBase(SleekTest):
self.failUnless(stanza1 != stanza2,
"Divergent stanza copies incorrectly compared equal.")
+ def testExtension(self):
+ """Testing using is_extension."""
+
+ class TestStanza(ElementBase):
+ name = "foo"
+ namespace = "foo"
+ interfaces = set(('bar', 'baz'))
+
+ class TestExtension(ElementBase):
+ name = 'extended'
+ namespace = 'foo'
+ plugin_attrib = name
+ interfaces = set((name,))
+ is_extension = True
+
+ def set_extended(self, value):
+ self.xml.text = value
+
+ def get_extended(self):
+ return self.xml.text
+
+ def del_extended(self):
+ self.parent().xml.remove(self.xml)
+
+ register_stanza_plugin(TestStanza, TestExtension)
+
+ stanza = TestStanza()
+ stanza['extended'] = 'testing'
+
+ self.check(stanza, """
+ <foo xmlns="foo">
+ <extended>testing</extended>
+ </foo>
+ """)
+
+ self.failUnless(stanza['extended'] == 'testing',
+ "Could not retrieve stanza extension value.")
+
+ del stanza['extended']
+ self.check(stanza, """
+ <foo xmlns="foo" />
+ """)
+
+ def testOverrides(self):
+ """Test using interface overrides."""
+
+ class TestStanza(ElementBase):
+ name = "foo"
+ namespace = "foo"
+ interfaces = set(('bar', 'baz'))
+
+ class TestOverride(ElementBase):
+ name = 'overrider'
+ namespace = 'foo'
+ plugin_attrib = name
+ interfaces = set(('bar',))
+ overrides = ['set_bar']
+
+ def setup(self, xml):
+ # Don't create XML for the plugin
+ self.xml = ET.Element('')
+
+ def set_bar(self, value):
+ if not value.startswith('override-'):
+ self.parent()._set_attr('bar', 'override-%s' % value)
+ else:
+ self.parent()._set_attr('bar', value)
+
+ stanza = TestStanza()
+ stanza['bar'] = 'foo'
+ self.check(stanza, """
+ <foo xmlns="foo" bar="foo" />
+ """)
+
+ register_stanza_plugin(TestStanza, TestOverride, overrides=True)
+
+ stanza = TestStanza()
+ stanza['bar'] = 'foo'
+ self.check(stanza, """
+ <foo xmlns="foo" bar="override-foo" />
+ """)
+
+
suite = unittest.TestLoader().loadTestsFromTestCase(TestElementBase)