conftest.py 3.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149
  1. import pytest
  2. import factory
  3. from collections import namedtuple
  4. from wtforms import Form, fields
  5. from werkzeug.datastructures import ImmutableMultiDict
  6. from pydantic_form import PydanticForm
  7. from pydantic import BaseModel, ValidationError
  8. ScenarioClasses = namedtuple(
  9. "ScenarioClasses",
  10. ['wtf_form', 'pydantic_form', 'schema', 'data_factory', 'bad_data_factory', 'keys']
  11. )
  12. ScenarioInstances = namedtuple(
  13. "ScenarioInstances",
  14. [
  15. 'wtf', 'wtf_formdata',
  16. 'pydantic', 'pydantic_formdata',
  17. 'formdata', 'data',
  18. 'schema'
  19. ]
  20. )
  21. @pytest.fixture(scope="session")
  22. def instance_factory():
  23. def _factory(scenario_classes, data):
  24. formdata = ImmutableMultiDict(data)
  25. try:
  26. schema_instance = scenario_classes.schema(**data)
  27. except ValidationError as e:
  28. schema_instance = None
  29. return ScenarioInstances(
  30. scenario_classes.wtf_form(data=data),
  31. scenario_classes.wtf_form(formdata=formdata),
  32. scenario_classes.pydantic_form(data=data),
  33. scenario_classes.pydantic_form(formdata=formdata),
  34. formdata,
  35. data,
  36. schema_instance
  37. )
  38. return _factory
  39. simple_keys = [('integer',), ('string',)]
  40. class SimpleSchema(BaseModel):
  41. integer: int
  42. string: str
  43. class SimpleWTForm(Form):
  44. _schema = SimpleSchema
  45. integer = fields.IntegerField()
  46. string = fields.StringField()
  47. class SimpleForm(SimpleWTForm, PydanticForm):
  48. _schema = SimpleSchema
  49. @pytest.fixture(scope="session")
  50. def scenario_classes_simple():
  51. return ScenarioClasses(
  52. SimpleWTForm, SimpleForm,
  53. SimpleSchema,
  54. SimpleDataFactory, SimpleBadDataFactory,
  55. simple_keys
  56. )
  57. class SimpleDataFactory(factory.Factory):
  58. class Meta:
  59. model = dict
  60. integer = factory.Faker('pyint')
  61. string = factory.Faker('pystr')
  62. class SimpleBadDataFactory(factory.Factory):
  63. class Meta:
  64. model = dict
  65. integer = factory.Faker('pystr')
  66. string = factory.Faker('pyint')
  67. @pytest.fixture
  68. def scenario_simple(instance_factory, scenario_classes_simple):
  69. return instance_factory(scenario_classes_simple, SimpleDataFactory())
  70. @pytest.fixture
  71. def scenario_simple_bad(instance_factory, scenario_classes_simple):
  72. return instance_factory(scenario_classes_simple, SimpleBadDataFactory())
  73. nested_keys = [('integer',), ('nested', 'integer'), ('nested', 'string')]
  74. class NestedSchema(BaseModel):
  75. integer: int
  76. nested: SimpleSchema
  77. class NestedWTForm(Form):
  78. _schema = NestedSchema
  79. integer = fields.IntegerField()
  80. nested = fields.FormField(form_class=SimpleForm)
  81. class NestedForm(NestedWTForm, PydanticForm):
  82. _schema = NestedSchema
  83. class NestedDataFactory(factory.Factory):
  84. class Meta:
  85. model = dict
  86. integer = factory.Faker('pyint')
  87. nested = factory.SubFactory(SimpleDataFactory)
  88. class NestedBadDataFactory(factory.Factory):
  89. class Meta:
  90. model = dict
  91. integer = factory.Faker('pystr')
  92. nested = factory.SubFactory(SimpleBadDataFactory)
  93. @pytest.fixture(scope="session")
  94. def scenario_classes_nested():
  95. return ScenarioClasses(
  96. NestedWTForm, NestedForm,
  97. NestedSchema,
  98. NestedDataFactory, NestedBadDataFactory,
  99. nested_keys
  100. )
  101. @pytest.fixture
  102. def scenario_nested(instance_factory, scenario_classes_nested):
  103. return instance_factory(scenario_classes_nested, NestedDataFactory())
  104. @pytest.fixture
  105. def scenario_nested_bad(instance_factory, scenario_classes_nested):
  106. return instance_factory(scenario_classes_nested, NestedBadDataFactory())