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 7.0KB

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