|
|
@@ -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
|
|
|
@@ -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]
|
|
|
@@ -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
|
|
|
@@ -225,13 +238,99 @@ 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', 'integer', 0),
|
|
|
+ ('nested_list', 'integer', 1),
|
|
|
+ ('nested_list', 'string', 0),
|
|
|
+ ('nested_list', 'string', 1)
|
|
|
+ ]
|
|
|
+)
|
|
|
+
|
|
|
+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', 'integer',): 'type_error.integer',
|
|
|
+ ('nested', 'string',): 'type_error.str'
|
|
|
+ },
|
|
|
+ {
|
|
|
+ ('integer',): 'value_error.missing',
|
|
|
+ ('nested',): '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
|