wcs/tests/backoffice_pages/test_form_inspect.py

771 lines
27 KiB
Python

import os
import re
import time
import pytest
from wcs import fields
from wcs.admin.settings import UserFieldsFormDef
from wcs.blocks import BlockDef
from wcs.carddef import CardDef
from wcs.formdef import FormDef
from wcs.qommon.http_request import HTTPRequest
from wcs.qommon.upload_storage import PicklableUpload
from wcs.wf.create_formdata import Mapping
from wcs.workflows import Workflow, WorkflowBackofficeFieldsFormDef, WorkflowCriticalityLevel
from ..utilities import clean_temporary_pub, create_temporary_pub, get_app, login
from .test_all import create_user
@pytest.fixture
def pub(request, emails):
pub = create_temporary_pub(sql_mode=True)
req = HTTPRequest(None, {'SCRIPT_NAME': '/', 'SERVER_NAME': 'example.net'})
pub.cfg['identification'] = {'methods': ['password']}
pub.cfg['language'] = {'language': 'en'}
pub.write_cfg()
pub.set_app_dir(req)
return pub
def teardown_module(module):
clean_temporary_pub()
class IHateUnicode:
def __unicode__(self):
raise Exception('HATE!!')
def __repr__(self):
return 'ok'
def test_inspect_page(pub, local_user):
create_user(pub)
BlockDef.wipe()
block = BlockDef()
block.name = 'foobar'
block.fields = [
fields.StringField(id='1', label='String', type='string', varname='string'),
]
block.store()
formdef = FormDef()
formdef.name = 'form title'
datasource = {'type': 'formula', 'value': repr([('A', 'aa'), ('B', 'bb'), ('C', 'cc')])}
formdef.fields = [
fields.StringField(
id='1', label='1st field', type='string', display_locations=['validation', 'summary', 'listings']
),
fields.ItemField(
id='2',
label='2nd field',
type='item',
items=['foo', 'bar', 'baz'],
display_locations=['validation', 'summary', 'listings'],
),
fields.ItemField(id='3', label='3rd field', type='item', data_source=datasource, varname='foo'),
fields.FileField(id='4', label='file field', type='file', varname='file'),
fields.BlockField(id='5', label='Block Data', varname='blockdata', type='block:foobar', max_items=3),
]
formdef.workflow_roles = {'_receiver': 1}
formdef.store()
formdata = formdef.data_class()()
formdata.just_created()
upload = PicklableUpload('hello.txt', content_type='text/plain')
upload.receive([b'hello world'])
formdata.data = {
'1': 'FOO BAR 0',
'2': 'baz',
'2_display': 'baz',
'3': 'C',
'3_display': 'cc',
# temper with field 3 structured values
'3_structured': {
'unicode': 'uné',
'str_but_non_utf8': b'\xed\xa0\x00', # not actually supposed to happen
'non_unicode_convertible': IHateUnicode(),
'very_long_string': '0' * 100000,
},
# add a PicklableUpload in field 4
'4': upload,
# block field
'5': {
'data': [
{
'1': 'plop',
},
{
'1': 'poulpe',
},
],
'schema': {}, # not important here
},
'0_display': 'plop poulpe',
}
formdata.jump_status('new')
formdata.user_id = local_user.id
formdata.workflow_data = {
'foo': {
'bar_coin': 'yy',
'errors': [
'this one has a\xa0non-breaking space',
],
},
'foo_bar': 'xx',
}
formdata.store()
user_formdef = UserFieldsFormDef(pub)
user_formdef.fields.append(fields.StringField(id='_first_name', label='name', type='string'))
user_formdef.fields.append(fields.StringField(id='3', label='test', type='string'))
user_formdef.store()
local_user.form_data = {'_first_name': 'toto', '3': 'nono'}
local_user.set_attributes_from_formdata(local_user.form_data)
local_user.store()
app = login(get_app(pub))
resp = app.get(formdata.get_url(backoffice=True), status=200)
assert 'Data Inspector' not in resp.text
resp = app.get('%sinspect' % formdata.get_url(backoffice=True), status=403)
create_user(pub, is_admin=True)
resp = app.get(formdata.get_url(backoffice=True), status=200)
resp = resp.click('Data Inspector')
assert '0' * 1000 in resp.text
assert len(resp.text) < 100000
pq = resp.pyquery.remove_namespaces()
assert pq('[title="form_var_file"]').parents('li').children('div.value span').text() == 'hello.txt'
assert pq('[title="form_var_file"]').children('a').attr('title') == 'file field'
assert (
pq('[title="form_var_file"]').children('a').attr('href')
== 'http://example.net/backoffice/forms/%s/fields/4/' % formdef.id
)
assert (
pq('[title="form_var_file_raw"]').parents('li').children('div.value span').text()
== 'hello.txt (file)'
)
assert len(pq('[title="form_var_file_raw"]').children('a')) == 0
assert pq('[title="form_var_foo_unicode"]').parents('li').children('div.value span').text() == 'uné'
assert (
pq('[title="form_var_foo_non_unicode_convertible"]')
.parents('li')
.children('div.value span')
.text()
.startswith('ok ')
)
assert (
pq('[title="form_var_foo_str_but_non_utf8"]').parents('li').children('div.value span').text()
== "b'\\xed\\xa0\\x00' (bytes)"
)
assert (
pq('[title="form_workflow_data_foo_errors"]').parents('li').children('div.value span').text()
== "['this one has a non-breaking space'] (list)"
)
assert pq('[title="form_var_blockdata"]').children('a').attr('title') == 'Block Data'
assert (
pq('[title="form_var_blockdata"]').children('a').attr('href')
== 'http://example.net/backoffice/forms/%s/fields/5/' % formdef.id
)
assert pq('[title="form_var_blockdata_0_string"]').children('a').attr('title') == 'String'
assert (
pq('[title="form_var_blockdata_0_string"]').children('a').attr('href')
== 'http://example.net/backoffice/forms/blocks/%s/1/' % block.id
)
assert pq('[title="form_var_blockdata_1_string"]').children('a').attr('title') == 'String'
assert (
pq('[title="form_var_blockdata_1_string"]').children('a').attr('href')
== 'http://example.net/backoffice/forms/blocks/%s/1/' % block.id
)
# don't show «unusable» variables
assert 'form_f1' not in resp.text
assert 'form_field_' not in resp.text
assert 'form_user_field_' not in resp.text
assert 'form_user_f3' not in resp.text
assert 'form_user_f_' not in resp.text
# make sure workflow data itself is not displayed, as it's available in
# expanded variables
assert not pq('[title="form_workflow_data"]')
# but do display it if it has some invalid contents
formdata.workflow_data['invalid key'] = 'foobar'
formdata.store()
resp = app.get(resp.request.url)
assert resp.pyquery('[title="form_workflow_data"]')
# check functions
assert re.findall('Recipient.*foobar', resp.text)
role = pub.role_class(name='plop')
role.store()
formdata.workflow_roles = {'_receiver': [role.id]}
formdata.store()
resp = app.get('%sinspect' % formdata.get_url(backoffice=True), status=200)
assert re.findall('Recipient.*plop', resp.text)
workflow = Workflow.get_default_workflow()
workflow.id = None
workflow.roles.update({'_plop': 'New Function'})
workflow.backoffice_fields_formdef = WorkflowBackofficeFieldsFormDef(workflow)
workflow.backoffice_fields_formdef.fields = [
fields.StringField(id='bo1', label='Foo bar', varname='foo_bar'),
]
workflow.store()
formdef.workflow_id = workflow.id
formdef.store()
resp = app.get('%sinspect' % formdata.get_url(backoffice=True), status=200)
assert re.findall('New Function.*unset', resp.text)
formdata.workflow_roles = {'_receiver': [role.id], '_plop': ['123']}
formdata.data['bo1'] = 'foobar42'
formdata.store()
resp = app.get('%sinspect' % formdata.get_url(backoffice=True), status=200)
assert re.findall('New Function.*(deleted)', resp.text)
pq = resp.pyquery.remove_namespaces()
assert pq('[title="form_var_foo_bar"]').parents('li').children('div.value span').text() == 'foobar42'
assert pq('[title="form_var_foo_bar"]').children('a').attr('title') == 'Foo bar'
assert (
pq('[title="form_var_foo_bar"]').children('a').attr('href')
== 'http://example.net/backoffice/workflows/%s/backoffice-fields/fields/bo1/' % workflow.id
)
# test tools
resp = app.get('%sinspect' % formdata.get_url(backoffice=True), status=200)
assert "Test tool" in resp.text
resp.form['test_mode'] = 'python-condition'
resp.form['python-condition'] = 'len(form_name) == 10' # "form title"
resp = resp.form.submit()
assert 'Condition result' in resp.text
assert 'result-true' in resp.text
assert '<code>True</code>' in resp.text
resp.form['python-condition'] = 'len(form_name) == 5'
resp = resp.form.submit()
assert 'Condition result' in resp.text
assert 'result-false' in resp.text
assert '<code>False</code>' in resp.text
resp.form['python-condition'] = 'form_do_not_exist == 3'
resp = resp.form.submit()
assert 'Condition result' not in resp.text
assert 'Failed to evaluate condition' in resp.text
assert 'NameError' in resp.text
if not pub.site_options.has_section('options'):
pub.site_options.add_section('options')
pub.site_options.set('options', 'disable-python-expressions', 'true')
with open(os.path.join(pub.app_dir, 'site-options.cfg'), 'w') as fd:
pub.site_options.write(fd)
resp = app.get('%sinspect' % formdata.get_url(backoffice=True), status=200)
assert 'Condition (Python)' not in resp.text
with pytest.raises(ValueError):
resp.form['test_mode'] = 'python-condition'
resp.form['test_mode'] = 'django-condition'
resp.form['django-condition'] = 'form_name|length == 10'
resp = resp.form.submit()
assert 'Condition result' in resp.text
assert 'result-true' in resp.text
resp.form['django-condition'] = 'form_name|length == 5'
resp = resp.form.submit()
assert 'Condition result' in resp.text
assert 'result-false' in resp.text
resp.form['django-condition'] = 'foo bar'
resp = resp.form.submit()
assert 'Condition result' not in resp.text
assert 'TemplateSyntaxError: Unused' in resp.text
resp.form['django-condition'] = 'form_name|length == 5'
ajax_resp = app.post(
'%sinspect-tool' % formdata.get_url(backoffice=True), params=resp.form.submit_fields()
)
assert ajax_resp.text.startswith('<div class="test-tool-result')
resp.form['test_mode'] = 'template'
resp.form['template'] = '{{ form_name }}'
resp = resp.form.submit()
assert 'Template rendering' in resp.text
assert '<div class="test-tool-result-plain">form title</div>' in resp.text
assert 'HTML Source' not in resp.text
assert 'rendered as an object' not in resp.text
resp.form['template'] = '<p>{{ form_name }}</p>'
resp = resp.form.submit()
assert 'Template rendering' in resp.text
assert '<p>form title</p>' in resp.text
assert 'HTML Source' in resp.text
assert 'rendered as an object' not in resp.text
resp.form['template'] = '{{ form_var_file }}'
resp = resp.form.submit()
assert 'Template rendering' in resp.text
assert '<div class="test-tool-result-plain">hello.txt</div>' in resp.text
assert 'rendered as an object' in resp.text
assert '<div class="test-tool-result-plain">hello.txt (file)</div>' in resp.text
assert 'HTML Source' not in resp.text
resp.form['template'] = '{{ form_var_file_raw.get_content }}' # will give bytes
resp = resp.form.submit()
assert 'Template rendering' in resp.text
assert '<div class="test-tool-result-plain">b\'' in resp.text
assert 'rendered as an object' in resp.text
assert '<div class="test-tool-result-plain">b\'' in resp.text
assert '(bytes)' in resp.text
assert 'HTML Source' not in resp.text
resp.form['template'] = '{% for x in 1 %}ok{% endfor %}'
resp = resp.form.submit()
assert 'Failed to evaluate template' in resp.text
assert 'TypeError' in resp.text
resp.form['template'] = '{% for x in 1 %}ok{% end %}'
resp = resp.form.submit()
assert 'syntax error' in resp.text
assert 'Invalid block tag' in resp.text
resp.form['template'] = ''
resp.form['test_mode'] = 'html_template'
resp.form['html_template'] = '<p>{{ form_name }}</p>'
resp = resp.form.submit()
resp = resp.form.submit()
assert 'Template rendering' in resp.text
assert '<p>form title</p>' in resp.text
assert 'HTML Source' in resp.text
resp.form['html_template'] = '{% for x in 1 %}ok{% endfor %}'
resp = resp.form.submit()
assert 'Failed to evaluate HTML template' in resp.text
assert 'TypeError' in resp.text
resp.form['html_template'] = '{% for x in 1 %}ok{% end %}'
resp = resp.form.submit()
assert 'syntax error' in resp.text
assert 'Invalid block tag' in resp.text
def test_inspect_page_with_related_objects(pub):
user = create_user(pub, is_admin=True)
FormDef.wipe()
CardDef.wipe()
# test ExternalWorkflowGlobalAction
external_wf = Workflow(name='External Workflow')
st1 = external_wf.add_status(name='New')
action = external_wf.add_global_action('Delete', 'delete')
action.add_action('remove')
trigger = action.append_trigger('webservice')
trigger.identifier = 'delete'
external_wf.store()
external_formdef = FormDef()
external_formdef.name = 'External Form'
external_formdef.fields = [
fields.StringField(id='0', label='string', varname='form_string'),
]
external_formdef.workflow = external_wf
external_formdef.store()
external_carddef = CardDef()
external_carddef.name = 'External Card'
external_carddef.fields = [
fields.StringField(id='0', label='string', varname='card_string'),
]
external_carddef.backoffice_submission_roles = user.roles
external_carddef.workflow = external_wf
external_carddef.store()
wf = Workflow(name='External actions')
st1 = wf.add_status('Create external formdata')
# add a message to history, to check it doesn't interfer when searching for
# linked data.
register_comment = st1.add_action('register-comment', id='_register')
register_comment.comment = '<p>test</p>'
create_formdata = st1.add_action('create_formdata', id='_create_form')
create_formdata.label = 'create linked form'
create_formdata.formdef_slug = external_formdef.url_name
create_formdata.varname = 'created_form'
mappings = [Mapping(field_id='0', expression='{{ form_var_string }}')]
create_formdata.mappings = mappings
create_carddata = st1.add_action('create_carddata', id='_create_card')
create_carddata.label = 'create linked card'
create_carddata.formdef_slug = external_carddef.url_name
create_carddata.varname = 'created_card'
create_carddata.mappings = mappings
global_action = wf.add_global_action('Delete external linked object', 'delete')
action = global_action.add_action('external_workflow_global_action')
action.slug = 'formdef:%s' % external_formdef.url_name
action.trigger_id = 'action:%s' % trigger.identifier
wf.store()
formdef = FormDef()
formdef.name = 'External action form'
formdef.fields = [
fields.StringField(id='0', label='string', varname='string'),
]
formdef.workflow = wf
formdef.store()
carddef = CardDef()
carddef.name = 'External action card'
carddef.fields = [
fields.StringField(id='0', label='string', varname='string'),
]
carddef.backoffice_submission_roles = user.roles
carddef.workflow = wf
carddef.store()
assert formdef.data_class().count() == 0
assert carddef.data_class().count() == 0
assert external_formdef.data_class().count() == 0
assert external_carddef.data_class().count() == 0
formdata = formdef.data_class()()
formdata.data = {'0': 'test form'}
formdata.user = user
formdata.store()
formdata.just_created()
formdata.perform_workflow()
assert formdef.data_class().count() == 1
assert carddef.data_class().count() == 0
# related form and card
assert external_formdef.data_class().count() == 1
assert external_carddef.data_class().count() == 1
app = login(get_app(pub))
resp = app.get('/backoffice/management/external-action-form/1/inspect')
assert 'Related Forms/Cards' in resp.text
# related form and card
assert (
'<a href="http://example.net/backoffice/management/external-form/1/">External Form #1-1 (Evolution)</a>'
in resp.text
)
assert (
'<a href="http://example.net/backoffice/data/external-card/1/">External Card #1-1 (Evolution)</a>'
in resp.text
)
# check related form
resp = app.get('/backoffice/management/external-form/1/')
assert (
'<h3>Original form</h3><p><a href="http://example.net/backoffice/management/external-action-form/1/">External action form #2-1</a></p>'
in resp.text
)
resp = app.get('/backoffice/management/external-form/1/inspect')
# parent
assert (
'<a href="http://example.net/backoffice/management/external-action-form/1/">External action form #2-1 (Parent)</a>'
in resp.text
)
# check related card
resp = app.get('/backoffice/data/external-card/1/')
assert (
'<h3>Original form</h3><p><a href="http://example.net/backoffice/management/external-action-form/1/">External action form #2-1</a></p>'
in resp.text
)
resp = app.get('/backoffice/data/external-card/1/inspect')
# parent
assert (
'<a href="http://example.net/backoffice/management/external-action-form/1/">External action form #2-1 (Parent)</a>'
in resp.text
)
external_formdef.data_class().wipe()
external_carddef.data_class().wipe()
# missing form/card data
resp = app.get('/backoffice/management/external-action-form/1/inspect')
assert 'Related Forms/Cards' in resp.text
assert (
'<a href="">Linked &quot;External Form&quot; object by id 1 (Evolution - not found)</a>' in resp.text
)
assert (
'<a href="">Linked &quot;External Card&quot; object by id 1 (Evolution - not found)</a>' in resp.text
)
formdef.data_class().wipe()
carddef.data_class().wipe()
carddata = carddef.data_class()()
carddata.data = {'0': 'test card'}
carddata.user = user
carddata.store()
carddata.just_created()
carddata.perform_workflow()
assert formdef.data_class().count() == 0
assert carddef.data_class().count() == 1
# related form and card
assert external_formdef.data_class().count() == 1
assert external_carddef.data_class().count() == 1
resp = app.get('/backoffice/data/external-action-card/1/inspect')
assert 'Related Forms/Cards' in resp.text
# related form and card
assert (
'<a href="http://example.net/backoffice/management/external-form/2/">External Form #1-2 (Evolution)</a>'
in resp.text
)
assert (
'<a href="http://example.net/backoffice/data/external-card/2/">External Card #1-2 (Evolution)</a>'
in resp.text
)
# check related form
resp = app.get('/backoffice/management/external-form/2/')
assert (
'<h3>Original card</h3><p><a href="http://example.net/backoffice/data/external-action-card/1/">External action card #2-1</a></p>'
in resp.text
)
resp = app.get('/backoffice/management/external-form/2/inspect')
# parent
assert (
'<a href="http://example.net/backoffice/data/external-action-card/1/">External action card #2-1 (Parent)</a>'
in resp.text
)
# check related card
resp = app.get('/backoffice/data/external-card/2/')
assert (
'<h3>Original card</h3><p><a href="http://example.net/backoffice/data/external-action-card/1/">External action card #2-1</a></p>'
in resp.text
)
resp = app.get('/backoffice/data/external-card/2/inspect')
# parent
assert (
'<a href="http://example.net/backoffice/data/external-action-card/1/">External action card #2-1 (Parent)</a>'
in resp.text
)
FormDef.wipe()
CardDef.wipe()
Workflow.wipe()
# test linked Card in datasource
wf = Workflow(name='WF')
st1 = wf.add_status('NEW')
wf.store()
wfc = Workflow(name='WFC')
wfc.add_status('NEW')
wfc.store()
carddef = CardDef()
carddef.name = 'CARD A'
carddef.fields = [
fields.StringField(id='0', label='string', varname='string'),
]
carddef.backoffice_submission_roles = user.roles
carddef.workflow = wfc
carddef.store()
datasource = {'type': 'carddef:%s' % carddef.url_name}
formdef = FormDef()
formdef.name = 'FORM A'
formdef.fields = [
fields.ItemField(id='0', label='Card', type='item', varname='card', data_source=datasource),
]
formdef.workflow = wf
formdef.store()
carddata = carddef.data_class()()
carddata.data = {'0': 'Text'}
carddata.store()
formdata = formdef.data_class()()
formdata.data = {'0': '1'}
formdata.store()
formdata.just_created()
formdata.perform_workflow()
assert formdef.data_class().count() == 1
assert carddef.data_class().count() == 1
resp = app.get('/backoffice/management/form-a/1/inspect')
assert 'Related Forms/Cards' in resp.text
# related card
assert (
'<a href="http://example.net/backoffice/data/card-a/1/">CARD A #1-1 (Data Source - in field with identifier: card)</a>'
in resp.text
)
# missing carddata
carddef.data_class().wipe()
resp = app.get('/backoffice/management/form-a/1/inspect')
assert 'Related Forms/Cards' in resp.text
assert (
'<a href="">Linked &quot;CARD A&quot; object by id 1 (Data Source - in field with identifier: card - not found)</a>'
in resp.text
)
# missing carddef
CardDef.wipe()
resp = app.get('/backoffice/management/form-a/1/inspect')
assert 'Related Forms/Cards' in resp.text
assert (
'<a href="">Linked object def by id card-a (Data Source - in field with identifier: card - not found)</a>'
in resp.text
)
def test_inspect_page_actions_traces(pub):
create_user(pub, is_admin=True)
workflow = Workflow.get_default_workflow()
workflow.id = '2'
workflow.criticality_levels = [
WorkflowCriticalityLevel(name='green'),
WorkflowCriticalityLevel(name='yellow'),
WorkflowCriticalityLevel(name='red'),
]
action = workflow.add_global_action('Timeout Test')
action.add_action('modify_criticality')
trigger = action.append_trigger('timeout')
trigger.anchor = 'creation'
trigger.timeout = '2'
workflow.store()
FormDef.wipe()
formdef = FormDef()
formdef.name = 'form title'
formdef.workflow_id = workflow.id
formdef.store()
formdef.data_class().wipe()
formdata = formdef.data_class()()
formdata.data = {}
formdata.just_created()
formdata.perform_workflow()
formdata.store()
# change receipt time to get global timeout to run
formdata.receipt_time = time.localtime(time.time() - 3 * 86400)
formdata.store()
pub.apply_global_action_timeouts()
formdata.refresh_from_storage()
assert formdata.get_criticality_level_object().name == 'yellow'
resp = login(get_app(pub)).get(formdata.get_url(backoffice=True), status=200)
resp = resp.click('Data Inspector')
assert '>Actions Tracing</' in resp
assert [x.text for x in resp.pyquery('#inspect-timeline strong')] == ['Just Submitted', 'New']
assert [x.text for x in resp.pyquery('#inspect-timeline a.tracing-link') if x.text] == [
'Email',
'Email',
'Automatic Jump',
'Criticality Levels',
]
action_links = [x.attrib['href'] for x in resp.pyquery('#inspect-timeline a.tracing-link')]
assert action_links[0] == 'http://example.net/backoffice/workflows/2/status/just_submitted/'
assert (
action_links[1]
== 'http://example.net/backoffice/workflows/2/status/just_submitted/items/_notify_new_receiver_email/'
)
assert action_links[-1] == 'http://example.net/backoffice/workflows/2/global-actions/1/items/1/'
def test_inspect_page_missing_carddef_error(pub):
create_user(pub, is_admin=True)
formdef = FormDef()
formdef.name = 'form title'
formdef.fields = []
formdef.store()
formdata = formdef.data_class()()
formdata.just_created()
formdata.store()
resp = login(get_app(pub)).get('%sinspect' % formdata.get_url(backoffice=True), status=200)
resp.form['test_mode'] = 'template'
resp.form['template'] = '{{ cards|objects:"XXX" }}'
resp = resp.form.submit()
assert 'Failed to evaluate template' in resp.text
assert ' such card model: XXX' in resp.text
def test_inspect_page_draft_formdata(pub, local_user):
create_user(pub, is_admin=True)
formdef = FormDef()
formdef.name = 'form title'
formdef.workflow_roles = {'_receiver': 1}
formdef.store()
formdata = formdef.data_class()()
formdata.status = 'draft'
formdata.store()
app = login(get_app(pub))
app.get(formdata.get_url(backoffice=True) + 'inspect', status=403)
def test_inspect_page_map_field(pub, local_user):
create_user(pub)
formdef = FormDef()
formdef.name = 'form title'
formdef.fields = [
fields.MapField(id='1', label='1st field', type='map', varname='map1'),
fields.MapField(id='2', label='2nd field', type='map', varname='map2'),
fields.MapField(id='3', label='3rd field', type='map', varname='map3'),
]
formdef.workflow_roles = {'_receiver': 1}
formdef.store()
formdata = formdef.data_class()()
formdata.just_created()
formdata.data = {
'1': '1.2345;6.789', # valid value
'2': None, # empty value
'3': 'XXX;YYY', # invalid value
}
formdata.jump_status('new')
formdata.store()
create_user(pub, is_admin=True)
resp = login(get_app(pub)).get('%sinspect' % formdata.get_url(backoffice=True))
assert resp.pyquery('[title="form_var_map1"]')
assert resp.pyquery('[title="form_var_map1_lat"]')
assert resp.pyquery('[title="form_var_map1_lon"]')
assert resp.pyquery('[title="form_var_map2"]')
assert not resp.pyquery('[title="form_var_map2_lat"]')
assert not resp.pyquery('[title="form_var_map2_lon"]')
assert resp.pyquery('[title="form_var_map3"]')
assert not resp.pyquery('[title="form_var_map3_lat"]')
assert not resp.pyquery('[title="form_var_map3_lon"]')
def test_inspect_page_lazy_list(pub):
FormDef.wipe()
formdef = FormDef()
formdef.name = 'form title'
formdef.fields = [
fields.StringField(id='1', label='String', type='string', varname='string'),
]
formdef.store()
formdef.data_class().wipe()
for value in ('foo', 'bar', 'baz'):
formdata = formdef.data_class()()
formdata.data = {'1': value}
formdata.just_created()
formdata.jump_status('new')
formdata.store()
create_user(pub, is_admin=True)
resp = login(get_app(pub)).get('%sinspect' % formdata.get_url(backoffice=True))
resp.form['test_mode'] = 'template'
resp.form['template'] = '{{ form_objects|order_by:"string"|getlist:"string" }}'
resp = resp.form.submit()
assert 'rendered as an object' in resp.text
assert resp.pyquery('.test-tool-lazylist-details li:first-child').text() == 'Number of items: 3'
assert resp.pyquery('.test-tool-lazylist-details li:last-child').text() == 'First items: bar, baz, foo'