conftest.py 3.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131
  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
  8. ScenarioClasses = namedtuple(
  9. "ScenarioClasses",
  10. ['wtf_form', 'pydantic_form', 'schema', 'data_factory']
  11. )
  12. ScenarioInstances = namedtuple(
  13. "ScenarioInstances",
  14. [
  15. 'wtf', 'wtf_formdata',
  16. 'pydantic', 'pydantic_formdata',
  17. 'formdata', 'data'
  18. ]
  19. )
  20. @pytest.fixture(scope="session")
  21. def instance_factory():
  22. def _factory(scenario_classes, data):
  23. formdata = ImmutableMultiDict(data)
  24. return ScenarioInstances(
  25. scenario_classes.wtf_form(data=data),
  26. scenario_classes.wtf_form(formdata=formdata),
  27. scenario_classes.pydantic_form(data=data),
  28. scenario_classes.pydantic_form(formdata=formdata),
  29. formdata,
  30. data
  31. )
  32. return _factory
  33. class SimpleSchema(BaseModel):
  34. integer: int
  35. string: str
  36. class SimpleWTForm(Form):
  37. _schema = SimpleSchema
  38. integer = fields.IntegerField()
  39. string = fields.StringField()
  40. class SimpleForm(SimpleWTForm, PydanticForm):
  41. _schema = SimpleSchema
  42. @pytest.fixture(scope="session")
  43. def scenario_classes_simple():
  44. return ScenarioClasses(SimpleWTForm, SimpleForm, SimpleSchema, SimpleDataFactory)
  45. class SimpleDataFactory(factory.Factory):
  46. class Meta:
  47. model = dict
  48. integer = factory.Faker('pyint')
  49. string = factory.Faker('pystr')
  50. class SimpleBadDataFactory(factory.Factory):
  51. class Meta:
  52. model = dict
  53. integer = factory.Faker('pystr')
  54. string = factory.Faker('pyint')
  55. @pytest.fixture
  56. def scenario_simple(instance_factory, scenario_classes_simple):
  57. return instance_factory(scenario_classes_simple, SimpleDataFactory())
  58. @pytest.fixture
  59. def scenario_simple_bad(instance_factory, scenario_classes_simple):
  60. return instance_factory(scenario_classes_simple, SimpleBadDataFactory())
  61. class NestedSchema(BaseModel):
  62. integer: int
  63. nested: SimpleSchema
  64. class NestedWTForm(Form):
  65. _schema = NestedSchema
  66. integer = fields.IntegerField()
  67. nested = fields.FormField(form_class=SimpleForm)
  68. class NestedForm(NestedWTForm, PydanticForm):
  69. _schema = NestedSchema
  70. class NestedDataFactory(factory.Factory):
  71. class Meta:
  72. model = dict
  73. integer = factory.Faker('pyint')
  74. nested = factory.SubFactory(SimpleDataFactory)
  75. class NestedBadDataFactory(factory.Factory):
  76. class Meta:
  77. model = dict
  78. integer = factory.Faker('pystr')
  79. nested = factory.SubFactory(SimpleBadDataFactory)
  80. @pytest.fixture(scope="session")
  81. def scenario_classes_nested():
  82. return ScenarioClasses(NestedWTForm, NestedForm, NestedSchema, NestedDataFactory)
  83. @pytest.fixture
  84. def scenario_nested(instance_factory, scenario_classes_nested):
  85. return instance_factory(scenario_classes_nested, NestedDataFactory())
  86. @pytest.fixture
  87. def scenario_nested_bad(instance_factory, scenario_classes_nested):
  88. return instance_factory(scenario_classes_nested, NestedBadDataFactory())