test_process.py 3.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143
  1. from itertools import product
  2. from werkzeug.datastructures import ImmutableMultiDict
  3. from pydantic_form.translator import *
  4. from pydantic_form.utils import recursive_get
  5. import pytest
  6. @pytest.fixture
  7. def data(request, scenario):
  8. return getattr(scenario.data_factory, request.param)()
  9. SCENARIOS = [
  10. 'scenario_simple',
  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': ImmutableMultiDict(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, error in errors_factory(scenario).items():
  102. assert recursive_get(form.errors, *k)[0]['type'] == error
  103. @pytest.mark.parametrize(
  104. 'data',
  105. ['valid'],
  106. indirect=True
  107. )
  108. @pytest.mark.parametrize(
  109. 'scenario',
  110. SCENARIOS,
  111. indirect=True
  112. )
  113. def test_baked_instance(scenario, data):
  114. form = scenario.form(data=data)
  115. form.validate()
  116. assert hasattr(form, '_baked_instance')
  117. assert form._baked_instance is not None
  118. assert form._baked_instance.dict() == data
  119. for key, sub_form in iter_form(form, leafs_only=False):
  120. if isinstance(sub_form, FormField):
  121. assert hasattr(sub_form, '_baked_instance')
  122. assert sub_form._baked_instance is not None
  123. assert sub_form._baked_instance.dict() == recursive_get(data, *key)