import pytest from wtforms import FormField from pydantic_form.translator import iter_form, SchemaToForm from pydantic_form.utils import recursive_get, formdata_mangle, nested_dict_iter @pytest.fixture def data(request, scenario): return getattr(scenario.data_factory, request.param)() SCENARIOS = [ 'scenario_simple', 'scenario_simple_list', 'scenario_nested', 'scenario_nested_list', 'scenario_double_nested' ] @pytest.mark.parametrize( 'kwargs_factory', [ lambda data: {'data': data}, lambda data: {'formdata': formdata_mangle(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, expected in nested_dict_iter(errors_factory(scenario), iter_list=True): field_errors = SchemaToForm.get_item(form.errors, k) errors = [e['type'] for e in field_errors] assert len(errors) == 1 assert errors[0] == expected @pytest.mark.parametrize( 'data', ['valid'], indirect=True ) @pytest.mark.parametrize( 'scenario', SCENARIOS, indirect=True ) def test_baked_instance(scenario, data): form = scenario.form(data=data) form.validate() assert hasattr(form, '_baked_instance') assert form._baked_instance is not None assert form._baked_instance.dict() == data for key, sub_form in iter_form(form, leafs_only=False): sub_form = SchemaToForm.get_field(form, key) if isinstance(sub_form, FormField): assert hasattr(sub_form, '_baked_instance') assert sub_form._baked_instance is not None assert sub_form._baked_instance.dict() == SchemaToForm.get_item(data, key)