Ejemplo n.º 1
0
    def test_offer_delete_view_for_voucher_offer_with_vouchers(self):
        offer = ConditionalOfferFactory(offer_type=ConditionalOffer.VOUCHER)
        VoucherFactory().offers.add(offer)

        view = offer_views.OfferDeleteView.as_view()

        request = RequestFactory().get('/')
        response = view(request, pk=offer.pk)
        assert response.status_code == 302
        assert response.url == reverse('dashboard:offer-detail',
                                       kwargs={'pk': offer.pk})
        assert [
            (m.level_tag, str(m.message)) for m in get_messages(request)
        ][0] == (
            'warning',
            "This offer can only be deleted if it has no vouchers attached to it"
        )

        request = RequestFactory().post('/')
        response = view(request, pk=offer.pk)
        assert response.status_code == 302
        assert response.url == reverse('dashboard:offer-detail',
                                       kwargs={'pk': offer.pk})
        assert [
            (m.level_tag, str(m.message)) for m in get_messages(request)
        ][0] == (
            'warning',
            "This offer can only be deleted if it has no vouchers attached to it"
        )
        assert ConditionalOffer.objects.exists()
Ejemplo n.º 2
0
def test_voucher_set_form_update_with_changed_count():
    tzinfo = timezone.get_current_timezone()
    voucher_set = VoucherSetFactory(
        name="Dummy name",
        count=5,
        code_length=12,
        description="Dummy description",
        start_datetime=datetime.datetime(2021, 2, 1, tzinfo=tzinfo),
        end_datetime=datetime.datetime(2021, 2, 28, tzinfo=tzinfo))
    voucher = voucher_set.vouchers.first()
    assert voucher.usage == Voucher.MULTI_USE
    new_offers = [
        ConditionalOfferFactory(offer_type=ConditionalOffer.VOUCHER),
        ConditionalOfferFactory(offer_type=ConditionalOffer.VOUCHER)
    ]
    data = {
        'name': "New name",
        'code_length': 10,
        'description': "New description",
        'start_datetime': datetime.datetime(2021, 3, 1, tzinfo=tzinfo),
        'end_datetime': datetime.datetime(2021, 3, 31, tzinfo=tzinfo),
        'count': 10,
        'usage': Voucher.SINGLE_USE,
        'offers': new_offers,
    }
    form = forms.VoucherSetForm(data, instance=voucher_set)
    assert form.is_valid(), form.errors
    voucher_set = form.save()
    voucher_set.refresh_from_db()
    assert voucher_set.count == 10  # "count" is updated
    assert voucher_set.vouchers.count() == 10
    for i, v in enumerate(voucher_set.vouchers.order_by('date_created')):
        assert v.name == "New name - %d" % (i + 1)
        if i < 5:
            # Original vouchers
            assert len(v.code) == 14  # The code is not modified
        else:
            # New vouchers
            assert len(v.code) == 12
        assert v.start_datetime == datetime.datetime(2021, 3, 1, tzinfo=tzinfo)
        assert v.end_datetime == datetime.datetime(2021, 3, 31, tzinfo=tzinfo)
        assert v.usage == Voucher.SINGLE_USE
        assert list(v.offers.all()) == new_offers
Ejemplo n.º 3
0
 def test_voucher_delete_view(self):
     v = voucher.VoucherFactory()
     v.offers.add(ConditionalOfferFactory(offer_type=ConditionalOffer.VOUCHER))
     assert Voucher.objects.count() == 1
     assert ConditionalOffer.objects.count() == 1
     request = RequestFactory().post('/')
     response = views.VoucherDeleteView.as_view()(request, pk=v.pk)
     assert Voucher.objects.count() == 0
     # Related offer is not deleted
     assert ConditionalOffer.objects.count() == 1
     assert response.status_code == 302
     assert response.url == reverse('dashboard:voucher-list')
     assert [(m.level_tag, str(m.message)) for m in get_messages(request)][0] == ('warning', "Voucher deleted")
Ejemplo n.º 4
0
    def test_offer_delete_view_for_voucher_offer_without_vouchers(self):
        offer = ConditionalOfferFactory(offer_type=ConditionalOffer.VOUCHER)

        view = offer_views.OfferDeleteView.as_view()

        request = RequestFactory().get('/')
        response = view(request, pk=offer.pk)
        assert response.status_code == 200

        request = RequestFactory().post('/')
        response = view(request, pk=offer.pk)
        assert response.status_code == 302
        assert response.url == reverse('dashboard:offer-list')
        assert [(m.level_tag, str(m.message)) for m in get_messages(request)
                ][0] == ('success', "Offer deleted!")
        assert not ConditionalOffer.objects.exists()
Ejemplo n.º 5
0
def test_voucher_set_form_create():
    a_range = RangeFactory(includes_all_products=True)
    offer = ConditionalOfferFactory(offer_type=ConditionalOffer.VOUCHER,
                                    benefit=BenefitFactory(range=a_range),
                                    condition=ConditionFactory(range=a_range,
                                                               value=1))
    data = MultiValueDict({
        'name': ['10% Discount'],
        'code_length': ['10'],
        'count': ['10'],
        'description': ['This is a 10% discount for mailing X'],
        'start_datetime': ['2014-10-01'],
        'end_datetime': ['2018-10-01'],
        'usage': [Voucher.MULTI_USE],
        'offers': [offer.pk],
    })
    form = forms.VoucherSetForm(data)
    assert form.is_valid(), form.errors
    voucher_set = form.save()
    assert voucher_set.vouchers.count() == 10
Ejemplo n.º 6
0
    def setUp(self):
        self.offer = ConditionalOfferFactory()
        self.metadata_form_kwargs_key = 'metadata%s' % self.offer.pk
        self.metadata_obj_key = 'metadata%s_obj' % self.offer.pk
        self.benefit_form_kwargs_key = 'benefit%s' % self.offer.pk
        self.benefit_obj_key = 'benefit%s_obj' % self.offer.pk
        self.condition_form_kwargs_key = 'condition%s' % self.offer.pk
        self.condition_obj_key = 'condition%s_obj' % self.offer.pk
        range_ = RangeFactory()

        self.metadata_form_kwargs_session_data = {
            'data': {
                'name': 'Test offer',
                'slug': self.offer.slug,
                'description': 'Test description',
                'offer_type': ConditionalOffer.VOUCHER,
                'exclusive': True,
                'status': ConditionalOffer.OPEN,
                'condition': self.offer.condition.pk,
                'benefit': self.offer.benefit.pk,
                'priority': 0,
                'start_datetime': None,
                'end_datetime': None,
                'max_global_applications': None,
                'max_user_applications': None,
                'max_basket_applications': None,
                'max_discount': None,
                'total_discount': '0.00',
                'num_applications': 0,
                'num_orders': 0,
                'redirect_url': '',
                'date_created': '2021-04-23T14:00:00Z',
            },
        }
        self.metadata_obj_session_data = [{
            'model': 'offer.conditionaloffer',
            'pk': None,
            'fields': {
                'name': 'Test offer',
                'description': 'Test description',
                'offer_type': ConditionalOffer.VOUCHER,
            },
        }]
        self.benefit_form_kwargs_session_data = {
            'data': {
                'range': range_.pk,
                'type': Benefit.FIXED,
                'value': '2000',
                'max_affected_items': 2,
                'custom_benefit': '',
            },
        }
        self.benefit_obj_session_data = [{
            'model': 'offer.benefit',
            'pk': None,
            'fields': {
                'range': range_.pk,
                'type': Benefit.FIXED,
                'value': '2000',
                'max_affected_items': 2,
                'proxy_class': '',
            },
        }]
        self.condition_form_kwargs_session_data = {
            'data': {
                'range': range_.pk,
                'type': Condition.VALUE,
                'value': '2000',
                'custom_condition': '',
            },
        }
        self.condition_obj_session_data = [{
            'model': 'offer.condition',
            'pk': None,
            'fields': {
                'range': range_.pk,
                'type': Condition.VALUE,
                'value': '2000',
                'proxy_class': '',
            },
        }]
Ejemplo n.º 7
0
class TestUpdateOfferWizardStepView(TestCase):
    def setUp(self):
        self.offer = ConditionalOfferFactory()
        self.metadata_form_kwargs_key = 'metadata%s' % self.offer.pk
        self.metadata_obj_key = 'metadata%s_obj' % self.offer.pk
        self.benefit_form_kwargs_key = 'benefit%s' % self.offer.pk
        self.benefit_obj_key = 'benefit%s_obj' % self.offer.pk
        self.condition_form_kwargs_key = 'condition%s' % self.offer.pk
        self.condition_obj_key = 'condition%s_obj' % self.offer.pk
        range_ = RangeFactory()

        self.metadata_form_kwargs_session_data = {
            'data': {
                'name': 'Test offer',
                'slug': self.offer.slug,
                'description': 'Test description',
                'offer_type': ConditionalOffer.VOUCHER,
                'exclusive': True,
                'status': ConditionalOffer.OPEN,
                'condition': self.offer.condition.pk,
                'benefit': self.offer.benefit.pk,
                'priority': 0,
                'start_datetime': None,
                'end_datetime': None,
                'max_global_applications': None,
                'max_user_applications': None,
                'max_basket_applications': None,
                'max_discount': None,
                'total_discount': '0.00',
                'num_applications': 0,
                'num_orders': 0,
                'redirect_url': '',
                'date_created': '2021-04-23T14:00:00Z',
            },
        }
        self.metadata_obj_session_data = [{
            'model': 'offer.conditionaloffer',
            'pk': None,
            'fields': {
                'name': 'Test offer',
                'description': 'Test description',
                'offer_type': ConditionalOffer.VOUCHER,
            },
        }]
        self.benefit_form_kwargs_session_data = {
            'data': {
                'range': range_.pk,
                'type': Benefit.FIXED,
                'value': '2000',
                'max_affected_items': 2,
                'custom_benefit': '',
            },
        }
        self.benefit_obj_session_data = [{
            'model': 'offer.benefit',
            'pk': None,
            'fields': {
                'range': range_.pk,
                'type': Benefit.FIXED,
                'value': '2000',
                'max_affected_items': 2,
                'proxy_class': '',
            },
        }]
        self.condition_form_kwargs_session_data = {
            'data': {
                'range': range_.pk,
                'type': Condition.VALUE,
                'value': '2000',
                'custom_condition': '',
            },
        }
        self.condition_obj_session_data = [{
            'model': 'offer.condition',
            'pk': None,
            'fields': {
                'range': range_.pk,
                'type': Condition.VALUE,
                'value': '2000',
                'proxy_class': '',
            },
        }]

    def test_offer_meta_data_view(self):
        request = RequestFactory().post('/',
                                        data={
                                            'name': 'Test offer',
                                            'description': 'Test description',
                                            'offer_type':
                                            ConditionalOffer.VOUCHER,
                                        })
        response = offer_views.OfferMetaDataView.as_view(update=True)(
            request, pk=self.offer.pk)

        self.assertEqual(response.status_code, 302)
        self.assertEqual(
            response.url,
            reverse('dashboard:offer-benefit', kwargs={'pk': self.offer.pk}))
        self.assertJSONEqual(
            request.session['offer_wizard'][self.metadata_form_kwargs_key], {
                'data': {
                    'name': 'Test offer',
                    'description': 'Test description',
                    'offer_type': ConditionalOffer.VOUCHER,
                },
            })
        self.assertJSONEqual(
            request.session['offer_wizard'][self.metadata_obj_key],
            [{
                'model': 'offer.conditionaloffer',
                'pk': self.offer.pk,
                'fields': {
                    'name': 'Test offer',
                    'slug': self.offer.slug,
                    'description': 'Test description',
                    'offer_type': ConditionalOffer.VOUCHER,
                    'exclusive': True,
                    'status': ConditionalOffer.OPEN,
                    'condition': self.offer.condition.pk,
                    'benefit': self.offer.benefit.pk,
                    'priority': 0,
                    'start_datetime': None,
                    'end_datetime': None,
                    'max_global_applications': None,
                    'max_user_applications': None,
                    'max_basket_applications': None,
                    'max_discount': None,
                    'total_discount': '0.00',
                    'num_applications': 0,
                    'num_orders': 0,
                    'redirect_url': '',
                    'date_created': '2021-04-23T14:00:00Z',
                },
            }])

    def test_offer_benefit_view_with_built_in_benefit_type(self):
        range_ = RangeFactory()

        request = RequestFactory().post('/',
                                        data={
                                            'range': range_.pk,
                                            'type': Benefit.FIXED,
                                            'value': 2000,
                                        })
        request.session['offer_wizard'] = {
            self.metadata_form_kwargs_key:
            json.dumps(self.metadata_form_kwargs_session_data),
            self.metadata_obj_key:
            json.dumps(self.metadata_obj_session_data),
        }
        response = offer_views.OfferBenefitView.as_view(update=True)(
            request, pk=self.offer.pk)

        self.assertEqual(response.status_code, 302)
        self.assertEqual(
            response.url,
            reverse('dashboard:offer-condition', kwargs={'pk': self.offer.pk}))
        self.assertJSONEqual(
            request.session['offer_wizard'][self.metadata_form_kwargs_key],
            self.metadata_form_kwargs_session_data)
        self.assertJSONEqual(
            request.session['offer_wizard'][self.metadata_obj_key],
            self.metadata_obj_session_data)
        self.assertJSONEqual(
            request.session['offer_wizard'][self.benefit_form_kwargs_key], {
                'data': {
                    'range': range_.pk,
                    'type': Benefit.FIXED,
                    'value': '2000',
                    'max_affected_items': None,
                    'custom_benefit': '',
                },
            })
        self.assertJSONEqual(
            request.session['offer_wizard'][self.benefit_obj_key],
            [{
                'model': 'offer.benefit',
                'pk': self.offer.benefit.pk,
                'fields': {
                    'range': range_.pk,
                    'type': Benefit.FIXED,
                    'value': '2000',
                    'max_affected_items': None,
                    'proxy_class': '',
                },
            }])

    def test_offer_benefit_view_with_custom_benefit_type(self):
        benefit = create_benefit(CustomBenefitModel)

        request = RequestFactory().post('/',
                                        data={
                                            'custom_benefit': benefit.pk,
                                        })
        request.session['offer_wizard'] = {
            self.metadata_form_kwargs_key:
            json.dumps(self.metadata_form_kwargs_session_data),
            self.metadata_obj_key:
            json.dumps(self.metadata_obj_session_data),
        }
        response = offer_views.OfferBenefitView.as_view(update=True)(
            request, pk=self.offer.pk)

        self.assertEqual(response.status_code, 302)
        self.assertEqual(
            response.url,
            reverse('dashboard:offer-condition', kwargs={'pk': self.offer.pk}))
        self.assertJSONEqual(
            request.session['offer_wizard'][self.metadata_form_kwargs_key],
            self.metadata_form_kwargs_session_data)
        self.assertJSONEqual(
            request.session['offer_wizard'][self.metadata_obj_key],
            self.metadata_obj_session_data)
        self.assertJSONEqual(
            request.session['offer_wizard'][self.benefit_form_kwargs_key], {
                'data': {
                    'range': None,
                    'type': '',
                    'value': None,
                    'max_affected_items': None,
                    'custom_benefit': str(benefit.pk),
                },
            })
        self.assertJSONEqual(
            request.session['offer_wizard'][self.benefit_obj_key],
            [{
                'model': 'offer.benefit',
                'pk': benefit.pk,
                'fields': {
                    'range': None,
                    'type': '',
                    'value': None,
                    'max_affected_items': None,
                    'proxy_class': benefit.proxy_class,
                }
            }])

    def test_offer_condition_view_with_built_in_condition_type(self):
        range_ = RangeFactory()

        request = RequestFactory().post('/',
                                        data={
                                            'range': range_.pk,
                                            'type': Condition.VALUE,
                                            'value': 2000,
                                        })
        request.session['offer_wizard'] = {
            self.metadata_form_kwargs_key:
            json.dumps(self.metadata_form_kwargs_session_data),
            self.metadata_obj_key:
            json.dumps(self.metadata_obj_session_data),
            self.benefit_form_kwargs_key:
            json.dumps(self.benefit_form_kwargs_session_data),
            self.benefit_obj_key:
            json.dumps(self.benefit_obj_session_data),
        }
        response = offer_views.OfferConditionView.as_view(update=True)(
            request, pk=self.offer.pk)

        self.assertEqual(response.status_code, 302)
        self.assertEqual(
            response.url,
            reverse('dashboard:offer-restrictions',
                    kwargs={'pk': self.offer.pk}))
        self.assertJSONEqual(
            request.session['offer_wizard'][self.metadata_form_kwargs_key],
            self.metadata_form_kwargs_session_data)
        self.assertJSONEqual(
            request.session['offer_wizard'][self.metadata_obj_key],
            self.metadata_obj_session_data)
        self.assertJSONEqual(
            request.session['offer_wizard'][self.benefit_form_kwargs_key],
            self.benefit_form_kwargs_session_data)
        self.assertJSONEqual(
            request.session['offer_wizard'][self.benefit_obj_key],
            self.benefit_obj_session_data)
        self.assertJSONEqual(
            request.session['offer_wizard'][self.condition_form_kwargs_key], {
                'data': {
                    'range': range_.pk,
                    'type': Condition.VALUE,
                    'value': '2000',
                    'custom_condition': '',
                },
            })
        self.assertJSONEqual(
            request.session['offer_wizard'][self.condition_obj_key],
            [{
                'model': 'offer.condition',
                'pk': self.offer.condition.pk,
                'fields': {
                    'range': range_.pk,
                    'type': Condition.VALUE,
                    'value': '2000',
                    'proxy_class': '',
                },
            }])

    def test_offer_condition_view_with_custom_condition_type(self):
        range_ = RangeFactory()
        condition = create_condition(CustomConditionModel)

        request = RequestFactory().post('/',
                                        data={
                                            'range': range_.pk,
                                            'custom_condition': condition.pk,
                                        })
        request.session['offer_wizard'] = {
            self.metadata_form_kwargs_key:
            json.dumps(self.metadata_form_kwargs_session_data),
            self.metadata_obj_key:
            json.dumps(self.metadata_obj_session_data),
            self.benefit_form_kwargs_key:
            json.dumps(self.benefit_form_kwargs_session_data),
            self.benefit_obj_key:
            json.dumps(self.benefit_obj_session_data),
        }
        response = offer_views.OfferConditionView.as_view(update=True)(
            request, pk=self.offer.pk)

        self.assertEqual(response.status_code, 302)
        self.assertEqual(
            response.url,
            reverse('dashboard:offer-restrictions',
                    kwargs={'pk': self.offer.pk}))
        self.assertJSONEqual(
            request.session['offer_wizard'][self.metadata_form_kwargs_key],
            self.metadata_form_kwargs_session_data)
        self.assertJSONEqual(
            request.session['offer_wizard'][self.metadata_obj_key],
            self.metadata_obj_session_data)
        self.assertJSONEqual(
            request.session['offer_wizard'][self.benefit_form_kwargs_key],
            self.benefit_form_kwargs_session_data)
        self.assertJSONEqual(
            request.session['offer_wizard'][self.benefit_obj_key],
            self.benefit_obj_session_data)
        self.assertJSONEqual(
            request.session['offer_wizard'][self.condition_form_kwargs_key], {
                'data': {
                    'range': range_.pk,
                    'type': '',
                    'value': None,
                    'custom_condition': str(condition.pk),
                },
            })
        self.assertJSONEqual(
            request.session['offer_wizard'][self.condition_obj_key],
            [{
                'model': 'offer.condition',
                'pk': condition.pk,
                'fields': {
                    'range': None,
                    'type': '',
                    'value': None,
                    'proxy_class': condition.proxy_class,
                }
            }])

    def test_offer_restrictions_view(self):
        request = RequestFactory().post('/', data={
            'priority': 0,
        })
        request.session['offer_wizard'] = {
            self.metadata_form_kwargs_key:
            json.dumps(self.metadata_form_kwargs_session_data),
            self.metadata_obj_key:
            json.dumps(self.metadata_obj_session_data),
            self.benefit_form_kwargs_key:
            json.dumps(self.benefit_form_kwargs_session_data),
            self.benefit_obj_key:
            json.dumps(self.benefit_obj_session_data),
            self.condition_form_kwargs_key:
            json.dumps(self.condition_form_kwargs_session_data),
            self.condition_obj_key:
            json.dumps(self.condition_obj_session_data),
        }
        response = offer_views.OfferRestrictionsView.as_view(update=True)(
            request, pk=self.offer.pk)

        self.offer.refresh_from_db()
        self.assertEqual(response.status_code, 302)
        self.assertEqual(
            response.url,
            reverse('dashboard:offer-detail', kwargs={'pk': self.offer.pk}))
        self.assertEqual([(m.level_tag, str(m.message))
                          for m in get_messages(request)][0],
                         ('success', "Offer '%s' updated" % self.offer.name))
        self.assertEqual(request.session['offer_wizard'], {})
Ejemplo n.º 8
0
def many_offers():
    for i in range(0, 30):
        ConditionalOfferFactory(name='Test offer %d' % i)