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.

test_range.py 9.6KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236
  1. import random
  2. from django.contrib.messages.constants import SUCCESS, WARNING
  3. from django.test import TestCase
  4. from django.urls import reverse
  5. from webtest.forms import Upload
  6. from oscar.apps.dashboard.ranges import forms
  7. from oscar.apps.offer.models import Range, RangeProductFileUpload
  8. from oscar.test.factories import create_product
  9. from oscar.test.testcases import WebTestCase
  10. class RangeProductFormTests(TestCase):
  11. def setUp(self):
  12. self.range = Range.objects.create(name='dummy')
  13. def tearDown(self):
  14. Range.objects.all().delete()
  15. def submit_form(self, data):
  16. return forms.RangeProductForm(self.range, data)
  17. def test_either_query_or_file_must_be_submitted(self):
  18. form = self.submit_form({'query': ''})
  19. self.assertFalse(form.is_valid())
  20. def test_non_match_becomes_error(self):
  21. form = self.submit_form({'query': '123123'})
  22. self.assertFalse(form.is_valid())
  23. def test_matching_query_is_valid(self):
  24. create_product(partner_sku='123123')
  25. form = self.submit_form({'query': '123123'})
  26. self.assertTrue(form.is_valid())
  27. def test_passing_form_return_product_list(self):
  28. product = create_product(partner_sku='123123')
  29. form = self.submit_form({'query': '123123'})
  30. form.is_valid()
  31. self.assertEqual(1, len(form.get_products()))
  32. self.assertEqual(product.id, form.get_products()[0].id)
  33. def test_missing_skus_are_available(self):
  34. create_product(partner_sku='123123')
  35. form = self.submit_form({'query': '123123, 123xxx'})
  36. form.is_valid()
  37. self.assertEqual(1, len(form.get_missing_skus()))
  38. self.assertTrue('123xxx' in form.get_missing_skus())
  39. def test_only_dupes_is_invalid(self):
  40. product = create_product(partner_sku='123123')
  41. self.range.add_product(product)
  42. form = self.submit_form({'query': '123123'})
  43. self.assertFalse(form.is_valid())
  44. def test_dupe_skus_are_available(self):
  45. product = create_product(partner_sku='123123')
  46. create_product(partner_sku='123124')
  47. self.range.add_product(product)
  48. form = self.submit_form({'query': '123123, 123124'})
  49. self.assertTrue(form.is_valid())
  50. self.assertTrue('123123' in form.get_duplicate_skus())
  51. class RangeProductViewTest(WebTestCase):
  52. is_staff = True
  53. def setUp(self):
  54. super().setUp()
  55. self.range = Range.objects.create(name='dummy')
  56. self.url = reverse('dashboard:range-products', args=(self.range.id,))
  57. self.product1 = create_product(
  58. title='Product 1', partner_sku='123123', partner_name='Partner 1'
  59. )
  60. self.product2 = create_product(
  61. title='Product 2', partner_sku='123123', partner_name='Partner 2'
  62. )
  63. self.product3 = create_product(partner_sku='456')
  64. self.product4 = create_product(partner_sku='789')
  65. self.parent = create_product(upc="1234", structure="parent")
  66. self.child1 = create_product(upc="1234.345", structure="child", parent=self.parent)
  67. self.child2 = create_product(upc="1234-345", structure="child", parent=self.parent)
  68. def test_upload_file_with_skus(self):
  69. range_products_page = self.get(self.url)
  70. form = range_products_page.form
  71. form['file_upload'] = Upload('new_skus.txt', b'456')
  72. form.submit().follow()
  73. all_products = self.range.all_products()
  74. self.assertEqual(len(all_products), 1)
  75. self.assertTrue(self.product3 in all_products)
  76. range_product_file_upload = RangeProductFileUpload.objects.get()
  77. self.assertEqual(range_product_file_upload.range, self.range)
  78. self.assertEqual(range_product_file_upload.num_new_skus, 1)
  79. self.assertEqual(range_product_file_upload.status, RangeProductFileUpload.PROCESSED)
  80. self.assertEqual(range_product_file_upload.size, 3)
  81. def test_dupe_skus_warning(self):
  82. self.range.add_product(self.product3)
  83. range_products_page = self.get(self.url)
  84. form = range_products_page.forms[0]
  85. form['query'] = '456'
  86. response = form.submit()
  87. self.assertEqual(list(response.context['messages']), [])
  88. self.assertEqual(
  89. response.context['form'].errors['query'],
  90. ['The products with SKUs or UPCs matching 456 are already in this range']
  91. )
  92. form = response.forms[0]
  93. form['query'] = '456, 789'
  94. response = form.submit().follow()
  95. messages = list(response.context['messages'])
  96. self.assertEqual(len(messages), 2)
  97. self.assertEqual(messages[0].level, SUCCESS)
  98. self.assertEqual(messages[0].message, '1 product added to range')
  99. self.assertEqual(messages[1].level, WARNING)
  100. self.assertEqual(
  101. messages[1].message,
  102. 'The products with SKUs or UPCs matching 456 are already in this range'
  103. )
  104. def test_missing_skus_warning(self):
  105. range_products_page = self.get(self.url)
  106. form = range_products_page.form
  107. form['query'] = '321'
  108. response = form.submit()
  109. self.assertEqual(list(response.context['messages']), [])
  110. self.assertEqual(
  111. response.context['form'].errors['query'],
  112. ['No products exist with a SKU or UPC matching 321']
  113. )
  114. form = range_products_page.form
  115. form['query'] = '456, 321'
  116. response = form.submit().follow()
  117. messages = list(response.context['messages'])
  118. self.assertEqual(len(messages), 2)
  119. self.assertEqual(messages[0].level, SUCCESS)
  120. self.assertEqual(messages[0].message, '1 product added to range')
  121. self.assertEqual(messages[1].level, WARNING)
  122. self.assertEqual(
  123. messages[1].message, 'No product(s) were found with SKU or UPC matching 321'
  124. )
  125. def test_same_skus_within_different_products_warning_query(self):
  126. range_products_page = self.get(self.url)
  127. form = range_products_page.form
  128. form['query'] = '123123'
  129. response = form.submit().follow()
  130. messages = list(response.context['messages'])
  131. self.assertEqual(len(messages), 2)
  132. self.assertEqual(messages[1].level, WARNING)
  133. self.assertEqual(
  134. messages[1].message, 'There are more than one product with SKU 123123'
  135. )
  136. def test_same_skus_within_different_products_warning_file_upload(self):
  137. range_products_page = self.get(self.url)
  138. form = range_products_page.form
  139. form['file_upload'] = Upload('skus.txt', b'123123')
  140. response = form.submit().follow()
  141. messages = list(response.context['messages'])
  142. self.assertEqual(len(messages), 2)
  143. self.assertEqual(messages[1].level, WARNING)
  144. self.assertEqual(
  145. messages[1].message, 'There are more than one product with SKU 123123'
  146. )
  147. def test_adding_child_does_not_add_parent(self):
  148. range_products_page = self.get(self.url)
  149. form = range_products_page.forms[0]
  150. form['query'] = '1234.345'
  151. form.submit().follow()
  152. all_products = self.range.all_products()
  153. self.assertEqual(len(all_products), 1)
  154. self.assertFalse(self.range.contains_product(self.parent))
  155. self.assertTrue(self.range.contains_product(self.child1))
  156. self.assertFalse(self.range.contains_product(self.child2))
  157. form = range_products_page.forms[0]
  158. form['query'] = '1234-345'
  159. form.submit().follow()
  160. all_products = self.range.all_products()
  161. self.assertEqual(len(all_products), 1)
  162. self.assertTrue(self.range.contains_product(self.child1))
  163. self.assertTrue(self.range.contains_product(self.child2))
  164. self.assertFalse(self.range.contains_product(self.parent))
  165. def test_adding_multiple_children_does_not_add_parent(self):
  166. range_products_page = self.get(self.url)
  167. form = range_products_page.forms[0]
  168. form['query'] = '1234.345 1234-345'
  169. form.submit().follow()
  170. all_products = self.range.all_products()
  171. self.assertEqual(len(all_products), 2)
  172. self.assertTrue(self.range.contains_product(self.child1))
  173. self.assertTrue(self.range.contains_product(self.child2))
  174. self.assertFalse(self.range.contains_product(self.parent))
  175. def test_adding_multiple_comma_separated_children_does_not_add_parent(self):
  176. range_products_page = self.get(self.url)
  177. form = range_products_page.forms[0]
  178. form['query'] = '1234.345, 1234-345'
  179. form.submit().follow()
  180. all_products = self.range.all_products()
  181. self.assertEqual(len(all_products), 2)
  182. self.assertTrue(self.range.contains_product(self.child1))
  183. self.assertTrue(self.range.contains_product(self.child2))
  184. self.assertFalse(self.range.contains_product(self.parent))
  185. class RangeReorderViewTest(WebTestCase):
  186. is_staff = True
  187. csrf_checks = False
  188. def setUp(self):
  189. super().setUp()
  190. self.range = Range.objects.create(name='dummy')
  191. self.url = reverse('dashboard:range-reorder', args=(self.range.id,))
  192. self.product1 = create_product()
  193. self.product2 = create_product()
  194. self.product3 = create_product()
  195. self.range.included_products.set([
  196. self.product1, self.product2, self.product3])
  197. def test_range_product_reordering(self):
  198. product_order = list(self.range.rangeproduct_set.values_list(
  199. 'product_id', flat=True))
  200. random.shuffle(product_order)
  201. data = {'product': product_order}
  202. self.post(self.url, params=data)
  203. new_product_order = list(self.range.rangeproduct_set.values_list(
  204. 'product_id', flat=True).order_by('display_order'))
  205. self.assertEqual(new_product_order, product_order)