You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

basket_tests.py 6.9KB

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