diff options
author | Jacek Konieczny <jajcus@jajcus.net> | 2005-03-17 00:53:32 +0300 |
---|---|---|
committer | Jacek Konieczny <jajcus@jajcus.net> | 2005-03-17 00:53:32 +0300 |
commit | 2bbbe6c9b1d27a78a1601f8fb97b0cee65a9cf64 (patch) | |
tree | 88a0541b79e590e91e948a7eac932aa28b8d125f /tests | |
parent | d432cc7a678e64114ee7ddbb8be8fe7645495027 (diff) |
- Data Forms (JEP-0004) implementation
Diffstat (limited to 'tests')
-rwxr-xr-x | tests/all.py | 2 | ||||
-rwxr-xr-x | tests/dataforms.py | 427 |
2 files changed, 428 insertions, 1 deletions
diff --git a/tests/all.py b/tests/all.py index a08f018..34e0423 100755 --- a/tests/all.py +++ b/tests/all.py @@ -5,7 +5,7 @@ import sys import getopt all_modules=["vcard","jid","disco","imports","cache","stream_reader", "ns_operations", - "message", "presence"] + "message", "presence", "dataforms"] def suite(modules=None): if not modules: diff --git a/tests/dataforms.py b/tests/dataforms.py new file mode 100755 index 0000000..a05da7d --- /dev/null +++ b/tests/dataforms.py @@ -0,0 +1,427 @@ +#!/usr/bin/python +# -*- coding: UTF-8 -*- + +import unittest +import libxml2 +from pyxmpp.jabber.dataforms import Form, Field, Option +from pyxmpp.jid import JID + + +class TestForm(unittest.TestCase): + def test_empty_form_type(self): + form = self.parse_form(empty_form) + self.failUnlessEqual(form.type,"form") + self.failIf(form.title) + self.failIf(form.instructions) + self.failIf(form.fields) + self.failIf(form.items) + self.failIf(form.reported_fields) + self.failIf(list(form)) + form = self.parse_form(empty_submit) + self.failUnlessEqual(form.type,"submit") + form = self.parse_form(empty_cancel) + self.failUnlessEqual(form.type,"cancel") + form = self.parse_form(empty_result) + self.failUnlessEqual(form.type,"result") + + def test_jep4_example2_basic(self): + form = self.parse_form(jep4_example2) + self.check_form_info(form, jep4_example2_info) + + def test_jep4_example2_iter(self): + form = self.parse_form(jep4_example2) + self.check_form_iter(form, jep4_example2_fields) + + def test_jep4_example2_mapping(self): + form = self.parse_form(jep4_example2) + self.check_form_iter(form, jep4_example2_fields) + + def test_jep4_example2_build_inc(self): + form = self.build_form_inc("form", u"Bot Configuration", + u"Fill out this form to configure your new bot!", jep4_example2_fields) + self.check_form_info(form, jep4_example2_info) + self.check_form_iter(form, jep4_example2_fields) + + def test_jep4_example2_build_direct(self): + form = self.build_form_direct("form", u"Bot Configuration", + u"Fill out this form to configure your new bot!", jep4_example2_fields) + self.check_form_info(form, jep4_example2_info) + self.check_form_iter(form, jep4_example2_fields) + + def test_jep4_example2_as_xml(self): + form = self.build_form_inc("form", u"Bot Configuration", + u"Fill out this form to configure your new bot!", jep4_example2_fields) + xml = form.as_xml().serialize() + form = self.parse_form(xml) + self.check_form_info(form, jep4_example2_info) + self.check_form_iter(form, jep4_example2_fields) + + def test_jep4_example3_basic(self): + form = self.parse_form(jep4_example3) + self.check_form_info(form, jep4_example3_info) + + def test_jep4_example3_iter(self): + form = self.parse_form(jep4_example3) + self.check_form_iter(form, jep4_example3_fields) + + def test_jep4_example3_mapping(self): + form = self.parse_form(jep4_example3) + self.check_form_iter(form, jep4_example3_fields) + + def test_jep4_example3_parsed_values(self): + form = self.parse_form(jep4_example3) + self.check_form_parsed_values(form, jep4_example3_parsed_values) + + def test_jep4_example3_build_inc(self): + form = self.build_form_inc("submit", None, None, jep4_example3_fields) + self.check_form_info(form, jep4_example3_info) + self.check_form_iter(form, jep4_example3_fields) + + def test_jep4_example3_build_direct(self): + form = self.build_form_direct("submit", None, None, jep4_example3_fields) + self.check_form_info(form, jep4_example3_info) + self.check_form_iter(form, jep4_example3_fields) + + def test_jep4_example8_basic(self): + form = self.parse_form(jep4_example8) + self.check_form_info(form, jep4_example8_info) + + def test_jep4_example8_iter_items(self): + form = self.parse_form(jep4_example8) + self.check_form_iter(form, jep4_example8_fields) + self.check_form_reported(form, jep4_example8_reported) + self.check_form_items(form, jep4_example8_items) + + def build_form_inc(self, form_type, title, instructions, field_data): + form = Form(form_type) + form.title = title + form.instructions = instructions + for name, ftype, values, label, options, required, desc in field_data: + field = form.add_field(name = name, field_type = ftype, values = values, + label = label, required = required, desc = desc) + for olabel, ovalue in options: + field.add_option(ovalue, olabel) + return form + + def build_form_direct(self, form_type, title, instructions, field_data): + fields = [] + for name, ftype, values, label, options, required, desc in field_data: + foptions = [] + for olabel, ovalue in options: + foptions.append(Option(ovalue, olabel)) + field = Field(name = name, field_type = ftype, values = values, + label = label, options = foptions, required = required, desc = desc) + fields.append(field) + form = Form(form_type, title = title, instructions = instructions, fields = fields) + return form + + def check_form_info(self, form, form_info): + form_type, title, instructions = form_info + self.failUnlessEqual(form.type, form_type) + self.failUnlessEqual(form.title, title) + self.failUnlessEqual(form.instructions, instructions) + + def check_form_iter(self, form, field_data): + form_iter = iter(form) + for name, ftype, values, label, options, required, desc in field_data: + field = form_iter.next() + self.failUnlessEqual(field.name, name) + self.failUnlessEqual(field.type, ftype) + self.failUnlessEqual(field.values, values) + foptions = [(o.label, o.value) for o in field.options] + self.failUnlessEqual(foptions, options) + self.failUnlessEqual(field.required, required) + self.failUnlessEqual(field.desc, desc) + self.failUnlessRaises(StopIteration, form_iter.next) + + def check_form_mapping(self, form, field_data): + for name, ftype, values, label, options, required, desc in field_data: + if not name: + continue + field = form[name] + self.failUnlessEqual(field.name, name) + self.failUnlessEqual(field.type, ftype) + self.failUnlessEqual(field.values, values) + foptions = [(o.label, o.value) for o in field.options] + self.failUnlessEqual(foptions, options) + self.failUnlessEqual(field.required, required) + self.failUnlessEqual(field.desc, desc) + + def check_form_parsed_values(self, form, value_dict): + for name, value in value_dict.items(): + field = form[name] + self.failUnlessEqual(field.value,value) + self.failUnless(type(field.value) is type(value)) + + def check_form_reported(self, form, expected): + it = iter(expected) + for field in form.reported_fields: + self.failUnlessEqual(field.name,it.next()) + self.failUnlessRaises(StopIteration, it.next) + + def check_form_items(self, form, items): + it = iter(items) + for item in form.items: + self.check_form_iter(item, it.next()) + self.failUnlessRaises(StopIteration, it.next) + + def parse_form(self, xml): + doc = libxml2.parseDoc(xml) + root = doc.getRootElement() + return Form(root) + +def suite(): + suite = unittest.TestSuite() + suite.addTest(unittest.makeSuite(TestForm)) + return suite + +################### +# Test data follows + +empty_form = """<x xmlns="jabber:x:data" type="form"/>""" +empty_submit = """<x xmlns="jabber:x:data" type="submit"/>""" +empty_cancel = """<x xmlns="jabber:x:data" type="cancel"/>""" +empty_result = """<x xmlns="jabber:x:data" type="result"/>""" + +jep4_example2 = """ +<x xmlns='jabber:x:data' type='form'> + <title>Bot Configuration</title> + <instructions>Fill out this form to configure your new bot!</instructions> + <field type='hidden' + var='FORM_TYPE'> + <value>jabber:bot</value> + </field> + <field type='fixed'><value>Section 1: Bot Info</value></field> + <field type='text-single' + label='The name of your bot' + var='botname'/> + <field type='text-multi' + label='Helpful description of your bot' + var='description'/> + <field type='boolean' + label='Public bot?' + var='public'> + <required/> + </field> + <field type='text-private' + label='Password for special access' + var='password'/> + <field type='fixed'><value>Section 2: Features</value></field> + <field type='list-multi' + label='What features will the bot support?' + var='features'> + <option label='Contests'><value>contests</value></option> + <option label='News'><value>news</value></option> + <option label='Polls'><value>polls</value></option> + <option label='Reminders'><value>reminders</value></option> + <option label='Search'><value>search</value></option> + </field> + <field type='fixed'><value>Section 3: Subscriber List</value></field> + <field type='list-single' + label='Maximum number of subscribers' + var='maxsubs'> + <value>20</value> + <option label='10'><value>10</value></option> + <option label='20'><value>20</value></option> + <option label='30'><value>30</value></option> + <option label='50'><value>50</value></option> + <option label='100'><value>100</value></option> + <option label='None'><value>none</value></option> + </field> + <field type='fixed'><value>Section 4: Invitations</value></field> + <field type='jid-multi' + label='People to invite' + var='invitelist'> + <desc>Tell all your friends about your new bot!</desc> + </field> +</x> +""" +jep4_example2_info = (u"form", u"Bot Configuration", u"Fill out this form to configure your new bot!") +jep4_example2_fields = [ + # name, type, values, label, options, required, desc + (u"FORM_TYPE", u"hidden", [u"jabber:bot"], None, [], False, None), + (None, u"fixed", [u"Section 1: Bot Info"], None, [], False, None), + ("botname", 'text-single', [], 'The name of your bot', [], False, None), + ("description", "text-multi", [], 'Helpful description of your bot', [], False, None), + ('public', 'boolean', [], 'Public bot?', [], True, None), + ('password', 'text-private', [], 'Password for special access', [], False, None), + (None, 'fixed', ['Section 2: Features'], None, [], False, None), + ('features', 'list-multi', [], 'What features will the bot support?', [ + ('Contests', 'contests'), + ('News', 'news'), + ('Polls', 'polls'), + ('Reminders', 'reminders'), + ('Search', 'search'), + ], False, None), + (None, 'fixed', ['Section 3: Subscriber List'], None, [], False, None), + ('maxsubs', 'list-single', ['20'], 'Maximum number of subscribers', [ + ('10', '10'), + ('20', '20'), + ('30', '30'), + ('50', '50'), + ('100', '100'), + ('None', 'none')], False, None), + (None, 'fixed', ['Section 4: Invitations'], None, [], False, None), + ('invitelist', 'jid-multi', [], 'People to invite', [], False, u'Tell all your friends about your new bot!'), + ] +jep4_example2_reported = [] +jep4_example2_items = [] + +jep4_example3 = """ +<x xmlns='jabber:x:data' type='submit'> + <field type='hidden' var='FORM_TYPE'> + <value>jabber:bot</value> + </field> + <field type='text-single' var='botname'> + <value>The Jabber Google Bot</value> + </field> + <field type='text-multi' var='description'> + <value>This bot enables you to send requests to</value> + <value>Google and receive the search results right</value> + <value>in your Jabber client. It' really cool!</value> + <value>It even supports Google News!</value> + </field> + <field type='boolean' var='public'> + <value>0</value> + </field> + <field type='text-private' var='password'> + <value>v3r0na</value> + </field> + <field type='list-multi' var='features'> + <value>news</value> + <value>search</value> + </field> + <field type='list-single' var='maxsubs'> + <value>50</value> + </field> + <field type='jid-multi' var='invitelist'> + <value>juliet@capulet.com</value> + <value>benvolio@montague.net</value> + </field> +</x> +""" +jep4_example3_info = ("submit", None, None) +jep4_example3_fields = [ + # name, type, values, label, options, required, desc + ('FORM_TYPE', 'hidden', ['jabber:bot'], None, [], False, None), + ('botname', 'text-single', ['The Jabber Google Bot'], None, [], False, None), + ('description', 'text-multi', ['This bot enables you to send requests to', + 'Google and receive the search results right', + 'in your Jabber client. It\' really cool!', + 'It even supports Google News!'], None, [], False, None), + ('public', 'boolean', ['0'], None, [], False, None), + ('password', 'text-private', ['v3r0na'], None, [], False, None), + ('features', 'list-multi', ['news', 'search'], None, [], False, None), + ('maxsubs', 'list-single', ['50'], None, [], False, None), + ('invitelist', 'jid-multi', ['juliet@capulet.com', 'benvolio@montague.net'], None, [], False, None), + ] +jep4_example3_reported = [] +jep4_example3_items = [] +jep4_example3_parsed_values = { + 'FORM_TYPE': u'jabber:bot', + 'botname': u'The Jabber Google Bot', + 'description': [u'This bot enables you to send requests to', + u'Google and receive the search results right', + u'in your Jabber client. It\' really cool!', + u'It even supports Google News!'], + 'public': False, + 'password': u'v3r0na', + 'features': [u'news', u'search'], + 'maxsubs': u'50', + 'invitelist': [JID('juliet@capulet.com'), JID('benvolio@montague.net')], + } + +jep4_example8 = """ +<x xmlns='jabber:x:data' type='result'> + <title>Joogle Search: verona</title> + <reported> + <field var='name'/> + <field var='url'/> + </reported> + <item> + <field var='name'> + <value>Comune di Verona - Benvenuti nel sito ufficiale</value> + </field> + <field var='url'> + <value>http://www.comune.verona.it/</value> + </field> + </item> + <item> + <field var='name'> + <value>benvenuto!</value> + </field> + <field var='url'> + <value>http://www.hellasverona.it/</value> + </field> + </item> + <item> + <field var='name'> + <value>Universita degli Studi di Verona - Home Page</value> + </field> + <field var='url'> + <value>http://www.univr.it/</value> + </field> + </item> + <item> + <field var='name'> + <value>Aeroporti del Garda</value> + </field> + <field var='url'> + <value>http://www.aeroportoverona.it/</value> + </field> + </item> + <item> + <field var='name'> + <value>Veronafiere - fiera di Verona</value> + </field> + <field var='url'> + <value>http://www.veronafiere.it/</value> + </field> + </item> +</x> +""" +jep4_example8_info = ("result", "Joogle Search: verona", None) +jep4_example8_fields = [] +jep4_example8_reported = ["name", "url"] +jep4_example8_items = [ + # name, type, values, label, options, required, desc + [ + ("name", None, ['Comune di Verona - Benvenuti nel sito ufficiale'], + None, [], False, None), + ("url", None, ['http://www.comune.verona.it/'], + None, [], False, None), + ], + [ + ("name", None, ['benvenuto!'], + None, [], False, None), + ("url", None, ['http://www.hellasverona.it/'], + None, [], False, None), + ], + [ + ("name", None, ['Universita degli Studi di Verona - Home Page'], + None, [], False, None), + ("url", None, ['http://www.univr.it/'], + None, [], False, None), + ], + [ + ("name", None, ['Aeroporti del Garda'], + None, [], False, None), + ("url", None, ['http://www.aeroportoverona.it/'], + None, [], False, None), + ], + [ + ("name", None, ['Veronafiere - fiera di Verona'], + None, [], False, None), + ("url", None, ['http://www.veronafiere.it/'], + None, [], False, None), + ], + + ] + +# end of test data +################### + +if __name__ == '__main__': + unittest.TextTestRunner(verbosity=2).run(suite()) + +# vi: sts=4 et sw=4 encoding=utf-8 |