|
|
@@ -25,6 +25,10 @@ Scenario = namedtuple(
|
|
|
['form', 'schema', 'keys', 'data_factory', 'errors']
|
|
|
)
|
|
|
|
|
|
+Keys = namedtuple(
|
|
|
+ "Keys",
|
|
|
+ ["class_", "instance"]
|
|
|
+)
|
|
|
|
|
|
@pytest.fixture
|
|
|
def scenario(request):
|
|
|
@@ -38,7 +42,10 @@ class MissingDataFactory(factory.Factory):
|
|
|
|
|
|
# Simplest case
|
|
|
|
|
|
-simple_keys = [('integer',), ('string',)]
|
|
|
+simple_keys = Keys(
|
|
|
+ [('integer',), ('string',)],
|
|
|
+ [('integer',), ('string',)]
|
|
|
+)
|
|
|
|
|
|
class SimpleSchema(BaseModel):
|
|
|
integer: int
|
|
|
@@ -79,12 +86,12 @@ simple_data_factories = DataFactories(
|
|
|
simple_expected_errors = ExpectedErrors(
|
|
|
{},
|
|
|
{
|
|
|
- ('integer',): 'type_error.integer',
|
|
|
- ('string',): 'type_error.str'
|
|
|
+ 'integer': 'type_error.integer',
|
|
|
+ 'string': 'type_error.str'
|
|
|
},
|
|
|
{
|
|
|
- ('integer',): 'value_error.missing',
|
|
|
- ('string',): 'value_error.missing',
|
|
|
+ 'integer': 'value_error.missing',
|
|
|
+ 'string': 'value_error.missing',
|
|
|
}
|
|
|
)
|
|
|
|
|
|
@@ -100,7 +107,10 @@ def scenario_simple():
|
|
|
|
|
|
# Simple list case
|
|
|
|
|
|
-simple_list_keys = [('integer',), ('string',)]
|
|
|
+simple_list_keys = Keys(
|
|
|
+ [('integers',), ('strings',)],
|
|
|
+ [('integers', 0), ('integers', 1), ('strings', 0), ('strings', 1)],
|
|
|
+)
|
|
|
|
|
|
class SimpleListSchema(BaseModel):
|
|
|
integers: List[int]
|
|
|
@@ -140,12 +150,12 @@ simple_list_data_factories = DataFactories(
|
|
|
simple_list_expected_errors = ExpectedErrors(
|
|
|
{},
|
|
|
{
|
|
|
- ('integers',): ['type_error.integer', 'type_error.integer'],
|
|
|
- ('strings',): ['type_error.str', 'type_error.str']
|
|
|
+ 'integers': ['type_error.integer', 'type_error.integer'],
|
|
|
+ 'strings': ['type_error.str', 'type_error.str']
|
|
|
},
|
|
|
{
|
|
|
- ('integers',): 'value_error.missing',
|
|
|
- ('strings',): 'value_error.missing'
|
|
|
+ 'integers': 'value_error.missing',
|
|
|
+ 'strings': 'value_error.missing'
|
|
|
}
|
|
|
)
|
|
|
|
|
|
@@ -162,7 +172,10 @@ def scenario_simple_list():
|
|
|
|
|
|
# Case with one level of nesting
|
|
|
|
|
|
-nested_keys = [('integer',), ('nested', 'integer'), ('nested', 'string')]
|
|
|
+nested_keys = Keys(
|
|
|
+ [('integer',), ('nested', 'integer'), ('nested', 'string')],
|
|
|
+ [('integer',), ('nested', 'integer'), ('nested', 'string')]
|
|
|
+)
|
|
|
|
|
|
class NestedSchema(BaseModel):
|
|
|
integer: int
|
|
|
@@ -204,13 +217,15 @@ nested_data_factories = DataFactories(
|
|
|
nested_expected_errors = ExpectedErrors(
|
|
|
{},
|
|
|
{
|
|
|
- ('integer',): 'type_error.integer',
|
|
|
- ('nested', 'integer',): 'type_error.integer',
|
|
|
- ('nested', 'string',): 'type_error.str'
|
|
|
+ 'integer': 'type_error.integer',
|
|
|
+ 'nested': {
|
|
|
+ 'integer': 'type_error.integer',
|
|
|
+ 'string': 'type_error.str'
|
|
|
+ }
|
|
|
},
|
|
|
{
|
|
|
- ('integer',): 'value_error.missing',
|
|
|
- ('nested',): 'value_error.missing',
|
|
|
+ 'integer': 'value_error.missing',
|
|
|
+ 'nested': 'value_error.missing',
|
|
|
}
|
|
|
)
|
|
|
|
|
|
@@ -225,13 +240,101 @@ def scenario_nested():
|
|
|
)
|
|
|
|
|
|
|
|
|
+# Case with one level of nesting inside a list
|
|
|
+
|
|
|
+nested_list_keys = Keys(
|
|
|
+ [('integer',), ('nested_list', 'integer'), ('nested_list', 'string')],
|
|
|
+ [
|
|
|
+ ('integer',),
|
|
|
+ ('nested_list', 0, 'integer'),
|
|
|
+ ('nested_list', 1, 'integer'),
|
|
|
+ ('nested_list', 0, 'string'),
|
|
|
+ ('nested_list', 1, 'string')
|
|
|
+ ]
|
|
|
+)
|
|
|
+
|
|
|
+class NestedListSchema(BaseModel):
|
|
|
+ integer: int
|
|
|
+ nested_list: List[SimpleSchema]
|
|
|
+
|
|
|
+
|
|
|
+class NestedListWTForm(Form):
|
|
|
+ _schema = NestedListSchema
|
|
|
+
|
|
|
+ integer = fields.IntegerField()
|
|
|
+ nested_list = fields.FieldList(fields.FormField(form_class=SimpleForm), min_entries=2)
|
|
|
+
|
|
|
+
|
|
|
+class NestedListForm(NestedListWTForm, PydanticForm):
|
|
|
+ _schema = NestedListSchema
|
|
|
+
|
|
|
+
|
|
|
+class NestedListDataFactory(factory.Factory):
|
|
|
+ class Meta:
|
|
|
+ model = dict
|
|
|
+
|
|
|
+ integer = factory.Faker('pyint')
|
|
|
+ nested_list = factory.List([
|
|
|
+ factory.SubFactory(SimpleDataFactory),
|
|
|
+ factory.SubFactory(SimpleDataFactory)
|
|
|
+ ])
|
|
|
+
|
|
|
+
|
|
|
+class NestedListBadDataFactory(factory.Factory):
|
|
|
+ class Meta:
|
|
|
+ model = dict
|
|
|
+
|
|
|
+ integer = factory.Faker('pystr')
|
|
|
+ nested_list = factory.List([
|
|
|
+ factory.SubFactory(SimpleBadDataFactory),
|
|
|
+ factory.SubFactory(SimpleBadDataFactory)
|
|
|
+ ])
|
|
|
+
|
|
|
+nested_list_data_factories = DataFactories(
|
|
|
+ NestedListDataFactory,
|
|
|
+ NestedListBadDataFactory,
|
|
|
+ MissingDataFactory
|
|
|
+)
|
|
|
+
|
|
|
+nested_list_expected_errors = ExpectedErrors(
|
|
|
+ {},
|
|
|
+ {
|
|
|
+ 'integer': 'type_error.integer',
|
|
|
+ 'nested_list': [
|
|
|
+ {'integer': 'type_error.integer'},
|
|
|
+ {'string': 'type_error.str'}
|
|
|
+ ],
|
|
|
+ },
|
|
|
+ {
|
|
|
+ 'integer': 'value_error.missing',
|
|
|
+ 'nested_list': 'value_error.missing',
|
|
|
+ }
|
|
|
+)
|
|
|
+
|
|
|
+@pytest.fixture
|
|
|
+def scenario_nested_list():
|
|
|
+ return Scenario(
|
|
|
+ NestedListForm,
|
|
|
+ NestedListSchema,
|
|
|
+ nested_list_keys,
|
|
|
+ nested_list_data_factories,
|
|
|
+ nested_list_expected_errors
|
|
|
+ )
|
|
|
+
|
|
|
# Case with two levels of nesting
|
|
|
-double_nested_keys = [
|
|
|
- ('integer',),
|
|
|
- ('double_nested', 'integer'),
|
|
|
- ('double_nested', 'nested', 'integer'),
|
|
|
- ('double_nested', 'nested', 'string')
|
|
|
-]
|
|
|
+double_nested_keys = Keys([
|
|
|
+ ('integer',),
|
|
|
+ ('double_nested', 'integer'),
|
|
|
+ ('double_nested', 'nested', 'integer'),
|
|
|
+ ('double_nested', 'nested', 'string')
|
|
|
+ ],
|
|
|
+ [
|
|
|
+ ('integer',),
|
|
|
+ ('double_nested', 'integer'),
|
|
|
+ ('double_nested', 'nested', 'integer'),
|
|
|
+ ('double_nested', 'nested', 'string')
|
|
|
+ ]
|
|
|
+)
|
|
|
|
|
|
class DoubleNestedSchema(BaseModel):
|
|
|
integer: int
|
|
|
@@ -274,14 +377,18 @@ double_nested_data_factories = DataFactories(
|
|
|
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': 'type_error.integer',
|
|
|
+ 'double_nested': {
|
|
|
+ 'integer': 'type_error.integer',
|
|
|
+ 'nested': {
|
|
|
+ 'integer': 'type_error.integer',
|
|
|
+ 'string': 'type_error.str'
|
|
|
+ }
|
|
|
+ }
|
|
|
},
|
|
|
{
|
|
|
- ('integer',): 'value_error.missing',
|
|
|
- ('double_nested',): 'value_error.missing',
|
|
|
+ 'integer': 'value_error.missing',
|
|
|
+ 'double_nested': 'value_error.missing',
|
|
|
}
|
|
|
)
|
|
|
|