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_voucher_form.py 3.4KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100
  1. from datetime import timedelta
  2. import pytest
  3. from django import test
  4. from django.urls import reverse
  5. from django.utils import timezone
  6. from oscar.apps.dashboard.vouchers import forms
  7. from oscar.core.loading import get_model
  8. from oscar.test.factories.offer import (
  9. BenefitFactory,
  10. ConditionalOfferFactory,
  11. ConditionFactory,
  12. RangeFactory,
  13. )
  14. from oscar.test.factories.voucher import VoucherSetFactory
  15. ConditionalOffer = get_model("offer", "ConditionalOffer")
  16. Voucher = get_model("voucher", "Voucher")
  17. class TestVoucherForm(test.TestCase):
  18. def test_doesnt_crash_on_empty_date_fields(self):
  19. """
  20. There was a bug fixed in 02b3644 where the voucher form would raise an
  21. exception (instead of just failing validation) when being called with
  22. empty fields. This tests exists to prevent a regression.
  23. """
  24. offer = ConditionalOfferFactory(
  25. offer_type=ConditionalOffer.VOUCHER,
  26. benefit=BenefitFactory(range=None),
  27. condition=ConditionFactory(range=None, value=1),
  28. )
  29. data = {
  30. "code": "",
  31. "name": "",
  32. "start_datetime": "",
  33. "end_datetime": "",
  34. "usage": "Single use",
  35. "offers": [offer.pk],
  36. }
  37. form = forms.VoucherForm(data=data)
  38. try:
  39. form.is_valid()
  40. except Exception as e:
  41. import traceback
  42. self.fail(
  43. "Exception raised while validating voucher form: %s\n\n%s"
  44. % (str(e), traceback.format_exc())
  45. )
  46. @pytest.mark.django_db
  47. class TestVoucherSetForm:
  48. def test_valid_form(self):
  49. a_range = RangeFactory(includes_all_products=True)
  50. offer = ConditionalOfferFactory(
  51. offer_type=ConditionalOffer.VOUCHER,
  52. benefit=BenefitFactory(range=a_range),
  53. condition=ConditionFactory(range=a_range, value=1),
  54. )
  55. start = timezone.now()
  56. end = start + timedelta(days=1)
  57. data = {
  58. "name": "test",
  59. "code_length": 12,
  60. "description": "test",
  61. "start_datetime": start,
  62. "end_datetime": end,
  63. "count": 10,
  64. "usage": Voucher.MULTI_USE,
  65. "offers": [offer.pk],
  66. }
  67. form = forms.VoucherSetForm(data=data)
  68. assert form.is_valid()
  69. instance = form.save()
  70. assert instance.count == instance.vouchers.count()
  71. assert instance.start_datetime == start
  72. assert instance.end_datetime == end
  73. def test_valid_form_reduced_count(self):
  74. voucher_set = VoucherSetFactory(count=5)
  75. voucher = voucher_set.vouchers.first()
  76. data = {
  77. "name": voucher_set.name,
  78. "code_length": voucher_set.code_length,
  79. "description": voucher_set.description,
  80. "start_datetime": voucher_set.start_datetime,
  81. "end_datetime": voucher_set.end_datetime,
  82. "count": 4,
  83. "usage": voucher.usage,
  84. "offers": voucher.offers.all(),
  85. }
  86. form = forms.VoucherSetForm(data, instance=voucher_set)
  87. assert not form.is_valid()
  88. assert form.errors["count"][0] == (
  89. "This cannot be used to delete vouchers (currently 5) in this set. "
  90. 'You can do that on the <a href="%s">detail</a> page.'
  91. ) % reverse("dashboard:voucher-set-detail", kwargs={"pk": voucher_set.pk})