test_process.py 3.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155
  1. import pytest
  2. from wtforms import FormField
  3. from pydantic_form.translator import iter_form
  4. from pydantic_form.utils import recursive_get, formdata_mangle
  5. @pytest.fixture
  6. def data(request, scenario):
  7. return getattr(scenario.data_factory, request.param)()
  8. SCENARIOS = [
  9. 'scenario_simple',
  10. 'scenario_simple_list',
  11. 'scenario_nested',
  12. 'scenario_double_nested'
  13. ]
  14. @pytest.mark.parametrize(
  15. 'kwargs_factory',
  16. [
  17. lambda data: {'data': data},
  18. lambda data: {'formdata': formdata_mangle(data)},
  19. lambda data: data,
  20. ], ids=[
  21. 'data', 'formdata', 'kwargs'
  22. ]
  23. )
  24. @pytest.mark.parametrize(
  25. 'data',
  26. ['valid', 'bad'],
  27. indirect=True
  28. )
  29. @pytest.mark.parametrize(
  30. 'scenario',
  31. SCENARIOS,
  32. indirect=True
  33. )
  34. def test_process_data(scenario, data, kwargs_factory):
  35. form = scenario.form()
  36. kwargs = kwargs_factory(data)
  37. form.process(**kwargs)
  38. assert form.data == data
  39. @pytest.mark.parametrize(
  40. 'data',
  41. ['valid'],
  42. indirect=True
  43. )
  44. @pytest.mark.parametrize(
  45. 'scenario',
  46. SCENARIOS,
  47. indirect=True
  48. )
  49. def test_validate_valid(scenario, data):
  50. form = scenario.form(data=data)
  51. assert form.validate()
  52. form = scenario.form()
  53. form.process(data=data)
  54. assert form.validate()
  55. @pytest.mark.parametrize(
  56. 'data',
  57. ['bad'],
  58. indirect=True
  59. )
  60. @pytest.mark.parametrize(
  61. 'scenario',
  62. SCENARIOS,
  63. indirect=True
  64. )
  65. def test_validate_bad(scenario, data):
  66. form = scenario.form(data=data)
  67. assert not form.validate()
  68. form = scenario.form()
  69. form.process(data=data)
  70. assert not form.validate()
  71. @pytest.mark.parametrize(
  72. 'data',
  73. ['valid'],
  74. indirect=True
  75. )
  76. @pytest.mark.parametrize(
  77. 'scenario',
  78. SCENARIOS,
  79. indirect=True
  80. )
  81. def test_errors_valid(scenario, data):
  82. form = scenario.form(data=data)
  83. assert form.errors == {}
  84. @pytest.mark.parametrize(
  85. 'data, errors_factory',
  86. [
  87. ('bad', lambda s: s.errors.bad),
  88. ('missing', lambda s: s.errors.missing),
  89. ],
  90. indirect=['data']
  91. )
  92. @pytest.mark.parametrize(
  93. 'scenario',
  94. SCENARIOS,
  95. indirect=True
  96. )
  97. def test_errors_invalid(scenario, data, errors_factory):
  98. form = scenario.form(data=data)
  99. form.validate()
  100. assert form.errors
  101. for k, expected in errors_factory(scenario).items():
  102. field_errors = recursive_get(form.errors, *k)
  103. if isinstance(expected, list):
  104. errors = [e['type'] for e_list in field_errors for e in e_list]
  105. assert errors == expected
  106. else:
  107. errors = [e['type'] for e in field_errors]
  108. assert len(errors) == 1
  109. assert errors[0] == expected
  110. @pytest.mark.parametrize(
  111. 'data',
  112. ['valid'],
  113. indirect=True
  114. )
  115. @pytest.mark.parametrize(
  116. 'scenario',
  117. SCENARIOS,
  118. indirect=True
  119. )
  120. def test_baked_instance(scenario, data):
  121. form = scenario.form(data=data)
  122. form.validate()
  123. assert hasattr(form, '_baked_instance')
  124. assert form._baked_instance is not None
  125. assert form._baked_instance.dict() == data
  126. for key, sub_form in iter_form(form, leafs_only=False):
  127. if isinstance(sub_form, FormField):
  128. assert hasattr(sub_form, '_baked_instance')
  129. assert sub_form._baked_instance is not None
  130. assert sub_form._baked_instance.dict() == recursive_get(data, *key)