test_process.py 3.7 KB

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