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.

customer_tests.py 8.6KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229
  1. import httplib
  2. from mock import patch
  3. from decimal import Decimal as D
  4. from django.test.client import Client
  5. from django.contrib.auth.models import User
  6. from django.core.urlresolvers import reverse
  7. from django.test import TestCase
  8. from django.http import HttpRequest
  9. from oscar.apps.customer.history_helpers import get_recently_viewed_product_ids
  10. from oscar.test.helpers import create_product, create_order
  11. from oscar.test import ClientTestCase
  12. from oscar.apps.basket.models import Basket
  13. class HistoryHelpersTest(TestCase):
  14. def setUp(self):
  15. self.client = Client()
  16. self.product = create_product()
  17. def test_viewing_product_creates_cookie(self):
  18. response = self.client.get(self.product.get_absolute_url())
  19. self.assertTrue('oscar_recently_viewed_products' in response.cookies)
  20. def test_id_gets_added_to_cookie(self):
  21. response = self.client.get(self.product.get_absolute_url())
  22. request = HttpRequest()
  23. request.COOKIES['oscar_recently_viewed_products'] = response.cookies['oscar_recently_viewed_products'].value
  24. self.assertTrue(self.product.id in get_recently_viewed_product_ids(request))
  25. class AnonOrderDetail(TestCase):
  26. def setUp(self):
  27. self.client = Client()
  28. def test_404_received_for_unknown_order(self):
  29. response = self.client.get(reverse('customer:anon-order', kwargs={'order_number': 1000,
  30. 'hash': '1231231232'}))
  31. self.assertEqual(httplib.NOT_FOUND, response.status_code)
  32. def test_200_received_for_order_with_correct_hash(self):
  33. order = create_order()
  34. response = self.client.get(reverse('customer:anon-order', kwargs={'order_number': order.number,
  35. 'hash': order.verification_hash()}))
  36. self.assertEqual(httplib.OK, response.status_code)
  37. def test_404_received_for_order_with_incorrect_hash(self):
  38. order = create_order()
  39. response = self.client.get(reverse('customer:anon-order', kwargs={'order_number': order.number,
  40. 'hash': 'bad'}))
  41. self.assertEqual(httplib.NOT_FOUND, response.status_code)
  42. class EditProfileTests(TestCase):
  43. username = 'customer'
  44. password = 'cheeseshop'
  45. email = 'customer@example.com'
  46. def setUp(self):
  47. User.objects.create_user(username=self.username,
  48. email=self.email, password=self.password)
  49. is_successful = self.client.login(username=self.username,
  50. password=self.password)
  51. if not is_successful:
  52. self.fail("Unable to login as %s" % self.username)
  53. def tearDown(self):
  54. User.objects.all().delete()
  55. def test_update_profile_page_for_smoke(self):
  56. url = reverse('customer:profile-update')
  57. response = self.client.get(url)
  58. self.assertEqual(200, response.status_code)
  59. self.assertTrue('form' in response.context)
  60. class AuthTestCase(TestCase):
  61. username = 'customer'
  62. password = 'cheeseshop'
  63. email = 'customer@example.com'
  64. def setUp(self):
  65. self.client = Client()
  66. self.product = create_product()
  67. User.objects.create_user(username=self.username,
  68. email=self.email, password=self.password)
  69. self.client.login(username=self.username, password=self.password)
  70. def test_cookies_deleted_on_logout(self):
  71. response = self.client.get(self.product.get_absolute_url())
  72. self.assertTrue('oscar_recently_viewed_products' in response.cookies)
  73. response = self.client.get(reverse('customer:logout'))
  74. self.assertTrue(('oscar_recently_viewed_products' not in response.cookies)
  75. or not
  76. self.client.cookies['oscar_recently_viewed_products'].coded_value)
  77. class AuthStaffRedirectTests(TestCase):
  78. username = 'staff'
  79. password = 'cheeseshop'
  80. email = 'staff@example.com'
  81. def test_staff_member_login_for_dashboard(self):
  82. """
  83. Test if a staff member that is not yet logged in and trying to access the
  84. dashboard is redirected to the Oscar login page (instead of the ``admin``
  85. login page). Also test that the redirect after successful login will
  86. be the originally requested page.
  87. """
  88. self.client = Client()
  89. user = User.objects.create_user(username=self.username,
  90. email=self.email, password=self.password)
  91. user.is_staff = True
  92. user.save()
  93. response = self.client.get(reverse('dashboard:index'), follow=True)
  94. self.assertContains(response, "login-username", status_code=200)
  95. self.assertEquals(response.context['next'], reverse('dashboard:index'))
  96. class ReorderTests(ClientTestCase):
  97. def test_can_reorder(self):
  98. order = create_order(user=self.user)
  99. Basket.objects.all().delete()
  100. response = self.client.post(reverse('customer:order',
  101. args=(order.number,)),
  102. {'order_id': order.pk,
  103. 'action': 'reorder'})
  104. basket = Basket.objects.all()[0]
  105. self.assertEquals(len(basket.all_lines()), 1)
  106. def test_can_reorder_line(self):
  107. order = create_order(user=self.user)
  108. line = order.lines.all()[0]
  109. Basket.objects.all().delete()
  110. response = self.client.post(reverse('customer:order-line',
  111. args=(order.number, line.pk)),
  112. {'action': 'reorder'})
  113. basket = Basket.objects.all()[0]
  114. self.assertEquals(len(basket.all_lines()), 1)
  115. def test_cannot_reorder_out_of_stock_product(self):
  116. order = create_order(user=self.user)
  117. product = order.lines.all()[0].product
  118. product.stockrecord.num_in_stock = 0
  119. product.stockrecord.save()
  120. Basket.objects.all().delete()
  121. response = self.client.post(reverse('customer:order',
  122. args=(order.number,)),
  123. {'order_id': order.pk,
  124. 'action': 'reorder'})
  125. basket = Basket.objects.all()[0]
  126. self.assertEquals(len(basket.all_lines()), 0)
  127. def test_cannot_reorder_out_of_stock_line(self):
  128. order = create_order(user=self.user)
  129. line = order.lines.all()[0]
  130. product = line.product
  131. product.stockrecord.num_in_stock = 0
  132. product.stockrecord.save()
  133. Basket.objects.all().delete()
  134. response = self.client.post(reverse('customer:order-line',
  135. args=(order.number, line.pk)),
  136. {'action': 'reorder'})
  137. basket = Basket.objects.all()[0]
  138. self.assertEquals(len(basket.all_lines()), 0)
  139. @patch('django.conf.settings.OSCAR_MAX_BASKET_QUANTITY_THRESHOLD', 1)
  140. def test_cannot_reorder_when_basket_maximum_exceeded(self):
  141. order = create_order(user=self.user)
  142. line = order.lines.all()[0]
  143. Basket.objects.all().delete()
  144. #add a product
  145. product = create_product(price=D('12.00'))
  146. self.client.post(reverse('basket:add'), {'product_id': product.id,
  147. 'quantity': 1})
  148. basket = Basket.objects.all()[0]
  149. self.assertEquals(len(basket.all_lines()), 1)
  150. #try to reorder a product
  151. response = self.client.post(reverse('customer:order',
  152. args=(order.number,)),
  153. {'order_id': order.pk,
  154. 'action': 'reorder'})
  155. self.assertEqual(len(basket.all_lines()), 1)
  156. self.assertNotEqual(line.product.pk, product.pk)
  157. @patch('django.conf.settings.OSCAR_MAX_BASKET_QUANTITY_THRESHOLD', 1)
  158. def test_cannot_reorder_line_when_basket_maximum_exceeded(self):
  159. order = create_order(user=self.user)
  160. line = order.lines.all()[0]
  161. Basket.objects.all().delete()
  162. #add a product
  163. product = create_product(price=D('12.00'))
  164. self.client.post(reverse('basket:add'), {'product_id': product.id,
  165. 'quantity': 1})
  166. basket = Basket.objects.all()[0]
  167. self.assertEquals(len(basket.all_lines()), 1)
  168. response = self.client.post(reverse('customer:order-line',
  169. args=(order.number, line.pk)),
  170. {'action': 'reorder'})
  171. self.assertEquals(len(basket.all_lines()), 1)
  172. self.assertNotEqual(line.product.pk, product.pk)