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

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257
  1. from django.conf import settings
  2. from django.core.urlresolvers import reverse
  3. from django.utils.six.moves import http_client
  4. from oscar.core.loading import get_model
  5. from oscar.apps.order.models import (
  6. Order, OrderNote, PaymentEvent, PaymentEventType)
  7. from oscar.test.factories import (
  8. PartnerFactory, ShippingAddressFactory)
  9. from oscar.test.factories import create_order, create_basket
  10. from oscar.test.testcases import WebTestCase
  11. Basket = get_model('basket', 'Basket')
  12. Partner = get_model('partner', 'Partner')
  13. ShippingAddress = get_model('order', 'ShippingAddress')
  14. class TestOrderListDashboard(WebTestCase):
  15. is_staff = True
  16. def test_redirects_to_detail_page(self):
  17. order = create_order()
  18. page = self.get(reverse('dashboard:order-list'))
  19. form = page.forms['search_form']
  20. form['order_number'] = order.number
  21. response = form.submit()
  22. self.assertEqual(http_client.FOUND, response.status_code)
  23. def test_downloads_to_csv_without_error(self):
  24. address = ShippingAddressFactory()
  25. create_order(shipping_address=address)
  26. page = self.get(reverse('dashboard:order-list'))
  27. form = page.forms['orders_form']
  28. form['selected_order'].checked = True
  29. form.submit('download_selected')
  30. def test_allows_order_number_search(self):
  31. page = self.get(reverse('dashboard:order-list'))
  32. form = page.forms['search_form']
  33. form['order_number'] = '+'
  34. form.submit()
  35. class PermissionBasedDashboardOrderTestsBase(WebTestCase):
  36. permissions = ['partner.dashboard_access', ]
  37. username = 'user1@example.com'
  38. def setUp(self):
  39. """
  40. Creates two orders. order_in has self.user in it's partner users list.
  41. """
  42. super(PermissionBasedDashboardOrderTestsBase, self).setUp()
  43. self.address = ShippingAddressFactory()
  44. self.basket_in = create_basket()
  45. self.basket_out = create_basket()
  46. # replace partner with one that has the user in it's users list
  47. self.partner_in = PartnerFactory(users=[self.user])
  48. stockrecord = self.basket_in.lines.all()[0].stockrecord
  49. stockrecord.partner = self.partner_in
  50. stockrecord.save()
  51. self.order_in = create_order(basket=self.basket_in,
  52. shipping_address=self.address)
  53. self.order_out = create_order(basket=self.basket_out,
  54. shipping_address=self.address)
  55. class PermissionBasedDashboardOrderTestsNoStaff(PermissionBasedDashboardOrderTestsBase):
  56. is_staff = False
  57. def test_non_staff_can_only_list_her_orders(self):
  58. # order-list user1
  59. response = self.get(reverse('dashboard:order-list'))
  60. self.assertEqual(set(response.context['orders']),
  61. set([self.order_in]))
  62. # order-detail user2
  63. url = reverse('dashboard:order-detail',
  64. kwargs={'number': self.order_in.number})
  65. self.assertIsOk(self.get(url))
  66. url = reverse('dashboard:order-detail',
  67. kwargs={'number': self.order_out.number})
  68. self.assertNoAccess(self.get(url, status="*"))
  69. # order-line-detail user2
  70. url = reverse('dashboard:order-line-detail',
  71. kwargs={'number': self.order_in.number,
  72. 'line_id': self.order_in.lines.all()[0].pk})
  73. self.assertIsOk(self.get(url))
  74. url = reverse('dashboard:order-line-detail',
  75. kwargs={'number': self.order_out.number,
  76. 'line_id': self.order_out.lines.all()[0].pk})
  77. self.assertNoAccess(self.get(url, status="*"))
  78. # order-shipping-address
  79. url = reverse('dashboard:order-shipping-address',
  80. kwargs={'number': self.order_in.number})
  81. self.assertIsOk(self.get(url))
  82. url = reverse('dashboard:order-shipping-address',
  83. kwargs={'number': self.order_out.number})
  84. self.assertNoAccess(self.get(url, status="*"))
  85. class PermissionBasedDashboardOrderTestsStaff(PermissionBasedDashboardOrderTestsBase):
  86. is_staff = True
  87. def test_staff_user_can_list_all_orders(self):
  88. orders = [self.order_in, self.order_out]
  89. # order-list
  90. response = self.get(reverse('dashboard:order-list'))
  91. self.assertIsOk(response)
  92. self.assertEqual(set(response.context['orders']),
  93. set(orders))
  94. # order-detail
  95. for order in orders:
  96. url = reverse('dashboard:order-detail',
  97. kwargs={'number': order.number})
  98. self.assertIsOk(self.get(url))
  99. class TestOrderDetailPage(WebTestCase):
  100. is_staff = True
  101. def setUp(self):
  102. super(TestOrderDetailPage, self).setUp()
  103. # ensures that initial statuses are as expected
  104. self.order = create_order()
  105. self.event_type = PaymentEventType.objects.create(name='foo')
  106. url = reverse('dashboard:order-detail',
  107. kwargs={'number': self.order.number})
  108. self.page = self.get(url)
  109. def test_contains_order(self):
  110. self.assertEqual(self.page.context['order'], self.order)
  111. def test_allows_notes_to_be_added(self):
  112. form = self.page.forms['order_note_form']
  113. form['message'] = "boom"
  114. response = form.submit()
  115. self.assertIsRedirect(response)
  116. notes = self.order.notes.all()
  117. self.assertEqual(1, len(notes))
  118. def test_allows_line_status_to_be_changed(self):
  119. line = self.order.lines.all()[0]
  120. self.assertEqual(line.status, settings.OSCAR_INITIAL_LINE_STATUS)
  121. form = self.page.forms['order_lines_form']
  122. form['line_action'] = 'change_line_statuses'
  123. form['new_status'] = new_status = 'b'
  124. form['selected_line'] = [line.pk]
  125. form.submit()
  126. # fetch line again
  127. self.assertEqual(self.order.lines.all()[0].status, new_status)
  128. def test_allows_order_status_to_be_changed(self):
  129. form = self.page.forms['order_status_form']
  130. self.assertEqual(
  131. self.order.status, settings.OSCAR_INITIAL_ORDER_STATUS)
  132. form = self.page.forms['order_status_form']
  133. form['new_status'] = new_status = 'B'
  134. form.submit()
  135. # fetch order again
  136. self.assertEqual(Order.objects.get(pk=self.order.pk).status, new_status)
  137. def test_allows_creating_payment_event(self):
  138. line = self.order.lines.all()[0]
  139. form = self.page.forms['order_lines_form']
  140. form['line_action'] = 'create_payment_event'
  141. form['selected_line'] = [line.pk]
  142. form['payment_event_type'] = self.event_type.code
  143. form.submit()
  144. self.assertTrue(PaymentEvent.objects.exists())
  145. class TestChangingOrderStatus(WebTestCase):
  146. is_staff = True
  147. def setUp(self):
  148. super(TestChangingOrderStatus, self).setUp()
  149. Order.pipeline = {'A': ('B', 'C')}
  150. self.order = create_order(status='A')
  151. url = reverse('dashboard:order-detail',
  152. kwargs={'number': self.order.number})
  153. page = self.get(url)
  154. form = page.forms['order_status_form']
  155. form['new_status'] = 'B'
  156. self.response = form.submit()
  157. def reload_order(self):
  158. return Order.objects.get(number=self.order.number)
  159. def test_works(self):
  160. self.assertIsRedirect(self.response)
  161. self.assertEqual('B', self.reload_order().status)
  162. def test_creates_system_note(self):
  163. notes = self.order.notes.all()
  164. self.assertEqual(1, len(notes))
  165. self.assertEqual(OrderNote.SYSTEM, notes[0].note_type)
  166. class TestChangingOrderStatusFromFormOnOrderListView(WebTestCase):
  167. is_staff = True
  168. def setUp(self):
  169. super(TestChangingOrderStatusFromFormOnOrderListView, self).setUp()
  170. Order.pipeline = {'A': ('B', 'C'), 'B': ('A', 'C'), 'C': ('A', 'B')}
  171. self.order = create_order(status='A')
  172. url = reverse('dashboard:order-list')
  173. page = self.get(url)
  174. form = page.forms['orders_form']
  175. form['new_status'] = 'B'
  176. form['selected_order'] = self.order.pk
  177. self.response = form.submit(name='action', value='change_order_statuses')
  178. def reload_order(self):
  179. return Order.objects.get(number=self.order.number)
  180. def test_works(self):
  181. self.assertIsRedirect(self.response)
  182. # Has the order status been changed?
  183. self.assertEqual('B', self.reload_order().status)
  184. # Is a system note created?
  185. notes = self.order.notes.all()
  186. self.assertEqual(1, len(notes))
  187. self.assertEqual(OrderNote.SYSTEM, notes[0].note_type)
  188. class LineDetailTests(WebTestCase):
  189. is_staff = True
  190. def setUp(self):
  191. self.order = create_order()
  192. self.line = self.order.lines.all()[0]
  193. self.url = reverse('dashboard:order-line-detail',
  194. kwargs={'number': self.order.number,
  195. 'line_id': self.line.id})
  196. super(LineDetailTests, self).setUp()
  197. def test_line_detail_page_exists(self):
  198. response = self.get(self.url)
  199. self.assertIsOk(response)
  200. def test_line_in_context(self):
  201. response = self.get(self.url)
  202. self.assertInContext(response, 'line')