Projet

Général

Profil

0002-misc-split-form-pages-tests-block.patch

Lauréline Guérin, 23 octobre 2020 09:42

Télécharger (54,9 ko)

Voir les différences:

Subject: [PATCH 2/3] misc: split form pages tests (block)

 tests/test_form_pages/test_all.py   | 760 +-------------------------
 tests/test_form_pages/test_block.py | 802 ++++++++++++++++++++++++++++
 2 files changed, 807 insertions(+), 755 deletions(-)
 create mode 100644 tests/test_form_pages/test_block.py
tests/test_form_pages/test_all.py
1 1
# -*- coding: utf-8 -*-
2 2

  
3
import datetime
4 3
import json
5 4
import pytest
6 5
import hashlib
......
19 18
except ImportError:
20 19
    Image = None
21 20

  
22
from django.utils import six
23 21
from django.utils.six import StringIO, BytesIO
24 22
from django.utils.six.moves.urllib import parse as urlparse
25 23

  
......
30 28
from wcs.qommon.emails import docutils
31 29
from wcs.qommon.form import UploadedFile
32 30
from wcs.qommon.ident.password_accounts import PasswordAccount
33
from wcs.blocks import BlockDef
34 31
from wcs.carddef import CardDef
35 32
from wcs.formdef import FormDef
36
from wcs.workflows import (Workflow, EditableWorkflowStatusItem,
37
        DisplayMessageWorkflowStatusItem, WorkflowBackofficeFieldsFormDef,
38
        ChoiceWorkflowStatusItem, JumpOnSubmitWorkflowStatusItem,
39
        SendmailWorkflowStatusItem, CommentableWorkflowStatusItem,
40
        WorkflowVariablesFieldsFormDef)
33
from wcs.workflows import (
34
    Workflow, EditableWorkflowStatusItem,
35
    DisplayMessageWorkflowStatusItem, WorkflowBackofficeFieldsFormDef,
36
    ChoiceWorkflowStatusItem, JumpOnSubmitWorkflowStatusItem,
37
    CommentableWorkflowStatusItem, WorkflowVariablesFieldsFormDef)
41 38
from wcs.wf.backoffice_fields import SetBackofficeFieldsWorkflowStatusItem
42 39
from wcs.wf.export_to_model import ExportToModel, transform_to_pdf
43 40
from wcs.wf.jump import JumpWorkflowStatusItem
......
8714 8711
        '1_structured': {'id': '1', 'text': 'un', 'more': 'foo'},
8715 8712
    }
8716 8713
    assert '2020-04-18' in formdata.evolution[0].parts[0].content
8717

  
8718

  
8719
def test_block_simple(pub, blocks_feature):
8720
    create_user(pub)
8721
    FormDef.wipe()
8722
    BlockDef.wipe()
8723

  
8724
    block = BlockDef()
8725
    block.name = 'foobar'
8726
    block.fields = [
8727
        fields.StringField(id='123', required=True, label='Test', type='string'),
8728
        fields.StringField(id='234', required=True, label='Test2', type='string'),
8729
    ]
8730
    block.store()
8731

  
8732
    formdef = FormDef()
8733
    formdef.name = 'form title'
8734
    formdef.fields = [
8735
        fields.BlockField(id='1', label='test', type='block:foobar', hint='hintblock'),
8736
    ]
8737
    formdef.store()
8738

  
8739
    app = get_app(pub)
8740
    resp = app.get(formdef.get_url())
8741
    assert resp.text.count('>hintblock<') == 1
8742
    resp.form['f1$element0$f123'] = 'foo'
8743
    resp.form['f1$element0$f234'] = 'bar'
8744
    resp = resp.form.submit('submit')  # -> validation page
8745
    assert resp.form['f1$element0$f123'].attrs['readonly']
8746
    assert resp.form['f1$element0$f123'].value == 'foo'
8747
    assert resp.form['f1$element0$f234'].attrs['readonly']
8748
    assert resp.form['f1$element0$f234'].value == 'bar'
8749
    resp = resp.form.submit('submit')  # -> end page
8750
    resp = resp.follow()
8751
    assert '>foo<' in resp
8752
    assert '>bar<' in resp
8753

  
8754

  
8755
def test_block_required(pub, blocks_feature):
8756
    create_user(pub)
8757
    FormDef.wipe()
8758
    BlockDef.wipe()
8759

  
8760
    block = BlockDef()
8761
    block.name = 'foobar'
8762
    block.fields = [
8763
        fields.StringField(id='123', required=True, label='Test', type='string'),
8764
        fields.StringField(id='234', required=True, label='Test2', type='string'),
8765
    ]
8766
    block.store()
8767

  
8768
    formdef = FormDef()
8769
    formdef.name = 'form title'
8770
    formdef.fields = [
8771
        fields.BlockField(id='1', label='test', type='block:foobar'),
8772
    ]
8773
    formdef.store()
8774

  
8775
    app = get_app(pub)
8776
    resp = app.get(formdef.get_url())
8777
    resp = resp.form.submit('submit')  # -> error page
8778
    assert 'There were errors processing the form' in resp
8779
    assert resp.text.count('required field') == 1
8780
    resp.form['f1$element0$f123'] = 'foo'
8781
    resp.form['f1$element0$f234'] = 'bar'
8782
    resp = resp.form.submit('submit')  # -> validation page
8783
    assert 'Check values then click submit.' in resp.text
8784

  
8785
    resp = app.get(formdef.get_url())
8786
    resp.form['f1$element0$f123'] = 'foo'
8787
    resp = resp.form.submit('submit')  # -> error page
8788
    assert 'There were errors processing the form' in resp
8789
    assert resp.text.count('required field') == 1
8790
    resp.form['f1$element0$f234'] = 'bar'
8791
    resp = resp.form.submit('submit')  # -> validation page
8792
    assert 'Check values then click submit.' in resp.text
8793

  
8794
    # only one required
8795
    block.fields = [
8796
        fields.StringField(id='123', required=True, label='Test', type='string'),
8797
        fields.StringField(id='234', required=False, label='Test2', type='string'),
8798
    ]
8799
    block.store()
8800

  
8801
    resp = app.get(formdef.get_url())
8802
    resp.form['f1$element0$f123'] = 'foo'
8803
    resp = resp.form.submit('submit')  # -> validation page
8804
    assert 'Check values then click submit.' in resp.text
8805

  
8806
    # none required, but globally required
8807
    block.fields = [
8808
        fields.StringField(id='123', required=False, label='Test', type='string'),
8809
        fields.StringField(id='234', required=False, label='Test2', type='string'),
8810
    ]
8811
    block.store()
8812

  
8813
    resp = app.get(formdef.get_url())
8814
    resp = resp.form.submit('submit')  # -> error page
8815
    assert 'There were errors processing the form' in resp
8816
    assert resp.text.count('required field') == 1
8817
    resp.form['f1$element0$f234'] = 'bar'
8818
    resp = resp.form.submit('submit')  # -> validation page
8819
    assert 'Check values then click submit.' in resp.text
8820

  
8821

  
8822
def test_block_date(pub, blocks_feature):
8823
    create_user(pub)
8824
    FormDef.wipe()
8825
    BlockDef.wipe()
8826

  
8827
    block = BlockDef()
8828
    block.name = 'foobar'
8829
    block.fields = [
8830
        fields.StringField(id='123', required=True, label='Test', type='string'),
8831
        fields.DateField(id='234', required=True, label='Test2', type='date'),
8832
    ]
8833
    block.store()
8834

  
8835
    formdef = FormDef()
8836
    formdef.name = 'form title'
8837
    formdef.fields = [
8838
        fields.BlockField(id='1', label='test', type='block:foobar'),
8839
    ]
8840
    formdef.store()
8841

  
8842
    app = get_app(pub)
8843
    resp = app.get(formdef.get_url())
8844
    resp.form['f1$element0$f123'] = 'foo'
8845
    resp.form['f1$element0$f234'] = '2020-06-16'
8846
    resp = resp.form.submit('submit')  # -> validation page
8847
    assert 'Check values then click submit.' in resp.text
8848
    resp = resp.form.submit('submit')  # -> submit
8849
    resp = resp.follow()
8850
    assert '>2020-06-16<' in resp
8851

  
8852

  
8853
def test_block_bool(pub, blocks_feature):
8854
    create_user(pub)
8855
    FormDef.wipe()
8856
    BlockDef.wipe()
8857

  
8858
    block = BlockDef()
8859
    block.name = 'foobar'
8860
    block.fields = [
8861
        fields.StringField(id='123', required=True, label='Test', type='string'),
8862
        fields.BoolField(id='234', required=False, label='Test2', type='bool'),
8863
    ]
8864
    block.store()
8865

  
8866
    formdef = FormDef()
8867
    formdef.name = 'form title'
8868
    formdef.fields = [
8869
        fields.BlockField(id='1', label='test', type='block:foobar'),
8870
    ]
8871
    formdef.store()
8872

  
8873
    for value in (True, False):
8874
        app = get_app(pub)
8875
        resp = app.get(formdef.get_url())
8876
        resp.form['f1$element0$f123'] = 'foo'
8877
        resp.form['f1$element0$f234'].checked = value
8878
        resp = resp.form.submit('submit')  # -> validation page
8879
        assert resp.form['f1$element0$f234disabled'].checked is value
8880
        assert resp.form['f1$element0$f234'].value == str(value)
8881
        assert 'Check values then click submit.' in resp
8882
        resp = resp.form.submit('submit')  # -> submit
8883
        resp = resp.follow()
8884
        if value:
8885
            assert '<div class="value">Yes</div>' in resp
8886
        else:
8887
            assert '<div class="value">No</div>' in resp
8888

  
8889

  
8890
def test_block_autocomplete_list(pub, blocks_feature):
8891
    create_user(pub)
8892
    FormDef.wipe()
8893
    BlockDef.wipe()
8894

  
8895
    block = BlockDef()
8896
    block.name = 'foobar'
8897
    block.fields = [
8898
        fields.StringField(id='123', required=True, label='Test', type='string'),
8899
        fields.ItemField(id='234', required=True, label='Test2', type='item',
8900
            display_mode='autocomplete', items=['Foo', 'Bar']),
8901
    ]
8902
    block.store()
8903

  
8904
    formdef = FormDef()
8905
    formdef.name = 'form title'
8906
    formdef.fields = [
8907
        fields.BlockField(id='1', label='test', type='block:foobar'),
8908
    ]
8909
    formdef.store()
8910

  
8911
    app = get_app(pub)
8912
    resp = app.get(formdef.get_url())
8913
    resp.form['f1$element0$f123'] = 'foo'
8914
    resp.form['f1$element0$f234'] = 'Bar'
8915
    resp = resp.form.submit('submit')  # -> validation page
8916
    assert 'Check values then click submit.' in resp.text
8917
    resp = resp.form.submit('submit')  # -> submit
8918
    resp = resp.follow()
8919
    assert '>Bar<' in resp
8920

  
8921

  
8922
def test_block_geoloc_prefill(pub, blocks_feature):
8923
    create_user(pub)
8924
    FormDef.wipe()
8925
    BlockDef.wipe()
8926

  
8927
    block = BlockDef()
8928
    block.name = 'foobar'
8929
    block.fields = [
8930
        fields.StringField(id='123', required=True, label='Test', type='string',
8931
            prefill={'type': 'geolocation', 'value': 'road'}),
8932
    ]
8933
    block.store()
8934

  
8935
    formdef = FormDef()
8936
    formdef.name = 'form title'
8937
    formdef.fields = [
8938
        fields.BlockField(id='1', label='test', type='block:foobar'),
8939
    ]
8940
    formdef.store()
8941

  
8942
    app = get_app(pub)
8943
    resp = app.get(formdef.get_url())
8944
    assert 'qommon.geolocation.js' in resp
8945
    assert resp.html.find('div', {'data-geolocation': 'road'})
8946

  
8947

  
8948
def test_block_string_prefill(pub, blocks_feature):
8949
    create_user(pub)
8950
    FormDef.wipe()
8951
    BlockDef.wipe()
8952

  
8953
    block = BlockDef()
8954
    block.name = 'foobar'
8955
    block.fields = [
8956
        fields.StringField(id='123', required=True, label='Test', type='string',
8957
            prefill={'type': 'string', 'value': '{{ form_var_foo }} World'}),
8958
    ]
8959
    block.store()
8960

  
8961
    formdef = FormDef()
8962
    formdef.name = 'form title'
8963
    formdef.fields = [
8964
        fields.PageField(id='0', label='1st page', type='page'),
8965
        fields.StringField(id='1', label='string', varname='foo'),
8966
        fields.PageField(id='2', label='2nd page', type='page'),
8967
        fields.BlockField(id='3', label='test', type='block:foobar'),
8968
    ]
8969
    formdef.store()
8970
    formdef.data_class().wipe()
8971

  
8972
    app = get_app(pub)
8973
    resp = app.get(formdef.get_url())
8974
    resp.form['f1'] = 'Hello'
8975
    resp = resp.form.submit('submit')  # -> 2nd page
8976
    assert resp.form['f3$element0$f123'].value == 'Hello World'
8977
    resp = resp.form.submit('submit')  # -> validation page
8978
    resp = resp.form.submit('submit')  # -> end page
8979
    resp = resp.follow()
8980

  
8981
    formdata = formdef.data_class().select()[0]
8982
    assert formdata.data['3']['data'][0]['123'] == 'Hello World'
8983

  
8984
    # check unmodified prefilled field
8985
    app = get_app(pub)
8986
    resp = app.get(formdef.get_url())
8987
    resp.form['f1'] = 'Hello'
8988
    resp = resp.form.submit('submit')  # -> 2nd page
8989
    assert resp.form['f3$element0$f123'].value == 'Hello World'
8990
    resp = resp.form.submit('submit')  # -> validation page
8991
    resp = resp.form.submit('previous')  # -> 2nd page
8992
    resp = resp.form.submit('previous')  # -> 1st page
8993
    resp.form['f1'] = 'Test'
8994
    resp = resp.form.submit('submit')  # -> 2nd page
8995
    assert resp.form['f3$element0$f123'].value == 'Test World'
8996

  
8997
    # check modified prefilled field
8998
    app = get_app(pub)
8999
    resp = app.get(formdef.get_url())
9000
    resp.form['f1'] = 'Hello'
9001
    resp = resp.form.submit('submit')  # -> 2nd page
9002
    assert resp.form['f3$element0$f123'].value == 'Hello World'
9003
    resp.form['f3$element0$f123'] = 'Foobar'
9004
    resp = resp.form.submit('submit')  # -> validation page
9005
    resp = resp.form.submit('previous')  # -> 2nd page
9006
    resp = resp.form.submit('previous')  # -> 1st page
9007
    resp.form['f1'] = 'Test'
9008
    resp = resp.form.submit('submit')  # -> 2nd page
9009
    assert resp.form['f3$element0$f123'].value == 'Foobar'
9010

  
9011

  
9012
def test_block_locked_prefill(pub, blocks_feature):
9013
    create_user(pub)
9014
    FormDef.wipe()
9015
    BlockDef.wipe()
9016

  
9017
    block = BlockDef()
9018
    block.name = 'foobar'
9019
    block.fields = [
9020
        fields.StringField(id='123', required=True, label='Test', type='string',
9021
            prefill={'type': 'string', 'value': '{{ form_var_foo }} World', 'locked': True}),
9022
    ]
9023
    block.store()
9024

  
9025
    formdef = FormDef()
9026
    formdef.name = 'form title'
9027
    formdef.fields = [
9028
        fields.PageField(id='0', label='1st page', type='page'),
9029
        fields.StringField(id='1', label='string', varname='foo'),
9030
        fields.PageField(id='2', label='2nd page', type='page'),
9031
        fields.BlockField(id='3', label='test', type='block:foobar'),
9032
    ]
9033
    formdef.store()
9034
    formdef.data_class().wipe()
9035

  
9036
    app = get_app(pub)
9037
    resp = app.get(formdef.get_url())
9038
    resp.form['f1'] = 'Hello'
9039
    resp = resp.form.submit('submit')  # -> 2nd page
9040
    assert resp.form['f3$element0$f123'].value == 'Hello World'
9041
    assert 'readonly' in resp.form['f3$element0$f123'].attrs
9042
    resp.form['f3$element0$f123'].value = 'Hello'  # try changing the value
9043
    resp = resp.form.submit('submit')  # -> validation page
9044
    resp = resp.form.submit('submit')  # -> end page
9045
    resp = resp.follow()
9046

  
9047
    formdata = formdef.data_class().select()[0]
9048
    assert formdata.data['3']['data'][0]['123'] == 'Hello World'  # value got reverted
9049

  
9050

  
9051
def test_workflow_form_block_prefill(pub):
9052
    create_user(pub)
9053
    FormDef.wipe()
9054
    BlockDef.wipe()
9055

  
9056
    block = BlockDef()
9057
    block.name = 'foobar'
9058
    block.fields = [
9059
        fields.StringField(id='123', required=True, label='Test', type='string',
9060
            prefill={'type': 'user', 'value': 'email'}),
9061
    ]
9062
    block.store()
9063

  
9064
    wf = Workflow(name='status')
9065
    st1 = wf.add_status('Status1', 'st1')
9066

  
9067
    display_form = FormWorkflowStatusItem()
9068
    display_form.id = '_x'
9069
    display_form.by = ['_submitter']
9070
    display_form.varname = 'xxx'
9071
    display_form.formdef = WorkflowFormFieldsFormDef(item=display_form)
9072
    display_form.formdef.fields.append(
9073
        fields.BlockField(id='3', label='test', type='block:foobar')
9074
    )
9075
    st1.items.append(display_form)
9076
    display_form.parent = st1
9077

  
9078
    wf.store()
9079

  
9080
    formdef = create_formdef()
9081
    formdef.workflow_id = wf.id
9082
    formdef.fields = []
9083
    formdef.store()
9084
    formdef.data_class().wipe()
9085

  
9086
    resp = login(get_app(pub), username='foo', password='foo').get('/test/')
9087
    resp = resp.form.submit('submit')  # -> validation
9088
    resp = resp.form.submit('submit').follow()
9089
    assert 'The form has been recorded' in resp
9090
    assert resp.form['f3$element0$f123'].value == 'foo@localhost'
9091

  
9092

  
9093
def test_block_title_and_comment(pub, blocks_feature):
9094
    create_user(pub)
9095
    FormDef.wipe()
9096
    BlockDef.wipe()
9097

  
9098
    block = BlockDef()
9099
    block.name = 'foobar'
9100
    block.fields = [
9101
        fields.StringField(id='123', required=True, label='Test', type='string'),
9102
        fields.TitleField(id='234', label='Blah', type='title'),
9103
        fields.CommentField(id='345', label='Blah', type='comment'),
9104
    ]
9105
    block.store()
9106

  
9107
    formdef = FormDef()
9108
    formdef.name = 'form title'
9109
    formdef.fields = [
9110
        fields.BlockField(id='1', label='test', type='block:foobar'),
9111
    ]
9112
    formdef.store()
9113

  
9114
    app = get_app(pub)
9115
    resp = app.get(formdef.get_url())
9116
    resp.form['f1$element0$f123'] = 'foo'
9117
    resp = resp.form.submit('submit')  # -> validation page
9118
    assert 'Check values then click submit.' in resp.text
9119
    resp = resp.form.submit('submit')  # -> submit
9120
    resp = resp.follow()
9121

  
9122

  
9123
def test_block_multipage(pub, blocks_feature):
9124
    create_user(pub)
9125
    FormDef.wipe()
9126
    BlockDef.wipe()
9127

  
9128
    block = BlockDef()
9129
    block.name = 'foobar'
9130
    block.fields = [
9131
        fields.StringField(id='123', required=True, label='Test', type='string'),
9132
        fields.StringField(id='234', required=True, label='Test2', type='string'),
9133
    ]
9134
    block.store()
9135

  
9136
    formdef = FormDef()
9137
    formdef.name = 'form title'
9138
    formdef.fields = [
9139
        fields.PageField(id='0', label='1st page', type='page'),
9140
        fields.BlockField(id='1', label='test', type='block:foobar'),
9141
        fields.PageField(id='2', label='2nd page', type='page'),
9142
    ]
9143
    formdef.store()
9144

  
9145
    app = get_app(pub)
9146
    resp = app.get(formdef.get_url())
9147
    resp.form['f1$element0$f123'] = 'foo'
9148
    resp.form['f1$element0$f234'] = 'bar'
9149
    resp = resp.form.submit('submit')  # -> 2nd page
9150
    resp = resp.form.submit('submit')  # -> validation page
9151
    assert resp.form['f1$element0$f123'].attrs['readonly']
9152
    assert resp.form['f1$element0$f123'].value == 'foo'
9153
    resp = resp.form.submit('previous')  # -> 2nd page
9154
    resp = resp.form.submit('previous')  # -> 1st page
9155
    assert 'readonly' not in resp.form['f1$element0$f123'].attrs
9156
    assert resp.form['f1$element0$f123'].value == 'foo'
9157
    resp = resp.form.submit('submit')  # -> 2nd page
9158
    resp = resp.form.submit('submit')  # -> validation page
9159
    resp = resp.form.submit('submit')  # -> submit
9160
    resp = resp.follow()
9161
    assert '>foo<' in resp
9162
    assert '>bar<' in resp
9163

  
9164

  
9165
def test_block_repeated(pub, blocks_feature):
9166
    create_user(pub)
9167
    FormDef.wipe()
9168
    BlockDef.wipe()
9169

  
9170
    block = BlockDef()
9171
    block.name = 'foobar'
9172
    block.fields = [
9173
        fields.StringField(id='123', required=True, label='Test', type='string'),
9174
        fields.StringField(id='234', required=True, label='Test2', type='string'),
9175
    ]
9176
    block.store()
9177

  
9178
    formdef = FormDef()
9179
    formdef.name = 'form title'
9180
    formdef.fields = [
9181
        fields.PageField(id='0', label='1st page', type='page'),
9182
        fields.BlockField(id='1', label='test', type='block:foobar', max_items=3, hint='hintblock'),
9183
        fields.PageField(id='2', label='2nd page', type='page'),
9184
    ]
9185
    formdef.store()
9186

  
9187
    app = get_app(pub)
9188
    resp = app.get(formdef.get_url())
9189
    assert resp.text.count('>Test<') == 1
9190
    assert resp.text.count('>hintblock<') == 1
9191
    assert 'Add another' in resp
9192
    assert resp.html.find('div', {'class': 'list-add'})
9193
    resp = resp.form.submit('f1$add_element')
9194
    assert resp.text.count('>Test<') == 2
9195
    assert resp.text.count('>hintblock<') == 1
9196
    resp = resp.form.submit('f1$add_element')
9197
    assert resp.text.count('>Test<') == 3
9198
    assert resp.text.count('>hintblock<') == 1
9199
    assert 'Add another' not in resp
9200

  
9201
    # fill items (1st and 3rd row)
9202
    resp.form['f1$element0$f123'] = 'foo'
9203
    resp.form['f1$element0$f234'] = 'bar'
9204
    resp.form['f1$element2$f123'] = 'foo2'
9205
    resp.form['f1$element2$f234'] = 'bar2'
9206

  
9207
    resp = resp.form.submit('submit')  # -> 2nd page
9208
    resp = resp.form.submit('submit')  # -> validation page
9209
    assert 'Check values then click submit.' in resp.text
9210
    assert resp.form['f1$element0$f123'].value == 'foo'
9211
    assert resp.form['f1$element0$f234'].value == 'bar'
9212
    assert resp.form['f1$element1$f123'].value == 'foo2'
9213
    assert resp.form['f1$element1$f234'].value == 'bar2'
9214

  
9215
    resp = resp.form.submit('previous')  # -> 2nd page
9216
    resp = resp.form.submit('previous')  # -> 1st page
9217
    assert 'readonly' not in resp.form['f1$element0$f123'].attrs
9218
    assert resp.form['f1$element0$f123'].value == 'foo'
9219

  
9220
    resp = resp.form.submit('submit')  # -> 2nd page
9221
    resp = resp.form.submit('submit')  # -> validation page
9222
    resp = resp.form.submit('submit')  # -> submit
9223
    resp = resp.follow()
9224
    assert '>foo<' in resp
9225
    assert '>bar<' in resp
9226
    assert '>foo2<' in resp
9227
    assert '>bar2<' in resp
9228

  
9229

  
9230
def test_block_repeated_over_limit(pub, blocks_feature):
9231
    create_user(pub)
9232
    FormDef.wipe()
9233
    BlockDef.wipe()
9234

  
9235
    block = BlockDef()
9236
    block.name = 'foobar'
9237
    block.fields = [
9238
        fields.StringField(id='123', required=True, label='Test', type='string'),
9239
        fields.StringField(id='234', required=True, label='Test2', type='string'),
9240
    ]
9241
    block.store()
9242

  
9243
    formdef = FormDef()
9244
    formdef.name = 'form title'
9245
    formdef.fields = [
9246
        fields.PageField(id='0', label='1st page', type='page'),
9247
        fields.BlockField(id='1', label='test', type='block:foobar', max_items=3),
9248
        fields.PageField(id='2', label='2nd page', type='page'),
9249
    ]
9250
    formdef.store()
9251

  
9252
    app = get_app(pub)
9253
    resp = app.get(formdef.get_url())
9254
    assert resp.text.count('>Test<') == 1
9255
    assert 'Add another' in resp
9256
    resp = resp.form.submit('f1$add_element')
9257
    assert resp.text.count('>Test<') == 2
9258
    resp = resp.form.submit('f1$add_element')
9259
    assert resp.text.count('>Test<') == 3
9260
    assert 'Add another' not in resp
9261

  
9262
    # fill items
9263
    resp.form['f1$element0$f123'] = 'foo'
9264
    resp.form['f1$element0$f234'] = 'bar'
9265
    resp.form['f1$element1$f123'] = 'foo1'
9266
    resp.form['f1$element1$f234'] = 'bar1'
9267
    resp.form['f1$element2$f123'] = 'foo2'
9268
    resp.form['f1$element2$f234'] = 'bar2'
9269

  
9270
    # (modify formdef to only allow 2)
9271
    formdef.fields[1].max_items = 2
9272
    formdef.store()
9273

  
9274
    # submit form
9275
    resp = resp.form.submit('submit')
9276
    assert 'Too many elements (maximum: 2)' in resp
9277

  
9278

  
9279
def test_block_repeated_files(pub, blocks_feature):
9280
    create_user(pub)
9281
    FormDef.wipe()
9282
    BlockDef.wipe()
9283

  
9284
    block = BlockDef()
9285
    block.name = 'foobar'
9286
    block.fields = [
9287
        fields.StringField(id='123', required=True, label='Test', type='string'),
9288
        fields.FileField(id='234', required=True, label='Test2', type='file'),
9289
    ]
9290
    block.store()
9291

  
9292
    formdef = FormDef()
9293
    formdef.name = 'form title'
9294
    formdef.fields = [
9295
        fields.PageField(id='0', label='1st page', type='page'),
9296
        fields.BlockField(id='1', label='test', type='block:foobar', max_items=3),
9297
        fields.PageField(id='2', label='2nd page', type='page'),
9298
    ]
9299
    formdef.store()
9300

  
9301
    app = get_app(pub)
9302
    resp = app.get(formdef.get_url())
9303
    assert resp.text.count('>Test<') == 1
9304
    assert 'Add another' in resp
9305
    resp = resp.form.submit('f1$add_element')
9306
    assert resp.text.count('>Test<') == 2
9307
    resp = resp.form.submit('f1$add_element')
9308
    assert resp.text.count('>Test<') == 3
9309
    assert 'Add another' not in resp
9310

  
9311
    # fill items (1st and 3rd row)
9312
    resp.form['f1$element0$f123'] = 'foo'
9313
    resp.form['f1$element0$f234$file'] = Upload('test1.txt', b'foobar1', 'text/plain')
9314
    resp.form['f1$element2$f123'] = 'foo2'
9315
    resp.form['f1$element2$f234$file'] = Upload('test2.txt', b'foobar2', 'text/plain')
9316

  
9317
    resp = resp.form.submit('submit')  # -> 2nd page
9318
    resp = resp.form.submit('submit')  # -> validation page
9319
    assert 'Check values then click submit.' in resp.text
9320
    assert resp.form['f1$element0$f123'].value == 'foo'
9321
    assert 'test1.txt' in resp
9322
    assert resp.form['f1$element1$f123'].value == 'foo2'
9323
    assert 'test2.txt' in resp
9324

  
9325
    resp = resp.form.submit('previous')  # -> 2nd page
9326
    resp = resp.form.submit('previous')  # -> 1st page
9327
    resp = resp.form.submit('submit')  # -> 2nd page
9328
    resp = resp.form.submit('submit')  # -> validation page
9329
    resp = resp.form.submit('submit')  # -> submit
9330
    resp = resp.follow()
9331
    assert '>foo<' in resp
9332
    assert 'test1.txt' in resp
9333
    assert '>foo2<' in resp
9334
    assert 'test2.txt' in resp
9335

  
9336

  
9337
def test_block_digest(pub, blocks_feature):
9338
    create_user(pub)
9339
    FormDef.wipe()
9340
    BlockDef.wipe()
9341

  
9342
    block = BlockDef()
9343
    block.name = 'foobar'
9344
    block.fields = [
9345
        fields.StringField(id='123', required=True, label='Test',
9346
            type='string', varname='foo'),
9347
        fields.StringField(id='234', required=True, label='Test2',
9348
            type='string', varname='bar'),
9349
    ]
9350
    block.store()
9351

  
9352
    formdef = FormDef()
9353
    formdef.name = 'form title'
9354
    formdef.fields = [
9355
        fields.BlockField(id='1', label='test', type='block:foobar', max_items=3),
9356
    ]
9357
    formdef.store()
9358

  
9359
    app = get_app(pub)
9360
    resp = app.get(formdef.get_url())
9361
    resp.form['f1$element0$f123'] = 'foo'
9362
    resp.form['f1$element0$f234'] = 'bar'
9363
    resp = resp.form.submit('f1$add_element')
9364
    resp.form['f1$element1$f123'] = 'foo2'
9365
    resp.form['f1$element1$f234'] = 'bar2'
9366

  
9367
    resp = resp.form.submit('submit')  # -> validation page
9368
    resp = resp.form.submit('submit')  # -> submit
9369

  
9370
    assert formdef.data_class().select()[0].data['1']['data'] == [
9371
            {'123': 'foo', '234': 'bar'}, {'123': 'foo2', '234': 'bar2'}]
9372
    # by default it gets the type of object
9373
    assert formdef.data_class().select()[0].data['1_display'] == 'foobar, foobar'
9374

  
9375
    # set a digest template
9376
    formdef.data_class().wipe()
9377

  
9378
    block.digest_template = 'X{{foobar_var_foo}}Y'
9379
    block.store()
9380

  
9381
    resp = app.get(formdef.get_url())
9382
    resp.form['f1$element0$f123'] = 'foo'
9383
    resp.form['f1$element0$f234'] = 'bar'
9384
    resp = resp.form.submit('f1$add_element')
9385
    resp.form['f1$element1$f123'] = 'foo2'
9386
    resp.form['f1$element1$f234'] = 'bar2'
9387

  
9388
    resp = resp.form.submit('submit')  # -> validation page
9389
    resp = resp.form.submit('submit')  # -> submit
9390
    assert formdef.data_class().select()[0].data['1']['data'] == [
9391
            {'123': 'foo', '234': 'bar'}, {'123': 'foo2', '234': 'bar2'}]
9392
    assert formdef.data_class().select()[0].data['1_display'] == 'XfooY, Xfoo2Y'
9393

  
9394

  
9395
def test_block_digest_item(pub, blocks_feature):
9396
    create_user(pub)
9397
    FormDef.wipe()
9398
    BlockDef.wipe()
9399
    NamedDataSource.wipe()
9400

  
9401
    # add a named data source
9402
    data_source = NamedDataSource(name='foobar')
9403
    data_source.data_source = {
9404
            'type': 'formula',
9405
            'value': repr([{'id': '1', 'text': 'un'},
9406
                           {'id': '2', 'text': 'deux'}])}
9407
    data_source.store()
9408

  
9409
    block = BlockDef()
9410
    block.name = 'foobar'
9411
    block.fields = [
9412
        fields.StringField(id='123', required=True, label='Test',
9413
            type='string', varname='foo'),
9414
        fields.ItemField(id='234', required=True, label='Test2',
9415
            type='item', varname='bar', data_source={'type': 'foobar'}),
9416
    ]
9417
    block.store()
9418

  
9419
    formdef = FormDef()
9420
    formdef.name = 'form title'
9421
    formdef.fields = [
9422
        fields.BlockField(id='1', label='test', type='block:foobar', max_items=3),
9423
    ]
9424
    formdef.store()
9425

  
9426
    app = get_app(pub)
9427
    resp = app.get(formdef.get_url())
9428
    resp.form['f1$element0$f123'] = 'foo'
9429
    resp.form['f1$element0$f234'] = '1'
9430
    resp = resp.form.submit('f1$add_element')
9431
    resp.form['f1$element1$f123'] = 'foo2'
9432
    resp.form['f1$element1$f234'] = '2'
9433

  
9434
    resp = resp.form.submit('submit')  # -> validation page
9435
    resp = resp.form.submit('submit')  # -> submit
9436

  
9437
    assert formdef.data_class().select()[0].data['1']['data'] == [
9438
            {'123': 'foo', '234': '1', '234_display': 'un'},
9439
            {'123': 'foo2', '234': '2', '234_display': 'deux'},
9440
    ]
9441
    # by default it gets the type of object
9442
    assert formdef.data_class().select()[0].data['1_display'] == 'foobar, foobar'
9443

  
9444
    # set a digest template
9445
    formdef.data_class().wipe()
9446

  
9447
    block.digest_template = 'X{{foobar_var_bar}}Y'
9448
    block.store()
9449

  
9450
    resp = app.get(formdef.get_url())
9451
    resp.form['f1$element0$f123'] = 'foo'
9452
    resp.form['f1$element0$f234'] = '1'
9453
    resp = resp.form.submit('f1$add_element')
9454
    resp.form['f1$element1$f123'] = 'foo2'
9455
    resp.form['f1$element1$f234'] = '2'
9456

  
9457
    resp = resp.form.submit('submit')  # -> validation page
9458
    resp = resp.form.submit('submit')  # -> submit
9459
    assert formdef.data_class().select()[0].data['1']['data'] == [
9460
            {'123': 'foo', '234': '1', '234_display': 'un'},
9461
            {'123': 'foo2', '234': '2', '234_display': 'deux'},
9462
    ]
9463
    assert formdef.data_class().select()[0].data['1_display'] == 'XunY, XdeuxY'
tests/test_form_pages/test_block.py
1
# -*- coding: utf-8 -*-
2

  
3
import pytest
4
from webtest import Upload
5

  
6
from wcs.qommon.ident.password_accounts import PasswordAccount
7
from wcs.blocks import BlockDef
8
from wcs.formdef import FormDef
9
from wcs.workflows import Workflow
10
from wcs.wf.form import FormWorkflowStatusItem, WorkflowFormFieldsFormDef
11
from wcs.categories import Category
12
from wcs.data_sources import NamedDataSource
13
from wcs import fields
14

  
15
from utilities import get_app, login, create_temporary_pub, clean_temporary_pub
16

  
17

  
18
def pytest_generate_tests(metafunc):
19
    if 'pub' in metafunc.fixturenames:
20
        metafunc.parametrize('pub', ['pickle', 'sql', 'pickle-templates', 'pickle-lazy'], indirect=True)
21

  
22

  
23
@pytest.fixture
24
def pub(request, emails):
25
    pub = create_temporary_pub(
26
            sql_mode=bool('sql' in request.param),
27
            templates_mode=bool('templates' in request.param),
28
            lazy_mode=bool('lazy' in request.param),
29
            )
30
    pub.cfg['identification'] = {'methods': ['password']}
31
    pub.cfg['language'] = {'language': 'en'}
32
    pub.write_cfg()
33

  
34
    if Category.count() == 0:
35
        cat = Category(name='foobar')
36
        cat.store()
37

  
38
    return pub
39

  
40

  
41
def teardown_module(module):
42
    clean_temporary_pub()
43

  
44

  
45
def create_user(pub):
46
    pub.user_class.wipe()
47
    PasswordAccount.wipe()
48

  
49
    user = pub.user_class()
50
    user.name = 'User Name'
51
    user.email = 'foo@localhost'
52
    user.store()
53
    account = PasswordAccount(id='foo')
54
    account.set_password('foo')
55
    account.user_id = user.id
56
    account.store()
57
    return user
58

  
59

  
60
def test_block_simple(pub, blocks_feature):
61
    FormDef.wipe()
62
    BlockDef.wipe()
63

  
64
    block = BlockDef()
65
    block.name = 'foobar'
66
    block.fields = [
67
        fields.StringField(id='123', required=True, label='Test', type='string'),
68
        fields.StringField(id='234', required=True, label='Test2', type='string'),
69
    ]
70
    block.store()
71

  
72
    formdef = FormDef()
73
    formdef.name = 'form title'
74
    formdef.fields = [
75
        fields.BlockField(id='1', label='test', type='block:foobar', hint='hintblock'),
76
    ]
77
    formdef.store()
78

  
79
    app = get_app(pub)
80
    resp = app.get(formdef.get_url())
81
    assert resp.text.count('>hintblock<') == 1
82
    resp.form['f1$element0$f123'] = 'foo'
83
    resp.form['f1$element0$f234'] = 'bar'
84
    resp = resp.form.submit('submit')  # -> validation page
85
    assert resp.form['f1$element0$f123'].attrs['readonly']
86
    assert resp.form['f1$element0$f123'].value == 'foo'
87
    assert resp.form['f1$element0$f234'].attrs['readonly']
88
    assert resp.form['f1$element0$f234'].value == 'bar'
89
    resp = resp.form.submit('submit')  # -> end page
90
    resp = resp.follow()
91
    assert '>foo<' in resp
92
    assert '>bar<' in resp
93

  
94

  
95
def test_block_required(pub, blocks_feature):
96
    FormDef.wipe()
97
    BlockDef.wipe()
98

  
99
    block = BlockDef()
100
    block.name = 'foobar'
101
    block.fields = [
102
        fields.StringField(id='123', required=True, label='Test', type='string'),
103
        fields.StringField(id='234', required=True, label='Test2', type='string'),
104
    ]
105
    block.store()
106

  
107
    formdef = FormDef()
108
    formdef.name = 'form title'
109
    formdef.fields = [
110
        fields.BlockField(id='1', label='test', type='block:foobar'),
111
    ]
112
    formdef.store()
113

  
114
    app = get_app(pub)
115
    resp = app.get(formdef.get_url())
116
    resp = resp.form.submit('submit')  # -> error page
117
    assert 'There were errors processing the form' in resp
118
    assert resp.text.count('required field') == 1
119
    resp.form['f1$element0$f123'] = 'foo'
120
    resp.form['f1$element0$f234'] = 'bar'
121
    resp = resp.form.submit('submit')  # -> validation page
122
    assert 'Check values then click submit.' in resp.text
123

  
124
    resp = app.get(formdef.get_url())
125
    resp.form['f1$element0$f123'] = 'foo'
126
    resp = resp.form.submit('submit')  # -> error page
127
    assert 'There were errors processing the form' in resp
128
    assert resp.text.count('required field') == 1
129
    resp.form['f1$element0$f234'] = 'bar'
130
    resp = resp.form.submit('submit')  # -> validation page
131
    assert 'Check values then click submit.' in resp.text
132

  
133
    # only one required
134
    block.fields = [
135
        fields.StringField(id='123', required=True, label='Test', type='string'),
136
        fields.StringField(id='234', required=False, label='Test2', type='string'),
137
    ]
138
    block.store()
139

  
140
    resp = app.get(formdef.get_url())
141
    resp.form['f1$element0$f123'] = 'foo'
142
    resp = resp.form.submit('submit')  # -> validation page
143
    assert 'Check values then click submit.' in resp.text
144

  
145
    # none required, but globally required
146
    block.fields = [
147
        fields.StringField(id='123', required=False, label='Test', type='string'),
148
        fields.StringField(id='234', required=False, label='Test2', type='string'),
149
    ]
150
    block.store()
151

  
152
    resp = app.get(formdef.get_url())
153
    resp = resp.form.submit('submit')  # -> error page
154
    assert 'There were errors processing the form' in resp
155
    assert resp.text.count('required field') == 1
156
    resp.form['f1$element0$f234'] = 'bar'
157
    resp = resp.form.submit('submit')  # -> validation page
158
    assert 'Check values then click submit.' in resp.text
159

  
160

  
161
def test_block_date(pub, blocks_feature):
162
    FormDef.wipe()
163
    BlockDef.wipe()
164

  
165
    block = BlockDef()
166
    block.name = 'foobar'
167
    block.fields = [
168
        fields.StringField(id='123', required=True, label='Test', type='string'),
169
        fields.DateField(id='234', required=True, label='Test2', type='date'),
170
    ]
171
    block.store()
172

  
173
    formdef = FormDef()
174
    formdef.name = 'form title'
175
    formdef.fields = [
176
        fields.BlockField(id='1', label='test', type='block:foobar'),
177
    ]
178
    formdef.store()
179

  
180
    app = get_app(pub)
181
    resp = app.get(formdef.get_url())
182
    resp.form['f1$element0$f123'] = 'foo'
183
    resp.form['f1$element0$f234'] = '2020-06-16'
184
    resp = resp.form.submit('submit')  # -> validation page
185
    assert 'Check values then click submit.' in resp.text
186
    resp = resp.form.submit('submit')  # -> submit
187
    resp = resp.follow()
188
    assert '>2020-06-16<' in resp
189

  
190

  
191
def test_block_bool(pub, blocks_feature):
192
    FormDef.wipe()
193
    BlockDef.wipe()
194

  
195
    block = BlockDef()
196
    block.name = 'foobar'
197
    block.fields = [
198
        fields.StringField(id='123', required=True, label='Test', type='string'),
199
        fields.BoolField(id='234', required=False, label='Test2', type='bool'),
200
    ]
201
    block.store()
202

  
203
    formdef = FormDef()
204
    formdef.name = 'form title'
205
    formdef.fields = [
206
        fields.BlockField(id='1', label='test', type='block:foobar'),
207
    ]
208
    formdef.store()
209

  
210
    for value in (True, False):
211
        app = get_app(pub)
212
        resp = app.get(formdef.get_url())
213
        resp.form['f1$element0$f123'] = 'foo'
214
        resp.form['f1$element0$f234'].checked = value
215
        resp = resp.form.submit('submit')  # -> validation page
216
        assert resp.form['f1$element0$f234disabled'].checked is value
217
        assert resp.form['f1$element0$f234'].value == str(value)
218
        assert 'Check values then click submit.' in resp
219
        resp = resp.form.submit('submit')  # -> submit
220
        resp = resp.follow()
221
        if value:
222
            assert '<div class="value">Yes</div>' in resp
223
        else:
224
            assert '<div class="value">No</div>' in resp
225

  
226

  
227
def test_block_autocomplete_list(pub, blocks_feature):
228
    FormDef.wipe()
229
    BlockDef.wipe()
230

  
231
    block = BlockDef()
232
    block.name = 'foobar'
233
    block.fields = [
234
        fields.StringField(id='123', required=True, label='Test', type='string'),
235
        fields.ItemField(
236
            id='234', required=True, label='Test2', type='item',
237
            display_mode='autocomplete', items=['Foo', 'Bar']),
238
    ]
239
    block.store()
240

  
241
    formdef = FormDef()
242
    formdef.name = 'form title'
243
    formdef.fields = [
244
        fields.BlockField(id='1', label='test', type='block:foobar'),
245
    ]
246
    formdef.store()
247

  
248
    app = get_app(pub)
249
    resp = app.get(formdef.get_url())
250
    resp.form['f1$element0$f123'] = 'foo'
251
    resp.form['f1$element0$f234'] = 'Bar'
252
    resp = resp.form.submit('submit')  # -> validation page
253
    assert 'Check values then click submit.' in resp.text
254
    resp = resp.form.submit('submit')  # -> submit
255
    resp = resp.follow()
256
    assert '>Bar<' in resp
257

  
258

  
259
def test_block_geoloc_prefill(pub, blocks_feature):
260
    FormDef.wipe()
261
    BlockDef.wipe()
262

  
263
    block = BlockDef()
264
    block.name = 'foobar'
265
    block.fields = [
266
        fields.StringField(
267
            id='123', required=True, label='Test', type='string',
268
            prefill={'type': 'geolocation', 'value': 'road'}),
269
    ]
270
    block.store()
271

  
272
    formdef = FormDef()
273
    formdef.name = 'form title'
274
    formdef.fields = [
275
        fields.BlockField(id='1', label='test', type='block:foobar'),
276
    ]
277
    formdef.store()
278

  
279
    app = get_app(pub)
280
    resp = app.get(formdef.get_url())
281
    assert 'qommon.geolocation.js' in resp
282
    assert resp.html.find('div', {'data-geolocation': 'road'})
283

  
284

  
285
def test_block_string_prefill(pub, blocks_feature):
286
    FormDef.wipe()
287
    BlockDef.wipe()
288

  
289
    block = BlockDef()
290
    block.name = 'foobar'
291
    block.fields = [
292
        fields.StringField(
293
            id='123', required=True, label='Test', type='string',
294
            prefill={'type': 'string', 'value': '{{ form_var_foo }} World'}),
295
    ]
296
    block.store()
297

  
298
    formdef = FormDef()
299
    formdef.name = 'form title'
300
    formdef.fields = [
301
        fields.PageField(id='0', label='1st page', type='page'),
302
        fields.StringField(id='1', label='string', varname='foo'),
303
        fields.PageField(id='2', label='2nd page', type='page'),
304
        fields.BlockField(id='3', label='test', type='block:foobar'),
305
    ]
306
    formdef.store()
307
    formdef.data_class().wipe()
308

  
309
    app = get_app(pub)
310
    resp = app.get(formdef.get_url())
311
    resp.form['f1'] = 'Hello'
312
    resp = resp.form.submit('submit')  # -> 2nd page
313
    assert resp.form['f3$element0$f123'].value == 'Hello World'
314
    resp = resp.form.submit('submit')  # -> validation page
315
    resp = resp.form.submit('submit')  # -> end page
316
    resp = resp.follow()
317

  
318
    formdata = formdef.data_class().select()[0]
319
    assert formdata.data['3']['data'][0]['123'] == 'Hello World'
320

  
321
    # check unmodified prefilled field
322
    app = get_app(pub)
323
    resp = app.get(formdef.get_url())
324
    resp.form['f1'] = 'Hello'
325
    resp = resp.form.submit('submit')  # -> 2nd page
326
    assert resp.form['f3$element0$f123'].value == 'Hello World'
327
    resp = resp.form.submit('submit')  # -> validation page
328
    resp = resp.form.submit('previous')  # -> 2nd page
329
    resp = resp.form.submit('previous')  # -> 1st page
330
    resp.form['f1'] = 'Test'
331
    resp = resp.form.submit('submit')  # -> 2nd page
332
    assert resp.form['f3$element0$f123'].value == 'Test World'
333

  
334
    # check modified prefilled field
335
    app = get_app(pub)
336
    resp = app.get(formdef.get_url())
337
    resp.form['f1'] = 'Hello'
338
    resp = resp.form.submit('submit')  # -> 2nd page
339
    assert resp.form['f3$element0$f123'].value == 'Hello World'
340
    resp.form['f3$element0$f123'] = 'Foobar'
341
    resp = resp.form.submit('submit')  # -> validation page
342
    resp = resp.form.submit('previous')  # -> 2nd page
343
    resp = resp.form.submit('previous')  # -> 1st page
344
    resp.form['f1'] = 'Test'
345
    resp = resp.form.submit('submit')  # -> 2nd page
346
    assert resp.form['f3$element0$f123'].value == 'Foobar'
347

  
348

  
349
def test_block_locked_prefill(pub, blocks_feature):
350
    FormDef.wipe()
351
    BlockDef.wipe()
352

  
353
    block = BlockDef()
354
    block.name = 'foobar'
355
    block.fields = [
356
        fields.StringField(
357
            id='123', required=True, label='Test', type='string',
358
            prefill={'type': 'string', 'value': '{{ form_var_foo }} World', 'locked': True}),
359
    ]
360
    block.store()
361

  
362
    formdef = FormDef()
363
    formdef.name = 'form title'
364
    formdef.fields = [
365
        fields.PageField(id='0', label='1st page', type='page'),
366
        fields.StringField(id='1', label='string', varname='foo'),
367
        fields.PageField(id='2', label='2nd page', type='page'),
368
        fields.BlockField(id='3', label='test', type='block:foobar'),
369
    ]
370
    formdef.store()
371
    formdef.data_class().wipe()
372

  
373
    app = get_app(pub)
374
    resp = app.get(formdef.get_url())
375
    resp.form['f1'] = 'Hello'
376
    resp = resp.form.submit('submit')  # -> 2nd page
377
    assert resp.form['f3$element0$f123'].value == 'Hello World'
378
    assert 'readonly' in resp.form['f3$element0$f123'].attrs
379
    resp.form['f3$element0$f123'].value = 'Hello'  # try changing the value
380
    resp = resp.form.submit('submit')  # -> validation page
381
    resp = resp.form.submit('submit')  # -> end page
382
    resp = resp.follow()
383

  
384
    formdata = formdef.data_class().select()[0]
385
    assert formdata.data['3']['data'][0]['123'] == 'Hello World'  # value got reverted
386

  
387

  
388
def test_workflow_form_block_prefill(pub):
389
    FormDef.wipe()
390
    BlockDef.wipe()
391
    create_user(pub)
392

  
393
    block = BlockDef()
394
    block.name = 'foobar'
395
    block.fields = [
396
        fields.StringField(
397
            id='123', required=True, label='Test', type='string',
398
            prefill={'type': 'user', 'value': 'email'}),
399
    ]
400
    block.store()
401

  
402
    wf = Workflow(name='status')
403
    st1 = wf.add_status('Status1', 'st1')
404

  
405
    display_form = FormWorkflowStatusItem()
406
    display_form.id = '_x'
407
    display_form.by = ['_submitter']
408
    display_form.varname = 'xxx'
409
    display_form.formdef = WorkflowFormFieldsFormDef(item=display_form)
410
    display_form.formdef.fields.append(
411
        fields.BlockField(id='3', label='test', type='block:foobar')
412
    )
413
    st1.items.append(display_form)
414
    display_form.parent = st1
415

  
416
    wf.store()
417

  
418
    FormDef.wipe()
419
    formdef = FormDef()
420
    formdef.name = 'test'
421
    formdef.fields = []
422
    formdef.workflow_id = wf.id
423
    formdef.store()
424
    formdef.data_class().wipe()
425

  
426
    resp = login(get_app(pub), username='foo', password='foo').get('/test/')
427
    resp = resp.form.submit('submit')  # -> validation
428
    resp = resp.form.submit('submit').follow()
429
    assert 'The form has been recorded' in resp
430
    assert resp.form['f3$element0$f123'].value == 'foo@localhost'
431

  
432

  
433
def test_block_title_and_comment(pub, blocks_feature):
434
    FormDef.wipe()
435
    BlockDef.wipe()
436

  
437
    block = BlockDef()
438
    block.name = 'foobar'
439
    block.fields = [
440
        fields.StringField(id='123', required=True, label='Test', type='string'),
441
        fields.TitleField(id='234', label='Blah', type='title'),
442
        fields.CommentField(id='345', label='Blah', type='comment'),
443
    ]
444
    block.store()
445

  
446
    formdef = FormDef()
447
    formdef.name = 'form title'
448
    formdef.fields = [
449
        fields.BlockField(id='1', label='test', type='block:foobar'),
450
    ]
451
    formdef.store()
452

  
453
    app = get_app(pub)
454
    resp = app.get(formdef.get_url())
455
    resp.form['f1$element0$f123'] = 'foo'
456
    resp = resp.form.submit('submit')  # -> validation page
457
    assert 'Check values then click submit.' in resp.text
458
    resp = resp.form.submit('submit')  # -> submit
459
    resp = resp.follow()
460

  
461

  
462
def test_block_multipage(pub, blocks_feature):
463
    FormDef.wipe()
464
    BlockDef.wipe()
465

  
466
    block = BlockDef()
467
    block.name = 'foobar'
468
    block.fields = [
469
        fields.StringField(id='123', required=True, label='Test', type='string'),
470
        fields.StringField(id='234', required=True, label='Test2', type='string'),
471
    ]
472
    block.store()
473

  
474
    formdef = FormDef()
475
    formdef.name = 'form title'
476
    formdef.fields = [
477
        fields.PageField(id='0', label='1st page', type='page'),
478
        fields.BlockField(id='1', label='test', type='block:foobar'),
479
        fields.PageField(id='2', label='2nd page', type='page'),
480
    ]
481
    formdef.store()
482

  
483
    app = get_app(pub)
484
    resp = app.get(formdef.get_url())
485
    resp.form['f1$element0$f123'] = 'foo'
486
    resp.form['f1$element0$f234'] = 'bar'
487
    resp = resp.form.submit('submit')  # -> 2nd page
488
    resp = resp.form.submit('submit')  # -> validation page
489
    assert resp.form['f1$element0$f123'].attrs['readonly']
490
    assert resp.form['f1$element0$f123'].value == 'foo'
491
    resp = resp.form.submit('previous')  # -> 2nd page
492
    resp = resp.form.submit('previous')  # -> 1st page
493
    assert 'readonly' not in resp.form['f1$element0$f123'].attrs
494
    assert resp.form['f1$element0$f123'].value == 'foo'
495
    resp = resp.form.submit('submit')  # -> 2nd page
496
    resp = resp.form.submit('submit')  # -> validation page
497
    resp = resp.form.submit('submit')  # -> submit
498
    resp = resp.follow()
499
    assert '>foo<' in resp
500
    assert '>bar<' in resp
501

  
502

  
503
def test_block_repeated(pub, blocks_feature):
504
    FormDef.wipe()
505
    BlockDef.wipe()
506

  
507
    block = BlockDef()
508
    block.name = 'foobar'
509
    block.fields = [
510
        fields.StringField(id='123', required=True, label='Test', type='string'),
511
        fields.StringField(id='234', required=True, label='Test2', type='string'),
512
    ]
513
    block.store()
514

  
515
    formdef = FormDef()
516
    formdef.name = 'form title'
517
    formdef.fields = [
518
        fields.PageField(id='0', label='1st page', type='page'),
519
        fields.BlockField(id='1', label='test', type='block:foobar', max_items=3, hint='hintblock'),
520
        fields.PageField(id='2', label='2nd page', type='page'),
521
    ]
522
    formdef.store()
523

  
524
    app = get_app(pub)
525
    resp = app.get(formdef.get_url())
526
    assert resp.text.count('>Test<') == 1
527
    assert resp.text.count('>hintblock<') == 1
528
    assert 'Add another' in resp
529
    assert resp.html.find('div', {'class': 'list-add'})
530
    resp = resp.form.submit('f1$add_element')
531
    assert resp.text.count('>Test<') == 2
532
    assert resp.text.count('>hintblock<') == 1
533
    resp = resp.form.submit('f1$add_element')
534
    assert resp.text.count('>Test<') == 3
535
    assert resp.text.count('>hintblock<') == 1
536
    assert 'Add another' not in resp
537

  
538
    # fill items (1st and 3rd row)
539
    resp.form['f1$element0$f123'] = 'foo'
540
    resp.form['f1$element0$f234'] = 'bar'
541
    resp.form['f1$element2$f123'] = 'foo2'
542
    resp.form['f1$element2$f234'] = 'bar2'
543

  
544
    resp = resp.form.submit('submit')  # -> 2nd page
545
    resp = resp.form.submit('submit')  # -> validation page
546
    assert 'Check values then click submit.' in resp.text
547
    assert resp.form['f1$element0$f123'].value == 'foo'
548
    assert resp.form['f1$element0$f234'].value == 'bar'
549
    assert resp.form['f1$element1$f123'].value == 'foo2'
550
    assert resp.form['f1$element1$f234'].value == 'bar2'
551

  
552
    resp = resp.form.submit('previous')  # -> 2nd page
553
    resp = resp.form.submit('previous')  # -> 1st page
554
    assert 'readonly' not in resp.form['f1$element0$f123'].attrs
555
    assert resp.form['f1$element0$f123'].value == 'foo'
556

  
557
    resp = resp.form.submit('submit')  # -> 2nd page
558
    resp = resp.form.submit('submit')  # -> validation page
559
    resp = resp.form.submit('submit')  # -> submit
560
    resp = resp.follow()
561
    assert '>foo<' in resp
562
    assert '>bar<' in resp
563
    assert '>foo2<' in resp
564
    assert '>bar2<' in resp
565

  
566

  
567
def test_block_repeated_over_limit(pub, blocks_feature):
568
    FormDef.wipe()
569
    BlockDef.wipe()
570

  
571
    block = BlockDef()
572
    block.name = 'foobar'
573
    block.fields = [
574
        fields.StringField(id='123', required=True, label='Test', type='string'),
575
        fields.StringField(id='234', required=True, label='Test2', type='string'),
576
    ]
577
    block.store()
578

  
579
    formdef = FormDef()
580
    formdef.name = 'form title'
581
    formdef.fields = [
582
        fields.PageField(id='0', label='1st page', type='page'),
583
        fields.BlockField(id='1', label='test', type='block:foobar', max_items=3),
584
        fields.PageField(id='2', label='2nd page', type='page'),
585
    ]
586
    formdef.store()
587

  
588
    app = get_app(pub)
589
    resp = app.get(formdef.get_url())
590
    assert resp.text.count('>Test<') == 1
591
    assert 'Add another' in resp
592
    resp = resp.form.submit('f1$add_element')
593
    assert resp.text.count('>Test<') == 2
594
    resp = resp.form.submit('f1$add_element')
595
    assert resp.text.count('>Test<') == 3
596
    assert 'Add another' not in resp
597

  
598
    # fill items
599
    resp.form['f1$element0$f123'] = 'foo'
600
    resp.form['f1$element0$f234'] = 'bar'
601
    resp.form['f1$element1$f123'] = 'foo1'
602
    resp.form['f1$element1$f234'] = 'bar1'
603
    resp.form['f1$element2$f123'] = 'foo2'
604
    resp.form['f1$element2$f234'] = 'bar2'
605

  
606
    # (modify formdef to only allow 2)
607
    formdef.fields[1].max_items = 2
608
    formdef.store()
609

  
610
    # submit form
611
    resp = resp.form.submit('submit')
612
    assert 'Too many elements (maximum: 2)' in resp
613

  
614

  
615
def test_block_repeated_files(pub, blocks_feature):
616
    FormDef.wipe()
617
    BlockDef.wipe()
618

  
619
    block = BlockDef()
620
    block.name = 'foobar'
621
    block.fields = [
622
        fields.StringField(id='123', required=True, label='Test', type='string'),
623
        fields.FileField(id='234', required=True, label='Test2', type='file'),
624
    ]
625
    block.store()
626

  
627
    formdef = FormDef()
628
    formdef.name = 'form title'
629
    formdef.fields = [
630
        fields.PageField(id='0', label='1st page', type='page'),
631
        fields.BlockField(id='1', label='test', type='block:foobar', max_items=3),
632
        fields.PageField(id='2', label='2nd page', type='page'),
633
    ]
634
    formdef.store()
635

  
636
    app = get_app(pub)
637
    resp = app.get(formdef.get_url())
638
    assert resp.text.count('>Test<') == 1
639
    assert 'Add another' in resp
640
    resp = resp.form.submit('f1$add_element')
641
    assert resp.text.count('>Test<') == 2
642
    resp = resp.form.submit('f1$add_element')
643
    assert resp.text.count('>Test<') == 3
644
    assert 'Add another' not in resp
645

  
646
    # fill items (1st and 3rd row)
647
    resp.form['f1$element0$f123'] = 'foo'
648
    resp.form['f1$element0$f234$file'] = Upload('test1.txt', b'foobar1', 'text/plain')
649
    resp.form['f1$element2$f123'] = 'foo2'
650
    resp.form['f1$element2$f234$file'] = Upload('test2.txt', b'foobar2', 'text/plain')
651

  
652
    resp = resp.form.submit('submit')  # -> 2nd page
653
    resp = resp.form.submit('submit')  # -> validation page
654
    assert 'Check values then click submit.' in resp.text
655
    assert resp.form['f1$element0$f123'].value == 'foo'
656
    assert 'test1.txt' in resp
657
    assert resp.form['f1$element1$f123'].value == 'foo2'
658
    assert 'test2.txt' in resp
659

  
660
    resp = resp.form.submit('previous')  # -> 2nd page
661
    resp = resp.form.submit('previous')  # -> 1st page
662
    resp = resp.form.submit('submit')  # -> 2nd page
663
    resp = resp.form.submit('submit')  # -> validation page
664
    resp = resp.form.submit('submit')  # -> submit
665
    resp = resp.follow()
666
    assert '>foo<' in resp
667
    assert 'test1.txt' in resp
668
    assert '>foo2<' in resp
669
    assert 'test2.txt' in resp
670

  
671

  
672
def test_block_digest(pub, blocks_feature):
673
    FormDef.wipe()
674
    BlockDef.wipe()
675

  
676
    block = BlockDef()
677
    block.name = 'foobar'
678
    block.fields = [
679
        fields.StringField(
680
            id='123', required=True, label='Test',
681
            type='string', varname='foo'),
682
        fields.StringField(
683
            id='234', required=True, label='Test2',
684
            type='string', varname='bar'),
685
    ]
686
    block.store()
687

  
688
    formdef = FormDef()
689
    formdef.name = 'form title'
690
    formdef.fields = [
691
        fields.BlockField(id='1', label='test', type='block:foobar', max_items=3),
692
    ]
693
    formdef.store()
694
    formdef.data_class().wipe()
695

  
696
    app = get_app(pub)
697
    resp = app.get(formdef.get_url())
698
    resp.form['f1$element0$f123'] = 'foo'
699
    resp.form['f1$element0$f234'] = 'bar'
700
    resp = resp.form.submit('f1$add_element')
701
    resp.form['f1$element1$f123'] = 'foo2'
702
    resp.form['f1$element1$f234'] = 'bar2'
703

  
704
    resp = resp.form.submit('submit')  # -> validation page
705
    resp = resp.form.submit('submit')  # -> submit
706

  
707
    assert formdef.data_class().select()[0].data['1']['data'] == [
708
            {'123': 'foo', '234': 'bar'}, {'123': 'foo2', '234': 'bar2'}]
709
    # by default it gets the type of object
710
    assert formdef.data_class().select()[0].data['1_display'] == 'foobar, foobar'
711

  
712
    # set a digest template
713
    formdef.data_class().wipe()
714

  
715
    block.digest_template = 'X{{foobar_var_foo}}Y'
716
    block.store()
717

  
718
    resp = app.get(formdef.get_url())
719
    resp.form['f1$element0$f123'] = 'foo'
720
    resp.form['f1$element0$f234'] = 'bar'
721
    resp = resp.form.submit('f1$add_element')
722
    resp.form['f1$element1$f123'] = 'foo2'
723
    resp.form['f1$element1$f234'] = 'bar2'
724

  
725
    resp = resp.form.submit('submit')  # -> validation page
726
    resp = resp.form.submit('submit')  # -> submit
727
    assert formdef.data_class().select()[0].data['1']['data'] == [
728
            {'123': 'foo', '234': 'bar'}, {'123': 'foo2', '234': 'bar2'}]
729
    assert formdef.data_class().select()[0].data['1_display'] == 'XfooY, Xfoo2Y'
730

  
731

  
732
def test_block_digest_item(pub, blocks_feature):
733
    FormDef.wipe()
734
    BlockDef.wipe()
735
    NamedDataSource.wipe()
736

  
737
    # add a named data source
738
    data_source = NamedDataSource(name='foobar')
739
    data_source.data_source = {
740
            'type': 'formula',
741
            'value': repr([{'id': '1', 'text': 'un'},
742
                           {'id': '2', 'text': 'deux'}])}
743
    data_source.store()
744

  
745
    block = BlockDef()
746
    block.name = 'foobar'
747
    block.fields = [
748
        fields.StringField(
749
            id='123', required=True, label='Test',
750
            type='string', varname='foo'),
751
        fields.ItemField(
752
            id='234', required=True, label='Test2',
753
            type='item', varname='bar', data_source={'type': 'foobar'}),
754
    ]
755
    block.store()
756

  
757
    formdef = FormDef()
758
    formdef.name = 'form title'
759
    formdef.fields = [
760
        fields.BlockField(id='1', label='test', type='block:foobar', max_items=3),
761
    ]
762
    formdef.store()
763
    formdef.data_class().wipe()
764

  
765
    app = get_app(pub)
766
    resp = app.get(formdef.get_url())
767
    resp.form['f1$element0$f123'] = 'foo'
768
    resp.form['f1$element0$f234'] = '1'
769
    resp = resp.form.submit('f1$add_element')
770
    resp.form['f1$element1$f123'] = 'foo2'
771
    resp.form['f1$element1$f234'] = '2'
772

  
773
    resp = resp.form.submit('submit')  # -> validation page
774
    resp = resp.form.submit('submit')  # -> submit
775

  
776
    assert formdef.data_class().select()[0].data['1']['data'] == [
777
            {'123': 'foo', '234': '1', '234_display': 'un'},
778
            {'123': 'foo2', '234': '2', '234_display': 'deux'},
779
    ]
780
    # by default it gets the type of object
781
    assert formdef.data_class().select()[0].data['1_display'] == 'foobar, foobar'
782

  
783
    # set a digest template
784
    formdef.data_class().wipe()
785

  
786
    block.digest_template = 'X{{foobar_var_bar}}Y'
787
    block.store()
788

  
789
    resp = app.get(formdef.get_url())
790
    resp.form['f1$element0$f123'] = 'foo'
791
    resp.form['f1$element0$f234'] = '1'
792
    resp = resp.form.submit('f1$add_element')
793
    resp.form['f1$element1$f123'] = 'foo2'
794
    resp.form['f1$element1$f234'] = '2'
795

  
796
    resp = resp.form.submit('submit')  # -> validation page
797
    resp = resp.form.submit('submit')  # -> submit
798
    assert formdef.data_class().select()[0].data['1']['data'] == [
799
            {'123': 'foo', '234': '1', '234_display': 'un'},
800
            {'123': 'foo2', '234': '2', '234_display': 'deux'},
801
    ]
802
    assert formdef.data_class().select()[0].data['1_display'] == 'XunY, XdeuxY'
0
-