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

basket_tests.py 7.3KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197
  1. from decimal import Decimal as D
  2. from six.moves import http_client
  3. import datetime
  4. from django.conf import settings
  5. from django.test import TestCase, Client
  6. from django.core.urlresolvers import reverse
  7. from oscar.test.factories import create_product
  8. from oscar.core.compat import get_user_model
  9. from oscar.apps.basket.models import Basket
  10. from oscar.apps.basket import reports
  11. from oscar.test.basket import add_product
  12. from oscar.test import factories
  13. from oscar.apps.partner import strategy
  14. User = get_user_model()
  15. class TestBasketMerging(TestCase):
  16. def setUp(self):
  17. self.product = create_product(num_in_stock=10)
  18. self.user_basket = Basket()
  19. self.user_basket.strategy = strategy.Default()
  20. add_product(self.user_basket, product=self.product)
  21. self.cookie_basket = Basket()
  22. self.cookie_basket.strategy = strategy.Default()
  23. add_product(self.cookie_basket, quantity=2, product=self.product)
  24. self.user_basket.merge(self.cookie_basket, add_quantities=False)
  25. def test_cookie_basket_has_status_set(self):
  26. self.assertEqual(Basket.MERGED, self.cookie_basket.status)
  27. def test_lines_are_moved_across(self):
  28. self.assertEqual(1, self.user_basket.lines.all().count())
  29. def test_merge_line_takes_max_quantity(self):
  30. line = self.user_basket.lines.get(product=self.product)
  31. self.assertEqual(2, line.quantity)
  32. class AnonAddToBasketViewTests(TestCase):
  33. def setUp(self):
  34. self.product = create_product(
  35. price=D('10.00'), num_in_stock=10)
  36. url = reverse('basket:add')
  37. post_params = {'product_id': self.product.id,
  38. 'action': 'add',
  39. 'quantity': 1}
  40. self.client = Client()
  41. self.response = self.client.post(url, post_params)
  42. def test_cookie_is_created(self):
  43. self.assertTrue('oscar_open_basket' in self.response.cookies)
  44. def test_price_is_recorded(self):
  45. basket_id = self.response.cookies['oscar_open_basket'].value.split(':')[0]
  46. basket = Basket.objects.get(id=basket_id)
  47. line = basket.lines.get(product=self.product)
  48. stockrecord = self.product.stockrecords.all()[0]
  49. self.assertEqual(stockrecord.price_excl_tax, line.price_excl_tax)
  50. class BasketSummaryViewTests(TestCase):
  51. def setUp(self):
  52. url = reverse('basket:summary')
  53. self.response = self.client.get(url)
  54. def test_shipping_method_in_context(self):
  55. self.assertTrue('shipping_method' in self.response.context)
  56. def test_order_total_in_context(self):
  57. self.assertTrue('order_total' in self.response.context)
  58. def test_view_does_not_error(self):
  59. self.assertEqual(http_client.OK, self.response.status_code)
  60. def test_basket_in_context(self):
  61. self.assertTrue('basket' in self.response.context)
  62. def test_basket_is_empty(self):
  63. basket = self.response.context['basket']
  64. self.assertEqual(0, basket.num_lines)
  65. class BasketThresholdTest(TestCase):
  66. def setUp(self):
  67. self._old_threshold = settings.OSCAR_MAX_BASKET_QUANTITY_THRESHOLD
  68. settings.OSCAR_MAX_BASKET_QUANTITY_THRESHOLD = 3
  69. def tearDown(self):
  70. settings.OSCAR_MAX_BASKET_QUANTITY_THRESHOLD = self._old_threshold
  71. def test_adding_more_than_threshold_raises(self):
  72. dummy_product = create_product(price=D('10.00'), num_in_stock=10)
  73. url = reverse('basket:add')
  74. post_params = {'product_id': dummy_product.id,
  75. 'action': 'add',
  76. 'quantity': 2}
  77. response = self.client.post(url, post_params)
  78. self.assertTrue('oscar_open_basket' in response.cookies)
  79. post_params = {'product_id': dummy_product.id,
  80. 'action': 'add',
  81. 'quantity': 2}
  82. response = self.client.post(url, post_params)
  83. self.assertTrue('Your basket currently has 2 items.' in
  84. response.cookies['messages'].value)
  85. class BasketReportTests(TestCase):
  86. def test_open_report_doesnt_error(self):
  87. data = {
  88. 'start_date': datetime.date(2012, 5, 1),
  89. 'end_date': datetime.date(2012, 5, 17),
  90. 'formatter': 'CSV'
  91. }
  92. generator = reports.OpenBasketReportGenerator(**data)
  93. generator.generate()
  94. def test_submitted_report_doesnt_error(self):
  95. data = {
  96. 'start_date': datetime.date(2012, 5, 1),
  97. 'end_date': datetime.date(2012, 5, 17),
  98. 'formatter': 'CSV'
  99. }
  100. generator = reports.SubmittedBasketReportGenerator(**data)
  101. generator.generate()
  102. class SavedBasketTests(TestCase):
  103. def test_moving_from_saved_basket(self):
  104. user = User.objects.create_user(username='test', password='pass',
  105. email='test@example.com')
  106. client = Client()
  107. client.login(email=user.email, password='pass')
  108. product = create_product(price=D('10.00'), num_in_stock=2)
  109. basket = factories.create_basket(empty=True)
  110. basket.owner = user
  111. basket.save()
  112. add_product(basket, product=product)
  113. saved_basket, created = Basket.saved.get_or_create(owner=user)
  114. saved_basket.strategy = basket.strategy
  115. add_product(saved_basket, product=product)
  116. response = client.get(reverse('basket:summary'))
  117. saved_formset = response.context['saved_formset']
  118. saved_form = saved_formset.forms[0]
  119. data = {
  120. saved_formset.add_prefix('INITIAL_FORMS'): 1,
  121. saved_formset.add_prefix('MAX_NUM_FORMS'): 1,
  122. saved_formset.add_prefix('TOTAL_FORMS'): 1,
  123. saved_form.add_prefix('id'): saved_form.initial['id'],
  124. saved_form.add_prefix('move_to_basket'): True,
  125. }
  126. response = client.post(reverse('basket:saved'), data=data)
  127. self.assertEqual(Basket.open.get(id=basket.id).lines.get(
  128. product=product).quantity, 2)
  129. self.assertRedirects(response, reverse('basket:summary'))
  130. def test_moving_from_saved_basket_more_than_stocklevel_raises(self):
  131. user = User.objects.create_user(username='test', password='pass',
  132. email='test@example.com')
  133. client = Client()
  134. client.login(email=user.email, password='pass')
  135. product = create_product(price=D('10.00'), num_in_stock=1)
  136. basket, created = Basket.open.get_or_create(owner=user)
  137. add_product(basket, product=product)
  138. saved_basket, created = Basket.saved.get_or_create(owner=user)
  139. add_product(saved_basket, product=product)
  140. response = client.get(reverse('basket:summary'))
  141. saved_formset = response.context['saved_formset']
  142. saved_form = saved_formset.forms[0]
  143. data = {
  144. saved_formset.add_prefix('INITIAL_FORMS'): 1,
  145. saved_formset.add_prefix('MAX_NUM_FORMS'): 1,
  146. saved_formset.add_prefix('TOTAL_FORMS'): 1,
  147. saved_form.add_prefix('id'): saved_form.initial['id'],
  148. saved_form.add_prefix('move_to_basket'): True,
  149. }
  150. response = client.post(reverse('basket:saved'), data=data)
  151. # we can't add more than stock level into basket
  152. self.assertEqual(Basket.open.get(id=basket.id).lines.get(product=product).quantity, 1)
  153. self.assertRedirects(response, reverse('basket:summary'))