Commit c7e99874 by Vedran Karacic

Restrict the basket to one voucher

parent 8cec634e
......@@ -2,7 +2,7 @@ import ddt
from django.test import RequestFactory
from oscar.core.loading import get_model
from oscar.test.factories import ProductFactory, RangeFactory
from oscar.test.factories import ProductFactory, RangeFactory, VoucherFactory
from ecommerce.extensions.basket.utils import get_certificate_type_display_value, prepare_basket
from ecommerce.extensions.partner.models import StockRecord
......@@ -45,6 +45,20 @@ class BasketUtilsTests(TestCase):
self.assertEqual(basket.total_discount, 10.00)
self.assertEqual(basket.total_excl_tax, 90.00)
def test_multiple_vouchers(self):
""" Verify only the last entered voucher is contained in the basket. """
product = ProductFactory()
voucher1 = VoucherFactory(code='FIRST')
basket = prepare_basket(self.request, product, voucher1)
self.assertEqual(basket.vouchers.count(), 1)
self.assertEqual(basket.vouchers.first(), voucher1)
voucher2 = VoucherFactory(code='SECOND')
new_basket = prepare_basket(self.request, product, voucher2)
self.assertEqual(basket, new_basket)
self.assertEqual(new_basket.vouchers.count(), 1)
self.assertEqual(new_basket.vouchers.first(), voucher2)
def test_prepare_basket_without_voucher(self):
""" Verify a basket is returned and does not contain a voucher. """
product = ProductFactory()
......
......@@ -13,7 +13,9 @@ def prepare_basket(request, product, voucher=None):
Create or get the basket, add the product, and apply a voucher.
Existing baskets are merged. The specified product will
be added to the remaining open basket. The Voucher is applied to the basket.
be added to the remaining open basket. If a voucher is passed, all existing
ones added to the basket are removed because we allow only one voucher per
basket after the Voucher is applied to the basket.
Arguments:
request (Request): The request object made to the view.
......@@ -27,6 +29,8 @@ def prepare_basket(request, product, voucher=None):
basket.flush()
basket.add_product(product, 1)
if voucher:
for v in basket.vouchers.all():
basket.vouchers.remove(v)
basket.vouchers.add(voucher)
Applicator().apply(basket, request.user, request)
logger.info('Applied Voucher [%s] to basket [%s].', voucher.code, basket.id)
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment