You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

test_offer_forms.py 5.1KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161
  1. from decimal import Decimal as D
  2. from django.core.exceptions import ValidationError
  3. from django.test import TestCase
  4. from oscar.apps.dashboard.offers import forms
  5. from oscar.apps.offer.custom import create_benefit
  6. from oscar.apps.offer.models import Benefit, Range
  7. from oscar.test.factories import create_product
  8. from tests._site.model_tests_app.models import CustomBenefitModel
  9. class TestBenefitForm(TestCase):
  10. def setUp(self):
  11. self.range = Range.objects.create(
  12. name="All products", includes_all_products=True)
  13. self.prod = create_product()
  14. def test_init_without_custom_benefit(self):
  15. """
  16. If no custom benefit exists, the type field should be required.
  17. """
  18. form = forms.BenefitForm()
  19. self.assertTrue(form.fields['type'].required)
  20. def test_init_with_custom_benefit(self):
  21. """
  22. If a custom benefit exists, the type field should not be required.
  23. """
  24. create_benefit(CustomBenefitModel)
  25. form = forms.BenefitForm()
  26. self.assertFalse(form.fields['type'].required)
  27. self.assertEqual(form.fields['custom_benefit'].initial, None)
  28. def test_init_with_custom_benefit_with_instance(self):
  29. """
  30. If a custom benefit exists and the kwargs instance is passed to init, the initial value for the custom_benefit
  31. should be the instance.
  32. """
  33. benefit = create_benefit(CustomBenefitModel)
  34. form = forms.BenefitForm(instance=benefit)
  35. self.assertFalse(form.fields['type'].required)
  36. self.assertEqual(form.fields['custom_benefit'].initial, benefit.id)
  37. def test_is_valid_no_data(self):
  38. """
  39. If not data is supplied, is_valid should evaluate to false
  40. """
  41. form = forms.BenefitForm()
  42. self.assertFalse(form.is_valid())
  43. def test_clean_no_value_data(self):
  44. """
  45. If data is supplied without any values, the form should evaluate to not valid +
  46. and the clean method should throw a ValidationError
  47. """
  48. form = forms.BenefitForm(data={
  49. 'range': '',
  50. 'type': '',
  51. 'value': '',
  52. 'custom_benefit': ''
  53. })
  54. self.assertFalse(form.is_valid())
  55. self.assertRaises(ValidationError, form.clean)
  56. def test_clean_new_incentive(self):
  57. """
  58. If a range, type and value is supplied, the clean method should return the cleaned data without errors.
  59. """
  60. form = forms.BenefitForm(data={
  61. 'range': self.range.id,
  62. 'type': Benefit.FIXED,
  63. 'value': 5,
  64. 'custom_benefit': ''
  65. })
  66. self.assertTrue(form.is_valid())
  67. self.assertEqual({
  68. 'range': self.range,
  69. 'type': Benefit.FIXED,
  70. 'value': D('5'),
  71. 'custom_benefit': '',
  72. 'max_affected_items': None
  73. }, form.clean())
  74. def test_clean_new_incentive_only_range(self):
  75. """
  76. If only a range is supplied, the clean method should throw a ValidationError.
  77. """
  78. form = forms.BenefitForm(data={
  79. 'range': self.range.id,
  80. 'type': '',
  81. 'value': '',
  82. 'custom_benefit': ''
  83. })
  84. self.assertFalse(form.is_valid())
  85. self.assertRaises(ValidationError, form.clean)
  86. def test_clean_validation_with_custom_benefit(self):
  87. """
  88. If a custom benefit is selected, the form should be valid.
  89. """
  90. benefit = create_benefit(CustomBenefitModel)
  91. form = forms.BenefitForm(data={
  92. 'range': '',
  93. 'type': '',
  94. 'value': '',
  95. 'custom_benefit': benefit.id
  96. })
  97. self.assertTrue(form.is_valid())
  98. self.assertEqual({
  99. 'range': None,
  100. 'type': '',
  101. 'value': None,
  102. 'custom_benefit': str(benefit.id),
  103. 'max_affected_items': None
  104. }, form.clean())
  105. def test_clean_only_range_custom_exists(self):
  106. """
  107. If a custom benefit exists, the type field is not required. Still, the clean method should throw a
  108. ValidationError, if only the range is supplied.
  109. """
  110. create_benefit(CustomBenefitModel)
  111. form = forms.BenefitForm(data={
  112. 'range': self.range,
  113. 'type': '',
  114. 'value': '',
  115. 'custom_benefit': ''
  116. })
  117. self.assertFalse(form.is_valid())
  118. self.assertRaises(ValidationError, form.clean)
  119. def test_clean_validation_custom_exists(self):
  120. """
  121. If a custom benefit exists, and the data for range, type and value is supplied, the form should validate.
  122. Clean should return the cleaned data.
  123. """
  124. create_benefit(CustomBenefitModel)
  125. form = forms.BenefitForm(data={
  126. 'range': self.range.id,
  127. 'type': Benefit.FIXED,
  128. 'value': 5,
  129. 'custom_benefit': ''
  130. })
  131. self.assertTrue(form.is_valid())
  132. self.assertEqual({
  133. 'range': self.range,
  134. 'type': Benefit.FIXED,
  135. 'value': D('5'),
  136. 'custom_benefit': '',
  137. 'max_affected_items': None
  138. }, form.clean())