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_models.py 6.5KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186
  1. import datetime
  2. from decimal import Decimal as D
  3. import pytest
  4. from django.core import exceptions
  5. from django.test import TestCase
  6. from datetime import timezone
  7. from oscar.apps.voucher.models import Voucher
  8. from oscar.core.compat import get_user_model
  9. from oscar.core.loading import get_model
  10. from oscar.test.factories import (
  11. ConditionFactory,
  12. OrderFactory,
  13. RangeFactory,
  14. UserFactory,
  15. VoucherFactory,
  16. VoucherSetFactory,
  17. create_basket,
  18. create_offer,
  19. create_product,
  20. )
  21. START_DATETIME = datetime.datetime(2011, 1, 1).replace(tzinfo=timezone.utc)
  22. END_DATETIME = datetime.datetime(2012, 1, 1).replace(tzinfo=timezone.utc)
  23. User = get_user_model()
  24. ConditionalOffer = get_model("offer", "ConditionalOffer")
  25. class TestSavingAVoucher(TestCase):
  26. def test_saves_code_as_uppercase(self):
  27. voucher = VoucherFactory(
  28. code="lower", start_datetime=START_DATETIME, end_datetime=END_DATETIME
  29. )
  30. self.assertEqual("LOWER", voucher.code)
  31. def test_verifies_dates_are_sensible(self):
  32. with self.assertRaises(exceptions.ValidationError):
  33. voucher = Voucher.objects.create(
  34. code="lower", start_datetime=END_DATETIME, end_datetime=START_DATETIME
  35. )
  36. voucher.clean()
  37. class TestAVoucher(TestCase):
  38. def setUp(self):
  39. self.voucher = VoucherFactory(
  40. start_datetime=START_DATETIME, end_datetime=END_DATETIME
  41. )
  42. def test_is_active_between_start_and_end_dates(self):
  43. test = datetime.datetime(2011, 6, 10).replace(tzinfo=timezone.utc)
  44. self.assertTrue(self.voucher.is_active(test))
  45. def test_is_active_on_end_date(self):
  46. self.assertTrue(self.voucher.is_active(END_DATETIME))
  47. def test_is_active_on_start_date(self):
  48. self.assertTrue(self.voucher.is_active(START_DATETIME))
  49. def test_is_inactive_outside_of_start_and_end_dates(self):
  50. test = datetime.datetime(2012, 3, 10).replace(tzinfo=timezone.utc)
  51. self.assertFalse(self.voucher.is_active(test))
  52. def test_increments_total_discount_when_recording_usage(self):
  53. self.voucher.record_discount({"discount": D("10.00")})
  54. self.assertEqual(self.voucher.total_discount, D("10.00"))
  55. self.voucher.record_discount({"discount": D("10.00")})
  56. self.assertEqual(self.voucher.total_discount, D("20.00"))
  57. class TestMultiuseVoucher(TestCase):
  58. def setUp(self):
  59. self.voucher = VoucherFactory(usage=Voucher.MULTI_USE)
  60. def test_is_available_to_same_user_multiple_times(self):
  61. user, order = UserFactory(), OrderFactory()
  62. for _ in range(10):
  63. self.voucher.record_usage(order, user)
  64. is_voucher_available_to_user, __ = self.voucher.is_available_to_user(
  65. user=user
  66. )
  67. self.assertTrue(is_voucher_available_to_user)
  68. class TestOncePerCustomerVoucher(TestCase):
  69. def setUp(self):
  70. self.voucher = VoucherFactory(usage=Voucher.ONCE_PER_CUSTOMER)
  71. def test_is_available_to_a_user_once(self):
  72. user, order = UserFactory(), OrderFactory()
  73. is_voucher_available_to_user, __ = self.voucher.is_available_to_user(user=user)
  74. self.assertTrue(is_voucher_available_to_user)
  75. self.voucher.record_usage(order, user)
  76. is_voucher_available_to_user, __ = self.voucher.is_available_to_user(user=user)
  77. self.assertFalse(is_voucher_available_to_user)
  78. def test_is_available_to_different_users(self):
  79. users, order = [UserFactory(), UserFactory()], OrderFactory()
  80. for user in users:
  81. is_voucher_available_to_user, __ = self.voucher.is_available_to_user(
  82. user=user
  83. )
  84. self.assertTrue(is_voucher_available_to_user)
  85. self.voucher.record_usage(order, user)
  86. is_voucher_available_to_user, __ = self.voucher.is_available_to_user(
  87. user=user
  88. )
  89. self.assertFalse(is_voucher_available_to_user)
  90. class TestVoucherDelete(TestCase):
  91. def setUp(self):
  92. product = create_product(price=100)
  93. self.offer_range = RangeFactory(products=[product])
  94. self.offer_condition = ConditionFactory(range=self.offer_range, value=2)
  95. class TestAvailableForBasket(TestCase):
  96. def setUp(self):
  97. self.basket = create_basket(empty=True)
  98. self.product = create_product(price=100)
  99. product_range = RangeFactory(products=[self.product])
  100. condition = ConditionFactory(range=product_range, value=2)
  101. self.voucher = VoucherFactory()
  102. self.voucher.offers.add(
  103. create_offer(
  104. offer_type="Voucher", product_range=product_range, condition=condition
  105. )
  106. )
  107. def test_is_available_for_basket(self):
  108. self.basket.add_product(product=self.product)
  109. is_voucher_available_for_basket, __ = self.voucher.is_available_for_basket(
  110. self.basket
  111. )
  112. self.assertFalse(is_voucher_available_for_basket)
  113. self.basket.add_product(product=self.product)
  114. is_voucher_available_for_basket, __ = self.voucher.is_available_for_basket(
  115. self.basket
  116. )
  117. self.assertTrue(is_voucher_available_for_basket)
  118. @pytest.mark.django_db
  119. class TestVoucherSet(object):
  120. def test_factory(self):
  121. voucherset = VoucherSetFactory()
  122. assert voucherset.count == voucherset.vouchers.count()
  123. assert str(voucherset) == voucherset.name
  124. offers = voucherset.vouchers.first().offers.all()
  125. for voucher in voucherset.vouchers.all():
  126. assert len(voucher.code) == 14
  127. assert voucher.code.count("-") == 2
  128. assert list(voucher.offers.all()) == list(offers)
  129. assert voucher.offers.count() == 1
  130. assert (
  131. voucher.offers.filter(offer_type=ConditionalOffer.VOUCHER).count() == 1
  132. )
  133. def test_update_count(self):
  134. voucherset = VoucherSetFactory(count=20)
  135. assert voucherset.count == 20
  136. voucherset.count = 10
  137. voucherset.save()
  138. voucherset.update_count()
  139. voucherset.refresh_from_db()
  140. assert voucherset.count == 20
  141. def test_num_basket_additions(self):
  142. voucherset = VoucherSetFactory()
  143. num_additions = voucherset.num_basket_additions
  144. assert num_additions == 0
  145. def test_num_orders(self):
  146. voucherset = VoucherSetFactory()
  147. assert voucherset.num_orders == 0
  148. user, order = UserFactory(), OrderFactory()
  149. voucher = voucherset.vouchers.first()
  150. voucher.record_usage(order, user)
  151. assert voucherset.num_orders == 1