Nevar pievienot vairāk kā 25 tēmas Tēmai ir jāsākas ar burtu vai ciparu, tā var saturēt domu zīmes ('-') un var būt līdz 35 simboliem gara.

order_tests.py 9.1KB

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