wcs/tests/test_formdef_import.py

230 lines
8.3 KiB
Python

# -*- coding: utf-8 -*-
import sys
import shutil
import StringIO
import time
import xml.etree.ElementTree as ET
from quixote import cleanup
from wcs.categories import Category
from wcs.formdef import FormDef, fields
from wcs.workflows import Workflow
from qommon.misc import indent_xml as indent
from utilities import create_temporary_pub
def setup_module(module):
cleanup()
global pub
pub = create_temporary_pub()
def teardown_module(module):
shutil.rmtree(pub.APP_DIR)
def export_to_indented_xml(formdef, include_id=False):
formdef_xml = formdef.export_to_xml(include_id=include_id)
indent(formdef_xml)
return formdef_xml
def assert_compare_formdef(formdef1, formdef2, include_id=False):
assert ET.tostring(export_to_indented_xml(formdef1, include_id=include_id)) == \
ET.tostring(export_to_indented_xml(formdef2, include_id=include_id))
assert formdef1.export_to_json(include_id=include_id, indent=2) == \
formdef2.export_to_json(include_id=include_id, indent=2)
def assert_xml_import_export_works(formdef, include_id=False):
formdef_xml = formdef.export_to_xml(include_id=include_id)
formdef2 = FormDef.import_from_xml_tree(formdef_xml, include_id=include_id)
assert_compare_formdef(formdef, formdef2, include_id=include_id)
return formdef2
def assert_json_import_export_works(formdef, include_id=False):
formdef2 = FormDef.import_from_json(
StringIO.StringIO(formdef.export_to_json(include_id=include_id)), include_id=include_id)
assert_compare_formdef(formdef, formdef2, include_id=include_id)
return formdef2
def test_empty():
formdef = FormDef()
formdef.name = 'empty'
assert_xml_import_export_works(formdef)
assert_json_import_export_works(formdef)
def test_text_attributes():
formdef = FormDef()
formdef.name = 'Foo'
formdef.url_name = 'foo'
f2 = assert_xml_import_export_works(formdef)
assert f2.url_name == formdef.url_name
f2 = assert_json_import_export_works(formdef)
assert f2.url_name == formdef.url_name
def test_boolean_attributes():
formdef = FormDef()
formdef.name = 'Foo'
formdef.url_name = 'foo'
formdef.confirmation = True
formdef.enable_tracking_codes = True
f2 = assert_xml_import_export_works(formdef)
assert f2.enable_tracking_codes == formdef.enable_tracking_codes
assert f2.confirmation == formdef.confirmation
f2 = assert_json_import_export_works(formdef)
assert f2.enable_tracking_codes == formdef.enable_tracking_codes
assert f2.confirmation == formdef.confirmation
def test_a_field():
formdef = FormDef()
formdef.name = 'Foo'
formdef.fields = [
fields.StringField(type='string', id=1, label='Bar', size='40')
]
f2 = assert_xml_import_export_works(formdef)
assert len(f2.fields) == len(formdef.fields)
f2 = assert_json_import_export_works(formdef)
assert len(f2.fields) == len(formdef.fields)
def test_more_fields():
formdef = FormDef()
formdef.name = 'Blah'
formdef.fields = [
fields.TextField(type='text', label='Bar', pre=True),
fields.EmailField(type='email', label='Bar'),
fields.BoolField(type='bool', label='Bar'),
fields.DateField(type='date', label='Bar', minimum_date='2014-01-01'),
fields.ItemField(type='item', label='Bar', items=['foo', 'bar', 'baz']),
]
f2 = assert_xml_import_export_works(formdef)
assert len(f2.fields) == len(formdef.fields)
assert f2.fields[2].type == formdef.fields[2].type
assert f2.fields[3].minimum_date == formdef.fields[3].minimum_date
assert f2.fields[4].items == formdef.fields[4].items
f2 = assert_json_import_export_works(formdef)
assert len(f2.fields) == len(formdef.fields)
assert f2.fields[2].type == formdef.fields[2].type
assert f2.fields[3].minimum_date == formdef.fields[3].minimum_date
assert f2.fields[4].items == formdef.fields[4].items
def test_include_id():
formdef = FormDef()
formdef.name = 'Blah'
formdef.fields = [
fields.TextField(type='text', label='Bar', pre=True),
fields.EmailField(type='email', label='Bar'),
fields.BoolField(type='bool', label='Bar'),
fields.DateField(type='date', label='Bar', minimum_date='2014-01-01'),
fields.ItemField(type='item', label='Bar', items=['foo', 'bar', 'baz']),
]
for field in formdef.fields:
field.id = formdef.get_new_field_id()
formdef.fields[4].id = '10'
f2 = assert_xml_import_export_works(formdef, include_id=True)
assert len(f2.fields) == len(formdef.fields)
assert f2.fields[0].id == formdef.fields[0].id
assert f2.fields[4].id == formdef.fields[4].id
f2 = assert_json_import_export_works(formdef, include_id=True)
assert len(f2.fields) == len(formdef.fields)
assert f2.fields[0].id == formdef.fields[0].id
assert f2.fields[4].id == formdef.fields[4].id
def test_modification_time():
formdef = FormDef()
formdef.name = 'empty'
formdef.last_modification_time = time.localtime()
assert_xml_import_export_works(formdef)
f2 = assert_json_import_export_works(formdef)
assert tuple(f2.last_modification_time)[:6] == tuple(formdef.last_modification_time)[:6]
def test_workflow_options():
formdef = FormDef()
formdef.name = 'workflow options'
formdef.workflow_options = {'foo': 'bar',
'foo2': 'baré'}
fd2 = assert_xml_import_export_works(formdef)
assert fd2.workflow_options == formdef.workflow_options
fd2 = assert_json_import_export_works(formdef)
assert fd2.workflow_options == formdef.workflow_options
def test_workflow_options_with_no_values():
formdef = FormDef()
formdef.name = 'foo'
formdef.workflow_options = {'foo': None,
'foo2': None}
fd2 = assert_xml_import_export_works(formdef)
assert fd2.workflow_options == formdef.workflow_options
fd2 = assert_json_import_export_works(formdef)
assert fd2.workflow_options == formdef.workflow_options
def test_workflow_reference():
Workflow.wipe()
FormDef.wipe()
wf = Workflow()
wf.name = 'test workflow'
wf.store()
formdef = FormDef()
formdef.name = 'foo'
formdef.workflow_id = wf.id
f2 = assert_xml_import_export_works(formdef)
assert f2.workflow_id == formdef.workflow_id
f2 = assert_xml_import_export_works(formdef, include_id=True)
assert f2.workflow_id == formdef.workflow_id
formdef_xml_with_id = formdef.export_to_xml(include_id=True)
formdef_xml_without_id = formdef.export_to_xml(include_id=False)
# check there's no reference to a non-existing workflow
Workflow.wipe()
assert FormDef.import_from_xml_tree(formdef_xml_with_id, include_id=False).workflow_id is None
assert FormDef.import_from_xml_tree(formdef_xml_with_id, include_id=True).workflow_id is None
# check an import that is not using id fields will find the workflow by its
# name
wf = Workflow()
wf.id = '2'
wf.name = 'test workflow'
wf.store()
assert FormDef.import_from_xml_tree(formdef_xml_with_id, include_id=False).workflow_id == '2'
assert FormDef.import_from_xml_tree(formdef_xml_with_id, include_id=True).workflow_id is None
def test_category_reference():
Category.wipe()
FormDef.wipe()
cat = Category()
cat.name = 'test category'
cat.store()
formdef = FormDef()
formdef.name = 'foo'
formdef.category_id = cat.id
f2 = assert_xml_import_export_works(formdef)
assert f2.category_id == formdef.category_id
f2 = assert_xml_import_export_works(formdef, include_id=True)
assert f2.category_id == formdef.category_id
formdef_xml_with_id = formdef.export_to_xml(include_id=True)
formdef_xml_without_id = formdef.export_to_xml(include_id=False)
# check there's no reference to a non-existing category
Category.wipe()
assert FormDef.import_from_xml_tree(formdef_xml_with_id, include_id=False).category_id is None
assert FormDef.import_from_xml_tree(formdef_xml_with_id, include_id=True).category_id is None
# check an import that is not using id fields will find the category by its
# name
cat = Category()
cat.id = '2'
cat.name = 'test category'
cat.store()
assert FormDef.import_from_xml_tree(formdef_xml_with_id, include_id=False).category_id == '2'
assert FormDef.import_from_xml_tree(formdef_xml_with_id, include_id=True).category_id is None