Projet

Général

Profil

0001-testdef-add-support-for-blocks-73332.patch

Valentin Deniaud, 16 janvier 2023 14:36

Télécharger (4,47 ko)

Voir les différences:

Subject: [PATCH] testdef: add support for blocks (#73332)

 tests/test_testdef.py | 49 +++++++++++++++++++++++++++++++++++++++++++
 wcs/testdef.py        | 26 ++++++++++++++++++++---
 2 files changed, 72 insertions(+), 3 deletions(-)
tests/test_testdef.py
4 4
import pytest
5 5

  
6 6
from wcs import fields
7
from wcs.blocks import BlockDef
7 8
from wcs.formdef import FormDef
8 9
from wcs.qommon.http_request import HTTPRequest
9 10
from wcs.qommon.upload_storage import PicklableUpload
......
439 440
    assert str(excinfo.value) == 'Invalid value "hop.pdf" for field "File": forbidden file type.'
440 441

  
441 442

  
443
def test_validation_block_field(pub):
444
    block = BlockDef()
445
    block.name = 'foobar'
446
    block.fields = [
447
        fields.StringField(id='1', label='Text', varname='text'),
448
        fields.StringField(id='2', label='Hop'),
449
    ]
450
    block.store()
451

  
452
    formdef = FormDef()
453
    formdef.name = 'test title'
454
    formdef.fields = [
455
        fields.PageField(
456
            id='0',
457
            label='1st page',
458
            type='page',
459
            post_conditions=[
460
                {
461
                    'condition': {'type': 'django', 'value': 'form_var_blockdata_1_text == "a"'},
462
                    'error_message': '',
463
                }
464
            ],
465
        ),
466
        fields.BlockField(id='1', label='Block Data', varname='blockdata', type='block:foobar', max_items=3),
467
    ]
468
    formdef.store()
469

  
470
    formdata = formdef.data_class()()
471
    formdata.just_created()
472
    formdata.receipt_time = datetime.datetime(2021, 1, 1, 0, 0).timetuple()
473
    formdata.data['1'] = {'data': [{'1': 'a'}, {'1': 'b'}]}
474

  
475
    testdef = TestDef.create_from_formdata(formdef, formdata)
476
    with pytest.raises(TestError) as excinfo:
477
        testdef.run(formdef)
478
    assert str(excinfo.value) == 'Empty value for field "Hop" (of field "Block Data"): required field.'
479

  
480
    formdata.data['1'] = {'data': [{'1': 'a', '2': 'z'}, {'1': 'b', '2': 'z'}]}
481
    testdef = TestDef.create_from_formdata(formdef, formdata)
482
    with pytest.raises(TestError) as excinfo:
483
        testdef.run(formdef)
484
    assert str(excinfo.value) == 'Page 1 post condition was not met (form_var_blockdata_1_text == "a").'
485

  
486
    formdata.data['1'] = {'data': [{'1': 'b', '2': 'z'}, {'1': 'a', '2': 'z'}]}
487
    testdef = TestDef.create_from_formdata(formdef, formdata)
488
    testdef.run(formdef)
489

  
490

  
442 491
def test_computed_field_support(pub):
443 492
    formdef = FormDef()
444 493
    formdef.name = 'test title'
wcs/testdef.py
237 237
            value = ','.join(set(value) - set(widget.value))
238 238
            widget.set_error(get_selection_error_text())
239 239

  
240
        if widget.error:
240
        if widget.has_error():
241
            field_label = _('"%s"') % field.label
242
            if not widget.error:
243
                widget = self.get_error_subwidget(widget)
244
                value = widget.value
245
                field = widget.field
246
                field_label = _('"%(subfield)s" (of field %(field)s)') % {
247
                    'subfield': field.label,
248
                    'field': field_label,
249
                }
250

  
241 251
            if field.convert_value_to_str:
242 252
                value = field.convert_value_to_str(value)
243 253

  
244 254
            error_msg = 'Invalid value "%s"' % value if value else _('Empty value')
245 255
            raise TestError(
246
                '%(error)s for field "%(label)s": %(details)s.'
256
                '%(error)s for field %(label)s: %(details)s.'
247 257
                % {
248 258
                    'error': error_msg,
249
                    'label': field.label,
259
                    'label': field_label,
250 260
                    'details': widget.error,
251 261
                }
252 262
            )
253 263

  
264
    def get_error_subwidget(self, widget):
265
        for widget in widget.get_widgets():
266
            if widget.error:
267
                return widget
268

  
269
            if hasattr(widget, 'get_widgets'):
270
                widget = self.get_error_subwidget(widget)
271
                if widget:
272
                    return widget
273

  
254 274
    def export_to_json(self):
255 275
        return {
256 276
            'name': self.name,
257
-