Projet

Général

Profil

0001-tests-add-test-for-dynamic-custom-views-data-sources.patch

Nicolas Roche, 18 septembre 2021 19:38

Télécharger (6,54 ko)

Voir les différences:

Subject: [PATCH] tests: add test for dynamic custom views data sources
 (#56374)

 tests/form_pages/test_all.py | 137 +++++++++++++++++++++++++++++++++++
 1 file changed, 137 insertions(+)
tests/form_pages/test_all.py
5530 5530
    assert resp.form['f1'].options == []
5531 5531
    if pub.is_using_postgresql():
5532 5532
        assert pub.loggederror_class.count() == 1
5533 5533
        logged_error = pub.loggederror_class.select()[0]
5534 5534
        assert logged_error.formdef_id == formdef.id
5535 5535
        assert logged_error.summary == '[DATASOURCE] Unknown custom view "as-data-source" for CardDef "items"'
5536 5536

  
5537 5537

  
5538
def test_dynamic_item_field_with_datasource_from_custom_view_on_cards(pub):
5539
    if not pub.is_using_postgresql():
5540
        pytest.skip('this requires SQL')
5541
        return
5542

  
5543
    pub.role_class.wipe()
5544
    pub.custom_view_class.wipe()
5545

  
5546
    user = create_user(pub)
5547
    role = pub.role_class(name='xxx')
5548
    role.store()
5549
    user.roles = [role.id]
5550
    user.is_admin = True
5551
    user.store()
5552

  
5553
    formdef = create_formdef()
5554
    formdef.data_class().wipe()
5555

  
5556
    data_source = {
5557
        'type': 'formula',
5558
        'value': repr(
5559
            [
5560
                {'id': '0', 'text': 'foo'},
5561
                {'id': '1', 'text': 'bar'},
5562
                {'id': '2', 'text': 'baz'},
5563
            ]
5564
        ),
5565
    }
5566

  
5567
    CardDef.wipe()
5568
    carddef = CardDef()
5569
    carddef.name = 'items'
5570
    carddef.digest_templates = {'default': '{{form_var_attr}}'}
5571
    carddef.workflow_roles = {'_editor': user.roles[0]}
5572
    carddef.fields = [
5573
        fields.ItemField(id='0', type='item', label='item', data_source=data_source),
5574
        fields.StringField(id='1', type='string', label='string', varname='attr'),
5575
    ]
5576
    carddef.store()
5577
    carddef.data_class().wipe()
5578
    baz_ids = set()
5579
    for key, value in enumerate(['foo', 'bar', 'baz']):
5580
        for i in range(0, 10):
5581
            carddata = carddef.data_class()()
5582
            carddata.data = {
5583
                '0': repr(key),
5584
                '0_display': value,
5585
                '1': 'attr%s%s' % (key, i),
5586
            }
5587
            carddata.just_created()
5588
            carddata.store()
5589
            if value == 'baz':
5590
                baz_ids.add(str(carddata.id))
5591

  
5592
    # create custom view
5593
    app = login(get_app(pub), username='foo', password='foo')
5594

  
5595
    resp = app.get('/backoffice/data/items/')
5596
    if pub.is_using_postgresql():
5597
        assert resp.text.count('<tr') == 21  # thead + 20 items (max per page)
5598
    else:
5599
        assert resp.text.count('<tr') == 31  # thead + all items
5600
    resp.forms['listing-settings']['filter-0'].checked = True
5601
    resp.forms['listing-settings']['filter-status'].checked = True
5602
    resp = resp.forms['listing-settings'].submit()
5603

  
5604
    resp.forms['listing-settings']['filter'].value = 'recorded'
5605
    resp = resp.forms['listing-settings'].submit()
5606

  
5607
    resp.forms['save-custom-view']['title'] = 'as data source'
5608
    resp.forms['save-custom-view']['visibility'] = 'datasource'
5609
    resp = resp.forms['save-custom-view'].submit().follow()
5610

  
5611
    assert resp.forms['listing-settings']['filter-0-value'].attrs['data-allow-template']
5612
    assert 'custom value' in [x[2] for x in resp.forms['listing-settings']['filter-0-value'].options]
5613
    resp.forms['listing-settings']['filter-0-value'].force_value('{{ form_var_blah_raw }}')
5614

  
5615
    resp = resp.forms['listing-settings'].submit()
5616
    assert resp.forms['listing-settings']['filter-0-value'].value == '{{ form_var_blah_raw }}'
5617
    assert resp.text.count('<tr') == 1  # thead only
5618

  
5619
    # save custom view with filter
5620
    resp = resp.forms['save-custom-view'].submit().follow()
5621

  
5622
    custom_view = pub.custom_view_class.select()[0]
5623

  
5624
    # use custom view as source
5625
    ds = {'type': 'carddef:%s:%s' % (carddef.url_name, custom_view.slug)}
5626
    formdef.fields = [
5627
        fields.ItemField(id='0', type='item', label='item', varname='blah', data_source=data_source),
5628
        fields.ItemField(id='1', label='string', type='item', data_source=ds, display_disabled_items=True),
5629
    ]
5630
    formdef.store()
5631

  
5632
    resp = get_app(pub).get('/test/')
5633
    assert resp.form['f1'].options == [('', False, '---')]
5634
    resp.form['f0'] = '2'
5635
    live_resp = app.post('/test/live?modified_field_id=0', params=resp.form.submit_fields())
5636
    assert len(live_resp.json['result']['1']['items']) == 10
5637
    assert {x['id'] for x in live_resp.json['result']['1']['items']} == baz_ids
5638

  
5639
    resp.form['f1'].options = []
5640
    for item in live_resp.json['result']['1']['items']:
5641
        # simulate javascript filling the <select>
5642
        resp.form['f1'].options.append((item['id'], False, item['text']))
5643

  
5644
    resp.form['f1'] = resp.form['f1'].options[0][0]
5645
    resp = resp.form.submit('submit')  # -> validation page
5646
    resp = resp.form.submit('submit')  # -> submit
5647
    assert formdef.data_class().select()[0].data['1'] in baz_ids
5648

  
5649
    # same in autocomplete mode
5650
    formdef.fields[1].display_mode = 'autocomplete'
5651
    formdef.store()
5652
    app = get_app(pub)
5653
    resp = app.get('/test/')
5654
    # simulate select2 mode, with qommon.forms.js adding an extra hidden widget
5655
    resp.form.fields['f1_display'] = Hidden(form=resp.form, tag='input', name='f1_display', pos=10)
5656
    select2_url = resp.pyquery('select:last').attr['data-select2-url']
5657
    resp_json = app.get(select2_url + '?q=')
5658
    assert len(resp_json.json['data']) == 0
5659
    resp.form['f0'] = '2'
5660

  
5661
    live_resp = app.post('/test/live?modified_field_id=0', params=resp.form.submit_fields())
5662
    new_select2_url = live_resp.json['result']['1']['source_url']
5663
    resp_json = app.get(new_select2_url + '?q=')
5664
    assert len(resp_json.json['data']) == 10
5665
    assert {str(x['id']) for x in resp_json.json['data']} == baz_ids
5666

  
5667
    resp.form['f1'].force_value(str(resp_json.json['data'][0]['id']))
5668
    resp.form.fields['f1_display'].force_value(resp_json.json['data'][0]['text'])
5669

  
5670
    resp = resp.form.submit('submit')  # -> validation page
5671
    resp = resp.form.submit('submit')  # -> submit
5672
    assert formdef.data_class().select()[0].data['1'] in baz_ids
5673

  
5674

  
5538 5675
def test_item_field_from_cards_check_lazy_live(pub):
5539 5676
    create_user(pub)
5540 5677
    formdef = create_formdef()
5541 5678
    formdef.data_class().wipe()
5542 5679

  
5543 5680
    CardDef.wipe()
5544 5681
    carddef = CardDef()
5545 5682
    carddef.name = 'items'
5546
-