Nelze vybrat více než 25 témat Téma musí začínat písmenem nebo číslem, může obsahovat pomlčky („-“) a může být dlouhé až 35 znaků.

test_offer.py 12KB

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