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.

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131
  1. import datetime
  2. import pytest
  3. from django.utils import timezone
  4. from django.utils.datastructures import MultiValueDict
  5. from oscar.apps.dashboard.vouchers import forms
  6. from oscar.core.loading import get_model
  7. from oscar.test.factories.offer import (
  8. BenefitFactory,
  9. ConditionalOfferFactory,
  10. ConditionFactory,
  11. RangeFactory,
  12. )
  13. from oscar.test.factories.voucher import VoucherSetFactory
  14. ConditionalOffer = get_model("offer", "ConditionalOffer")
  15. Voucher = get_model("voucher", "Voucher")
  16. @pytest.mark.django_db
  17. def test_voucher_set_form_create():
  18. a_range = RangeFactory(includes_all_products=True)
  19. offer = ConditionalOfferFactory(
  20. offer_type=ConditionalOffer.VOUCHER,
  21. benefit=BenefitFactory(range=a_range),
  22. condition=ConditionFactory(range=a_range, value=1),
  23. )
  24. data = MultiValueDict(
  25. {
  26. "name": ["10% Discount"],
  27. "code_length": ["10"],
  28. "count": ["10"],
  29. "description": ["This is a 10% discount for mailing X"],
  30. "start_datetime": ["2014-10-01"],
  31. "end_datetime": ["2018-10-01"],
  32. "usage": [Voucher.MULTI_USE],
  33. "offers": [offer.pk],
  34. }
  35. )
  36. form = forms.VoucherSetForm(data)
  37. assert form.is_valid(), form.errors
  38. voucher_set = form.save()
  39. assert voucher_set.vouchers.count() == 10
  40. @pytest.mark.django_db
  41. def test_voucher_set_form_update_with_unchanged_count():
  42. tzinfo = timezone.get_current_timezone()
  43. voucher_set = VoucherSetFactory(
  44. name="Dummy name",
  45. count=5,
  46. code_length=12,
  47. description="Dummy description",
  48. start_datetime=datetime.datetime(2021, 2, 1, tzinfo=tzinfo),
  49. end_datetime=datetime.datetime(2021, 2, 28, tzinfo=tzinfo),
  50. )
  51. voucher = voucher_set.vouchers.first()
  52. assert voucher.usage == Voucher.MULTI_USE
  53. new_offers = [
  54. ConditionalOfferFactory(offer_type=ConditionalOffer.VOUCHER),
  55. ConditionalOfferFactory(offer_type=ConditionalOffer.VOUCHER),
  56. ]
  57. data = {
  58. "name": "New name",
  59. "code_length": 10,
  60. "description": "New description",
  61. "start_datetime": datetime.datetime(2021, 3, 1, tzinfo=tzinfo),
  62. "end_datetime": datetime.datetime(2021, 3, 31, tzinfo=tzinfo),
  63. "count": voucher_set.count,
  64. "usage": Voucher.SINGLE_USE,
  65. "offers": new_offers,
  66. }
  67. form = forms.VoucherSetForm(data, instance=voucher_set)
  68. assert form.is_valid(), form.errors
  69. voucher_set = form.save()
  70. assert voucher_set.vouchers.count() == 5
  71. for i, v in enumerate(voucher_set.vouchers.order_by("date_created")):
  72. assert v.name == "New name - %d" % (i + 1)
  73. assert len(v.code) == 14 # The code is not modified
  74. assert v.start_datetime == datetime.datetime(2021, 3, 1, tzinfo=tzinfo)
  75. assert v.end_datetime == datetime.datetime(2021, 3, 31, tzinfo=tzinfo)
  76. assert v.usage == Voucher.SINGLE_USE
  77. assert list(v.offers.all()) == new_offers
  78. @pytest.mark.django_db
  79. def test_voucher_set_form_update_with_changed_count():
  80. tzinfo = timezone.get_current_timezone()
  81. voucher_set = VoucherSetFactory(
  82. name="Dummy name",
  83. count=5,
  84. code_length=12,
  85. description="Dummy description",
  86. start_datetime=datetime.datetime(2021, 2, 1, tzinfo=tzinfo),
  87. end_datetime=datetime.datetime(2021, 2, 28, tzinfo=tzinfo),
  88. )
  89. voucher = voucher_set.vouchers.first()
  90. assert voucher.usage == Voucher.MULTI_USE
  91. new_offers = [
  92. ConditionalOfferFactory(offer_type=ConditionalOffer.VOUCHER),
  93. ConditionalOfferFactory(offer_type=ConditionalOffer.VOUCHER),
  94. ]
  95. data = {
  96. "name": "New name",
  97. "code_length": 10,
  98. "description": "New description",
  99. "start_datetime": datetime.datetime(2021, 3, 1, tzinfo=tzinfo),
  100. "end_datetime": datetime.datetime(2021, 3, 31, tzinfo=tzinfo),
  101. "count": 10,
  102. "usage": Voucher.SINGLE_USE,
  103. "offers": new_offers,
  104. }
  105. form = forms.VoucherSetForm(data, instance=voucher_set)
  106. assert form.is_valid(), form.errors
  107. voucher_set = form.save()
  108. voucher_set.refresh_from_db()
  109. assert voucher_set.count == 10 # "count" is updated
  110. assert voucher_set.vouchers.count() == 10
  111. for i, v in enumerate(voucher_set.vouchers.order_by("date_created")):
  112. assert v.name == "New name - %d" % (i + 1)
  113. if i < 5:
  114. # Original vouchers
  115. assert len(v.code) == 14 # The code is not modified
  116. else:
  117. # New vouchers
  118. assert len(v.code) == 12
  119. assert v.start_datetime == datetime.datetime(2021, 3, 1, tzinfo=tzinfo)
  120. assert v.end_datetime == datetime.datetime(2021, 3, 31, tzinfo=tzinfo)
  121. assert v.usage == Voucher.SINGLE_USE
  122. assert list(v.offers.all()) == new_offers