Вы не можете выбрать более 25 тем Темы должны начинаться с буквы или цифры, могут содержать дефисы(-) и должны содержать не более 35 символов.

test_models.py 6.2KB

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