test_process.py 3.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163
  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_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'],
  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. assert form.data == data
  40. @pytest.mark.parametrize(
  41. 'data',
  42. ['valid'],
  43. indirect=True
  44. )
  45. @pytest.mark.parametrize(
  46. 'scenario',
  47. SCENARIOS,
  48. indirect=True
  49. )
  50. def test_validate_valid(scenario, data):
  51. form = scenario.form(data=data)
  52. assert form.validate()
  53. form = scenario.form()
  54. form.process(data=data)
  55. assert form.validate()
  56. @pytest.mark.parametrize(
  57. 'data',
  58. ['bad'],
  59. indirect=True
  60. )
  61. @pytest.mark.parametrize(
  62. 'scenario',
  63. SCENARIOS,
  64. indirect=True
  65. )
  66. def test_validate_bad(scenario, data):
  67. form = scenario.form(data=data)
  68. assert not form.validate()
  69. form = scenario.form()
  70. form.process(data=data)
  71. assert not form.validate()
  72. @pytest.mark.parametrize(
  73. 'data',
  74. ['valid'],
  75. indirect=True
  76. )
  77. @pytest.mark.parametrize(
  78. 'scenario',
  79. SCENARIOS,
  80. indirect=True
  81. )
  82. def test_errors_valid(scenario, data):
  83. form = scenario.form(data=data)
  84. assert form.errors == {}
  85. import pprint
  86. @pytest.mark.parametrize(
  87. 'data, errors_factory',
  88. [
  89. ('bad', lambda s: s.errors.bad),
  90. ('missing', lambda s: s.errors.missing),
  91. ],
  92. indirect=['data']
  93. )
  94. @pytest.mark.parametrize(
  95. 'scenario',
  96. SCENARIOS,
  97. indirect=True
  98. )
  99. def test_errors_invalid(scenario, data, errors_factory):
  100. form = scenario.form(data=data)
  101. form.validate()
  102. assert form.errors
  103. print()
  104. pprint.pprint(form.translator.errors)
  105. pprint.pprint(form.errors)
  106. for k, expected in errors_factory(scenario).items():
  107. print(k, expected)
  108. field_errors = recursive_get(form.errors, *k)
  109. if isinstance(expected, list):
  110. errors = [e['type'] for e_list in field_errors for e in e_list]
  111. assert errors == expected
  112. else:
  113. errors = [e['type'] for e in field_errors]
  114. assert len(errors) == 1
  115. assert errors[0] == expected
  116. from pydantic_form.translator import SchemaToForm
  117. @pytest.mark.parametrize(
  118. 'data',
  119. ['valid'],
  120. indirect=True
  121. )
  122. @pytest.mark.parametrize(
  123. 'scenario',
  124. SCENARIOS,
  125. indirect=True
  126. )
  127. def test_baked_instance(scenario, data):
  128. form = scenario.form(data=data)
  129. form.validate()
  130. assert hasattr(form, '_baked_instance')
  131. assert form._baked_instance is not None
  132. assert form._baked_instance.dict() == data
  133. for key, sub_form in iter_form(form, leafs_only=False):
  134. print(key, sub_form)
  135. sub_form = SchemaToForm.get_field(form, key)
  136. print(key, sub_form)
  137. if isinstance(sub_form, FormField):
  138. print('?')
  139. assert hasattr(sub_form, '_baked_instance')
  140. assert sub_form._baked_instance is not None
  141. assert sub_form._baked_instance.dict() == recursive_get(data, *key)