test_process.py 4.0 KB

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