| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296 |
- import pytest
- import factory
- from collections import namedtuple
- from wtforms import Form, fields
- from werkzeug.datastructures import ImmutableMultiDict
- from pydantic_form import PydanticForm
- from pydantic import BaseModel, ValidationError
- from pydantic.types import StrictStr
- from typing import List
- DataFactories = namedtuple(
- "DataFactories",
- ['valid', 'bad', 'missing']
- )
- ExpectedErrors = namedtuple(
- "ExpectedErrors",
- ['valid', 'bad', 'missing']
- )
- Scenario = namedtuple(
- "ScenarioClasses",
- ['form', 'schema', 'keys', 'data_factory', 'errors']
- )
- @pytest.fixture
- def scenario(request):
- return request.getfixturevalue(request.param)
- class MissingDataFactory(factory.Factory):
- class Meta:
- model = dict
- # Simplest case
- simple_keys = [('integer',), ('string',)]
- class SimpleSchema(BaseModel):
- integer: int
- string: StrictStr
- class SimpleWTForm(Form):
- _schema = SimpleSchema
- integer = fields.IntegerField()
- string = fields.StringField()
- class SimpleForm(SimpleWTForm, PydanticForm):
- _schema = SimpleSchema
- class SimpleDataFactory(factory.Factory):
- class Meta:
- model = dict
- integer = factory.Faker('pyint')
- string = factory.Faker('pystr')
- class SimpleBadDataFactory(factory.Factory):
- class Meta:
- model = dict
- integer = factory.Faker('pystr')
- string = factory.Faker('pyint')
- simple_data_factories = DataFactories(
- SimpleDataFactory,
- SimpleBadDataFactory,
- MissingDataFactory
- )
- simple_expected_errors = ExpectedErrors(
- {},
- {
- ('integer',): 'type_error.integer',
- ('string',): 'type_error.str'
- },
- {
- ('integer',): 'value_error.missing',
- ('string',): 'value_error.missing',
- }
- )
- @pytest.fixture
- def scenario_simple():
- return Scenario(
- SimpleForm,
- SimpleSchema,
- simple_keys,
- simple_data_factories,
- simple_expected_errors
- )
- # Simple list case
- simple_list_keys = [('integer',), ('string',)]
- class SimpleListSchema(BaseModel):
- integers: List[int]
- strings: List[StrictStr]
- class SimpleListWTForm(Form):
- _schema = SimpleSchema
- integers = fields.FieldList(fields.IntegerField(), min_entries=2)
- strings = fields.FieldList(fields.StringField(), min_entries=2)
- class SimpleListForm(SimpleListWTForm, PydanticForm):
- _schema = SimpleListSchema
- class SimpleListDataFactory(factory.Factory):
- class Meta:
- model = dict
- integers = factory.List([factory.Faker('pyint'), factory.Faker('pyint')])
- strings = factory.List([factory.Faker('pystr'), factory.Faker('pystr')])
- class SimpleListBadDataFactory(factory.Factory):
- class Meta:
- model = dict
- integers = factory.List([factory.Faker('pystr'), factory.Faker('pystr')])
- strings = factory.List([factory.Faker('pyint'), factory.Faker('pyint')])
- simple_list_data_factories = DataFactories(
- SimpleListDataFactory,
- SimpleListBadDataFactory,
- MissingDataFactory
- )
- simple_list_expected_errors = ExpectedErrors(
- {},
- {
- ('integers',): ['type_error.integer', 'type_error.integer'],
- ('strings',): ['type_error.str', 'type_error.str']
- },
- {
- ('integers',): 'value_error.missing',
- ('strings',): 'value_error.missing'
- }
- )
- @pytest.fixture
- def scenario_simple_list():
- return Scenario(
- SimpleListForm,
- SimpleListSchema,
- simple_list_keys,
- simple_list_data_factories,
- simple_list_expected_errors
- )
- # Case with one level of nesting
- nested_keys = [('integer',), ('nested', 'integer'), ('nested', 'string')]
- class NestedSchema(BaseModel):
- integer: int
- nested: SimpleSchema
- class NestedWTForm(Form):
- _schema = NestedSchema
- integer = fields.IntegerField()
- nested = fields.FormField(form_class=SimpleForm)
- class NestedForm(NestedWTForm, PydanticForm):
- _schema = NestedSchema
- class NestedDataFactory(factory.Factory):
- class Meta:
- model = dict
- integer = factory.Faker('pyint')
- nested = factory.SubFactory(SimpleDataFactory)
- class NestedBadDataFactory(factory.Factory):
- class Meta:
- model = dict
- integer = factory.Faker('pystr')
- nested = factory.SubFactory(SimpleBadDataFactory)
- nested_data_factories = DataFactories(
- NestedDataFactory,
- NestedBadDataFactory,
- MissingDataFactory
- )
- nested_expected_errors = ExpectedErrors(
- {},
- {
- ('integer',): 'type_error.integer',
- ('nested', 'integer',): 'type_error.integer',
- ('nested', 'string',): 'type_error.str'
- },
- {
- ('integer',): 'value_error.missing',
- ('nested',): 'value_error.missing',
- }
- )
- @pytest.fixture
- def scenario_nested():
- return Scenario(
- NestedForm,
- NestedSchema,
- nested_keys,
- nested_data_factories,
- nested_expected_errors
- )
- # Case with two levels of nesting
- double_nested_keys = [
- ('integer',),
- ('double_nested', 'integer'),
- ('double_nested', 'nested', 'integer'),
- ('double_nested', 'nested', 'string')
- ]
- class DoubleNestedSchema(BaseModel):
- integer: int
- double_nested: NestedSchema
- class DoubleNestedWTForm(Form):
- _schema = DoubleNestedSchema
- integer = fields.IntegerField()
- double_nested = fields.FormField(form_class=NestedWTForm)
- class DoubleNestedForm(DoubleNestedWTForm, PydanticForm):
- _schema = DoubleNestedSchema
- double_nested = fields.FormField(form_class=NestedForm)
- class DoubleNestedDataFactory(factory.Factory):
- class Meta:
- model = dict
- integer = factory.Faker('pyint')
- double_nested = factory.SubFactory(NestedDataFactory)
- class DoubleNestedBadDataFactory(factory.Factory):
- class Meta:
- model = dict
- integer = factory.Faker('pystr')
- double_nested = factory.SubFactory(NestedBadDataFactory)
- double_nested_data_factories = DataFactories(
- DoubleNestedDataFactory,
- DoubleNestedBadDataFactory,
- MissingDataFactory
- )
- double_nested_expected_errors = ExpectedErrors(
- {},
- {
- ('integer',): 'type_error.integer',
- ('double_nested', 'integer',): 'type_error.integer',
- ('double_nested', 'nested', 'integer',): 'type_error.integer',
- ('double_nested', 'nested', 'string',): 'type_error.str'
- },
- {
- ('integer',): 'value_error.missing',
- ('double_nested',): 'value_error.missing',
- }
- )
- @pytest.fixture
- def scenario_double_nested():
- return Scenario(
- DoubleNestedForm,
- DoubleNestedSchema,
- double_nested_keys,
- double_nested_data_factories,
- double_nested_expected_errors
- )
|