Projet

Général

Profil

0001-misc-split-backoffice_pages-tests.patch

Lauréline Guérin, 18 janvier 2022 09:46

Télécharger (25,9 ko)

Voir les différences:

Subject: [PATCH 1/4] 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
581 581
    resp = app.get('/backoffice/not-form-title/', status=404)
582 582

  
583 583

  
584
def test_backoffice_columns(pub):
585
    create_superuser(pub)
586
    create_environment(pub)
587
    app = login(get_app(pub))
588
    resp = app.get('/backoffice/management/form-title/')
589
    assert resp.text.count('</th>') == 8  # six columns
590
    resp.forms['listing-settings']['1'].checked = False
591
    assert 'submission_channel' not in resp.forms['listing-settings'].fields
592
    assert 'last_update_time' in resp.forms['listing-settings'].fields
593
    resp = resp.forms['listing-settings'].submit()
594
    assert resp.text.count('</th>') == 7  # fixe columns
595
    assert resp.text.count('data-link') == 17  # 17 rows
596
    assert resp.text.count('FOO BAR') == 0  # no field 1 column
597

  
598
    # change column order
599
    assert (
600
        resp.forms['listing-settings']['columns-order'].value
601
        == 'id,time,last_update_time,user-label,2,status,1,3,anonymised'
602
    )
603
    resp.forms['listing-settings'][
604
        'columns-order'
605
    ].value = 'user-label,id,time,last_update_time,2,status,1,3,anonymised'
606
    resp = resp.forms['listing-settings'].submit()
607
    assert resp.text.find('<span>User Label</span>') < resp.text.find('<span>Number</span>')
608

  
609

  
610
def test_backoffice_channel_column(pub):
611
    if not pub.site_options.has_section('variables'):
612
        pub.site_options.add_section('variables')
613
    pub.site_options.set('variables', 'welco_url', 'xxx')
614
    with open(os.path.join(pub.app_dir, 'site-options.cfg'), 'w') as fd:
615
        pub.site_options.write(fd)
616

  
617
    create_superuser(pub)
618
    create_environment(pub)
619
    app = login(get_app(pub))
620
    resp = app.get('/backoffice/management/form-title/')
621
    assert resp.text.count('</th>') == 8  # six columns
622
    resp.forms['listing-settings']['submission_channel'].checked = True
623
    resp = resp.forms['listing-settings'].submit()
624
    assert resp.text.count('</th>') == 9  # seven columns
625
    assert resp.text.count('data-link') == 17  # 17 rows
626
    assert resp.text.count('<td>Web</td>') == 17
627

  
628

  
629
def test_backoffice_submission_agent_column(pub):
630
    user = create_user(pub)
631
    create_environment(pub)
632

  
633
    agent = pub.user_class(name='agent')
634
    agent.store()
635

  
636
    app = login(get_app(pub))
637
    resp = app.get('/backoffice/management/form-title/')
638
    assert 'submission_agent' not in resp.forms['listing-settings'].fields
639

  
640
    formdef = FormDef.get_by_urlname('form-title')
641
    formdef.backoffice_submission_roles = user.roles
642
    formdef.store()
643
    resp = app.get('/backoffice/management/form-title/')
644
    assert resp.text.count('</th>') == 8  # six columns
645
    resp.forms['listing-settings']['submission_agent'].checked = True
646
    resp = resp.forms['listing-settings'].submit()
647
    assert resp.text.count('</th>') == 9  # seven columns
648
    assert resp.text.count('data-link') == 17  # 17 rows
649
    assert '>agent<' not in resp.text
650
    resp = resp.click('Export a Spreadsheet')
651
    resp.form['format'] = 'csv'
652
    resp = resp.form.submit('submit')
653
    assert len(resp.text.splitlines()) == 18  # 17 + header line
654
    assert ',"agent",' not in resp.text
655

  
656
    for formdata in formdef.data_class().select():
657
        formdata.submission_agent_id = str(agent.id)
658
        formdata.store()
659

  
660
    resp = app.get('/backoffice/management/form-title/')
661
    resp.forms['listing-settings']['submission_agent'].checked = True
662
    resp = resp.forms['listing-settings'].submit()
663
    assert resp.text.count('>agent<') == 17
664

  
665
    resp = resp.click('Export a Spreadsheet')
666
    resp.form['format'] = 'csv'
667
    resp = resp.form.submit('submit')
668
    assert len(resp.text.splitlines()) == 18  # 17 + header line
669
    assert resp.text.count(',"agent"') == 17
670

  
671

  
672
def test_backoffice_image_column(pub):
673
    create_superuser(pub)
674
    create_environment(pub)
675
    formdef = FormDef.get_by_urlname('form-title')
676
    formdef.fields.append(
677
        fields.FileField(
678
            id='4', label='file field', type='file', display_locations=['validation', 'summary', 'listings']
679
        )
680
    )
681
    formdef.store()
682

  
683
    upload = PicklableUpload('test.jpeg', 'image/jpeg')
684
    with open(os.path.join(os.path.dirname(__file__), '..', 'image-with-gps-data.jpeg'), 'rb') as fd:
685
        upload.receive([fd.read()])
686
    for formdata in formdef.data_class().select(lambda x: x.status == 'wf-new'):
687
        formdata.data['4'] = upload
688
        formdata.store()
689
    app = login(get_app(pub))
690
    resp = app.get('/backoffice/management/form-title/')
691
    assert 'download?f=4&thumbnail=1' not in resp.text
692

  
693

  
694
def test_backoffice_file_column(pub):
695
    create_superuser(pub)
696
    create_environment(pub)
697
    formdef = FormDef.get_by_urlname('form-title')
698
    formdef.fields.append(
699
        fields.FileField(
700
            id='4', label='file field', type='file', display_locations=['validation', 'summary', 'listings']
701
        )
702
    )
703
    formdef.store()
704

  
705
    upload = PicklableUpload('a filename that is too long "and" will be ellipsised.txt', 'text/plain')
706
    upload.receive([b'text'])
707
    for formdata in formdef.data_class().select(lambda x: x.status == 'wf-new'):
708
        formdata.data['4'] = upload
709
        formdata.store()
710
    app = login(get_app(pub))
711
    resp = app.get('/backoffice/management/form-title/')
712
    assert 'title="a filename that is too long &quot;and&quot; will be ellipsised.txt"' in resp
713
    assert '<span>a filename that is too(…).txt</span>' in resp
714

  
715

  
716
def test_backoffice_user_columns(pub):
717
    create_superuser(pub)
718
    create_environment(pub)
719

  
720
    from wcs.admin.settings import UserFieldsFormDef
721

  
722
    user_formdef = UserFieldsFormDef(pub)
723
    user_formdef.fields.append(fields.StringField(id='_first_name', label='name', type='string'))
724
    user_formdef.fields.append(fields.StringField(id='3', label='test', type='string'))
725
    user_formdef.store()
726
    pub.cfg['users']['field_name'] = ['3', '4']
727
    pub.write_cfg()
728

  
729
    user1 = pub.user_class(name='userA')
730
    user1.form_data = {'_first_name': 'toto', '3': 'nono'}
731
    user1.set_attributes_from_formdata(user1.form_data)
732
    user1.store()
733
    user2 = pub.user_class(name='userB')
734
    user2.form_data = {'_first_name': 'tutu', '3': 'nunu'}
735
    user2.set_attributes_from_formdata(user2.form_data)
736
    user2.store()
737

  
738
    formdef = FormDef.get_by_urlname('form-title')
739
    for i, formdata in enumerate(formdef.data_class().select()):
740
        formdata.user_id = user1.id if bool(i % 2) else user2.id
741
        formdata.store()
742

  
743
    app = login(get_app(pub))
744
    resp = app.get('/backoffice/management/form-title/')
745
    assert resp.text.count('</th>') == 8  # six columns
746

  
747
    if not pub.is_using_postgresql():
748
        # no support for relation columns unless using SQL
749
        assert 'user-label$3' not in resp.forms['listing-settings'].fields
750
        return
751
    resp.forms['listing-settings']['user-label$3'].checked = True
752
    resp = resp.forms['listing-settings'].submit()
753
    assert resp.text.count('</th>') == 9
754
    assert '<td>nono</td' in resp
755

  
756

  
757
def test_backoffice_card_field_columns(pub):
758
    user = create_superuser(pub)
759
    create_environment(pub)
760

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

  
763
    CardDef.wipe()
764
    carddef = CardDef()
765
    carddef.name = 'foo'
766
    carddef.fields = [
767
        fields.CommentField(id='0', label='...', type='comment'),
768
        fields.StringField(id='1', label='Test', type='string', varname='foo'),
769
        fields.DateField(id='2', label='Date', type='date'),
770
        fields.BoolField(id='3', label='Bool', type='bool'),
771
        fields.ItemField(id='4', label='Item', type='item', data_source=datasource),
772
    ]
773
    carddef.backoffice_submission_roles = user.roles
774
    carddef.workflow_roles = {'_editor': user.roles[0]}
775
    carddef.digest_templates = {'default': 'card {{ form_var_foo }}'}
776
    carddef.store()
777
    carddef.data_class().wipe()
778

  
779
    card = carddef.data_class()()
780
    card.data = {
781
        '1': 'plop',
782
        '2': time.strptime('2020-04-24', '%Y-%m-%d'),
783
        '3': True,
784
        '4': 'A',
785
        '4_display': 'aa',
786
    }
787
    card.store()
788

  
789
    formdef = FormDef.get_by_urlname('form-title')
790
    formdef.geolocations = {'base': 'Geolocation'}
791
    formdef.fields.append(
792
        fields.ItemField(
793
            id='4', label='card field', type='item', data_source={'type': 'carddef:foo', 'value': ''}
794
        )
795
    )
796
    formdef.store()
797

  
798
    for formdata in formdef.data_class().select(lambda x: x.status == 'wf-new'):
799
        formdata.data['4'] = str(card.id)
800
        formdata.data['4_display'] = formdef.fields[-1].store_display_value(formdata.data, '4')
801
        formdata.data['4_structured'] = formdef.fields[-1].store_structured_value(formdata.data, '4')
802
        formdata.geolocations = {'base': {'lat': 48.83, 'lon': 2.32}}
803
        formdata.store()
804

  
805
    app = login(get_app(pub))
806
    resp = app.get('/backoffice/management/form-title/')
807
    assert resp.text.count('</th>') == 8  # six columns
808
    if not pub.is_using_postgresql():
809
        # no support for relation columns unless using SQL
810
        assert '4$1' not in resp.forms['listing-settings'].fields
811
        return
812
    assert '4$0' not in resp.forms['listing-settings'].fields
813
    resp.forms['listing-settings']['4$1'].checked = True
814
    resp.forms['listing-settings']['4$2'].checked = True
815
    resp.forms['listing-settings']['4$3'].checked = True
816
    resp.forms['listing-settings']['4$4'].checked = True
817
    resp = resp.forms['listing-settings'].submit()
818
    assert resp.text.count('</th>') == 12
819
    assert resp.text.count('data-link') == 17  # 17 rows
820
    assert resp.text.count('<td>plop</td>') == 17
821
    assert resp.text.count('<td>2020-04-24</td>') == 17
822
    assert resp.text.count('<td>Yes</td>') == 17
823
    assert resp.text.count('<td>aa</td>') == 17
824

  
825
    resp_csv = resp.click('Export a Spreadsheet')
826
    resp_csv.form['format'] = 'csv'
827
    resp_csv = resp_csv.form.submit('submit')
828
    assert resp_csv.text.splitlines()[1].endswith(',"plop","2020-04-24","Yes","aa"')
829

  
830
    resp_map = resp.click('Plot on a Map')
831
    geojson_url = re.findall(r'data-geojson-url="(.*?)"', resp_map.text)[0]
832
    resp_geojson = app.get(geojson_url)
833
    assert {
834
        'varname': None,
835
        'label': 'card field - Test',
836
        'value': 'plop',
837
        'html_value': 'plop',
838
    } in resp_geojson.json['features'][0]['properties']['display_fields']
839

  
840

  
841
def test_backoffice_block_columns(pub):
842
    create_environment(pub)
843
    create_superuser(pub)
844

  
845
    BlockDef.wipe()
846
    block = BlockDef()
847
    block.name = 'foobar'
848
    block.fields = [
849
        fields.StringField(id='123', required=True, label='Test', type='string'),
850
    ]
851
    block.store()
852

  
853
    formdef = FormDef.get_by_urlname('form-title')
854
    formdef.fields.append(
855
        fields.BlockField(id='8', label='Block', type='block:foobar', varname='data', max_items=3),
856
    )
857
    formdef.store()
858

  
859
    for formdata in formdef.data_class().select(lambda x: x.status == 'wf-new'):
860
        formdata.data['8'] = {
861
            'data': [{'123': 'blah'}],
862
            'schema': {'123': 'string'},
863
        }
864
        formdata.data['8_display'] = 'blah'
865
        formdata.store()
866

  
867
    app = login(get_app(pub))
868
    resp = app.get('/backoffice/management/form-title/')
869
    # check Block / Test is not part of the possible columns
870
    assert [x.text_content() for x in resp.pyquery('#columns-filter label')] == [
871
        'Number',
872
        'Created',
873
        'Last Modified',
874
        'User Label',
875
        '1st field',
876
        '2nd field',
877
        'Status',
878
        '3rd field',
879
        'Block',
880
        'Anonymised',
881
    ]
882

  
883

  
884 584
def test_backoffice_form_category_permissions(pub):
885 585
    user = create_user(pub)
886 586
    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
-