選択できるのは25トピックまでです。 トピックは、先頭が英数字で、英数字とダッシュ('-')を使用した35文字以内のものにしてください。

model_tests.py 3.2KB

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