SleekXMPP/tests/test_stanza_xep_0004.py
Lance Stout 017d7ec62b Add tests for setting a form's type to 'submit' or 'cancel'.
Form fields now remember their current type if the type is deleted. This
allows for fields to properly format their values if set after the form
has been changed to the 'submit' type.
2011-08-13 01:28:18 -07:00

198 lines
6.7 KiB
Python

from sleekxmpp.test import *
from sleekxmpp.thirdparty import OrderedDict
import sleekxmpp.plugins.xep_0004 as xep_0004
class TestDataForms(SleekTest):
def setUp(self):
register_stanza_plugin(Message, xep_0004.Form)
register_stanza_plugin(xep_0004.Form, xep_0004.FormField)
register_stanza_plugin(xep_0004.FormField, xep_0004.FieldOption)
def testMultipleInstructions(self):
"""Testing using multiple instructions elements in a data form."""
msg = self.Message()
msg['form']['instructions'] = "Instructions\nSecond batch"
self.check(msg, """
<message>
<x xmlns="jabber:x:data" type="form">
<instructions>Instructions</instructions>
<instructions>Second batch</instructions>
</x>
</message>
""")
def testAddField(self):
"""Testing adding fields to a data form."""
msg = self.Message()
form = msg['form']
form.addField(var='f1',
ftype='text-single',
label='Text',
desc='A text field',
required=True,
value='Some text!')
self.check(msg, """
<message>
<x xmlns="jabber:x:data" type="form">
<field var="f1" type="text-single" label="Text">
<desc>A text field</desc>
<required />
<value>Some text!</value>
</field>
</x>
</message>
""")
fields = OrderedDict()
fields['f1'] = {'type': 'text-single',
'label': 'Username',
'required': True}
fields['f2'] = {'type': 'text-private',
'label': 'Password',
'required': True}
fields['f3'] = {'type': 'text-multi',
'label': 'Message',
'value': 'Enter message.\nA long one even.'}
fields['f4'] = {'type': 'list-single',
'label': 'Message Type',
'options': [{'label': 'Cool!',
'value': 'cool'},
{'label': 'Urgh!',
'value': 'urgh'}]}
form['fields'] = fields
self.check(msg, """
<message>
<x xmlns="jabber:x:data" type="form">
<field var="f1" type="text-single" label="Username">
<required />
</field>
<field var="f2" type="text-private" label="Password">
<required />
</field>
<field var="f3" type="text-multi" label="Message">
<value>Enter message.</value>
<value>A long one even.</value>
</field>
<field var="f4" type="list-single" label="Message Type">
<option label="Cool!">
<value>cool</value>
</option>
<option label="Urgh!">
<value>urgh</value>
</option>
</field>
</x>
</message>
""")
def testSetValues(self):
"""Testing setting form values"""
msg = self.Message()
form = msg['form']
form.add_field(var='foo', ftype='text-single')
form.add_field(var='bar', ftype='list-multi')
form.setValues({'foo': 'Foo!',
'bar': ['a', 'b']})
self.check(msg, """
<message>
<x xmlns="jabber:x:data" type="form">
<field var="foo" type="text-single">
<value>Foo!</value>
</field>
<field var="bar" type="list-multi">
<value>a</value>
<value>b</value>
</field>
</x>
</message>""")
def testSubmitType(self):
"""Test that setting type to 'submit' clears extra details"""
msg = self.Message()
form = msg['form']
fields = OrderedDict()
fields['f1'] = {'type': 'text-single',
'label': 'Username',
'required': True}
fields['f2'] = {'type': 'text-private',
'label': 'Password',
'required': True}
fields['f3'] = {'type': 'text-multi',
'label': 'Message',
'value': 'Enter message.\nA long one even.'}
fields['f4'] = {'type': 'list-single',
'label': 'Message Type',
'options': [{'label': 'Cool!',
'value': 'cool'},
{'label': 'Urgh!',
'value': 'urgh'}]}
form['fields'] = fields
form['type'] = 'submit'
form['values'] = {'f1': 'username',
'f2': 'hunter2',
'f3': 'A long\nmultiline\nmessage',
'f4': 'cool'}
self.check(form, """
<x xmlns="jabber:x:data" type="submit">
<field var="f1">
<value>username</value>
</field>
<field var="f2">
<value>hunter2</value>
</field>
<field var="f3">
<value>A long</value>
<value>multiline</value>
<value>message</value>
</field>
<field var="f4">
<value>cool</value>
</field>
</x>
""", use_values=False)
def testCancelType(self):
"""Test that setting type to 'cancel' clears all fields"""
msg = self.Message()
form = msg['form']
fields = OrderedDict()
fields['f1'] = {'type': 'text-single',
'label': 'Username',
'required': True}
fields['f2'] = {'type': 'text-private',
'label': 'Password',
'required': True}
fields['f3'] = {'type': 'text-multi',
'label': 'Message',
'value': 'Enter message.\nA long one even.'}
fields['f4'] = {'type': 'list-single',
'label': 'Message Type',
'options': [{'label': 'Cool!',
'value': 'cool'},
{'label': 'Urgh!',
'value': 'urgh'}]}
form['fields'] = fields
form['type'] = 'cancel'
self.check(form, """
<x xmlns="jabber:x:data" type="cancel" />
""")
suite = unittest.TestLoader().loadTestsFromTestCase(TestDataForms)