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

test_basket.py 7.7KB

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