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_offer.py 11KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312
  1. from django.urls import reverse
  2. from django.utils import timezone
  3. from oscar.apps.offer import models
  4. from oscar.test import factories, testcases
  5. class TestAnAdmin(testcases.WebTestCase):
  6. # New version of offer tests buy using WebTest
  7. is_staff = True
  8. def setUp(self):
  9. super().setUp()
  10. self.range = models.Range.objects.create(
  11. name="All products", includes_all_products=True)
  12. def test_can_create_an_offer(self):
  13. list_page = self.get(reverse('dashboard:offer-list'))
  14. metadata_page = list_page.click('Create new offer')
  15. metadata_form = metadata_page.form
  16. metadata_form['name'] = "Test offer"
  17. metadata_form['offer_type'] = models.ConditionalOffer.SITE
  18. benefit_page = metadata_form.submit().follow()
  19. benefit_form = benefit_page.form
  20. benefit_form['range'] = self.range.id
  21. benefit_form['type'] = "Percentage"
  22. benefit_form['value'] = "25"
  23. condition_page = benefit_form.submit().follow()
  24. condition_form = condition_page.form
  25. condition_form['range'] = self.range.id
  26. condition_form['type'] = "Count"
  27. condition_form['value'] = "3"
  28. restrictions_page = condition_form.submit().follow()
  29. restrictions_page.form.submit()
  30. offers = models.ConditionalOffer.objects.all()
  31. self.assertEqual(1, len(offers))
  32. offer = offers[0]
  33. self.assertEqual("Test offer", offer.name)
  34. self.assertEqual(3, offer.condition.value)
  35. self.assertEqual(25, offer.benefit.value)
  36. def test_offer_list_page(self):
  37. offer = factories.create_offer(name="Offer A")
  38. list_page = self.get(reverse('dashboard:offer-list'))
  39. form = list_page.forms[0]
  40. form['name'] = "I do not exist"
  41. res = form.submit()
  42. self.assertTrue("No offers found" in res.text)
  43. form['name'] = "Offer A"
  44. res = form.submit()
  45. self.assertFalse("No offers found" in res.text)
  46. form['is_active'] = "true"
  47. res = form.submit()
  48. self.assertFalse("No offers found" in res.text)
  49. yesterday = timezone.now() - timezone.timedelta(days=1)
  50. offer.end_datetime = yesterday
  51. offer.save()
  52. form['is_active'] = "true"
  53. res = form.submit()
  54. self.assertTrue("No offers found" in res.text)
  55. tomorrow = timezone.now() + timezone.timedelta(days=1)
  56. offer.end_datetime = tomorrow
  57. offer.save()
  58. form['offer_type'] = "Site"
  59. res = form.submit()
  60. self.assertFalse("No offers found" in res.text)
  61. form['offer_type'] = "Voucher"
  62. res = form.submit()
  63. self.assertTrue("No offers found" in res.text)
  64. def test_can_update_an_existing_offer(self):
  65. factories.create_offer(name="Offer A")
  66. list_page = self.get(reverse('dashboard:offer-list'))
  67. detail_page = list_page.click('Offer A')
  68. metadata_page = detail_page.click(linkid="edit_metadata")
  69. metadata_form = metadata_page.form
  70. metadata_form['name'] = "Offer A+"
  71. metadata_form['offer_type'] = models.ConditionalOffer.SITE
  72. benefit_page = metadata_form.submit().follow()
  73. benefit_form = benefit_page.form
  74. condition_page = benefit_form.submit().follow()
  75. condition_form = condition_page.form
  76. restrictions_page = condition_form.submit().follow()
  77. restrictions_page.form.submit()
  78. models.ConditionalOffer.objects.get(name="Offer A+")
  79. def test_can_update_an_existing_offer_save_directly(self):
  80. # see if we can save the offer directly without completing all
  81. # steps
  82. offer = factories.create_offer(name="Offer A")
  83. name_and_description_page = self.get(
  84. reverse('dashboard:offer-metadata', kwargs={'pk': offer.pk}))
  85. res = name_and_description_page.form.submit('save').follow()
  86. self.assertEqual(200, res.status_code)
  87. def test_can_jump_to_intermediate_step_for_existing_offer(self):
  88. offer = factories.create_offer()
  89. url = reverse('dashboard:offer-condition',
  90. kwargs={'pk': offer.id})
  91. self.assertEqual(200, self.get(url).status_code)
  92. def test_cannot_jump_to_intermediate_step(self):
  93. for url_name in ('dashboard:offer-condition',
  94. 'dashboard:offer-benefit',
  95. 'dashboard:offer-restrictions'):
  96. response = self.get(reverse(url_name))
  97. self.assertEqual(302, response.status_code)
  98. def test_can_suspend_an_offer(self):
  99. # Create an offer
  100. offer = factories.create_offer()
  101. self.assertFalse(offer.is_suspended)
  102. detail_page = self.get(reverse('dashboard:offer-detail',
  103. kwargs={'pk': offer.pk}))
  104. form = detail_page.forms['status_form']
  105. form.submit('suspend')
  106. offer.refresh_from_db()
  107. self.assertTrue(offer.is_suspended)
  108. def test_can_reinstate_a_suspended_offer(self):
  109. # Create a suspended offer
  110. offer = factories.create_offer()
  111. offer.suspend()
  112. self.assertTrue(offer.is_suspended)
  113. detail_page = self.get(reverse('dashboard:offer-detail',
  114. kwargs={'pk': offer.pk}))
  115. form = detail_page.forms['status_form']
  116. form.submit('unsuspend')
  117. offer.refresh_from_db()
  118. self.assertFalse(offer.is_suspended)
  119. def test_can_change_offer_priority(self):
  120. offer = factories.create_offer()
  121. restrictions_page = self.get(reverse('dashboard:offer-restrictions', kwargs={'pk': offer.pk}))
  122. restrictions_page.form['priority'] = '12'
  123. restrictions_page.form.submit()
  124. offer.refresh_from_db()
  125. self.assertEqual(offer.priority, 12)
  126. def test_jump_back_to_incentive_step_for_new_offer(self):
  127. list_page = self.get(reverse('dashboard:offer-list'))
  128. metadata_page = list_page.click('Create new offer')
  129. metadata_form = metadata_page.form
  130. metadata_form['name'] = "Test offer"
  131. metadata_form['offer_type'] = models.ConditionalOffer.SITE
  132. benefit_page = metadata_form.submit().follow()
  133. benefit_form = benefit_page.form
  134. benefit_form['range'] = self.range.id
  135. benefit_form['type'] = "Percentage"
  136. benefit_form['value'] = "25"
  137. benefit_form.submit()
  138. benefit_page = self.get(reverse('dashboard:offer-benefit'))
  139. # Accessing through context because WebTest form does not include an 'errors' field
  140. benefit_form = benefit_page.context['form']
  141. self.assertFalse('range' in benefit_form.errors)
  142. self.assertEqual(len(benefit_form.errors), 0)
  143. def test_jump_back_to_condition_step_for_new_offer(self):
  144. list_page = self.get(reverse('dashboard:offer-list'))
  145. metadata_page = list_page.click('Create new offer')
  146. metadata_form = metadata_page.form
  147. metadata_form['name'] = "Test offer"
  148. metadata_form['offer_type'] = models.ConditionalOffer.SITE
  149. benefit_page = metadata_form.submit().follow()
  150. benefit_form = benefit_page.form
  151. benefit_form['range'] = self.range.id
  152. benefit_form['type'] = "Percentage"
  153. benefit_form['value'] = "25"
  154. condition_page = benefit_form.submit().follow()
  155. condition_form = condition_page.form
  156. condition_form['range'] = self.range.id
  157. condition_form['type'] = "Count"
  158. condition_form['value'] = "3"
  159. condition_form.submit()
  160. condition_page = self.get(reverse('dashboard:offer-condition'))
  161. self.assertFalse('range' in condition_page.errors)
  162. self.assertEqual(len(condition_page.errors), 0)
  163. def test_jump_to_incentive_step_for_existing_offer(self):
  164. offer = factories.create_offer()
  165. url = reverse('dashboard:offer-benefit', kwargs={'pk': offer.id})
  166. condition_page = self.get(url)
  167. self.assertFalse('range' in condition_page.errors)
  168. self.assertEqual(len(condition_page.errors), 0)
  169. def test_jump_to_condition_step_for_existing_offer(self):
  170. offer = factories.create_offer()
  171. url = reverse('dashboard:offer-condition', kwargs={'pk': offer.id})
  172. condition_page = self.get(url)
  173. self.assertFalse('range' in condition_page.errors)
  174. self.assertEqual(len(condition_page.errors), 0)
  175. def test_remove_offer_from_combinations(self):
  176. offer_a = factories.create_offer("Offer A")
  177. offer_b = factories.create_offer("Offer B")
  178. offer_b.exclusive = False
  179. offer_b.save()
  180. restrictions_page = self.get(reverse(
  181. 'dashboard:offer-restrictions', kwargs={'pk': offer_a.pk}))
  182. restrictions_page.form['exclusive'] = False
  183. restrictions_page.form['combinations'] = [offer_b.id]
  184. restrictions_page.form.submit()
  185. self.assertIn(offer_a, offer_b.combinations.all())
  186. restrictions_page = self.get(reverse(
  187. 'dashboard:offer-restrictions', kwargs={'pk': offer_a.pk}))
  188. restrictions_page.form['combinations'] = []
  189. restrictions_page.form.submit()
  190. self.assertNotIn(offer_a, offer_b.combinations.all())
  191. class TestOfferListSearch(testcases.WebTestCase):
  192. is_staff = True
  193. TEST_CASES = [
  194. ({}, []),
  195. (
  196. {'name': 'Bob Smith'},
  197. ['Name matches "Bob Smith"']
  198. ),
  199. (
  200. {'is_active': True},
  201. ['Is active']
  202. ),
  203. (
  204. {'is_active': False},
  205. ['Is inactive']
  206. ),
  207. (
  208. {'offer_type': 'Site'},
  209. ['Is of type "Site offer - available to all users"']
  210. ),
  211. (
  212. {'has_vouchers': True},
  213. ['Has vouchers']
  214. ),
  215. (
  216. {'has_vouchers': False},
  217. ['Has no vouchers']
  218. ),
  219. (
  220. {'voucher_code': 'abcd1234'},
  221. ['Voucher code matches "abcd1234"']
  222. ),
  223. (
  224. {
  225. 'name': 'Bob Smith',
  226. 'is_active': True,
  227. 'offer_type': 'Site',
  228. 'has_vouchers': True,
  229. 'voucher_code': 'abcd1234',
  230. },
  231. [
  232. 'Name matches "Bob Smith"',
  233. 'Is active',
  234. 'Is of type "Site offer - available to all users"',
  235. 'Has vouchers',
  236. 'Voucher code matches "abcd1234"',
  237. ]
  238. ),
  239. ]
  240. def test_search_filter_descriptions(self):
  241. url = reverse('dashboard:offer-list')
  242. for params, expected_filters in self.TEST_CASES:
  243. response = self.get(url, params=params)
  244. self.assertEqual(response.status_code, 200)
  245. applied_filters = [
  246. el.text.strip() for el in
  247. response.html.select('.search-filter-list .badge')
  248. ]
  249. self.assertEqual(applied_filters, expected_filters)