Projet

Général

Profil

0001-misc-split-backoffice_pages-tests.patch

Lauréline Guérin, 17 janvier 2022 14:40

Télécharger (25,9 ko)

Voir les différences:

Subject: [PATCH 1/3] misc: split backoffice_pages tests

 tests/backoffice_pages/test_all.py     | 300 ---------------------
 tests/backoffice_pages/test_columns.py | 344 +++++++++++++++++++++++++
 tests/backoffice_pages/test_filters.py |   1 -
 3 files changed, 344 insertions(+), 301 deletions(-)
 create mode 100644 tests/backoffice_pages/test_columns.py
tests/backoffice_pages/test_all.py
567 567
    resp = app.get('/backoffice/not-form-title/', status=404)
568 568

  
569 569

  
570
def test_backoffice_columns(pub):
571
    create_superuser(pub)
572
    create_environment(pub)
573
    app = login(get_app(pub))
574
    resp = app.get('/backoffice/management/form-title/')
575
    assert resp.text.count('</th>') == 8  # six columns
576
    resp.forms['listing-settings']['1'].checked = False
577
    assert 'submission_channel' not in resp.forms['listing-settings'].fields
578
    assert 'last_update_time' in resp.forms['listing-settings'].fields
579
    resp = resp.forms['listing-settings'].submit()
580
    assert resp.text.count('</th>') == 7  # fixe columns
581
    assert resp.text.count('data-link') == 17  # 17 rows
582
    assert resp.text.count('FOO BAR') == 0  # no field 1 column
583

  
584
    # change column order
585
    assert (
586
        resp.forms['listing-settings']['columns-order'].value
587
        == 'id,time,last_update_time,user-label,2,status,1,3,anonymised'
588
    )
589
    resp.forms['listing-settings'][
590
        'columns-order'
591
    ].value = 'user-label,id,time,last_update_time,2,status,1,3,anonymised'
592
    resp = resp.forms['listing-settings'].submit()
593
    assert resp.text.find('<span>User Label</span>') < resp.text.find('<span>Number</span>')
594

  
595

  
596
def test_backoffice_channel_column(pub):
597
    if not pub.site_options.has_section('variables'):
598
        pub.site_options.add_section('variables')
599
    pub.site_options.set('variables', 'welco_url', 'xxx')
600
    with open(os.path.join(pub.app_dir, 'site-options.cfg'), 'w') as fd:
601
        pub.site_options.write(fd)
602

  
603
    create_superuser(pub)
604
    create_environment(pub)
605
    app = login(get_app(pub))
606
    resp = app.get('/backoffice/management/form-title/')
607
    assert resp.text.count('</th>') == 8  # six columns
608
    resp.forms['listing-settings']['submission_channel'].checked = True
609
    resp = resp.forms['listing-settings'].submit()
610
    assert resp.text.count('</th>') == 9  # seven columns
611
    assert resp.text.count('data-link') == 17  # 17 rows
612
    assert resp.text.count('<td>Web</td>') == 17
613

  
614

  
615
def test_backoffice_submission_agent_column(pub):
616
    user = create_user(pub)
617
    create_environment(pub)
618

  
619
    agent = pub.user_class(name='agent')
620
    agent.store()
621

  
622
    app = login(get_app(pub))
623
    resp = app.get('/backoffice/management/form-title/')
624
    assert 'submission_agent' not in resp.forms['listing-settings'].fields
625

  
626
    formdef = FormDef.get_by_urlname('form-title')
627
    formdef.backoffice_submission_roles = user.roles
628
    formdef.store()
629
    resp = app.get('/backoffice/management/form-title/')
630
    assert resp.text.count('</th>') == 8  # six columns
631
    resp.forms['listing-settings']['submission_agent'].checked = True
632
    resp = resp.forms['listing-settings'].submit()
633
    assert resp.text.count('</th>') == 9  # seven columns
634
    assert resp.text.count('data-link') == 17  # 17 rows
635
    assert '>agent<' not in resp.text
636
    resp = resp.click('Export a Spreadsheet')
637
    resp.form['format'] = 'csv'
638
    resp = resp.form.submit('submit')
639
    assert len(resp.text.splitlines()) == 18  # 17 + header line
640
    assert ',"agent",' not in resp.text
641

  
642
    for formdata in formdef.data_class().select():
643
        formdata.submission_agent_id = str(agent.id)
644
        formdata.store()
645

  
646
    resp = app.get('/backoffice/management/form-title/')
647
    resp.forms['listing-settings']['submission_agent'].checked = True
648
    resp = resp.forms['listing-settings'].submit()
649
    assert resp.text.count('>agent<') == 17
650

  
651
    resp = resp.click('Export a Spreadsheet')
652
    resp.form['format'] = 'csv'
653
    resp = resp.form.submit('submit')
654
    assert len(resp.text.splitlines()) == 18  # 17 + header line
655
    assert resp.text.count(',"agent"') == 17
656

  
657

  
658
def test_backoffice_image_column(pub):
659
    create_superuser(pub)
660
    create_environment(pub)
661
    formdef = FormDef.get_by_urlname('form-title')
662
    formdef.fields.append(
663
        fields.FileField(
664
            id='4', label='file field', type='file', display_locations=['validation', 'summary', 'listings']
665
        )
666
    )
667
    formdef.store()
668

  
669
    upload = PicklableUpload('test.jpeg', 'image/jpeg')
670
    with open(os.path.join(os.path.dirname(__file__), '..', 'image-with-gps-data.jpeg'), 'rb') as fd:
671
        upload.receive([fd.read()])
672
    for formdata in formdef.data_class().select(lambda x: x.status == 'wf-new'):
673
        formdata.data['4'] = upload
674
        formdata.store()
675
    app = login(get_app(pub))
676
    resp = app.get('/backoffice/management/form-title/')
677
    assert 'download?f=4&thumbnail=1' not in resp.text
678

  
679

  
680
def test_backoffice_file_column(pub):
681
    create_superuser(pub)
682
    create_environment(pub)
683
    formdef = FormDef.get_by_urlname('form-title')
684
    formdef.fields.append(
685
        fields.FileField(
686
            id='4', label='file field', type='file', display_locations=['validation', 'summary', 'listings']
687
        )
688
    )
689
    formdef.store()
690

  
691
    upload = PicklableUpload('a filename that is too long "and" will be ellipsised.txt', 'text/plain')
692
    upload.receive([b'text'])
693
    for formdata in formdef.data_class().select(lambda x: x.status == 'wf-new'):
694
        formdata.data['4'] = upload
695
        formdata.store()
696
    app = login(get_app(pub))
697
    resp = app.get('/backoffice/management/form-title/')
698
    assert 'title="a filename that is too long &quot;and&quot; will be ellipsised.txt"' in resp
699
    assert '<span>a filename that is too(…).txt</span>' in resp
700

  
701

  
702
def test_backoffice_user_columns(pub):
703
    create_superuser(pub)
704
    create_environment(pub)
705

  
706
    from wcs.admin.settings import UserFieldsFormDef
707

  
708
    user_formdef = UserFieldsFormDef(pub)
709
    user_formdef.fields.append(fields.StringField(id='_first_name', label='name', type='string'))
710
    user_formdef.fields.append(fields.StringField(id='3', label='test', type='string'))
711
    user_formdef.store()
712
    pub.cfg['users']['field_name'] = ['3', '4']
713
    pub.write_cfg()
714

  
715
    user1 = pub.user_class(name='userA')
716
    user1.form_data = {'_first_name': 'toto', '3': 'nono'}
717
    user1.set_attributes_from_formdata(user1.form_data)
718
    user1.store()
719
    user2 = pub.user_class(name='userB')
720
    user2.form_data = {'_first_name': 'tutu', '3': 'nunu'}
721
    user2.set_attributes_from_formdata(user2.form_data)
722
    user2.store()
723

  
724
    formdef = FormDef.get_by_urlname('form-title')
725
    for i, formdata in enumerate(formdef.data_class().select()):
726
        formdata.user_id = user1.id if bool(i % 2) else user2.id
727
        formdata.store()
728

  
729
    app = login(get_app(pub))
730
    resp = app.get('/backoffice/management/form-title/')
731
    assert resp.text.count('</th>') == 8  # six columns
732

  
733
    if not pub.is_using_postgresql():
734
        # no support for relation columns unless using SQL
735
        assert 'user-label$3' not in resp.forms['listing-settings'].fields
736
        return
737
    resp.forms['listing-settings']['user-label$3'].checked = True
738
    resp = resp.forms['listing-settings'].submit()
739
    assert resp.text.count('</th>') == 9
740
    assert '<td>nono</td' in resp
741

  
742

  
743
def test_backoffice_card_field_columns(pub):
744
    user = create_superuser(pub)
745
    create_environment(pub)
746

  
747
    datasource = {'type': 'formula', 'value': repr([('A', 'aa'), ('B', 'bb'), ('C', 'cc')])}
748

  
749
    CardDef.wipe()
750
    carddef = CardDef()
751
    carddef.name = 'foo'
752
    carddef.fields = [
753
        fields.CommentField(id='0', label='...', type='comment'),
754
        fields.StringField(id='1', label='Test', type='string', varname='foo'),
755
        fields.DateField(id='2', label='Date', type='date'),
756
        fields.BoolField(id='3', label='Bool', type='bool'),
757
        fields.ItemField(id='4', label='Item', type='item', data_source=datasource),
758
    ]
759
    carddef.backoffice_submission_roles = user.roles
760
    carddef.workflow_roles = {'_editor': user.roles[0]}
761
    carddef.digest_templates = {'default': 'card {{ form_var_foo }}'}
762
    carddef.store()
763
    carddef.data_class().wipe()
764

  
765
    card = carddef.data_class()()
766
    card.data = {
767
        '1': 'plop',
768
        '2': time.strptime('2020-04-24', '%Y-%m-%d'),
769
        '3': True,
770
        '4': 'A',
771
        '4_display': 'aa',
772
    }
773
    card.store()
774

  
775
    formdef = FormDef.get_by_urlname('form-title')
776
    formdef.geolocations = {'base': 'Geolocation'}
777
    formdef.fields.append(
778
        fields.ItemField(
779
            id='4', label='card field', type='item', data_source={'type': 'carddef:foo', 'value': ''}
780
        )
781
    )
782
    formdef.store()
783

  
784
    for formdata in formdef.data_class().select(lambda x: x.status == 'wf-new'):
785
        formdata.data['4'] = str(card.id)
786
        formdata.data['4_display'] = formdef.fields[-1].store_display_value(formdata.data, '4')
787
        formdata.data['4_structured'] = formdef.fields[-1].store_structured_value(formdata.data, '4')
788
        formdata.geolocations = {'base': {'lat': 48.83, 'lon': 2.32}}
789
        formdata.store()
790

  
791
    app = login(get_app(pub))
792
    resp = app.get('/backoffice/management/form-title/')
793
    assert resp.text.count('</th>') == 8  # six columns
794
    if not pub.is_using_postgresql():
795
        # no support for relation columns unless using SQL
796
        assert '4$1' not in resp.forms['listing-settings'].fields
797
        return
798
    assert '4$0' not in resp.forms['listing-settings'].fields
799
    resp.forms['listing-settings']['4$1'].checked = True
800
    resp.forms['listing-settings']['4$2'].checked = True
801
    resp.forms['listing-settings']['4$3'].checked = True
802
    resp.forms['listing-settings']['4$4'].checked = True
803
    resp = resp.forms['listing-settings'].submit()
804
    assert resp.text.count('</th>') == 12
805
    assert resp.text.count('data-link') == 17  # 17 rows
806
    assert resp.text.count('<td>plop</td>') == 17
807
    assert resp.text.count('<td>2020-04-24</td>') == 17
808
    assert resp.text.count('<td>Yes</td>') == 17
809
    assert resp.text.count('<td>aa</td>') == 17
810

  
811
    resp_csv = resp.click('Export a Spreadsheet')
812
    resp_csv.form['format'] = 'csv'
813
    resp_csv = resp_csv.form.submit('submit')
814
    assert resp_csv.text.splitlines()[1].endswith(',"plop","2020-04-24","Yes","aa"')
815

  
816
    resp_map = resp.click('Plot on a Map')
817
    geojson_url = re.findall(r'data-geojson-url="(.*?)"', resp_map.text)[0]
818
    resp_geojson = app.get(geojson_url)
819
    assert {
820
        'varname': None,
821
        'label': 'card field - Test',
822
        'value': 'plop',
823
        'html_value': 'plop',
824
    } in resp_geojson.json['features'][0]['properties']['display_fields']
825

  
826

  
827
def test_backoffice_block_columns(pub):
828
    create_environment(pub)
829
    create_superuser(pub)
830

  
831
    BlockDef.wipe()
832
    block = BlockDef()
833
    block.name = 'foobar'
834
    block.fields = [
835
        fields.StringField(id='123', required=True, label='Test', type='string'),
836
    ]
837
    block.store()
838

  
839
    formdef = FormDef.get_by_urlname('form-title')
840
    formdef.fields.append(
841
        fields.BlockField(id='8', label='Block', type='block:foobar', varname='data', max_items=3),
842
    )
843
    formdef.store()
844

  
845
    for formdata in formdef.data_class().select(lambda x: x.status == 'wf-new'):
846
        formdata.data['8'] = {
847
            'data': [{'123': 'blah'}],
848
            'schema': {'123': 'string'},
849
        }
850
        formdata.data['8_display'] = 'blah'
851
        formdata.store()
852

  
853
    app = login(get_app(pub))
854
    resp = app.get('/backoffice/management/form-title/')
855
    # check Block / Test is not part of the possible columns
856
    assert [x.text_content() for x in resp.pyquery('#columns-filter label')] == [
857
        'Number',
858
        'Created',
859
        'Last Modified',
860
        'User Label',
861
        '1st field',
862
        '2nd field',
863
        'Status',
864
        '3rd field',
865
        'Block',
866
        'Anonymised',
867
    ]
868

  
869

  
870 570
def test_backoffice_form_category_permissions(pub):
871 571
    user = create_user(pub)
872 572
    create_environment(pub)
tests/backoffice_pages/test_columns.py
1
import os
2
import re
3
import time
4

  
5
import pytest
6

  
7
from wcs import fields
8
from wcs.blocks import BlockDef
9
from wcs.carddef import CardDef
10
from wcs.formdef import FormDef
11
from wcs.qommon.http_request import HTTPRequest
12
from wcs.qommon.upload_storage import PicklableUpload
13

  
14
from ..utilities import clean_temporary_pub, create_temporary_pub, get_app, login
15
from .test_all import create_environment, create_superuser, create_user
16

  
17

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

  
22

  
23
@pytest.fixture
24
def pub(request, emails):
25
    pub = create_temporary_pub(sql_mode=bool('sql' in request.param))
26

  
27
    req = HTTPRequest(None, {'SCRIPT_NAME': '/', 'SERVER_NAME': 'example.net'})
28
    pub.set_app_dir(req)
29
    pub.cfg['identification'] = {'methods': ['password']}
30
    pub.cfg['language'] = {'language': 'en'}
31
    pub.write_cfg()
32
    with open(os.path.join(pub.app_dir, 'site-options.cfg'), 'w') as fd:
33
        fd.write(
34
            '''
35
    [api-secrets]
36
    coucou = 1234
37
    '''
38
        )
39

  
40
    return pub
41

  
42

  
43
def teardown_module(module):
44
    clean_temporary_pub()
45

  
46

  
47
def test_backoffice_columns(pub):
48
    create_superuser(pub)
49
    create_environment(pub)
50
    app = login(get_app(pub))
51
    resp = app.get('/backoffice/management/form-title/')
52
    assert resp.text.count('</th>') == 8  # six columns
53
    resp.forms['listing-settings']['1'].checked = False
54
    assert 'submission_channel' not in resp.forms['listing-settings'].fields
55
    assert 'last_update_time' in resp.forms['listing-settings'].fields
56
    resp = resp.forms['listing-settings'].submit()
57
    assert resp.text.count('</th>') == 7  # fixe columns
58
    assert resp.text.count('data-link') == 17  # 17 rows
59
    assert resp.text.count('FOO BAR') == 0  # no field 1 column
60

  
61
    # change column order
62
    assert (
63
        resp.forms['listing-settings']['columns-order'].value
64
        == 'id,time,last_update_time,user-label,2,status,1,3,anonymised'
65
    )
66
    resp.forms['listing-settings'][
67
        'columns-order'
68
    ].value = 'user-label,id,time,last_update_time,2,status,1,3,anonymised'
69
    resp = resp.forms['listing-settings'].submit()
70
    assert resp.text.find('<span>User Label</span>') < resp.text.find('<span>Number</span>')
71

  
72

  
73
def test_backoffice_channel_column(pub):
74
    if not pub.site_options.has_section('variables'):
75
        pub.site_options.add_section('variables')
76
    pub.site_options.set('variables', 'welco_url', 'xxx')
77
    with open(os.path.join(pub.app_dir, 'site-options.cfg'), 'w') as fd:
78
        pub.site_options.write(fd)
79

  
80
    create_superuser(pub)
81
    create_environment(pub)
82
    app = login(get_app(pub))
83
    resp = app.get('/backoffice/management/form-title/')
84
    assert resp.text.count('</th>') == 8  # six columns
85
    resp.forms['listing-settings']['submission_channel'].checked = True
86
    resp = resp.forms['listing-settings'].submit()
87
    assert resp.text.count('</th>') == 9  # seven columns
88
    assert resp.text.count('data-link') == 17  # 17 rows
89
    assert resp.text.count('<td>Web</td>') == 17
90

  
91

  
92
def test_backoffice_submission_agent_column(pub):
93
    user = create_user(pub)
94
    create_environment(pub)
95

  
96
    agent = pub.user_class(name='agent')
97
    agent.store()
98

  
99
    app = login(get_app(pub))
100
    resp = app.get('/backoffice/management/form-title/')
101
    assert 'submission_agent' not in resp.forms['listing-settings'].fields
102

  
103
    formdef = FormDef.get_by_urlname('form-title')
104
    formdef.backoffice_submission_roles = user.roles
105
    formdef.store()
106
    resp = app.get('/backoffice/management/form-title/')
107
    assert resp.text.count('</th>') == 8  # six columns
108
    resp.forms['listing-settings']['submission_agent'].checked = True
109
    resp = resp.forms['listing-settings'].submit()
110
    assert resp.text.count('</th>') == 9  # seven columns
111
    assert resp.text.count('data-link') == 17  # 17 rows
112
    assert '>agent<' not in resp.text
113
    resp = resp.click('Export a Spreadsheet')
114
    resp.form['format'] = 'csv'
115
    resp = resp.form.submit('submit')
116
    assert len(resp.text.splitlines()) == 18  # 17 + header line
117
    assert ',"agent",' not in resp.text
118

  
119
    for formdata in formdef.data_class().select():
120
        formdata.submission_agent_id = str(agent.id)
121
        formdata.store()
122

  
123
    resp = app.get('/backoffice/management/form-title/')
124
    resp.forms['listing-settings']['submission_agent'].checked = True
125
    resp = resp.forms['listing-settings'].submit()
126
    assert resp.text.count('>agent<') == 17
127

  
128
    resp = resp.click('Export a Spreadsheet')
129
    resp.form['format'] = 'csv'
130
    resp = resp.form.submit('submit')
131
    assert len(resp.text.splitlines()) == 18  # 17 + header line
132
    assert resp.text.count(',"agent"') == 17
133

  
134

  
135
def test_backoffice_image_column(pub):
136
    create_superuser(pub)
137
    create_environment(pub)
138
    formdef = FormDef.get_by_urlname('form-title')
139
    formdef.fields.append(
140
        fields.FileField(
141
            id='4', label='file field', type='file', display_locations=['validation', 'summary', 'listings']
142
        )
143
    )
144
    formdef.store()
145

  
146
    upload = PicklableUpload('test.jpeg', 'image/jpeg')
147
    with open(os.path.join(os.path.dirname(__file__), '..', 'image-with-gps-data.jpeg'), 'rb') as fd:
148
        upload.receive([fd.read()])
149
    for formdata in formdef.data_class().select(lambda x: x.status == 'wf-new'):
150
        formdata.data['4'] = upload
151
        formdata.store()
152
    app = login(get_app(pub))
153
    resp = app.get('/backoffice/management/form-title/')
154
    assert 'download?f=4&thumbnail=1' not in resp.text
155

  
156

  
157
def test_backoffice_file_column(pub):
158
    create_superuser(pub)
159
    create_environment(pub)
160
    formdef = FormDef.get_by_urlname('form-title')
161
    formdef.fields.append(
162
        fields.FileField(
163
            id='4', label='file field', type='file', display_locations=['validation', 'summary', 'listings']
164
        )
165
    )
166
    formdef.store()
167

  
168
    upload = PicklableUpload('a filename that is too long "and" will be ellipsised.txt', 'text/plain')
169
    upload.receive([b'text'])
170
    for formdata in formdef.data_class().select(lambda x: x.status == 'wf-new'):
171
        formdata.data['4'] = upload
172
        formdata.store()
173
    app = login(get_app(pub))
174
    resp = app.get('/backoffice/management/form-title/')
175
    assert 'title="a filename that is too long &quot;and&quot; will be ellipsised.txt"' in resp
176
    assert '<span>a filename that is too(…).txt</span>' in resp
177

  
178

  
179
def test_backoffice_user_columns(pub):
180
    create_superuser(pub)
181
    create_environment(pub)
182

  
183
    from wcs.admin.settings import UserFieldsFormDef
184

  
185
    user_formdef = UserFieldsFormDef(pub)
186
    user_formdef.fields.append(fields.StringField(id='_first_name', label='name', type='string'))
187
    user_formdef.fields.append(fields.StringField(id='3', label='test', type='string'))
188
    user_formdef.store()
189
    pub.cfg['users']['field_name'] = ['3', '4']
190
    pub.write_cfg()
191

  
192
    user1 = pub.user_class(name='userA')
193
    user1.form_data = {'_first_name': 'toto', '3': 'nono'}
194
    user1.set_attributes_from_formdata(user1.form_data)
195
    user1.store()
196
    user2 = pub.user_class(name='userB')
197
    user2.form_data = {'_first_name': 'tutu', '3': 'nunu'}
198
    user2.set_attributes_from_formdata(user2.form_data)
199
    user2.store()
200

  
201
    formdef = FormDef.get_by_urlname('form-title')
202
    for i, formdata in enumerate(formdef.data_class().select()):
203
        formdata.user_id = user1.id if bool(i % 2) else user2.id
204
        formdata.store()
205

  
206
    app = login(get_app(pub))
207
    resp = app.get('/backoffice/management/form-title/')
208
    assert resp.text.count('</th>') == 8  # six columns
209

  
210
    if not pub.is_using_postgresql():
211
        # no support for relation columns unless using SQL
212
        assert 'user-label$3' not in resp.forms['listing-settings'].fields
213
        return
214
    resp.forms['listing-settings']['user-label$3'].checked = True
215
    resp = resp.forms['listing-settings'].submit()
216
    assert resp.text.count('</th>') == 9
217
    assert '<td>nono</td' in resp
218

  
219

  
220
def test_backoffice_card_field_columns(pub):
221
    user = create_superuser(pub)
222
    create_environment(pub)
223

  
224
    datasource = {'type': 'formula', 'value': repr([('A', 'aa'), ('B', 'bb'), ('C', 'cc')])}
225

  
226
    CardDef.wipe()
227
    carddef = CardDef()
228
    carddef.name = 'foo'
229
    carddef.fields = [
230
        fields.CommentField(id='0', label='...', type='comment'),
231
        fields.StringField(id='1', label='Test', type='string', varname='foo'),
232
        fields.DateField(id='2', label='Date', type='date'),
233
        fields.BoolField(id='3', label='Bool', type='bool'),
234
        fields.ItemField(id='4', label='Item', type='item', data_source=datasource),
235
    ]
236
    carddef.backoffice_submission_roles = user.roles
237
    carddef.workflow_roles = {'_editor': user.roles[0]}
238
    carddef.digest_templates = {'default': 'card {{ form_var_foo }}'}
239
    carddef.store()
240
    carddef.data_class().wipe()
241

  
242
    card = carddef.data_class()()
243
    card.data = {
244
        '1': 'plop',
245
        '2': time.strptime('2020-04-24', '%Y-%m-%d'),
246
        '3': True,
247
        '4': 'A',
248
        '4_display': 'aa',
249
    }
250
    card.store()
251

  
252
    formdef = FormDef.get_by_urlname('form-title')
253
    formdef.geolocations = {'base': 'Geolocation'}
254
    formdef.fields.append(
255
        fields.ItemField(
256
            id='4', label='card field', type='item', data_source={'type': 'carddef:foo', 'value': ''}
257
        )
258
    )
259
    formdef.store()
260

  
261
    for formdata in formdef.data_class().select(lambda x: x.status == 'wf-new'):
262
        formdata.data['4'] = str(card.id)
263
        formdata.data['4_display'] = formdef.fields[-1].store_display_value(formdata.data, '4')
264
        formdata.data['4_structured'] = formdef.fields[-1].store_structured_value(formdata.data, '4')
265
        formdata.geolocations = {'base': {'lat': 48.83, 'lon': 2.32}}
266
        formdata.store()
267

  
268
    app = login(get_app(pub))
269
    resp = app.get('/backoffice/management/form-title/')
270
    assert resp.text.count('</th>') == 8  # six columns
271
    if not pub.is_using_postgresql():
272
        # no support for relation columns unless using SQL
273
        assert '4$1' not in resp.forms['listing-settings'].fields
274
        return
275
    assert '4$0' not in resp.forms['listing-settings'].fields
276
    resp.forms['listing-settings']['4$1'].checked = True
277
    resp.forms['listing-settings']['4$2'].checked = True
278
    resp.forms['listing-settings']['4$3'].checked = True
279
    resp.forms['listing-settings']['4$4'].checked = True
280
    resp = resp.forms['listing-settings'].submit()
281
    assert resp.text.count('</th>') == 12
282
    assert resp.text.count('data-link') == 17  # 17 rows
283
    assert resp.text.count('<td>plop</td>') == 17
284
    assert resp.text.count('<td>2020-04-24</td>') == 17
285
    assert resp.text.count('<td>Yes</td>') == 17
286
    assert resp.text.count('<td>aa</td>') == 17
287

  
288
    resp_csv = resp.click('Export a Spreadsheet')
289
    resp_csv.form['format'] = 'csv'
290
    resp_csv = resp_csv.form.submit('submit')
291
    assert resp_csv.text.splitlines()[1].endswith(',"plop","2020-04-24","Yes","aa"')
292

  
293
    resp_map = resp.click('Plot on a Map')
294
    geojson_url = re.findall(r'data-geojson-url="(.*?)"', resp_map.text)[0]
295
    resp_geojson = app.get(geojson_url)
296
    assert {
297
        'varname': None,
298
        'label': 'card field - Test',
299
        'value': 'plop',
300
        'html_value': 'plop',
301
    } in resp_geojson.json['features'][0]['properties']['display_fields']
302

  
303

  
304
def test_backoffice_block_columns(pub):
305
    create_environment(pub)
306
    create_superuser(pub)
307

  
308
    BlockDef.wipe()
309
    block = BlockDef()
310
    block.name = 'foobar'
311
    block.fields = [
312
        fields.StringField(id='123', required=True, label='Test', type='string'),
313
    ]
314
    block.store()
315

  
316
    formdef = FormDef.get_by_urlname('form-title')
317
    formdef.fields.append(
318
        fields.BlockField(id='8', label='Block', type='block:foobar', varname='data', max_items=3),
319
    )
320
    formdef.store()
321

  
322
    for formdata in formdef.data_class().select(lambda x: x.status == 'wf-new'):
323
        formdata.data['8'] = {
324
            'data': [{'123': 'blah'}],
325
            'schema': {'123': 'string'},
326
        }
327
        formdata.data['8_display'] = 'blah'
328
        formdata.store()
329

  
330
    app = login(get_app(pub))
331
    resp = app.get('/backoffice/management/form-title/')
332
    # check Block / Test is not part of the possible columns
333
    assert [x.text_content() for x in resp.pyquery('#columns-filter label')] == [
334
        'Number',
335
        'Created',
336
        'Last Modified',
337
        'User Label',
338
        '1st field',
339
        '2nd field',
340
        'Status',
341
        '3rd field',
342
        'Block',
343
        'Anonymised',
344
    ]
tests/backoffice_pages/test_filters.py
794 794

  
795 795
    app = login(get_app(pub))
796 796
    resp = app.get('/backoffice/management/form-title/')
797
    # block subfields should not be proposed as columns
798 797
    assert '<label><input type="checkbox" name="1"/>Block Data / String</label>' not in resp
799 798
    assert '<label><input type="checkbox" name="2"/>Block Data / Item</label>' not in resp
800 799
    assert '<label><input type="checkbox" name="3"/>Block Data / Bool</label>' not in resp
801
-