Przeglądaj źródła

Distinct test scenarios for class/instance iteration

theenglishway (time) 6 lat temu
rodzic
commit
aac31fedd4
2 zmienionych plików z 133 dodań i 17 usunięć
  1. 108 9
      tests/conftest.py
  2. 25 8
      tests/test_iterators.py

+ 108 - 9
tests/conftest.py

@@ -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

+ 25 - 8
tests/test_iterators.py

@@ -21,21 +21,38 @@ def instance_factory(request):
     'scenario',
     [
         'scenario_simple',
+        'scenario_simple_list',
         'scenario_nested',
+        'scenario_nested_list',
         'scenario_double_nested'
     ], indirect=True
 )
-def test_iterators(scenario):
+def test_iterator_schema(scenario):
     data = scenario.data_factory.valid()
     keys = scenario.keys
 
-    assert [k for k, _ in iter_form_class(scenario.form)] == keys
+    assert [k for k, _ in iter_schema(scenario.schema)] == keys.class_
 
-    form = scenario.form()
-    assert [k for k, _ in iter_form_class(scenario.form)] == keys
-    assert [k for k, _ in iter_form(form)] == keys
+    schema_instance = scenario.schema(**data)
+    assert [k for k, _ in iter_schema(scenario.schema)] == keys.class_
+    assert [k for k, _ in iter_schema(schema_instance)] == keys.instance
 
-    assert [k for k, _ in iter_schema(scenario.schema)] == keys
 
-    schema_instance = scenario.schema(**data)
-    assert [k for k, _ in iter_schema(schema_instance)] == keys
+@pytest.mark.parametrize(
+    'scenario',
+    [
+        'scenario_simple',
+        'scenario_simple_list',
+        'scenario_nested',
+        'scenario_nested_list',
+        'scenario_double_nested'
+    ], indirect=True
+)
+def test_iterator_form(scenario):
+    keys = scenario.keys
+
+    assert [k for k, _ in iter_form_class(scenario.form)] == keys.class_
+
+    form = scenario.form()
+    assert [k for k, _ in iter_form_class(scenario.form)] == keys.class_
+    assert [k for k, _ in iter_form(form)] == keys.instance