from itertools import product from werkzeug.datastructures import ImmutableMultiDict from pydantic_form.translator import * from pydantic_form.utils import recursive_get import pytest @pytest.fixture def data(request, scenario): return getattr(scenario.data_factory, request.param)() SCENARIOS = [ 'scenario_simple', 'scenario_nested', 'scenario_double_nested' ] @pytest.mark.parametrize( 'kwargs_factory', [ lambda data: {'data': data}, lambda data: {'formdata': ImmutableMultiDict(data)}, lambda data: data, ], ids=[ 'data', 'formdata', 'kwargs' ] ) @pytest.mark.parametrize( 'data', ['valid', 'bad'], indirect=True ) @pytest.mark.parametrize( 'scenario', SCENARIOS, indirect=True ) def test_process_data(scenario, data, kwargs_factory): form = scenario.form() kwargs = kwargs_factory(data) form.process(**kwargs) assert form.data == data @pytest.mark.parametrize( 'data', ['valid'], indirect=True ) @pytest.mark.parametrize( 'scenario', SCENARIOS, indirect=True ) def test_validate_valid(scenario, data): form = scenario.form(data=data) assert form.validate() form = scenario.form() form.process(data=data) assert form.validate() @pytest.mark.parametrize( 'data', ['bad'], indirect=True ) @pytest.mark.parametrize( 'scenario', SCENARIOS, indirect=True ) def test_validate_bad(scenario, data): form = scenario.form(data=data) assert not form.validate() form = scenario.form() form.process(data=data) assert not form.validate() @pytest.mark.parametrize( 'data', ['valid'], indirect=True ) @pytest.mark.parametrize( 'scenario', SCENARIOS, indirect=True ) def test_errors_valid(scenario, data): form = scenario.form(data=data) assert form.errors == {} @pytest.mark.parametrize( 'data, errors_factory', [ ('bad', lambda s: s.errors.bad), ('missing', lambda s: s.errors.missing), ], indirect=['data'] ) @pytest.mark.parametrize( 'scenario', SCENARIOS, indirect=True ) def test_errors_invalid(scenario, data, errors_factory): form = scenario.form(data=data) form.validate() assert form.errors for k, error in errors_factory(scenario).items(): assert recursive_get(form.errors, *k)[0]['type'] == error