Ви не можете вибрати більше 25 тем Теми мають розпочинатися з літери або цифри, можуть містити дефіси (-) і не повинні перевищувати 35 символів.

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596
  1. import datetime
  2. from decimal import Decimal as D
  3. from django.test import TestCase
  4. from django.core import exceptions
  5. from django.utils.timezone import utc
  6. from oscar.apps.voucher.models import Voucher
  7. from oscar.core.compat import get_user_model
  8. from oscar.test.factories import OrderFactory, UserFactory, VoucherFactory
  9. START_DATETIME = datetime.datetime(2011, 1, 1).replace(tzinfo=utc)
  10. END_DATETIME = datetime.datetime(2012, 1, 1).replace(tzinfo=utc)
  11. User = get_user_model()
  12. class TestSavingAVoucher(TestCase):
  13. def test_saves_code_as_uppercase(self):
  14. voucher = VoucherFactory(
  15. code='lower',
  16. start_datetime=START_DATETIME, end_datetime=END_DATETIME)
  17. self.assertEqual('LOWER', voucher.code)
  18. def test_verifies_dates_are_sensible(self):
  19. with self.assertRaises(exceptions.ValidationError):
  20. voucher = Voucher.objects.create(
  21. code='lower', start_datetime=END_DATETIME,
  22. end_datetime=START_DATETIME)
  23. voucher.clean()
  24. class TestAVoucher(TestCase):
  25. def setUp(self):
  26. self.voucher = VoucherFactory(
  27. start_datetime=START_DATETIME, end_datetime=END_DATETIME)
  28. def test_is_active_between_start_and_end_dates(self):
  29. test = datetime.datetime(2011, 6, 10).replace(tzinfo=utc)
  30. self.assertTrue(self.voucher.is_active(test))
  31. def test_is_active_on_end_date(self):
  32. self.assertTrue(self.voucher.is_active(END_DATETIME))
  33. def test_is_active_on_start_date(self):
  34. self.assertTrue(self.voucher.is_active(START_DATETIME))
  35. def test_is_inactive_outside_of_start_and_end_dates(self):
  36. test = datetime.datetime(2012, 3, 10).replace(tzinfo=utc)
  37. self.assertFalse(self.voucher.is_active(test))
  38. def test_increments_total_discount_when_recording_usage(self):
  39. self.voucher.record_discount({'discount': D('10.00')})
  40. self.assertEqual(self.voucher.total_discount, D('10.00'))
  41. self.voucher.record_discount({'discount': D('10.00')})
  42. self.assertEqual(self.voucher.total_discount, D('20.00'))
  43. class TestMultiuseVoucher(TestCase):
  44. def setUp(self):
  45. self.voucher = VoucherFactory(usage=Voucher.MULTI_USE)
  46. def test_is_available_to_same_user_multiple_times(self):
  47. user, order = UserFactory(), OrderFactory()
  48. for i in range(10):
  49. self.voucher.record_usage(order, user)
  50. is_voucher_available_to_user, __ = self.voucher.is_available_to_user(user=user)
  51. self.assertTrue(is_voucher_available_to_user)
  52. class TestOncePerCustomerVoucher(TestCase):
  53. def setUp(self):
  54. self.voucher = VoucherFactory(usage=Voucher.ONCE_PER_CUSTOMER)
  55. def test_is_available_to_a_user_once(self):
  56. user, order = UserFactory(), OrderFactory()
  57. is_voucher_available_to_user, __ = self.voucher.is_available_to_user(user=user)
  58. self.assertTrue(is_voucher_available_to_user)
  59. self.voucher.record_usage(order, user)
  60. is_voucher_available_to_user, __ = self.voucher.is_available_to_user(user=user)
  61. self.assertFalse(is_voucher_available_to_user)
  62. def test_is_available_to_different_users(self):
  63. users, order = [UserFactory(), UserFactory()], OrderFactory()
  64. for user in users:
  65. is_voucher_available_to_user, __ = self.voucher.is_available_to_user(user=user)
  66. self.assertTrue(is_voucher_available_to_user)
  67. self.voucher.record_usage(order, user)
  68. is_voucher_available_to_user, __ = self.voucher.is_available_to_user(user=user)
  69. self.assertFalse(is_voucher_available_to_user)