Nelze vybrat více než 25 témat Téma musí začínat písmenem nebo číslem, může obsahovat pomlčky („-“) a může být dlouhé až 35 znaků.

test_models.py 5.7KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156
  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 django.utils.timezone import utc
  7. from oscar.apps.voucher.models import Voucher
  8. from oscar.core.compat import get_user_model
  9. from oscar.test.factories import (
  10. ConditionFactory, OrderFactory, RangeFactory, UserFactory, VoucherFactory,
  11. VoucherSetFactory, create_basket, create_offer, create_product)
  12. START_DATETIME = datetime.datetime(2011, 1, 1).replace(tzinfo=utc)
  13. END_DATETIME = datetime.datetime(2012, 1, 1).replace(tzinfo=utc)
  14. User = get_user_model()
  15. class TestSavingAVoucher(TestCase):
  16. def test_saves_code_as_uppercase(self):
  17. voucher = VoucherFactory(
  18. code='lower',
  19. start_datetime=START_DATETIME, end_datetime=END_DATETIME)
  20. self.assertEqual('LOWER', voucher.code)
  21. def test_verifies_dates_are_sensible(self):
  22. with self.assertRaises(exceptions.ValidationError):
  23. voucher = Voucher.objects.create(
  24. code='lower', start_datetime=END_DATETIME,
  25. end_datetime=START_DATETIME)
  26. voucher.clean()
  27. class TestAVoucher(TestCase):
  28. def setUp(self):
  29. self.voucher = VoucherFactory(
  30. start_datetime=START_DATETIME, end_datetime=END_DATETIME)
  31. def test_is_active_between_start_and_end_dates(self):
  32. test = datetime.datetime(2011, 6, 10).replace(tzinfo=utc)
  33. self.assertTrue(self.voucher.is_active(test))
  34. def test_is_active_on_end_date(self):
  35. self.assertTrue(self.voucher.is_active(END_DATETIME))
  36. def test_is_active_on_start_date(self):
  37. self.assertTrue(self.voucher.is_active(START_DATETIME))
  38. def test_is_inactive_outside_of_start_and_end_dates(self):
  39. test = datetime.datetime(2012, 3, 10).replace(tzinfo=utc)
  40. self.assertFalse(self.voucher.is_active(test))
  41. def test_increments_total_discount_when_recording_usage(self):
  42. self.voucher.record_discount({'discount': D('10.00')})
  43. self.assertEqual(self.voucher.total_discount, D('10.00'))
  44. self.voucher.record_discount({'discount': D('10.00')})
  45. self.assertEqual(self.voucher.total_discount, D('20.00'))
  46. class TestMultiuseVoucher(TestCase):
  47. def setUp(self):
  48. self.voucher = VoucherFactory(usage=Voucher.MULTI_USE)
  49. def test_is_available_to_same_user_multiple_times(self):
  50. user, order = UserFactory(), OrderFactory()
  51. for i in range(10):
  52. self.voucher.record_usage(order, user)
  53. is_voucher_available_to_user, __ = self.voucher.is_available_to_user(user=user)
  54. self.assertTrue(is_voucher_available_to_user)
  55. class TestOncePerCustomerVoucher(TestCase):
  56. def setUp(self):
  57. self.voucher = VoucherFactory(usage=Voucher.ONCE_PER_CUSTOMER)
  58. def test_is_available_to_a_user_once(self):
  59. user, order = UserFactory(), OrderFactory()
  60. is_voucher_available_to_user, __ = self.voucher.is_available_to_user(user=user)
  61. self.assertTrue(is_voucher_available_to_user)
  62. self.voucher.record_usage(order, user)
  63. is_voucher_available_to_user, __ = self.voucher.is_available_to_user(user=user)
  64. self.assertFalse(is_voucher_available_to_user)
  65. def test_is_available_to_different_users(self):
  66. users, order = [UserFactory(), UserFactory()], OrderFactory()
  67. for user in users:
  68. is_voucher_available_to_user, __ = self.voucher.is_available_to_user(user=user)
  69. self.assertTrue(is_voucher_available_to_user)
  70. self.voucher.record_usage(order, user)
  71. is_voucher_available_to_user, __ = self.voucher.is_available_to_user(user=user)
  72. self.assertFalse(is_voucher_available_to_user)
  73. class TestAvailableForBasket(TestCase):
  74. def setUp(self):
  75. self.basket = create_basket(empty=True)
  76. self.product = create_product(price=100)
  77. range = RangeFactory(products=[self.product])
  78. condition = ConditionFactory(range=range, value=2)
  79. self.voucher = VoucherFactory()
  80. self.voucher.offers.add(create_offer(offer_type='Voucher', range=range, condition=condition))
  81. def test_is_available_for_basket(self):
  82. self.basket.add_product(product=self.product)
  83. is_voucher_available_for_basket, __ = self.voucher.is_available_for_basket(self.basket)
  84. self.assertFalse(is_voucher_available_for_basket)
  85. self.basket.add_product(product=self.product)
  86. is_voucher_available_for_basket, __ = self.voucher.is_available_for_basket(self.basket)
  87. self.assertTrue(is_voucher_available_for_basket)
  88. @pytest.mark.django_db
  89. class TestVoucherSet(object):
  90. def test_factory(self):
  91. voucherset = VoucherSetFactory()
  92. assert voucherset.count == voucherset.vouchers.count()
  93. code = voucherset.vouchers.first().code
  94. assert len(code) == 14
  95. assert code.count('-') == 2
  96. assert str(voucherset) == voucherset.name
  97. assert voucherset.offer
  98. for voucher in voucherset.vouchers.all():
  99. assert voucherset.offer in voucher.offers.all()
  100. def test_min_count(self):
  101. voucherset = VoucherSetFactory(count=20)
  102. assert voucherset.count == 20
  103. voucherset.count = 10
  104. voucherset.save()
  105. voucherset.refresh_from_db()
  106. assert voucherset.count == 20
  107. def test_num_basket_additions(self):
  108. voucherset = VoucherSetFactory()
  109. num_additions = voucherset.num_basket_additions
  110. assert num_additions == 0
  111. def test_num_orders(self):
  112. voucherset = VoucherSetFactory()
  113. assert voucherset.num_orders == 0
  114. order = OrderFactory()
  115. user, order = UserFactory(), OrderFactory()
  116. voucher = voucherset.vouchers.first()
  117. voucher.record_usage(order, user)
  118. assert voucherset.num_orders == 1