wcs/tests/workflow/test_formdata.py

370 lines
12 KiB
Python

import pytest
from quixote import cleanup, get_response
from wcs import sessions
from wcs.carddef import CardDef
from wcs.fields import EmailField, ItemField, StringField
from wcs.formdef import FormDef
from wcs.qommon.http_request import HTTPRequest
from wcs.wf.create_formdata import Mapping
from wcs.workflows import Workflow
from ..utilities import clean_temporary_pub, create_temporary_pub
def setup_module(module):
cleanup()
def teardown_module(module):
clean_temporary_pub()
@pytest.fixture
def pub(request):
pub = create_temporary_pub()
pub.cfg['language'] = {'language': 'en'}
pub.write_cfg()
req = HTTPRequest(None, {'SERVER_NAME': 'example.net', 'SCRIPT_NAME': ''})
req.response.filter = {}
req._user = None
pub._set_request(req)
req.session = sessions.BasicSession(id=1)
pub.set_config(req)
return pub
@pytest.fixture
def two_pubs(request):
pub = create_temporary_pub(sql_mode=True)
pub.cfg['language'] = {'language': 'en'}
pub.write_cfg()
req = HTTPRequest(None, {'SERVER_NAME': 'example.net', 'SCRIPT_NAME': ''})
req.response.filter = {}
req._user = None
pub._set_request(req)
req.session = sessions.BasicSession(id=1)
pub.set_config(req)
return pub
def test_create_formdata(two_pubs):
FormDef.wipe()
two_pubs.tracking_code_class.wipe()
target_formdef = FormDef()
target_formdef.name = 'target form'
target_formdef.fields = [
StringField(id='0', label='string', varname='foo_string'),
]
target_formdef.store()
wf = Workflow(name='create-formdata')
wf.possible_status = Workflow.get_default_workflow().possible_status[:]
create = wf.possible_status[1].add_action('create_formdata', id='_create', prepend=True)
create.label = 'create a new linked form'
create.varname = 'resubmitted'
create.mappings = [
Mapping(field_id='0', expression='=form_var_toto_string'),
Mapping(field_id='1', expression='=form_var_toto_file_raw'),
Mapping(field_id='2', expression='=form_var_toto_item_raw'),
]
wf.store()
source_formdef = FormDef()
source_formdef.name = 'source form'
source_formdef.fields = []
source_formdef.workflow_id = wf.id
source_formdef.store()
formdata = source_formdef.data_class()()
formdata.data = {}
formdata.just_created()
assert target_formdef.data_class().count() == 0
assert two_pubs.loggederror_class.count() == 0
# check unconfigure action do nothing
formdata.perform_workflow()
assert target_formdef.data_class().count() == 0
create.formdef_slug = target_formdef.url_name
wf.store()
del source_formdef._workflow
formdata.perform_workflow()
assert target_formdef.data_class().count() == 1
errors = two_pubs.loggederror_class.select()
assert len(errors) == 2
assert 'form_var_toto_string' in errors[0].exception_message
assert errors[1].summary == 'Missing field: unknown (1), unknown (2)'
assert errors[0].formdata_id == str(target_formdef.data_class().select()[0].id)
assert errors[1].formdata_id == str(target_formdef.data_class().select()[0].id)
# add field labels cache
two_pubs.loggederror_class.wipe()
target_formdef.data_class().wipe()
create.formdef_slug = target_formdef.url_name
create.cached_field_labels = {'0': 'field0', '1': 'field1', '2': 'field2'}
wf.store()
del source_formdef._workflow
formdata.perform_workflow()
assert target_formdef.data_class().count() == 1
errors = two_pubs.loggederror_class.select()
assert len(errors) == 2
assert errors[1].summary == 'Missing field: field1, field2'
# no tracking code has been created
created_formdata = target_formdef.data_class().select()[0]
assert created_formdata.tracking_code is None
assert two_pubs.tracking_code_class.count() == 0
# now we want one
target_formdef.enable_tracking_codes = True
target_formdef.store()
target_formdef.data_class().wipe()
formdata.perform_workflow()
# and a tracking code is created
assert target_formdef.data_class().count() == 1
created_formdata = target_formdef.data_class().select()[0]
assert created_formdata.tracking_code is not None
assert two_pubs.tracking_code_class.count() == 1
assert two_pubs.tracking_code_class.select()[0].formdef_id == target_formdef.id
assert two_pubs.tracking_code_class.select()[0].formdata_id == str(created_formdata.id)
create.condition = {'type': 'python', 'value': '1 == 2'}
wf.store()
del source_formdef._workflow
target_formdef.data_class().wipe()
assert target_formdef.data_class().count() == 0
formdata.perform_workflow()
assert target_formdef.data_class().count() == 0
def test_create_formdata_migration(pub):
wf = Workflow(name='create-formdata')
st1 = wf.add_status('Status1', 'st1')
create = st1.add_action('create_formdata', id='_create')
create.label = 'create a new linked form'
create.varname = 'resubmitted'
create.mappings = [
Mapping(field_id='0', expression='=form_var_toto_string'),
Mapping(field_id='1', expression='=form_var_toto_file_raw'),
Mapping(field_id='2', expression='=form_var_toto_item_raw'),
]
create.keep_user = True
wf.store()
wf = Workflow.get(wf.id)
assert wf.possible_status[0].items[0].user_association_mode == 'keep-user'
assert not hasattr(wf.possible_status[0].items[0], 'keep_user')
def test_create_formdata_tracking_code(two_pubs, emails):
FormDef.wipe()
two_pubs.tracking_code_class.wipe()
target_wf = Workflow(name='send-mail')
st1 = target_wf.add_status('Status1', 'st1')
item = st1.add_action('sendmail')
item.to = ['bar@localhost']
item.subject = 'Foobar'
item.body = '{{ form_tracking_code }}'
target_wf.store()
target_formdef = FormDef()
target_formdef.name = 'target-form'
target_formdef.fields = [
EmailField(id='0', label='Email', type='email'),
]
target_formdef.workflow_id = target_wf.id
target_formdef.enable_tracking_codes = True
target_formdef.store()
wf = Workflow(name='create-formdata')
st1 = wf.add_status('Status1', 'st1')
create = st1.add_action('create_formdata')
create.formdef_slug = target_formdef.url_name
create.mappings = [
Mapping(field_id='0', expression='=form_var_email_string'),
]
wf.store()
formdef = FormDef()
formdef.name = 'source form'
formdef.fields = [
EmailField(id='0', label='Email', type='email'),
]
formdef.workflow_id = wf.id
formdef.store()
formdata = formdef.data_class()()
formdata.data = {}
formdata.just_created()
assert target_formdef.data_class().count() == 0
assert emails.count() == 0
formdata.perform_workflow()
get_response().process_after_jobs()
assert target_formdef.data_class().count() == 1
assert emails.count() == 1
tracking_code = target_formdef.data_class().select()[0].tracking_code
assert tracking_code in emails.get('Foobar')['payload']
def test_create_formdata_attach_to_history(two_pubs):
FormDef.wipe()
two_pubs.tracking_code_class.wipe()
target_formdef = FormDef()
target_formdef.name = 'target form'
target_formdef.fields = [
StringField(id='0', label='string', varname='foo_string'),
]
target_formdef.store()
target_formdef.data_class().wipe()
wf = Workflow(name='create-formdata')
wf.possible_status = Workflow.get_default_workflow().possible_status[:]
create = wf.possible_status[1].add_action('create_formdata', id='_create', prepend=True)
create.label = 'create a new linked form'
create.varname = 'resubmitted'
create.mappings = [
Mapping(field_id='0', expression='=form_var_toto_string'),
Mapping(field_id='1', expression='=form_var_toto_file_raw'),
Mapping(field_id='2', expression='=form_var_toto_item_raw'),
]
wf.store()
source_formdef = FormDef()
source_formdef.name = 'source form'
source_formdef.fields = []
source_formdef.workflow_id = wf.id
source_formdef.store()
formdata = source_formdef.data_class()()
formdata.data = {}
formdata.just_created()
create.formdef_slug = target_formdef.url_name
create.attach_to_history = True
wf.store()
del source_formdef._workflow
formdata.perform_workflow()
assert target_formdef.data_class().count() == 1
assert formdata.evolution[-1].parts[0].attach_to_history is True
assert 'New form "target form" created: <a href="%s1/">1-1</a>' % target_formdef.get_url() in str(
formdata.evolution[-1].parts[0].view()
)
# don't crash in case target formdata is removed
formdata.refresh_from_storage()
target_formdef.data_class().wipe()
assert 'New form created (deleted, 1-1)' in str(formdata.evolution[-1].parts[0].view())
# don't crash in case target formdef is removed
target_formdef.remove_self()
formdata.refresh_from_storage()
assert 'New form created (deleted, 1-1)' in str(formdata.evolution[-1].parts[0].view())
def test_create_formdata_card_item_mapping(two_pubs):
two_pubs.loggederror_class.wipe()
FormDef.wipe()
CardDef.wipe()
carddef = CardDef()
carddef.name = 'Bar'
carddef.fields = [
StringField(id='0', label='Bar', varname='bar'),
]
carddef.digest_templates = {'default': '{{ form_var_bar }}'}
carddef.store()
carddef.data_class().wipe()
for i in range(0, 4):
carddata = carddef.data_class()()
carddata.data = {'0': 'Bar %s' % (i + 1)}
carddata.just_created()
carddata.store()
target_formdef = FormDef()
target_formdef.name = 'Foo'
target_formdef.fields = [
ItemField(id='0', label='Bar', type='item', data_source={'type': 'carddef:bar'}, required=False),
]
target_formdef.store()
target_formdef.data_class().wipe()
wf = Workflow(name='create-formdata')
wf.possible_status = Workflow.get_default_workflow().possible_status[:]
create = wf.possible_status[1].add_action('create_formdata', id='_create', prepend=True)
create.label = 'create a new linked form'
create.formdef_slug = 'foo'
create.mappings = [
Mapping(field_id='0', expression='{{ form_var_foo_string|default:"" }}'),
]
wf.store()
source_formdef = FormDef()
source_formdef.name = 'Foo'
source_formdef.fields = [
StringField(id='0', label='string', varname='foo_string'),
]
source_formdef.workflow_id = wf.id
source_formdef.store()
source_formdef.data_class().wipe()
# empty string a result -> None
formdata = source_formdef.data_class()()
formdata.data = {}
formdata.just_created()
formdata.perform_workflow()
assert target_formdef.data_class().count() == 1
target_formdata = target_formdef.data_class().select()[0]
assert target_formdata.data.get('0') is None
assert target_formdata.data.get('0_display') is None
# valid value, using id
target_formdef.data_class().wipe()
formdata = source_formdef.data_class()()
formdata.data = {'0': str(carddata.id)}
formdata.just_created()
formdata.perform_workflow()
assert target_formdef.data_class().count() == 1
target_formdata = target_formdef.data_class().select()[0]
assert target_formdata.data.get('0') == str(carddata.id)
assert target_formdata.data.get('0_display') == carddata.default_digest
# valid value, using digest
target_formdef.data_class().wipe()
formdata = source_formdef.data_class()()
formdata.data = {'0': carddata.default_digest}
formdata.just_created()
formdata.perform_workflow()
assert target_formdef.data_class().count() == 1
target_formdata = target_formdef.data_class().select()[0]
assert target_formdata.data.get('0') == str(carddata.id)
assert target_formdata.data.get('0_display') == carddata.default_digest
# invalid value
target_formdef.data_class().wipe()
formdata = source_formdef.data_class()()
formdata.data = {'0': 'XXX'}
formdata.just_created()
formdata.perform_workflow()
assert target_formdef.data_class().count() == 1
target_formdata = target_formdef.data_class().select()[0]
assert target_formdata.data.get('0') is None
assert target_formdata.data.get('0_display') is None
assert two_pubs.loggederror_class.count() == 1
assert two_pubs.loggederror_class.count() == 1
error = two_pubs.loggederror_class.select()[0]
assert error.exception_message == "unknown card value ('XXX')"