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

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