浏览代码

Fix saving of Benefit/Condition "proxy_class" field in dashboard OfferWizardStepView

- This uses a simpler and more robust way to get the list of fields to
  serialise for storage in the session
- "custom_benefit" and "custom_condition" were unused, as they aren't
  fields of any of the serialised models
- Also remove unused parameter in
  "dashboard.offers.views.OfferWizardStepView._fetch_form_kwargs"
master
Joseph Wayodi 4 年前
父节点
当前提交
1a3372e172
共有 2 个文件被更改,包括 628 次插入12 次删除
  1. 3
    12
      src/oscar/apps/dashboard/offers/views.py
  2. 625
    0
      tests/integration/dashboard/test_offer_views.py

+ 3
- 12
src/oscar/apps/dashboard/offers/views.py 查看文件

140
         session_data[self._key()] = json_data
140
         session_data[self._key()] = json_data
141
         self.request.session.save()
141
         self.request.session.save()
142
 
142
 
143
-    def _fetch_form_kwargs(self, step_name=None):
144
-        if not step_name:
145
-            step_name = self.step_name
143
+    def _fetch_form_kwargs(self):
146
         session_data = self.request.session.setdefault(self.wizard_name, {})
144
         session_data = self.request.session.setdefault(self.wizard_name, {})
147
-        json_data = session_data.get(self._key(step_name), None)
145
+        json_data = session_data.get(self._key(self.step_name), None)
148
         if json_data:
146
         if json_data:
149
             return json.loads(json_data)
147
             return json.loads(json_data)
150
 
148
 
156
         # We don't store the object instance as that is not JSON serialisable.
154
         # We don't store the object instance as that is not JSON serialisable.
157
         # Instead, we save an alternative form
155
         # Instead, we save an alternative form
158
         instance = form.save(commit=False)
156
         instance = form.save(commit=False)
159
-        fields = form.fields.keys()
160
-        safe_fields = ['custom_benefit', 'custom_condition']
161
         # remove fields that do not exist (yet) on the uncommitted instance, i.e. m2m fields
157
         # remove fields that do not exist (yet) on the uncommitted instance, i.e. m2m fields
162
-        # unless they are 'virtual' fields as listed in 'safe_fields'
163
-        cleanfields = {x: hasattr(instance, x) for x in fields}
164
-        cleanfields.update({x: True for x in fields if x in safe_fields})
165
-        cleanfields = [
166
-            x[0] for x in cleanfields.items() if x[1]
167
-        ]
158
+        cleanfields = [field.name for field in instance._meta.local_fields]
168
 
159
 
169
         json_qs = serializers.serialize('json', [instance], fields=tuple(cleanfields))
160
         json_qs = serializers.serialize('json', [instance], fields=tuple(cleanfields))
170
 
161
 

+ 625
- 0
tests/integration/dashboard/test_offer_views.py 查看文件

1
+import json
2
+
1
 import pytest
3
 import pytest
2
 from django.contrib.messages import get_messages
4
 from django.contrib.messages import get_messages
5
+from django.test import TestCase
3
 from django.urls import reverse
6
 from django.urls import reverse
7
+from freezegun import freeze_time
4
 
8
 
5
 from oscar.apps.dashboard.offers import views as offer_views
9
 from oscar.apps.dashboard.offers import views as offer_views
6
 from oscar.apps.dashboard.ranges import views as range_views
10
 from oscar.apps.dashboard.ranges import views as range_views
11
+from oscar.apps.offer.custom import create_benefit, create_condition
7
 from oscar.core.loading import get_model
12
 from oscar.core.loading import get_model
8
 from oscar.test.factories.catalogue import ProductFactory
13
 from oscar.test.factories.catalogue import ProductFactory
9
 from oscar.test.factories.offer import ConditionalOfferFactory, RangeFactory
14
 from oscar.test.factories.offer import ConditionalOfferFactory, RangeFactory
10
 from oscar.test.factories.voucher import VoucherFactory
15
 from oscar.test.factories.voucher import VoucherFactory
16
+from tests._site.model_tests_app.models import (
17
+    CustomBenefitModel, CustomConditionModel)
11
 from tests.fixtures import RequestFactory
18
 from tests.fixtures import RequestFactory
12
 
19
 
13
 Range = get_model('offer', 'Range')
20
 Range = get_model('offer', 'Range')
14
 ConditionalOffer = get_model('offer', 'ConditionalOffer')
21
 ConditionalOffer = get_model('offer', 'ConditionalOffer')
22
+Benefit = get_model('offer', 'Benefit')
23
+Condition = get_model('offer', 'Condition')
15
 
24
 
16
 
25
 
17
 @pytest.fixture
26
 @pytest.fixture
106
         assert response.context_data['paginator']
115
         assert response.context_data['paginator']
107
         assert response.context_data['page_obj']
116
         assert response.context_data['page_obj']
108
         assert response.status_code == 200
117
         assert response.status_code == 200
118
+
119
+
120
+class TestCreateOfferWizardStepView(TestCase):
121
+
122
+    def setUp(self):
123
+        range_ = RangeFactory()
124
+
125
+        self.metadata_form_kwargs_session_data = {
126
+            'data': {
127
+                'name': 'Test offer',
128
+                'slug': '',
129
+                'description': 'Test description',
130
+                'offer_type': ConditionalOffer.SITE,
131
+                'exclusive': True,
132
+                'status': ConditionalOffer.OPEN,
133
+                'condition': None,
134
+                'benefit': None,
135
+                'priority': 0,
136
+                'start_datetime': None,
137
+                'end_datetime': None,
138
+                'max_global_applications': None,
139
+                'max_user_applications': None,
140
+                'max_basket_applications': None,
141
+                'max_discount': None,
142
+                'total_discount': '0.00',
143
+                'num_applications': 0,
144
+                'num_orders': 0,
145
+                'redirect_url': '',
146
+                'date_created': None,
147
+            },
148
+        }
149
+        self.metadata_obj_session_data = [{
150
+            'model': 'offer.conditionaloffer',
151
+            'pk': None,
152
+            'fields': {
153
+                'name': 'Test offer',
154
+                'description': 'Test description',
155
+                'offer_type': ConditionalOffer.SITE,
156
+            },
157
+        }]
158
+        self.benefit_form_kwargs_session_data = {
159
+            'data': {
160
+                'range': range_.pk,
161
+                'type': Benefit.PERCENTAGE,
162
+                'value': '10',
163
+                'max_affected_items': None,
164
+                'custom_benefit': '',
165
+            },
166
+        }
167
+        self.benefit_obj_session_data = [{
168
+            'model': 'offer.benefit',
169
+            'pk': None,
170
+            'fields': {
171
+                'range': range_.pk,
172
+                'type': Benefit.PERCENTAGE,
173
+                'value': '10',
174
+                'max_affected_items': None,
175
+                'proxy_class': None,
176
+            },
177
+        }]
178
+        self.condition_form_kwargs_session_data = {
179
+            'data': {
180
+                'range': range_.pk,
181
+                'type': Condition.COUNT,
182
+                'value': '10',
183
+                'custom_condition': '',
184
+            },
185
+        }
186
+        self.condition_obj_session_data = [{
187
+            'model': 'offer.condition',
188
+            'pk': None,
189
+            'fields': {
190
+                'range': range_.pk,
191
+                'type': Condition.COUNT,
192
+                'value': '10',
193
+                'proxy_class': None,
194
+            },
195
+        }]
196
+
197
+    def test_offer_meta_data_view(self):
198
+        request = RequestFactory().post('/', data={
199
+            'name': 'Test offer',
200
+            'description': 'Test description',
201
+            'offer_type': ConditionalOffer.SITE,
202
+        })
203
+        response = offer_views.OfferMetaDataView.as_view()(request)
204
+
205
+        self.assertEqual(response.status_code, 302)
206
+        self.assertEqual(response.url, reverse('dashboard:offer-benefit'))
207
+        self.assertJSONEqual(request.session['offer_wizard']['metadata'], {
208
+            'data': {
209
+                'name': 'Test offer',
210
+                'description': 'Test description',
211
+                'offer_type': ConditionalOffer.SITE,
212
+            },
213
+        })
214
+        self.assertJSONEqual(request.session['offer_wizard']['metadata_obj'], [{
215
+            'model': 'offer.conditionaloffer',
216
+            'pk': None,
217
+            'fields': {
218
+                'name': 'Test offer',
219
+                'slug': '',
220
+                'description': 'Test description',
221
+                'offer_type': ConditionalOffer.SITE,
222
+                'exclusive': True,
223
+                'status': ConditionalOffer.OPEN,
224
+                'condition': None,
225
+                'benefit': None,
226
+                'priority': 0,
227
+                'start_datetime': None,
228
+                'end_datetime': None,
229
+                'max_global_applications': None,
230
+                'max_user_applications': None,
231
+                'max_basket_applications': None,
232
+                'max_discount': None,
233
+                'total_discount': '0.00',
234
+                'num_applications': 0,
235
+                'num_orders': 0,
236
+                'redirect_url': '',
237
+                'date_created': None,
238
+            },
239
+        }])
240
+
241
+    def test_offer_benefit_view_with_built_in_benefit_type(self):
242
+        range_ = RangeFactory()
243
+
244
+        request = RequestFactory().post('/', data={
245
+            'range': range_.pk,
246
+            'type': Benefit.PERCENTAGE,
247
+            'value': 10,
248
+        })
249
+        request.session['offer_wizard'] = {
250
+            'metadata': json.dumps(self.metadata_form_kwargs_session_data),
251
+            'metadata_obj': json.dumps(self.metadata_obj_session_data),
252
+        }
253
+        response = offer_views.OfferBenefitView.as_view()(request)
254
+
255
+        self.assertEqual(response.status_code, 302)
256
+        self.assertEqual(response.url, reverse('dashboard:offer-condition'))
257
+        self.assertJSONEqual(request.session['offer_wizard']['metadata'], self.metadata_form_kwargs_session_data)
258
+        self.assertJSONEqual(request.session['offer_wizard']['metadata_obj'], self.metadata_obj_session_data)
259
+        self.assertJSONEqual(request.session['offer_wizard']['benefit'], {
260
+            'data': {
261
+                'range': range_.pk,
262
+                'type': Benefit.PERCENTAGE,
263
+                'value': '10',
264
+                'max_affected_items': None,
265
+                'custom_benefit': '',
266
+            },
267
+        })
268
+        self.assertJSONEqual(request.session['offer_wizard']['benefit_obj'], [{
269
+            'model': 'offer.benefit',
270
+            'pk': None,
271
+            'fields': {
272
+                'range': range_.pk,
273
+                'type': Benefit.PERCENTAGE,
274
+                'value': '10',
275
+                'max_affected_items': None,
276
+                'proxy_class': None,
277
+            },
278
+        }])
279
+
280
+    def test_offer_benefit_view_with_custom_benefit_type(self):
281
+        benefit = create_benefit(CustomBenefitModel)
282
+
283
+        request = RequestFactory().post('/', data={
284
+            'custom_benefit': benefit.pk,
285
+        })
286
+        request.session['offer_wizard'] = {
287
+            'metadata': json.dumps(self.metadata_form_kwargs_session_data),
288
+            'metadata_obj': json.dumps(self.metadata_obj_session_data),
289
+        }
290
+        response = offer_views.OfferBenefitView.as_view()(request)
291
+
292
+        self.assertEqual(response.status_code, 302)
293
+        self.assertEqual(response.url, reverse('dashboard:offer-condition'))
294
+        self.assertJSONEqual(request.session['offer_wizard']['metadata'], self.metadata_form_kwargs_session_data)
295
+        self.assertJSONEqual(request.session['offer_wizard']['metadata_obj'], self.metadata_obj_session_data)
296
+        self.assertJSONEqual(request.session['offer_wizard']['benefit'], {
297
+            'data': {
298
+                'range': None,
299
+                'type': '',
300
+                'value': None,
301
+                'max_affected_items': None,
302
+                'custom_benefit': str(benefit.pk),
303
+            },
304
+        })
305
+        self.assertJSONEqual(request.session['offer_wizard']['benefit_obj'], [{
306
+            'model': 'offer.benefit',
307
+            'pk': benefit.pk,
308
+            'fields': {
309
+                'range': None,
310
+                'type': '',
311
+                'value': None,
312
+                'max_affected_items': None,
313
+                'proxy_class': benefit.proxy_class,
314
+            }
315
+        }])
316
+
317
+    def test_offer_condition_view_with_built_in_condition_type(self):
318
+        range_ = RangeFactory()
319
+
320
+        request = RequestFactory().post('/', data={
321
+            'range': range_.pk,
322
+            'type': Condition.COUNT,
323
+            'value': 10,
324
+        })
325
+        request.session['offer_wizard'] = {
326
+            'metadata': json.dumps(self.metadata_form_kwargs_session_data),
327
+            'metadata_obj': json.dumps(self.metadata_obj_session_data),
328
+            'benefit': json.dumps(self.benefit_form_kwargs_session_data),
329
+            'benefit_obj': json.dumps(self.benefit_obj_session_data),
330
+        }
331
+        response = offer_views.OfferConditionView.as_view()(request)
332
+
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': Condition.COUNT,
343
+                'value': '10',
344
+                'custom_condition': '',
345
+            },
346
+        })
347
+        self.assertJSONEqual(request.session['offer_wizard']['condition_obj'], [{
348
+            'model': 'offer.condition',
349
+            'pk': None,
350
+            'fields': {
351
+                'range': range_.pk,
352
+                'type': Condition.COUNT,
353
+                'value': '10',
354
+                'proxy_class': None,
355
+            },
356
+        }])
357
+
358
+    def test_offer_condition_view_with_custom_condition_type(self):
359
+        range_ = RangeFactory()
360
+        condition = create_condition(CustomConditionModel)
361
+
362
+        request = RequestFactory().post('/', data={
363
+            'range': range_.pk,
364
+            'custom_condition': condition.pk,
365
+        })
366
+        request.session['offer_wizard'] = {
367
+            'metadata': json.dumps(self.metadata_form_kwargs_session_data),
368
+            'metadata_obj': json.dumps(self.metadata_obj_session_data),
369
+            'benefit': json.dumps(self.benefit_form_kwargs_session_data),
370
+            'benefit_obj': json.dumps(self.benefit_obj_session_data),
371
+        }
372
+        response = offer_views.OfferConditionView.as_view()(request)
373
+
374
+        self.assertEqual(response.status_code, 302)
375
+        self.assertEqual(response.url, reverse('dashboard:offer-restrictions'))
376
+        self.assertJSONEqual(request.session['offer_wizard']['metadata'], self.metadata_form_kwargs_session_data)
377
+        self.assertJSONEqual(request.session['offer_wizard']['metadata_obj'], self.metadata_obj_session_data)
378
+        self.assertJSONEqual(request.session['offer_wizard']['benefit'], self.benefit_form_kwargs_session_data)
379
+        self.assertJSONEqual(request.session['offer_wizard']['benefit_obj'], self.benefit_obj_session_data)
380
+        self.assertJSONEqual(request.session['offer_wizard']['condition'], {
381
+            'data': {
382
+                'range': range_.pk,
383
+                'type': '',
384
+                'value': None,
385
+                'custom_condition': str(condition.pk),
386
+            },
387
+        })
388
+        self.assertJSONEqual(request.session['offer_wizard']['condition_obj'], [{
389
+            'model': 'offer.condition',
390
+            'pk': condition.pk,
391
+            'fields': {
392
+                'range': None,
393
+                'type': '',
394
+                'value': None,
395
+                'proxy_class': condition.proxy_class,
396
+            }
397
+        }])
398
+
399
+    def test_offer_restrictions_view(self):
400
+        request = RequestFactory().post('/', data={
401
+            'priority': 0,
402
+        })
403
+        request.session['offer_wizard'] = {
404
+            'metadata': json.dumps(self.metadata_form_kwargs_session_data),
405
+            'metadata_obj': json.dumps(self.metadata_obj_session_data),
406
+            'benefit': json.dumps(self.benefit_form_kwargs_session_data),
407
+            'benefit_obj': json.dumps(self.benefit_obj_session_data),
408
+            'condition': json.dumps(self.condition_form_kwargs_session_data),
409
+            'condition_obj': json.dumps(self.condition_obj_session_data),
410
+        }
411
+        response = offer_views.OfferRestrictionsView.as_view()(request)
412
+
413
+        offer = ConditionalOffer.objects.get()
414
+        self.assertEqual(response.status_code, 302)
415
+        self.assertEqual(response.url, reverse('dashboard:offer-detail', kwargs={'pk': offer.pk}))
416
+        self.assertEqual([(m.level_tag, str(m.message)) for m in get_messages(request)][0],
417
+                         ('success', "Offer '%s' created!" % offer.name))
418
+        self.assertEqual(request.session['offer_wizard'], {})
419
+
420
+
421
+@freeze_time('2021-04-23 14:00:00')
422
+class TestUpdateOfferWizardStepView(TestCase):
423
+
424
+    def setUp(self):
425
+        self.offer = ConditionalOfferFactory()
426
+        self.metadata_form_kwargs_key = 'metadata%s' % self.offer.pk
427
+        self.metadata_obj_key = 'metadata%s_obj' % self.offer.pk
428
+        self.benefit_form_kwargs_key = 'benefit%s' % self.offer.pk
429
+        self.benefit_obj_key = 'benefit%s_obj' % self.offer.pk
430
+        self.condition_form_kwargs_key = 'condition%s' % self.offer.pk
431
+        self.condition_obj_key = 'condition%s_obj' % self.offer.pk
432
+        range_ = RangeFactory()
433
+
434
+        self.metadata_form_kwargs_session_data = {
435
+            'data': {
436
+                'name': 'Test offer',
437
+                'slug': self.offer.slug,
438
+                'description': 'Test description',
439
+                'offer_type': ConditionalOffer.VOUCHER,
440
+                'exclusive': True,
441
+                'status': ConditionalOffer.OPEN,
442
+                'condition': self.offer.condition.pk,
443
+                'benefit': self.offer.benefit.pk,
444
+                'priority': 0,
445
+                'start_datetime': None,
446
+                'end_datetime': None,
447
+                'max_global_applications': None,
448
+                'max_user_applications': None,
449
+                'max_basket_applications': None,
450
+                'max_discount': None,
451
+                'total_discount': '0.00',
452
+                'num_applications': 0,
453
+                'num_orders': 0,
454
+                'redirect_url': '',
455
+                'date_created': '2021-04-23T14:00:00Z',
456
+            },
457
+        }
458
+        self.metadata_obj_session_data = [{
459
+            'model': 'offer.conditionaloffer',
460
+            'pk': None,
461
+            'fields': {
462
+                'name': 'Test offer',
463
+                'description': 'Test description',
464
+                'offer_type': ConditionalOffer.VOUCHER,
465
+            },
466
+        }]
467
+        self.benefit_form_kwargs_session_data = {
468
+            'data': {
469
+                'range': range_.pk,
470
+                'type': Benefit.FIXED,
471
+                'value': '2000',
472
+                'max_affected_items': 2,
473
+                'custom_benefit': '',
474
+            },
475
+        }
476
+        self.benefit_obj_session_data = [{
477
+            'model': 'offer.benefit',
478
+            'pk': None,
479
+            'fields': {
480
+                'range': range_.pk,
481
+                'type': Benefit.FIXED,
482
+                'value': '2000',
483
+                'max_affected_items': 2,
484
+                'proxy_class': '',
485
+            },
486
+        }]
487
+        self.condition_form_kwargs_session_data = {
488
+            'data': {
489
+                'range': range_.pk,
490
+                'type': Condition.VALUE,
491
+                'value': '2000',
492
+                'custom_condition': '',
493
+            },
494
+        }
495
+        self.condition_obj_session_data = [{
496
+            'model': 'offer.condition',
497
+            'pk': None,
498
+            'fields': {
499
+                'range': range_.pk,
500
+                'type': Condition.VALUE,
501
+                'value': '2000',
502
+                'proxy_class': '',
503
+            },
504
+        }]
505
+
506
+    def test_offer_meta_data_view(self):
507
+        request = RequestFactory().post('/', data={
508
+            'name': 'Test offer',
509
+            'description': 'Test description',
510
+            'offer_type': ConditionalOffer.VOUCHER,
511
+        })
512
+        response = offer_views.OfferMetaDataView.as_view(update=True)(request, pk=self.offer.pk)
513
+
514
+        self.assertEqual(response.status_code, 302)
515
+        self.assertEqual(response.url, reverse('dashboard:offer-benefit', kwargs={'pk': self.offer.pk}))
516
+        self.assertJSONEqual(request.session['offer_wizard'][self.metadata_form_kwargs_key], {
517
+            'data': {
518
+                'name': 'Test offer',
519
+                'description': 'Test description',
520
+                'offer_type': ConditionalOffer.VOUCHER,
521
+            },
522
+        })
523
+        self.assertJSONEqual(request.session['offer_wizard'][self.metadata_obj_key], [{
524
+            'model': 'offer.conditionaloffer',
525
+            'pk': self.offer.pk,
526
+            'fields': {
527
+                'name': 'Test offer',
528
+                'slug': self.offer.slug,
529
+                'description': 'Test description',
530
+                'offer_type': ConditionalOffer.VOUCHER,
531
+                'exclusive': True,
532
+                'status': ConditionalOffer.OPEN,
533
+                'condition': self.offer.condition.pk,
534
+                'benefit': self.offer.benefit.pk,
535
+                'priority': 0,
536
+                'start_datetime': None,
537
+                'end_datetime': None,
538
+                'max_global_applications': None,
539
+                'max_user_applications': None,
540
+                'max_basket_applications': None,
541
+                'max_discount': None,
542
+                'total_discount': '0.00',
543
+                'num_applications': 0,
544
+                'num_orders': 0,
545
+                'redirect_url': '',
546
+                'date_created': '2021-04-23T14:00:00Z',
547
+            },
548
+        }])
549
+
550
+    def test_offer_benefit_view_with_built_in_benefit_type(self):
551
+        range_ = RangeFactory()
552
+
553
+        request = RequestFactory().post('/', data={
554
+            'range': range_.pk,
555
+            'type': Benefit.FIXED,
556
+            'value': 2000,
557
+        })
558
+        request.session['offer_wizard'] = {
559
+            self.metadata_form_kwargs_key: json.dumps(self.metadata_form_kwargs_session_data),
560
+            self.metadata_obj_key: json.dumps(self.metadata_obj_session_data),
561
+        }
562
+        response = offer_views.OfferBenefitView.as_view(update=True)(request, pk=self.offer.pk)
563
+
564
+        self.assertEqual(response.status_code, 302)
565
+        self.assertEqual(response.url, reverse('dashboard:offer-condition', kwargs={'pk': self.offer.pk}))
566
+        self.assertJSONEqual(request.session['offer_wizard'][self.metadata_form_kwargs_key],
567
+                             self.metadata_form_kwargs_session_data)
568
+        self.assertJSONEqual(request.session['offer_wizard'][self.metadata_obj_key], self.metadata_obj_session_data)
569
+        self.assertJSONEqual(request.session['offer_wizard'][self.benefit_form_kwargs_key], {
570
+            'data': {
571
+                'range': range_.pk,
572
+                'type': Benefit.FIXED,
573
+                'value': '2000',
574
+                'max_affected_items': None,
575
+                'custom_benefit': '',
576
+            },
577
+        })
578
+        self.assertJSONEqual(request.session['offer_wizard'][self.benefit_obj_key], [{
579
+            'model': 'offer.benefit',
580
+            'pk': self.offer.benefit.pk,
581
+            'fields': {
582
+                'range': range_.pk,
583
+                'type': Benefit.FIXED,
584
+                'value': '2000',
585
+                'max_affected_items': None,
586
+                'proxy_class': '',
587
+            },
588
+        }])
589
+
590
+    def test_offer_benefit_view_with_custom_benefit_type(self):
591
+        benefit = create_benefit(CustomBenefitModel)
592
+
593
+        request = RequestFactory().post('/', data={
594
+            'custom_benefit': benefit.pk,
595
+        })
596
+        request.session['offer_wizard'] = {
597
+            self.metadata_form_kwargs_key: json.dumps(self.metadata_form_kwargs_session_data),
598
+            self.metadata_obj_key: json.dumps(self.metadata_obj_session_data),
599
+        }
600
+        response = offer_views.OfferBenefitView.as_view(update=True)(request, pk=self.offer.pk)
601
+
602
+        self.assertEqual(response.status_code, 302)
603
+        self.assertEqual(response.url, reverse('dashboard:offer-condition', kwargs={'pk': self.offer.pk}))
604
+        self.assertJSONEqual(request.session['offer_wizard'][self.metadata_form_kwargs_key],
605
+                             self.metadata_form_kwargs_session_data)
606
+        self.assertJSONEqual(request.session['offer_wizard'][self.metadata_obj_key], self.metadata_obj_session_data)
607
+        self.assertJSONEqual(request.session['offer_wizard'][self.benefit_form_kwargs_key], {
608
+            'data': {
609
+                'range': None,
610
+                'type': '',
611
+                'value': None,
612
+                'max_affected_items': None,
613
+                'custom_benefit': str(benefit.pk),
614
+            },
615
+        })
616
+        self.assertJSONEqual(request.session['offer_wizard'][self.benefit_obj_key], [{
617
+            'model': 'offer.benefit',
618
+            'pk': benefit.pk,
619
+            'fields': {
620
+                'range': None,
621
+                'type': '',
622
+                'value': None,
623
+                'max_affected_items': None,
624
+                'proxy_class': benefit.proxy_class,
625
+            }
626
+        }])
627
+
628
+    def test_offer_condition_view_with_built_in_condition_type(self):
629
+        range_ = RangeFactory()
630
+
631
+        request = RequestFactory().post('/', data={
632
+            'range': range_.pk,
633
+            'type': Condition.VALUE,
634
+            'value': 2000,
635
+        })
636
+        request.session['offer_wizard'] = {
637
+            self.metadata_form_kwargs_key: json.dumps(self.metadata_form_kwargs_session_data),
638
+            self.metadata_obj_key: json.dumps(self.metadata_obj_session_data),
639
+            self.benefit_form_kwargs_key: json.dumps(self.benefit_form_kwargs_session_data),
640
+            self.benefit_obj_key: json.dumps(self.benefit_obj_session_data),
641
+        }
642
+        response = offer_views.OfferConditionView.as_view(update=True)(request, pk=self.offer.pk)
643
+
644
+        self.assertEqual(response.status_code, 302)
645
+        self.assertEqual(response.url, reverse('dashboard:offer-restrictions', kwargs={'pk': self.offer.pk}))
646
+        self.assertJSONEqual(request.session['offer_wizard'][self.metadata_form_kwargs_key],
647
+                             self.metadata_form_kwargs_session_data)
648
+        self.assertJSONEqual(request.session['offer_wizard'][self.metadata_obj_key], self.metadata_obj_session_data)
649
+        self.assertJSONEqual(request.session['offer_wizard'][self.benefit_form_kwargs_key],
650
+                             self.benefit_form_kwargs_session_data)
651
+        self.assertJSONEqual(request.session['offer_wizard'][self.benefit_obj_key], self.benefit_obj_session_data)
652
+        self.assertJSONEqual(request.session['offer_wizard'][self.condition_form_kwargs_key], {
653
+            'data': {
654
+                'range': range_.pk,
655
+                'type': Condition.VALUE,
656
+                'value': '2000',
657
+                'custom_condition': '',
658
+            },
659
+        })
660
+        self.assertJSONEqual(request.session['offer_wizard'][self.condition_obj_key], [{
661
+            'model': 'offer.condition',
662
+            'pk': self.offer.condition.pk,
663
+            'fields': {
664
+                'range': range_.pk,
665
+                'type': Condition.VALUE,
666
+                'value': '2000',
667
+                'proxy_class': '',
668
+            },
669
+        }])
670
+
671
+    def test_offer_condition_view_with_custom_condition_type(self):
672
+        range_ = RangeFactory()
673
+        condition = create_condition(CustomConditionModel)
674
+
675
+        request = RequestFactory().post('/', data={
676
+            'range': range_.pk,
677
+            'custom_condition': condition.pk,
678
+        })
679
+        request.session['offer_wizard'] = {
680
+            self.metadata_form_kwargs_key: json.dumps(self.metadata_form_kwargs_session_data),
681
+            self.metadata_obj_key: json.dumps(self.metadata_obj_session_data),
682
+            self.benefit_form_kwargs_key: json.dumps(self.benefit_form_kwargs_session_data),
683
+            self.benefit_obj_key: json.dumps(self.benefit_obj_session_data),
684
+        }
685
+        response = offer_views.OfferConditionView.as_view(update=True)(request, pk=self.offer.pk)
686
+
687
+        self.assertEqual(response.status_code, 302)
688
+        self.assertEqual(response.url, reverse('dashboard:offer-restrictions', kwargs={'pk': self.offer.pk}))
689
+        self.assertJSONEqual(request.session['offer_wizard'][self.metadata_form_kwargs_key],
690
+                             self.metadata_form_kwargs_session_data)
691
+        self.assertJSONEqual(request.session['offer_wizard'][self.metadata_obj_key], self.metadata_obj_session_data)
692
+        self.assertJSONEqual(request.session['offer_wizard'][self.benefit_form_kwargs_key],
693
+                             self.benefit_form_kwargs_session_data)
694
+        self.assertJSONEqual(request.session['offer_wizard'][self.benefit_obj_key], self.benefit_obj_session_data)
695
+        self.assertJSONEqual(request.session['offer_wizard'][self.condition_form_kwargs_key], {
696
+            'data': {
697
+                'range': range_.pk,
698
+                'type': '',
699
+                'value': None,
700
+                'custom_condition': str(condition.pk),
701
+            },
702
+        })
703
+        self.assertJSONEqual(request.session['offer_wizard'][self.condition_obj_key], [{
704
+            'model': 'offer.condition',
705
+            'pk': condition.pk,
706
+            'fields': {
707
+                'range': None,
708
+                'type': '',
709
+                'value': None,
710
+                'proxy_class': condition.proxy_class,
711
+            }
712
+        }])
713
+
714
+    def test_offer_restrictions_view(self):
715
+        request = RequestFactory().post('/', data={
716
+            'priority': 0,
717
+        })
718
+        request.session['offer_wizard'] = {
719
+            self.metadata_form_kwargs_key: json.dumps(self.metadata_form_kwargs_session_data),
720
+            self.metadata_obj_key: json.dumps(self.metadata_obj_session_data),
721
+            self.benefit_form_kwargs_key: json.dumps(self.benefit_form_kwargs_session_data),
722
+            self.benefit_obj_key: json.dumps(self.benefit_obj_session_data),
723
+            self.condition_form_kwargs_key: json.dumps(self.condition_form_kwargs_session_data),
724
+            self.condition_obj_key: json.dumps(self.condition_obj_session_data),
725
+        }
726
+        response = offer_views.OfferRestrictionsView.as_view(update=True)(request, pk=self.offer.pk)
727
+
728
+        self.offer.refresh_from_db()
729
+        self.assertEqual(response.status_code, 302)
730
+        self.assertEqual(response.url, reverse('dashboard:offer-detail', kwargs={'pk': self.offer.pk}))
731
+        self.assertEqual([(m.level_tag, str(m.message)) for m in get_messages(request)][0],
732
+                         ('success', "Offer '%s' updated" % self.offer.name))
733
+        self.assertEqual(request.session['offer_wizard'], {})

正在加载...
取消
保存