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

test_models.py 4.8KB

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