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.

test_offer_views.py 30KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733
  1. import json
  2. import pytest
  3. from django.contrib.messages import get_messages
  4. from django.test import TestCase
  5. from django.urls import reverse
  6. from freezegun import freeze_time
  7. from oscar.apps.dashboard.offers import views as offer_views
  8. from oscar.apps.dashboard.ranges import views as range_views
  9. from oscar.apps.offer.custom import create_benefit, create_condition
  10. from oscar.core.loading import get_model
  11. from oscar.test.factories.catalogue import ProductFactory
  12. from oscar.test.factories.offer import ConditionalOfferFactory, RangeFactory
  13. from oscar.test.factories.voucher import VoucherFactory
  14. from tests._site.model_tests_app.models import (
  15. CustomBenefitModel, CustomConditionModel)
  16. from tests.fixtures import RequestFactory
  17. Range = get_model('offer', 'Range')
  18. ConditionalOffer = get_model('offer', 'ConditionalOffer')
  19. Benefit = get_model('offer', 'Benefit')
  20. Condition = get_model('offer', 'Condition')
  21. @pytest.fixture
  22. def many_ranges():
  23. for i in range(0, 30):
  24. RangeFactory()
  25. return Range.objects.all()
  26. @pytest.fixture
  27. def many_offers():
  28. for i in range(0, 30):
  29. ConditionalOfferFactory(
  30. name='Test offer %d' % i
  31. )
  32. @pytest.fixture
  33. def range_with_products():
  34. productrange = RangeFactory()
  35. for i in range(0, 30):
  36. product = ProductFactory()
  37. productrange.add_product(product)
  38. return productrange
  39. @pytest.mark.django_db
  40. class TestDashboardOffers:
  41. def test_range_list_view(self, rf, many_ranges):
  42. request = rf.get('/')
  43. view = range_views.RangeListView.as_view()
  44. response = view(request)
  45. # if these are missing the pagination is broken
  46. assert response.context_data['paginator']
  47. assert response.context_data['page_obj']
  48. assert response.status_code == 200
  49. def test_offer_list_view(self, rf, many_offers):
  50. request = rf.get('/')
  51. view = offer_views.OfferListView.as_view()
  52. response = view(request)
  53. # if these are missing the pagination is broken
  54. assert response.context_data['paginator']
  55. assert response.context_data['page_obj']
  56. assert response.status_code == 200
  57. def test_offer_delete_view_for_voucher_offer_without_vouchers(self):
  58. offer = ConditionalOfferFactory(offer_type=ConditionalOffer.VOUCHER)
  59. view = offer_views.OfferDeleteView.as_view()
  60. request = RequestFactory().get('/')
  61. response = view(request, pk=offer.pk)
  62. assert response.status_code == 200
  63. request = RequestFactory().post('/')
  64. response = view(request, pk=offer.pk)
  65. assert response.status_code == 302
  66. assert response.url == reverse('dashboard:offer-list')
  67. assert [(m.level_tag, str(m.message)) for m in get_messages(request)][0] == ('success', "Offer deleted!")
  68. assert not ConditionalOffer.objects.exists()
  69. def test_offer_delete_view_for_voucher_offer_with_vouchers(self):
  70. offer = ConditionalOfferFactory(offer_type=ConditionalOffer.VOUCHER)
  71. VoucherFactory().offers.add(offer)
  72. view = offer_views.OfferDeleteView.as_view()
  73. request = RequestFactory().get('/')
  74. response = view(request, pk=offer.pk)
  75. assert response.status_code == 302
  76. assert response.url == reverse('dashboard:offer-detail', kwargs={'pk': offer.pk})
  77. assert [(m.level_tag, str(m.message)) for m in get_messages(request)][0] == (
  78. 'warning', "This offer can only be deleted if it has no vouchers attached to it")
  79. request = RequestFactory().post('/')
  80. response = view(request, pk=offer.pk)
  81. assert response.status_code == 302
  82. assert response.url == reverse('dashboard:offer-detail', kwargs={'pk': offer.pk})
  83. assert [(m.level_tag, str(m.message)) for m in get_messages(request)][0] == (
  84. 'warning', "This offer can only be deleted if it has no vouchers attached to it")
  85. assert ConditionalOffer.objects.exists()
  86. def test_range_product_list_view(self, rf, range_with_products):
  87. view = range_views.RangeProductListView.as_view()
  88. pk = range_with_products.pk
  89. request = rf.get('/')
  90. response = view(request, pk=pk)
  91. # if these are missing the pagination is broken
  92. assert response.context_data['paginator']
  93. assert response.context_data['page_obj']
  94. assert response.status_code == 200
  95. class TestCreateOfferWizardStepView(TestCase):
  96. def setUp(self):
  97. range_ = RangeFactory()
  98. self.metadata_form_kwargs_session_data = {
  99. 'data': {
  100. 'name': 'Test offer',
  101. 'slug': '',
  102. 'description': 'Test description',
  103. 'offer_type': ConditionalOffer.SITE,
  104. 'exclusive': True,
  105. 'status': ConditionalOffer.OPEN,
  106. 'condition': None,
  107. 'benefit': None,
  108. 'priority': 0,
  109. 'start_datetime': None,
  110. 'end_datetime': None,
  111. 'max_global_applications': None,
  112. 'max_user_applications': None,
  113. 'max_basket_applications': None,
  114. 'max_discount': None,
  115. 'total_discount': '0.00',
  116. 'num_applications': 0,
  117. 'num_orders': 0,
  118. 'redirect_url': '',
  119. 'date_created': None,
  120. },
  121. }
  122. self.metadata_obj_session_data = [{
  123. 'model': 'offer.conditionaloffer',
  124. 'pk': None,
  125. 'fields': {
  126. 'name': 'Test offer',
  127. 'description': 'Test description',
  128. 'offer_type': ConditionalOffer.SITE,
  129. },
  130. }]
  131. self.benefit_form_kwargs_session_data = {
  132. 'data': {
  133. 'range': range_.pk,
  134. 'type': Benefit.PERCENTAGE,
  135. 'value': '10',
  136. 'max_affected_items': None,
  137. 'custom_benefit': '',
  138. },
  139. }
  140. self.benefit_obj_session_data = [{
  141. 'model': 'offer.benefit',
  142. 'pk': None,
  143. 'fields': {
  144. 'range': range_.pk,
  145. 'type': Benefit.PERCENTAGE,
  146. 'value': '10',
  147. 'max_affected_items': None,
  148. 'proxy_class': None,
  149. },
  150. }]
  151. self.condition_form_kwargs_session_data = {
  152. 'data': {
  153. 'range': range_.pk,
  154. 'type': Condition.COUNT,
  155. 'value': '10',
  156. 'custom_condition': '',
  157. },
  158. }
  159. self.condition_obj_session_data = [{
  160. 'model': 'offer.condition',
  161. 'pk': None,
  162. 'fields': {
  163. 'range': range_.pk,
  164. 'type': Condition.COUNT,
  165. 'value': '10',
  166. 'proxy_class': None,
  167. },
  168. }]
  169. def test_offer_meta_data_view(self):
  170. request = RequestFactory().post('/', data={
  171. 'name': 'Test offer',
  172. 'description': 'Test description',
  173. 'offer_type': ConditionalOffer.SITE,
  174. })
  175. response = offer_views.OfferMetaDataView.as_view()(request)
  176. self.assertEqual(response.status_code, 302)
  177. self.assertEqual(response.url, reverse('dashboard:offer-benefit'))
  178. self.assertJSONEqual(request.session['offer_wizard']['metadata'], {
  179. 'data': {
  180. 'name': 'Test offer',
  181. 'description': 'Test description',
  182. 'offer_type': ConditionalOffer.SITE,
  183. },
  184. })
  185. self.assertJSONEqual(request.session['offer_wizard']['metadata_obj'], [{
  186. 'model': 'offer.conditionaloffer',
  187. 'pk': None,
  188. 'fields': {
  189. 'name': 'Test offer',
  190. 'slug': '',
  191. 'description': 'Test description',
  192. 'offer_type': ConditionalOffer.SITE,
  193. 'exclusive': True,
  194. 'status': ConditionalOffer.OPEN,
  195. 'condition': None,
  196. 'benefit': None,
  197. 'priority': 0,
  198. 'start_datetime': None,
  199. 'end_datetime': None,
  200. 'max_global_applications': None,
  201. 'max_user_applications': None,
  202. 'max_basket_applications': None,
  203. 'max_discount': None,
  204. 'total_discount': '0.00',
  205. 'num_applications': 0,
  206. 'num_orders': 0,
  207. 'redirect_url': '',
  208. 'date_created': None,
  209. },
  210. }])
  211. def test_offer_benefit_view_with_built_in_benefit_type(self):
  212. range_ = RangeFactory()
  213. request = RequestFactory().post('/', data={
  214. 'range': range_.pk,
  215. 'type': Benefit.PERCENTAGE,
  216. 'value': 10,
  217. })
  218. request.session['offer_wizard'] = {
  219. 'metadata': json.dumps(self.metadata_form_kwargs_session_data),
  220. 'metadata_obj': json.dumps(self.metadata_obj_session_data),
  221. }
  222. response = offer_views.OfferBenefitView.as_view()(request)
  223. self.assertEqual(response.status_code, 302)
  224. self.assertEqual(response.url, reverse('dashboard:offer-condition'))
  225. self.assertJSONEqual(request.session['offer_wizard']['metadata'], self.metadata_form_kwargs_session_data)
  226. self.assertJSONEqual(request.session['offer_wizard']['metadata_obj'], self.metadata_obj_session_data)
  227. self.assertJSONEqual(request.session['offer_wizard']['benefit'], {
  228. 'data': {
  229. 'range': range_.pk,
  230. 'type': Benefit.PERCENTAGE,
  231. 'value': '10',
  232. 'max_affected_items': None,
  233. 'custom_benefit': '',
  234. },
  235. })
  236. self.assertJSONEqual(request.session['offer_wizard']['benefit_obj'], [{
  237. 'model': 'offer.benefit',
  238. 'pk': None,
  239. 'fields': {
  240. 'range': range_.pk,
  241. 'type': Benefit.PERCENTAGE,
  242. 'value': '10',
  243. 'max_affected_items': None,
  244. 'proxy_class': None,
  245. },
  246. }])
  247. def test_offer_benefit_view_with_custom_benefit_type(self):
  248. benefit = create_benefit(CustomBenefitModel)
  249. request = RequestFactory().post('/', data={
  250. 'custom_benefit': benefit.pk,
  251. })
  252. request.session['offer_wizard'] = {
  253. 'metadata': json.dumps(self.metadata_form_kwargs_session_data),
  254. 'metadata_obj': json.dumps(self.metadata_obj_session_data),
  255. }
  256. response = offer_views.OfferBenefitView.as_view()(request)
  257. self.assertEqual(response.status_code, 302)
  258. self.assertEqual(response.url, reverse('dashboard:offer-condition'))
  259. self.assertJSONEqual(request.session['offer_wizard']['metadata'], self.metadata_form_kwargs_session_data)
  260. self.assertJSONEqual(request.session['offer_wizard']['metadata_obj'], self.metadata_obj_session_data)
  261. self.assertJSONEqual(request.session['offer_wizard']['benefit'], {
  262. 'data': {
  263. 'range': None,
  264. 'type': '',
  265. 'value': None,
  266. 'max_affected_items': None,
  267. 'custom_benefit': str(benefit.pk),
  268. },
  269. })
  270. self.assertJSONEqual(request.session['offer_wizard']['benefit_obj'], [{
  271. 'model': 'offer.benefit',
  272. 'pk': benefit.pk,
  273. 'fields': {
  274. 'range': None,
  275. 'type': '',
  276. 'value': None,
  277. 'max_affected_items': None,
  278. 'proxy_class': benefit.proxy_class,
  279. }
  280. }])
  281. def test_offer_condition_view_with_built_in_condition_type(self):
  282. range_ = RangeFactory()
  283. request = RequestFactory().post('/', data={
  284. 'range': range_.pk,
  285. 'type': Condition.COUNT,
  286. 'value': 10,
  287. })
  288. request.session['offer_wizard'] = {
  289. 'metadata': json.dumps(self.metadata_form_kwargs_session_data),
  290. 'metadata_obj': json.dumps(self.metadata_obj_session_data),
  291. 'benefit': json.dumps(self.benefit_form_kwargs_session_data),
  292. 'benefit_obj': json.dumps(self.benefit_obj_session_data),
  293. }
  294. response = offer_views.OfferConditionView.as_view()(request)
  295. self.assertEqual(response.status_code, 302)
  296. self.assertEqual(response.url, reverse('dashboard:offer-restrictions'))
  297. self.assertJSONEqual(request.session['offer_wizard']['metadata'], self.metadata_form_kwargs_session_data)
  298. self.assertJSONEqual(request.session['offer_wizard']['metadata_obj'], self.metadata_obj_session_data)
  299. self.assertJSONEqual(request.session['offer_wizard']['benefit'], self.benefit_form_kwargs_session_data)
  300. self.assertJSONEqual(request.session['offer_wizard']['benefit_obj'], self.benefit_obj_session_data)
  301. self.assertJSONEqual(request.session['offer_wizard']['condition'], {
  302. 'data': {
  303. 'range': range_.pk,
  304. 'type': Condition.COUNT,
  305. 'value': '10',
  306. 'custom_condition': '',
  307. },
  308. })
  309. self.assertJSONEqual(request.session['offer_wizard']['condition_obj'], [{
  310. 'model': 'offer.condition',
  311. 'pk': None,
  312. 'fields': {
  313. 'range': range_.pk,
  314. 'type': Condition.COUNT,
  315. 'value': '10',
  316. 'proxy_class': None,
  317. },
  318. }])
  319. def test_offer_condition_view_with_custom_condition_type(self):
  320. range_ = RangeFactory()
  321. condition = create_condition(CustomConditionModel)
  322. request = RequestFactory().post('/', data={
  323. 'range': range_.pk,
  324. 'custom_condition': condition.pk,
  325. })
  326. request.session['offer_wizard'] = {
  327. 'metadata': json.dumps(self.metadata_form_kwargs_session_data),
  328. 'metadata_obj': json.dumps(self.metadata_obj_session_data),
  329. 'benefit': json.dumps(self.benefit_form_kwargs_session_data),
  330. 'benefit_obj': json.dumps(self.benefit_obj_session_data),
  331. }
  332. response = offer_views.OfferConditionView.as_view()(request)
  333. self.assertEqual(response.status_code, 302)
  334. self.assertEqual(response.url, reverse('dashboard:offer-restrictions'))
  335. self.assertJSONEqual(request.session['offer_wizard']['metadata'], self.metadata_form_kwargs_session_data)
  336. self.assertJSONEqual(request.session['offer_wizard']['metadata_obj'], self.metadata_obj_session_data)
  337. self.assertJSONEqual(request.session['offer_wizard']['benefit'], self.benefit_form_kwargs_session_data)
  338. self.assertJSONEqual(request.session['offer_wizard']['benefit_obj'], self.benefit_obj_session_data)
  339. self.assertJSONEqual(request.session['offer_wizard']['condition'], {
  340. 'data': {
  341. 'range': range_.pk,
  342. 'type': '',
  343. 'value': None,
  344. 'custom_condition': str(condition.pk),
  345. },
  346. })
  347. self.assertJSONEqual(request.session['offer_wizard']['condition_obj'], [{
  348. 'model': 'offer.condition',
  349. 'pk': condition.pk,
  350. 'fields': {
  351. 'range': None,
  352. 'type': '',
  353. 'value': None,
  354. 'proxy_class': condition.proxy_class,
  355. }
  356. }])
  357. def test_offer_restrictions_view(self):
  358. request = RequestFactory().post('/', data={
  359. 'priority': 0,
  360. })
  361. request.session['offer_wizard'] = {
  362. 'metadata': json.dumps(self.metadata_form_kwargs_session_data),
  363. 'metadata_obj': json.dumps(self.metadata_obj_session_data),
  364. 'benefit': json.dumps(self.benefit_form_kwargs_session_data),
  365. 'benefit_obj': json.dumps(self.benefit_obj_session_data),
  366. 'condition': json.dumps(self.condition_form_kwargs_session_data),
  367. 'condition_obj': json.dumps(self.condition_obj_session_data),
  368. }
  369. response = offer_views.OfferRestrictionsView.as_view()(request)
  370. offer = ConditionalOffer.objects.get()
  371. self.assertEqual(response.status_code, 302)
  372. self.assertEqual(response.url, reverse('dashboard:offer-detail', kwargs={'pk': offer.pk}))
  373. self.assertEqual([(m.level_tag, str(m.message)) for m in get_messages(request)][0],
  374. ('success', "Offer '%s' created!" % offer.name))
  375. self.assertEqual(request.session['offer_wizard'], {})
  376. @freeze_time('2021-04-23 14:00:00')
  377. class TestUpdateOfferWizardStepView(TestCase):
  378. def setUp(self):
  379. self.offer = ConditionalOfferFactory()
  380. self.metadata_form_kwargs_key = 'metadata%s' % self.offer.pk
  381. self.metadata_obj_key = 'metadata%s_obj' % self.offer.pk
  382. self.benefit_form_kwargs_key = 'benefit%s' % self.offer.pk
  383. self.benefit_obj_key = 'benefit%s_obj' % self.offer.pk
  384. self.condition_form_kwargs_key = 'condition%s' % self.offer.pk
  385. self.condition_obj_key = 'condition%s_obj' % self.offer.pk
  386. range_ = RangeFactory()
  387. self.metadata_form_kwargs_session_data = {
  388. 'data': {
  389. 'name': 'Test offer',
  390. 'slug': self.offer.slug,
  391. 'description': 'Test description',
  392. 'offer_type': ConditionalOffer.VOUCHER,
  393. 'exclusive': True,
  394. 'status': ConditionalOffer.OPEN,
  395. 'condition': self.offer.condition.pk,
  396. 'benefit': self.offer.benefit.pk,
  397. 'priority': 0,
  398. 'start_datetime': None,
  399. 'end_datetime': None,
  400. 'max_global_applications': None,
  401. 'max_user_applications': None,
  402. 'max_basket_applications': None,
  403. 'max_discount': None,
  404. 'total_discount': '0.00',
  405. 'num_applications': 0,
  406. 'num_orders': 0,
  407. 'redirect_url': '',
  408. 'date_created': '2021-04-23T14:00:00Z',
  409. },
  410. }
  411. self.metadata_obj_session_data = [{
  412. 'model': 'offer.conditionaloffer',
  413. 'pk': None,
  414. 'fields': {
  415. 'name': 'Test offer',
  416. 'description': 'Test description',
  417. 'offer_type': ConditionalOffer.VOUCHER,
  418. },
  419. }]
  420. self.benefit_form_kwargs_session_data = {
  421. 'data': {
  422. 'range': range_.pk,
  423. 'type': Benefit.FIXED,
  424. 'value': '2000',
  425. 'max_affected_items': 2,
  426. 'custom_benefit': '',
  427. },
  428. }
  429. self.benefit_obj_session_data = [{
  430. 'model': 'offer.benefit',
  431. 'pk': None,
  432. 'fields': {
  433. 'range': range_.pk,
  434. 'type': Benefit.FIXED,
  435. 'value': '2000',
  436. 'max_affected_items': 2,
  437. 'proxy_class': '',
  438. },
  439. }]
  440. self.condition_form_kwargs_session_data = {
  441. 'data': {
  442. 'range': range_.pk,
  443. 'type': Condition.VALUE,
  444. 'value': '2000',
  445. 'custom_condition': '',
  446. },
  447. }
  448. self.condition_obj_session_data = [{
  449. 'model': 'offer.condition',
  450. 'pk': None,
  451. 'fields': {
  452. 'range': range_.pk,
  453. 'type': Condition.VALUE,
  454. 'value': '2000',
  455. 'proxy_class': '',
  456. },
  457. }]
  458. def test_offer_meta_data_view(self):
  459. request = RequestFactory().post('/', data={
  460. 'name': 'Test offer',
  461. 'description': 'Test description',
  462. 'offer_type': ConditionalOffer.VOUCHER,
  463. })
  464. response = offer_views.OfferMetaDataView.as_view(update=True)(request, pk=self.offer.pk)
  465. self.assertEqual(response.status_code, 302)
  466. self.assertEqual(response.url, reverse('dashboard:offer-benefit', kwargs={'pk': self.offer.pk}))
  467. self.assertJSONEqual(request.session['offer_wizard'][self.metadata_form_kwargs_key], {
  468. 'data': {
  469. 'name': 'Test offer',
  470. 'description': 'Test description',
  471. 'offer_type': ConditionalOffer.VOUCHER,
  472. },
  473. })
  474. self.assertJSONEqual(request.session['offer_wizard'][self.metadata_obj_key], [{
  475. 'model': 'offer.conditionaloffer',
  476. 'pk': self.offer.pk,
  477. 'fields': {
  478. 'name': 'Test offer',
  479. 'slug': self.offer.slug,
  480. 'description': 'Test description',
  481. 'offer_type': ConditionalOffer.VOUCHER,
  482. 'exclusive': True,
  483. 'status': ConditionalOffer.OPEN,
  484. 'condition': self.offer.condition.pk,
  485. 'benefit': self.offer.benefit.pk,
  486. 'priority': 0,
  487. 'start_datetime': None,
  488. 'end_datetime': None,
  489. 'max_global_applications': None,
  490. 'max_user_applications': None,
  491. 'max_basket_applications': None,
  492. 'max_discount': None,
  493. 'total_discount': '0.00',
  494. 'num_applications': 0,
  495. 'num_orders': 0,
  496. 'redirect_url': '',
  497. 'date_created': '2021-04-23T14:00:00Z',
  498. },
  499. }])
  500. def test_offer_benefit_view_with_built_in_benefit_type(self):
  501. range_ = RangeFactory()
  502. request = RequestFactory().post('/', data={
  503. 'range': range_.pk,
  504. 'type': Benefit.FIXED,
  505. 'value': 2000,
  506. })
  507. request.session['offer_wizard'] = {
  508. self.metadata_form_kwargs_key: json.dumps(self.metadata_form_kwargs_session_data),
  509. self.metadata_obj_key: json.dumps(self.metadata_obj_session_data),
  510. }
  511. response = offer_views.OfferBenefitView.as_view(update=True)(request, pk=self.offer.pk)
  512. self.assertEqual(response.status_code, 302)
  513. self.assertEqual(response.url, reverse('dashboard:offer-condition', kwargs={'pk': self.offer.pk}))
  514. self.assertJSONEqual(request.session['offer_wizard'][self.metadata_form_kwargs_key],
  515. self.metadata_form_kwargs_session_data)
  516. self.assertJSONEqual(request.session['offer_wizard'][self.metadata_obj_key], self.metadata_obj_session_data)
  517. self.assertJSONEqual(request.session['offer_wizard'][self.benefit_form_kwargs_key], {
  518. 'data': {
  519. 'range': range_.pk,
  520. 'type': Benefit.FIXED,
  521. 'value': '2000',
  522. 'max_affected_items': None,
  523. 'custom_benefit': '',
  524. },
  525. })
  526. self.assertJSONEqual(request.session['offer_wizard'][self.benefit_obj_key], [{
  527. 'model': 'offer.benefit',
  528. 'pk': self.offer.benefit.pk,
  529. 'fields': {
  530. 'range': range_.pk,
  531. 'type': Benefit.FIXED,
  532. 'value': '2000',
  533. 'max_affected_items': None,
  534. 'proxy_class': '',
  535. },
  536. }])
  537. def test_offer_benefit_view_with_custom_benefit_type(self):
  538. benefit = create_benefit(CustomBenefitModel)
  539. request = RequestFactory().post('/', data={
  540. 'custom_benefit': benefit.pk,
  541. })
  542. request.session['offer_wizard'] = {
  543. self.metadata_form_kwargs_key: json.dumps(self.metadata_form_kwargs_session_data),
  544. self.metadata_obj_key: json.dumps(self.metadata_obj_session_data),
  545. }
  546. response = offer_views.OfferBenefitView.as_view(update=True)(request, pk=self.offer.pk)
  547. self.assertEqual(response.status_code, 302)
  548. self.assertEqual(response.url, reverse('dashboard:offer-condition', kwargs={'pk': self.offer.pk}))
  549. self.assertJSONEqual(request.session['offer_wizard'][self.metadata_form_kwargs_key],
  550. self.metadata_form_kwargs_session_data)
  551. self.assertJSONEqual(request.session['offer_wizard'][self.metadata_obj_key], self.metadata_obj_session_data)
  552. self.assertJSONEqual(request.session['offer_wizard'][self.benefit_form_kwargs_key], {
  553. 'data': {
  554. 'range': None,
  555. 'type': '',
  556. 'value': None,
  557. 'max_affected_items': None,
  558. 'custom_benefit': str(benefit.pk),
  559. },
  560. })
  561. self.assertJSONEqual(request.session['offer_wizard'][self.benefit_obj_key], [{
  562. 'model': 'offer.benefit',
  563. 'pk': benefit.pk,
  564. 'fields': {
  565. 'range': None,
  566. 'type': '',
  567. 'value': None,
  568. 'max_affected_items': None,
  569. 'proxy_class': benefit.proxy_class,
  570. }
  571. }])
  572. def test_offer_condition_view_with_built_in_condition_type(self):
  573. range_ = RangeFactory()
  574. request = RequestFactory().post('/', data={
  575. 'range': range_.pk,
  576. 'type': Condition.VALUE,
  577. 'value': 2000,
  578. })
  579. request.session['offer_wizard'] = {
  580. self.metadata_form_kwargs_key: json.dumps(self.metadata_form_kwargs_session_data),
  581. self.metadata_obj_key: json.dumps(self.metadata_obj_session_data),
  582. self.benefit_form_kwargs_key: json.dumps(self.benefit_form_kwargs_session_data),
  583. self.benefit_obj_key: json.dumps(self.benefit_obj_session_data),
  584. }
  585. response = offer_views.OfferConditionView.as_view(update=True)(request, pk=self.offer.pk)
  586. self.assertEqual(response.status_code, 302)
  587. self.assertEqual(response.url, reverse('dashboard:offer-restrictions', kwargs={'pk': self.offer.pk}))
  588. self.assertJSONEqual(request.session['offer_wizard'][self.metadata_form_kwargs_key],
  589. self.metadata_form_kwargs_session_data)
  590. self.assertJSONEqual(request.session['offer_wizard'][self.metadata_obj_key], self.metadata_obj_session_data)
  591. self.assertJSONEqual(request.session['offer_wizard'][self.benefit_form_kwargs_key],
  592. self.benefit_form_kwargs_session_data)
  593. self.assertJSONEqual(request.session['offer_wizard'][self.benefit_obj_key], self.benefit_obj_session_data)
  594. self.assertJSONEqual(request.session['offer_wizard'][self.condition_form_kwargs_key], {
  595. 'data': {
  596. 'range': range_.pk,
  597. 'type': Condition.VALUE,
  598. 'value': '2000',
  599. 'custom_condition': '',
  600. },
  601. })
  602. self.assertJSONEqual(request.session['offer_wizard'][self.condition_obj_key], [{
  603. 'model': 'offer.condition',
  604. 'pk': self.offer.condition.pk,
  605. 'fields': {
  606. 'range': range_.pk,
  607. 'type': Condition.VALUE,
  608. 'value': '2000',
  609. 'proxy_class': '',
  610. },
  611. }])
  612. def test_offer_condition_view_with_custom_condition_type(self):
  613. range_ = RangeFactory()
  614. condition = create_condition(CustomConditionModel)
  615. request = RequestFactory().post('/', data={
  616. 'range': range_.pk,
  617. 'custom_condition': condition.pk,
  618. })
  619. request.session['offer_wizard'] = {
  620. self.metadata_form_kwargs_key: json.dumps(self.metadata_form_kwargs_session_data),
  621. self.metadata_obj_key: json.dumps(self.metadata_obj_session_data),
  622. self.benefit_form_kwargs_key: json.dumps(self.benefit_form_kwargs_session_data),
  623. self.benefit_obj_key: json.dumps(self.benefit_obj_session_data),
  624. }
  625. response = offer_views.OfferConditionView.as_view(update=True)(request, pk=self.offer.pk)
  626. self.assertEqual(response.status_code, 302)
  627. self.assertEqual(response.url, reverse('dashboard:offer-restrictions', kwargs={'pk': self.offer.pk}))
  628. self.assertJSONEqual(request.session['offer_wizard'][self.metadata_form_kwargs_key],
  629. self.metadata_form_kwargs_session_data)
  630. self.assertJSONEqual(request.session['offer_wizard'][self.metadata_obj_key], self.metadata_obj_session_data)
  631. self.assertJSONEqual(request.session['offer_wizard'][self.benefit_form_kwargs_key],
  632. self.benefit_form_kwargs_session_data)
  633. self.assertJSONEqual(request.session['offer_wizard'][self.benefit_obj_key], self.benefit_obj_session_data)
  634. self.assertJSONEqual(request.session['offer_wizard'][self.condition_form_kwargs_key], {
  635. 'data': {
  636. 'range': range_.pk,
  637. 'type': '',
  638. 'value': None,
  639. 'custom_condition': str(condition.pk),
  640. },
  641. })
  642. self.assertJSONEqual(request.session['offer_wizard'][self.condition_obj_key], [{
  643. 'model': 'offer.condition',
  644. 'pk': condition.pk,
  645. 'fields': {
  646. 'range': None,
  647. 'type': '',
  648. 'value': None,
  649. 'proxy_class': condition.proxy_class,
  650. }
  651. }])
  652. def test_offer_restrictions_view(self):
  653. request = RequestFactory().post('/', data={
  654. 'priority': 0,
  655. })
  656. request.session['offer_wizard'] = {
  657. self.metadata_form_kwargs_key: json.dumps(self.metadata_form_kwargs_session_data),
  658. self.metadata_obj_key: json.dumps(self.metadata_obj_session_data),
  659. self.benefit_form_kwargs_key: json.dumps(self.benefit_form_kwargs_session_data),
  660. self.benefit_obj_key: json.dumps(self.benefit_obj_session_data),
  661. self.condition_form_kwargs_key: json.dumps(self.condition_form_kwargs_session_data),
  662. self.condition_obj_key: json.dumps(self.condition_obj_session_data),
  663. }
  664. response = offer_views.OfferRestrictionsView.as_view(update=True)(request, pk=self.offer.pk)
  665. self.offer.refresh_from_db()
  666. self.assertEqual(response.status_code, 302)
  667. self.assertEqual(response.url, reverse('dashboard:offer-detail', kwargs={'pk': self.offer.pk}))
  668. self.assertEqual([(m.level_tag, str(m.message)) for m in get_messages(request)][0],
  669. ('success', "Offer '%s' updated" % self.offer.name))
  670. self.assertEqual(request.session['offer_wizard'], {})