Voucher: Add min_usages parameter (#2853)

This commit is contained in:
Raphael Michel
2022-10-20 18:07:24 +02:00
committed by GitHub
parent ba2d908a89
commit d69d70cfb1
13 changed files with 233 additions and 8 deletions

View File

@@ -66,6 +66,7 @@ TEST_VOUCHER_RES = {
'id': 1,
'code': '43K6LKM37FBVR2YG',
'max_usages': 1,
'min_usages': 1,
'redeemed': 0,
'valid_until': None,
'block_quota': False,
@@ -311,7 +312,8 @@ def test_voucher_create_full(token_client, organizer, event, item):
token_client, organizer, event,
data={
'code': 'ABCDEFGHI',
'max_usages': 1,
'max_usages': 10,
'min_usages': 10,
'valid_until': None,
'block_quota': False,
'allow_ignore_quota': False,
@@ -327,10 +329,10 @@ def test_voucher_create_full(token_client, organizer, event, item):
)
assert v.code == 'ABCDEFGHI'
assert v.max_usages == 1
assert v.max_usages == 10
assert v.min_usages == 10
assert v.redeemed == 0
assert v.valid_until is None
assert v.max_usages == 1
assert v.block_quota is False
assert v.price_mode == 'set'
assert v.value == Decimal('12.00')

View File

@@ -1281,6 +1281,35 @@ class CartTest(CartTestMixin, TestCase):
with scopes_disabled():
self.assertFalse(CartPosition.objects.filter(cart_id=self.session_key, event=self.event).exists())
def test_remove_voucher_min_usages(self):
with scopes_disabled():
v = Voucher.objects.create(item=self.ticket, value=Decimal('12.00'), event=self.event,
redeemed=1, min_usages=3, max_usages=10)
CartPosition.objects.create(
event=self.event, cart_id=self.session_key, item=self.ticket, voucher=v,
price=23, expires=now() + timedelta(minutes=10)
)
cp2 = CartPosition.objects.create(
event=self.event, cart_id=self.session_key, item=self.ticket, voucher=v,
price=23, expires=now() + timedelta(minutes=10)
)
cp3 = CartPosition.objects.create(
event=self.event, cart_id=self.session_key, item=self.ticket, voucher=v,
price=23, expires=now() + timedelta(minutes=10)
)
self.client.post('/%s/%s/cart/remove' % (self.orga.slug, self.event.slug), {
'id': cp3.pk
}, follow=True)
with scopes_disabled():
self.assertEqual(2, CartPosition.objects.filter(cart_id=self.session_key, event=self.event).count())
response = self.client.post('/%s/%s/cart/remove' % (self.orga.slug, self.event.slug), {
'id': cp2.pk
}, follow=True)
doc = BeautifulSoup(response.rendered_content, "lxml")
self.assertIn('at least 2', doc.select('.alert-danger')[0].text)
with scopes_disabled():
self.assertEqual(0, CartPosition.objects.filter(cart_id=self.session_key, event=self.event).count())
def test_remove_min(self):
self.ticket.min_per_order = 2
self.ticket.save()
@@ -1724,6 +1753,27 @@ class CartTest(CartTestMixin, TestCase):
with scopes_disabled():
self.assertEqual(1, CartPosition.objects.filter(cart_id=self.session_key, event=self.event).count())
def test_voucher_min_usages(self):
with scopes_disabled():
v = Voucher.objects.create(item=self.ticket, value=Decimal('12.00'), event=self.event, redeemed=1,
min_usages=5, max_usages=10)
response = self.client.post('/%s/%s/cart/add' % (self.orga.slug, self.event.slug), {
'item_%d' % self.ticket.id: '1',
'_voucher_code': v.code,
}, follow=True)
doc = BeautifulSoup(response.rendered_content, "lxml")
self.assertIn('select at least 4', doc.select('.alert-danger')[0].text)
with scopes_disabled():
self.assertFalse(CartPosition.objects.filter(cart_id=self.session_key, event=self.event).exists())
response = self.client.post('/%s/%s/cart/add' % (self.orga.slug, self.event.slug), {
'item_%d' % self.ticket.id: '4',
'_voucher_code': v.code,
}, follow=True)
doc = BeautifulSoup(response.rendered_content, "lxml")
self.assertFalse(doc.select('.alert-danger'))
with scopes_disabled():
self.assertEqual(4, CartPosition.objects.filter(cart_id=self.session_key, event=self.event).count())
def test_require_voucher(self):
with scopes_disabled():
v = Voucher.objects.create(quota=self.quota_shirts, event=self.event)
@@ -2049,6 +2099,45 @@ class CartTest(CartTestMixin, TestCase):
assert cp2.voucher == v
assert cp2.price == Decimal('4.00')
def test_voucher_apply_min_usages(self):
with scopes_disabled():
cp1 = CartPosition.objects.create(
event=self.event, cart_id=self.session_key, item=self.ticket,
price=23, listed_price=23, price_after_voucher=23, expires=now() + timedelta(minutes=10)
)
cp2 = CartPosition.objects.create(
event=self.event, cart_id=self.session_key, item=self.shirt, variation=self.shirt_blue,
price=150, listed_price=150, price_after_voucher=150, expires=now() + timedelta(minutes=10)
)
v = Voucher.objects.create(
event=self.event, price_mode='set', quota=self.quota_all, value=Decimal('4.00'), max_usages=100,
min_usages=4, redeemed=1
)
response = self.client.post('/%s/%s/cart/voucher' % (self.orga.slug, self.event.slug), {
'voucher': v.code,
}, follow=True)
assert 'alert-danger' in response.rendered_content
assert 'at least 3' in response.rendered_content
with scopes_disabled():
cp1.refresh_from_db()
cp2.refresh_from_db()
assert not cp1.voucher
assert not cp2.voucher
v.redeemed = 2
v.save()
response = self.client.post('/%s/%s/cart/voucher' % (self.orga.slug, self.event.slug), {
'voucher': v.code,
}, follow=True)
assert 'alert-success' in response.rendered_content
with scopes_disabled():
cp1.refresh_from_db()
cp2.refresh_from_db()
assert cp1.voucher == v
assert cp1.price == Decimal('4.00')
assert cp2.voucher == v
assert cp2.price == Decimal('4.00')
def test_voucher_apply_only_one_per_line(self):
with scopes_disabled():
cp1 = CartPosition.objects.create(

View File

@@ -2305,6 +2305,34 @@ class CheckoutTestCase(BaseCheckoutTestCase, TestCase):
with scopes_disabled():
assert CartPosition.objects.filter(cart_id=self.session_key).count() == 1
def test_voucher_min_usages(self):
with scopes_disabled():
v = Voucher.objects.create(item=self.ticket, value=Decimal('12.00'), price_mode='set', event=self.event,
valid_until=now() + timedelta(days=2), max_usages=10, redeemed=1,
min_usages=3)
CartPosition.objects.create(
event=self.event, cart_id=self.session_key, item=self.ticket,
price=12, expires=now() + timedelta(minutes=10), voucher=v
)
self._set_session('payment', 'banktransfer')
response = self.client.post('/%s/%s/checkout/confirm/' % (self.orga.slug, self.event.slug), follow=True)
doc = BeautifulSoup(response.content.decode(), "lxml")
self.assertIn("at least 2", doc.select(".alert-danger")[0].text)
with scopes_disabled():
CartPosition.objects.create(
event=self.event, cart_id=self.session_key, item=self.ticket,
price=12, expires=now() + timedelta(minutes=10), voucher=v
)
self.client.get('/%s/%s/checkout/confirm/' % (self.orga.slug, self.event.slug)) # required for session['shown_total']
response = self.client.post('/%s/%s/checkout/confirm/' % (self.orga.slug, self.event.slug), follow=True)
doc = BeautifulSoup(response.content.decode(), "lxml")
print(doc)
self.assertEqual(len(doc.select(".thank-you")), 1)
with scopes_disabled():
self.assertEqual(Order.objects.count(), 1)
self.assertEqual(OrderPosition.objects.count(), 2)
def test_voucher_ignore_quota(self):
self.quota_tickets.size = 0
self.quota_tickets.save()