1 |
1 |
import io
|
2 |
|
import shutil
|
3 |
2 |
import time
|
4 |
3 |
import xml.etree.ElementTree as ET
|
5 |
4 |
|
6 |
5 |
import pytest
|
7 |
|
from quixote import cleanup
|
8 |
6 |
|
|
7 |
from wcs.blocks import BlockDef
|
9 |
8 |
from wcs.carddef import CardDef
|
10 |
9 |
from wcs.categories import Category
|
11 |
10 |
from wcs.formdef import FormDef, FormdefImportError, fields
|
12 |
11 |
from wcs.qommon.misc import indent_xml as indent
|
13 |
12 |
from wcs.workflows import Workflow
|
14 |
13 |
|
15 |
|
from .utilities import create_temporary_pub
|
|
14 |
from .utilities import clean_temporary_pub, create_temporary_pub
|
16 |
15 |
|
17 |
16 |
|
18 |
|
def setup_module(module):
|
19 |
|
cleanup()
|
20 |
|
global pub
|
21 |
|
pub = create_temporary_pub()
|
|
17 |
@pytest.fixture
|
|
18 |
def pub(request):
|
|
19 |
return create_temporary_pub()
|
22 |
20 |
|
23 |
21 |
|
24 |
22 |
def teardown_module(module):
|
25 |
|
shutil.rmtree(pub.APP_DIR)
|
|
23 |
clean_temporary_pub()
|
26 |
24 |
|
27 |
25 |
|
28 |
26 |
def export_to_indented_xml(formdef, include_id=False):
|
... | ... | |
55 |
53 |
return formdef2
|
56 |
54 |
|
57 |
55 |
|
58 |
|
def test_empty():
|
|
56 |
def test_empty(pub):
|
59 |
57 |
formdef = FormDef()
|
60 |
58 |
formdef.name = 'empty'
|
61 |
59 |
assert_xml_import_export_works(formdef)
|
62 |
60 |
assert_json_import_export_works(formdef)
|
63 |
61 |
|
64 |
62 |
|
65 |
|
def test_text_attributes():
|
|
63 |
def test_text_attributes(pub):
|
66 |
64 |
formdef = FormDef()
|
67 |
65 |
formdef.name = 'Foo'
|
68 |
66 |
formdef.url_name = 'foo'
|
... | ... | |
72 |
70 |
assert f2.url_name == formdef.url_name
|
73 |
71 |
|
74 |
72 |
|
75 |
|
def test_empty_description_tag():
|
|
73 |
def test_empty_description_tag(pub):
|
76 |
74 |
formdef = FormDef()
|
77 |
75 |
formdef.name = 'empty'
|
78 |
76 |
assert_xml_import_export_works(formdef)
|
... | ... | |
83 |
81 |
assert not formdef2.description
|
84 |
82 |
|
85 |
83 |
|
86 |
|
def test_empty_display_locations_tag():
|
|
84 |
def test_empty_display_locations_tag(pub):
|
87 |
85 |
formdef = FormDef()
|
88 |
86 |
formdef.name = 'Foo'
|
89 |
87 |
formdef.fields = [
|
... | ... | |
113 |
111 |
assert '<display_locations />' in str(ET.tostring(f3))
|
114 |
112 |
|
115 |
113 |
|
116 |
|
def test_boolean_attributes():
|
|
114 |
def test_boolean_attributes(pub):
|
117 |
115 |
formdef = FormDef()
|
118 |
116 |
formdef.name = 'Foo'
|
119 |
117 |
formdef.url_name = 'foo'
|
... | ... | |
127 |
125 |
assert f2.confirmation == formdef.confirmation
|
128 |
126 |
|
129 |
127 |
|
130 |
|
def test_a_field():
|
|
128 |
def test_a_field(pub):
|
131 |
129 |
formdef = FormDef()
|
132 |
130 |
formdef.name = 'Foo'
|
133 |
131 |
formdef.fields = [fields.StringField(type='string', id=1, label='Bar', size='40')]
|
... | ... | |
137 |
135 |
assert len(f2.fields) == len(formdef.fields)
|
138 |
136 |
|
139 |
137 |
|
140 |
|
def test_more_fields():
|
|
138 |
def test_more_fields(pub):
|
141 |
139 |
formdef = FormDef()
|
142 |
140 |
formdef.name = 'Blah'
|
143 |
141 |
formdef.fields = [
|
... | ... | |
160 |
158 |
assert f2.fields[4].items == formdef.fields[4].items
|
161 |
159 |
|
162 |
160 |
|
163 |
|
def test_item_radio():
|
|
161 |
def test_item_radio(pub):
|
164 |
162 |
formdef = FormDef()
|
165 |
163 |
formdef.name = 'Blah'
|
166 |
164 |
formdef.fields = [
|
... | ... | |
193 |
191 |
assert fd2.fields[0].display_mode == 'list'
|
194 |
192 |
|
195 |
193 |
|
196 |
|
def test_include_id():
|
|
194 |
def test_include_id(pub):
|
197 |
195 |
formdef = FormDef()
|
198 |
196 |
formdef.name = 'Blah'
|
199 |
197 |
formdef.fields = [
|
... | ... | |
217 |
215 |
assert f2.fields[4].id == formdef.fields[4].id
|
218 |
216 |
|
219 |
217 |
|
220 |
|
def test_workflow_options():
|
|
218 |
def test_workflow_options(pub):
|
221 |
219 |
formdef = FormDef()
|
222 |
220 |
formdef.name = 'workflow options'
|
223 |
221 |
formdef.workflow_options = {'foo': 'bar', 'foo2': 'baré'}
|
... | ... | |
227 |
225 |
assert fd2.workflow_options == formdef.workflow_options
|
228 |
226 |
|
229 |
227 |
|
230 |
|
def test_workflow_options_with_no_values():
|
|
228 |
def test_workflow_options_with_no_values(pub):
|
231 |
229 |
formdef = FormDef()
|
232 |
230 |
formdef.name = 'foo'
|
233 |
231 |
formdef.workflow_options = {'foo': None, 'foo2': None}
|
... | ... | |
237 |
235 |
assert fd2.workflow_options == formdef.workflow_options
|
238 |
236 |
|
239 |
237 |
|
240 |
|
def test_workflow_options_with_file():
|
|
238 |
def test_workflow_options_with_file(pub):
|
241 |
239 |
from quixote.http_request import Upload
|
242 |
240 |
|
243 |
241 |
from wcs.qommon.form import UploadedFile
|
... | ... | |
260 |
258 |
assert formdef.workflow_options['foo'].get_content() == fd2.workflow_options['foo'].get_content()
|
261 |
259 |
|
262 |
260 |
|
263 |
|
def test_workflow_options_with_date():
|
|
261 |
def test_workflow_options_with_date(pub):
|
264 |
262 |
formdef = FormDef()
|
265 |
263 |
formdef.name = 'foo'
|
266 |
264 |
formdef.workflow_options = {'foo': time.strptime('2014-02-02', '%Y-%m-%d')}
|
... | ... | |
268 |
266 |
assert formdef.workflow_options['foo'] == fd2.workflow_options['foo']
|
269 |
267 |
|
270 |
268 |
|
271 |
|
def test_workflow_reference():
|
|
269 |
def test_workflow_reference(pub):
|
272 |
270 |
Workflow.wipe()
|
273 |
271 |
FormDef.wipe()
|
274 |
272 |
|
... | ... | |
302 |
300 |
assert FormDef.import_from_xml_tree(formdef_xml_with_id, include_id=True).workflow_id is None
|
303 |
301 |
|
304 |
302 |
|
305 |
|
def test_category_reference():
|
|
303 |
def test_category_reference(pub):
|
306 |
304 |
Category.wipe()
|
307 |
305 |
FormDef.wipe()
|
308 |
306 |
|
... | ... | |
336 |
334 |
assert FormDef.import_from_xml_tree(formdef_xml_with_id, include_id=True).category_id is None
|
337 |
335 |
|
338 |
336 |
|
339 |
|
def test_file_field():
|
|
337 |
def test_file_field(pub):
|
340 |
338 |
formdef = FormDef()
|
341 |
339 |
formdef.name = 'foo'
|
342 |
340 |
formdef.fields = [
|
... | ... | |
359 |
357 |
assert_json_import_export_works(formdef)
|
360 |
358 |
|
361 |
359 |
|
362 |
|
def test_invalid_field_type():
|
|
360 |
def test_invalid_field_type(pub):
|
363 |
361 |
formdef = FormDef()
|
364 |
362 |
formdef.name = 'foo'
|
365 |
363 |
formdef.fields = [fields.StringField(id='1', type='XXX')]
|
... | ... | |
368 |
366 |
FormDef.import_from_xml(io.BytesIO(export), include_id=True)
|
369 |
367 |
|
370 |
368 |
|
371 |
|
def test_invalid_data_source():
|
|
369 |
def test_invalid_data_source(pub):
|
372 |
370 |
# manually edited exports
|
373 |
371 |
formdef = FormDef()
|
374 |
372 |
formdef.name = 'foo'
|
... | ... | |
386 |
384 |
assert formdef2.fields[0].data_source == {}
|
387 |
385 |
|
388 |
386 |
|
389 |
|
def test_unknown_data_source():
|
|
387 |
def test_unknown_data_source(pub):
|
390 |
388 |
formdef = FormDef()
|
391 |
389 |
formdef.name = 'foo'
|
392 |
390 |
formdef.fields = [
|
... | ... | |
440 |
438 |
FormDef.import_from_xml(io.BytesIO(export))
|
441 |
439 |
|
442 |
440 |
|
443 |
|
def test_duplicated_field_ids():
|
|
441 |
def test_formdef_with_block(pub):
|
|
442 |
BlockDef.wipe()
|
|
443 |
block = BlockDef()
|
|
444 |
block.name = 'foobar'
|
|
445 |
block.digest_template = 'X{{foobar_var_foo}}Y'
|
|
446 |
block.fields = [
|
|
447 |
fields.StringField(id='123', required=True, label='Test', type='string', varname='foo'),
|
|
448 |
]
|
|
449 |
block.store()
|
|
450 |
|
|
451 |
formdef = FormDef()
|
|
452 |
formdef.name = 'foo'
|
|
453 |
formdef.fields = [fields.BlockField(id='1', type='block:foobar')]
|
|
454 |
|
|
455 |
BlockDef.wipe()
|
|
456 |
export = ET.tostring(export_to_indented_xml(formdef))
|
|
457 |
with pytest.raises(FormdefImportError, match='Unknown field type'):
|
|
458 |
FormDef.import_from_xml(io.BytesIO(export))
|
|
459 |
|
|
460 |
|
|
461 |
def test_duplicated_field_ids(pub):
|
444 |
462 |
formdef = FormDef()
|
445 |
463 |
formdef.name = 'foo'
|
446 |
464 |
formdef.fields = [
|
... | ... | |
462 |
480 |
assert formdef2.fields[2].id == '3'
|
463 |
481 |
|
464 |
482 |
|
465 |
|
def test_wrong_max_field_id():
|
|
483 |
def test_wrong_max_field_id(pub):
|
466 |
484 |
formdef = FormDef()
|
467 |
485 |
formdef.name = 'foo'
|
468 |
486 |
formdef.fields = [
|
... | ... | |
476 |
494 |
assert formdef2.max_field_id == 2
|
477 |
495 |
|
478 |
496 |
|
479 |
|
def test_page_condition():
|
|
497 |
def test_page_condition(pub):
|
480 |
498 |
formdef = FormDef()
|
481 |
499 |
formdef.name = 'foo'
|
482 |
500 |
formdef.fields = [fields.PageField(id='1', type='page', condition={'type': 'python', 'value': 'blah'})]
|
... | ... | |
493 |
511 |
assert fd2.fields[0].condition == formdef.fields[0].condition
|
494 |
512 |
|
495 |
513 |
|
496 |
|
def test_page_post_conditions():
|
|
514 |
def test_page_post_conditions(pub):
|
497 |
515 |
formdef = FormDef()
|
498 |
516 |
formdef.name = 'foo'
|
499 |
517 |
formdef.fields = [
|
... | ... | |
531 |
549 |
assert fd2.fields[0].post_conditions[0]['error_message'] == ''
|
532 |
550 |
|
533 |
551 |
|
534 |
|
def test_workflow_roles():
|
|
552 |
def test_geolocations(pub):
|
|
553 |
formdef = FormDef()
|
|
554 |
formdef.name = 'foo'
|
|
555 |
formdef.fields = []
|
|
556 |
formdef.geolocations = {'base': 'Base'}
|
|
557 |
fd2 = assert_xml_import_export_works(formdef, include_id=True)
|
|
558 |
assert fd2.geolocations == formdef.geolocations
|
|
559 |
fd3 = assert_json_import_export_works(formdef)
|
|
560 |
assert fd3.geolocations == formdef.geolocations
|
|
561 |
|
|
562 |
|
|
563 |
def test_workflow_roles(pub):
|
535 |
564 |
pub.role_class.wipe()
|
536 |
565 |
role = pub.role_class(name='blah')
|
537 |
566 |
role.store()
|
... | ... | |
562 |
591 |
assert fd2.workflow_roles.get('_receiver') is None
|
563 |
592 |
|
564 |
593 |
|
565 |
|
def test_geolocations():
|
566 |
|
formdef = FormDef()
|
567 |
|
formdef.name = 'foo'
|
568 |
|
formdef.fields = []
|
569 |
|
formdef.geolocations = {'base': 'Base'}
|
570 |
|
fd2 = assert_xml_import_export_works(formdef, include_id=True)
|
571 |
|
assert fd2.geolocations == formdef.geolocations
|
572 |
|
fd3 = assert_json_import_export_works(formdef)
|
573 |
|
assert fd3.geolocations == formdef.geolocations
|
574 |
|
|
575 |
|
|
576 |
|
def test_user_roles():
|
|
594 |
def test_user_roles(pub):
|
577 |
595 |
pub.role_class.wipe()
|
578 |
596 |
|
579 |
597 |
role = pub.role_class(name='blah')
|
... | ... | |
600 |
618 |
assert fd2.roles == ['logged-users']
|
601 |
619 |
|
602 |
620 |
|
603 |
|
def test_backoffice_submission_roles():
|
|
621 |
def test_backoffice_submission_roles(pub):
|
604 |
622 |
pub.role_class.wipe()
|
605 |
623 |
|
606 |
624 |
role = pub.role_class(name='blah')
|
... | ... | |
614 |
632 |
assert fd2.backoffice_submission_roles == formdef.backoffice_submission_roles
|
615 |
633 |
|
616 |
634 |
|
617 |
|
def test_required_authentication_contexts():
|
|
635 |
def test_required_authentication_contexts(pub):
|
618 |
636 |
formdef = FormDef()
|
619 |
637 |
formdef.name = 'foo'
|
620 |
638 |
formdef.fields = []
|
... | ... | |
623 |
641 |
assert fd2.required_authentication_contexts == formdef.required_authentication_contexts
|
624 |
642 |
|
625 |
643 |
|
626 |
|
def test_field_condition():
|
|
644 |
def test_field_condition(pub):
|
627 |
645 |
formdef = FormDef()
|
628 |
646 |
formdef.name = 'Foo'
|
629 |
647 |
formdef.fields = [
|
... | ... | |
636 |
654 |
assert f2.fields[0].condition == {'type': 'django', 'value': '1'}
|
637 |
655 |
|
638 |
656 |
|
639 |
|
def test_field_validation():
|
|
657 |
def test_field_validation(pub):
|
640 |
658 |
formdef = FormDef()
|
641 |
659 |
formdef.name = 'Foo'
|
642 |
660 |
formdef.fields = [fields.StringField(type='string', id=1, label='Bar', size='40', validation={})]
|
... | ... | |
669 |
687 |
assert f2.fields[0].validation == {'type': 'regex', 'value': '\\d'}
|
670 |
688 |
|
671 |
689 |
|
672 |
|
def test_digest_templates():
|
|
690 |
def test_digest_templates(pub):
|
673 |
691 |
formdef = FormDef()
|
674 |
692 |
formdef.name = 'Foo'
|
675 |
693 |
formdef.fields = []
|
... | ... | |
678 |
696 |
assert f2.digest_templates == formdef.digest_templates
|
679 |
697 |
|
680 |
698 |
|
681 |
|
def test_field_prefill():
|
|
699 |
def test_field_prefill(pub):
|
682 |
700 |
formdef = FormDef()
|
683 |
701 |
formdef.name = 'Foo'
|
684 |
702 |
formdef.fields = [
|
... | ... | |
734 |
752 |
assert f2.fields[0].prefill == {'type': 'string', 'value': None}
|
735 |
753 |
|
736 |
754 |
|
737 |
|
def test_custom_views():
|
|
755 |
def test_custom_views(pub):
|
738 |
756 |
formdef = FormDef()
|
739 |
757 |
formdef.name = 'foo'
|
740 |
758 |
formdef.fields = [
|
741 |
|
-
|