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.2KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185
  1. import httplib
  2. from django.db.models import get_model
  3. from django.test import TestCase, Client
  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 ClientTestCase, WebTestCase
  8. from oscar.test.factories import create_order, create_product
  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(httplib.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. class PermissionBasedDashboardOrderTests(ClientTestCase):
  32. permissions = ['partner.dashboard_access', ]
  33. def setUp(self):
  34. """
  35. Two partners with one product each, and one user each.
  36. Three orders: order #1 for product #1, order #2 for product #2,
  37. and order #3 for both products.
  38. """
  39. self.client = Client()
  40. self.user1 = self.create_user(username='user1@example.com')
  41. self.user2 = self.create_user(username='user2@example.com')
  42. self.partner1 = G(Partner, users=[self.user1])
  43. self.partner2 = G(Partner, users=[self.user2])
  44. self.product1 = create_product(partner=self.partner1)
  45. self.product2 = create_product(partner=self.partner2)
  46. self.basket1 = Basket.objects.create()
  47. self.basket2 = Basket.objects.create()
  48. self.basket12 = Basket.objects.create()
  49. self.basket1.add_product(self.product1)
  50. self.basket2.add_product(self.product2)
  51. self.basket12.add_product(self.product1)
  52. self.basket12.add_product(self.product2)
  53. self.address = G(ShippingAddress)
  54. self.order1 = create_order(basket=self.basket1,
  55. shipping_address=self.address)
  56. self.order2 = create_order(basket=self.basket2,
  57. shipping_address=self.address)
  58. self.order12 = create_order(basket=self.basket12,
  59. shipping_address=self.address)
  60. def test_staff_user_can_list_all_orders(self):
  61. self.is_staff = True
  62. self.login()
  63. orders = [self.order1, self.order2, self.order12]
  64. # order-list
  65. response = self.client.get(reverse('dashboard:order-list'))
  66. self.assertIsOk(response)
  67. self.assertEqual(set(response.context['orders']),
  68. set(orders))
  69. # order-detail
  70. for order in orders:
  71. url = reverse('dashboard:order-detail',
  72. kwargs={'number': order.number})
  73. self.assertIsOk(self.client.get(url))
  74. def test_non_staff_can_only_list_her_orders(self):
  75. # order-list user1
  76. self.client.login(username='user1@example.com', password=self.password)
  77. response = self.client.get(reverse('dashboard:order-list'))
  78. self.assertEqual(set(response.context['orders']),
  79. set([self.order1]))
  80. # order-list user2
  81. self.client.login(username='user2@example.com', password=self.password)
  82. response = self.client.get(reverse('dashboard:order-list'))
  83. self.assertEqual(set(response.context['orders']),
  84. set([self.order2]))
  85. # order-detail user2
  86. url = reverse('dashboard:order-detail',
  87. kwargs={'number': self.order2.number})
  88. self.assertIsOk(self.client.get(url))
  89. url = reverse('dashboard:order-detail',
  90. kwargs={'number': self.order12.number})
  91. self.assertNoAccess(self.client.get(url))
  92. # order-line-detail user2
  93. url = reverse('dashboard:order-line-detail',
  94. kwargs={'number': self.order2.number,
  95. 'line_id': self.order2.lines.all()[0].pk})
  96. self.assertIsOk(self.client.get(url))
  97. url = reverse('dashboard:order-line-detail',
  98. kwargs={'number': self.order12.number,
  99. 'line_id': self.order12.lines.all()[0].pk})
  100. self.assertNoAccess(self.client.get(url))
  101. # order-shipping-address
  102. url = reverse('dashboard:order-shipping-address',
  103. kwargs={'number': self.order2.number})
  104. self.assertIsOk(self.client.get(url))
  105. url = reverse('dashboard:order-shipping-address',
  106. kwargs={'number': self.order12.number})
  107. self.assertNoAccess(self.client.get(url))
  108. class OrderDetailTests(ClientTestCase):
  109. is_staff = True
  110. def setUp(self):
  111. Order.pipeline = {'A': ('B', 'C')}
  112. self.order = create_order(status='A')
  113. self.url = reverse('dashboard:order-detail', kwargs={'number': self.order.number})
  114. super(OrderDetailTests, self).setUp()
  115. def fetch_order(self):
  116. return Order.objects.get(number=self.order.number)
  117. def test_order_detail_page_contains_order(self):
  118. response = self.client.get(self.url)
  119. self.assertTrue('order' in response.context)
  120. def test_order_status_change(self):
  121. params = {'order_action': 'change_order_status',
  122. 'new_status': 'B'}
  123. response = self.client.post(self.url, params)
  124. self.assertIsRedirect(response)
  125. self.assertEqual('B', self.fetch_order().status)
  126. def test_order_status_change_creates_system_note(self):
  127. params = {'order_action': 'change_order_status',
  128. 'new_status': 'B'}
  129. self.client.post(self.url, params)
  130. notes = self.order.notes.all()
  131. self.assertEqual(1, len(notes))
  132. self.assertEqual(OrderNote.SYSTEM, notes[0].note_type)
  133. class LineDetailTests(ClientTestCase):
  134. is_staff = True
  135. def setUp(self):
  136. self.order = create_order()
  137. self.line = self.order.lines.all()[0]
  138. self.url = reverse('dashboard:order-line-detail', kwargs={'number': self.order.number,
  139. 'line_id': self.line.id})
  140. super(LineDetailTests, self).setUp()
  141. def test_line_detail_page_exists(self):
  142. response = self.client.get(self.url)
  143. self.assertIsOk(response)
  144. def test_line_in_context(self):
  145. response = self.client.get(self.url)
  146. self.assertInContext(response, 'line')
  147. class TemplateTagTests(TestCase):
  148. def test_get_num_orders(self):
  149. user = get(User)
  150. for i in range(1, 4):
  151. get(Order, user=user)
  152. out = Template(
  153. "{% load dashboard_tags %}"
  154. "{% num_orders user %}"
  155. ).render(Context({
  156. 'user': user
  157. }))
  158. self.assertEquals(out, "3")