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.

order_tests.py 7.1KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207
  1. from six.moves import http_client
  2. from oscar.core.loading import get_model
  3. from django.test import TestCase
  4. from django.core.urlresolvers import reverse
  5. from django.template import Template, Context
  6. from django_dynamic_fixture import get, G
  7. from oscar.test.testcases import WebTestCase
  8. from oscar.test.factories import create_order, create_basket
  9. from oscar.apps.order.models import Order, OrderNote
  10. from oscar.core.compat import get_user_model
  11. User = get_user_model()
  12. Basket = get_model('basket', 'Basket')
  13. Partner = get_model('partner', 'Partner')
  14. ShippingAddress = get_model('order', 'ShippingAddress')
  15. class TestOrderListDashboard(WebTestCase):
  16. is_staff = True
  17. def test_redirects_to_detail_page(self):
  18. order = create_order()
  19. page = self.get(reverse('dashboard:order-list'))
  20. form = page.forms['search_form']
  21. form['order_number'] = order.number
  22. response = form.submit()
  23. self.assertEqual(http_client.FOUND, response.status_code)
  24. def test_downloads_to_csv_without_error(self):
  25. address = get(ShippingAddress)
  26. create_order(shipping_address=address)
  27. page = self.get(reverse('dashboard:order-list'))
  28. form = page.forms['orders_form']
  29. form['selected_order'].checked = True
  30. form.submit('download_selected')
  31. def test_allows_order_number_search(self):
  32. page = self.get(reverse('dashboard:order-list'))
  33. form = page.forms['search_form']
  34. form['order_number'] = '+'
  35. form.submit()
  36. class PermissionBasedDashboardOrderTestsBase(WebTestCase):
  37. permissions = ['partner.dashboard_access', ]
  38. username = 'user1@example.com'
  39. def setUp(self):
  40. """
  41. Creates two orders. order_in has self.user in it's partner users list.
  42. """
  43. super(PermissionBasedDashboardOrderTestsBase, self).setUp()
  44. self.address = G(ShippingAddress)
  45. self.basket_in = create_basket()
  46. self.basket_out = create_basket()
  47. # replace partner with one that has the user in it's users list
  48. self.partner_in = G(Partner, users=[self.user])
  49. stockrecord = self.basket_in.lines.all()[0].stockrecord
  50. stockrecord.partner = self.partner_in
  51. stockrecord.save()
  52. self.order_in = create_order(basket=self.basket_in,
  53. shipping_address=self.address)
  54. self.order_out = create_order(basket=self.basket_out,
  55. shipping_address=self.address)
  56. class PermissionBasedDashboardOrderTestsNoStaff(PermissionBasedDashboardOrderTestsBase):
  57. is_staff = False
  58. def test_non_staff_can_only_list_her_orders(self):
  59. # order-list user1
  60. response = self.get(reverse('dashboard:order-list'))
  61. self.assertEqual(set(response.context['orders']),
  62. set([self.order_in]))
  63. # order-detail user2
  64. url = reverse('dashboard:order-detail',
  65. kwargs={'number': self.order_in.number})
  66. self.assertIsOk(self.get(url))
  67. url = reverse('dashboard:order-detail',
  68. kwargs={'number': self.order_out.number})
  69. self.assertNoAccess(self.get(url, status="*"))
  70. # order-line-detail user2
  71. url = reverse('dashboard:order-line-detail',
  72. kwargs={'number': self.order_in.number,
  73. 'line_id': self.order_in.lines.all()[0].pk})
  74. self.assertIsOk(self.get(url))
  75. url = reverse('dashboard:order-line-detail',
  76. kwargs={'number': self.order_out.number,
  77. 'line_id': self.order_out.lines.all()[0].pk})
  78. self.assertNoAccess(self.get(url, status="*"))
  79. # order-shipping-address
  80. url = reverse('dashboard:order-shipping-address',
  81. kwargs={'number': self.order_in.number})
  82. self.assertIsOk(self.get(url))
  83. url = reverse('dashboard:order-shipping-address',
  84. kwargs={'number': self.order_out.number})
  85. self.assertNoAccess(self.get(url, status="*"))
  86. class PermissionBasedDashboardOrderTestsStaff(PermissionBasedDashboardOrderTestsBase):
  87. is_staff = True
  88. def test_staff_user_can_list_all_orders(self):
  89. orders = [self.order_in, self.order_out]
  90. # order-list
  91. response = self.get(reverse('dashboard:order-list'))
  92. self.assertIsOk(response)
  93. self.assertEqual(set(response.context['orders']),
  94. set(orders))
  95. # order-detail
  96. for order in orders:
  97. url = reverse('dashboard:order-detail',
  98. kwargs={'number': order.number})
  99. self.assertIsOk(self.get(url))
  100. class TestOrderDetailPage(WebTestCase):
  101. is_staff = True
  102. def setUp(self):
  103. super(TestOrderDetailPage, self).setUp()
  104. self.order = create_order()
  105. url = reverse('dashboard:order-detail',
  106. kwargs={'number': self.order.number})
  107. self.page = self.get(url)
  108. def test_contains_order(self):
  109. self.assertTrue('order' in self.page.context)
  110. def test_allows_notes_to_be_added(self):
  111. form = self.page.forms['order_note_form']
  112. form['message'] = "boom"
  113. response = form.submit()
  114. self.assertIsRedirect(response)
  115. notes = self.order.notes.all()
  116. self.assertEqual(1, len(notes))
  117. class TestChangingOrderStatus(WebTestCase):
  118. is_staff = True
  119. def setUp(self):
  120. super(TestChangingOrderStatus, self).setUp()
  121. Order.pipeline = {'A': ('B', 'C')}
  122. self.order = create_order(status='A')
  123. url = reverse('dashboard:order-detail',
  124. kwargs={'number': self.order.number})
  125. page = self.get(url)
  126. form = page.forms['order_status_form']
  127. form['new_status'] = 'B'
  128. self.response = form.submit()
  129. def reload_order(self):
  130. return Order.objects.get(number=self.order.number)
  131. def test_works(self):
  132. self.assertIsRedirect(self.response)
  133. self.assertEqual('B', self.reload_order().status)
  134. def test_creates_system_note(self):
  135. notes = self.order.notes.all()
  136. self.assertEqual(1, len(notes))
  137. self.assertEqual(OrderNote.SYSTEM, notes[0].note_type)
  138. class LineDetailTests(WebTestCase):
  139. is_staff = True
  140. def setUp(self):
  141. self.order = create_order()
  142. self.line = self.order.lines.all()[0]
  143. self.url = reverse('dashboard:order-line-detail',
  144. kwargs={'number': self.order.number,
  145. 'line_id': self.line.id})
  146. super(LineDetailTests, self).setUp()
  147. def test_line_detail_page_exists(self):
  148. response = self.get(self.url)
  149. self.assertIsOk(response)
  150. def test_line_in_context(self):
  151. response = self.get(self.url)
  152. self.assertInContext(response, 'line')
  153. class TemplateTagTests(TestCase):
  154. def test_get_num_orders(self):
  155. user = get(User)
  156. for i in range(1, 4):
  157. get(Order, user=user)
  158. out = Template(
  159. "{% load dashboard_tags %}"
  160. "{% num_orders user %}"
  161. ).render(Context({
  162. 'user': user
  163. }))
  164. self.assertEqual(out, "3")