mirror of
https://github.com/pretix/pretix.git
synced 2026-05-04 15:04:03 +00:00
API: Support creating cart positions with vouchers (#2635)
This commit is contained in:
@@ -888,3 +888,180 @@ def test_cartpos_create_bulk_partial_seat_failure(token_client, organizer, event
|
||||
assert CartPosition.objects.count() == 1
|
||||
cp1 = CartPosition.objects.get(pk=resp.data['results'][0]['data']['id'])
|
||||
assert cp1.price == Decimal('23.00')
|
||||
|
||||
|
||||
@pytest.mark.django_db
|
||||
def test_cartpos_create_with_voucher_by_code(token_client, organizer, event, item, quota, seat):
|
||||
with scopes_disabled():
|
||||
voucher = event.vouchers.create(code="FOOBAR", seat=seat)
|
||||
res = copy.deepcopy(CARTPOS_CREATE_PAYLOAD)
|
||||
res['item'] = item.pk
|
||||
res['voucher'] = voucher.code
|
||||
res['seat'] = seat.seat_guid
|
||||
resp = token_client.post(
|
||||
'/api/v1/organizers/{}/events/{}/cartpositions/'.format(
|
||||
organizer.slug, event.slug
|
||||
), format='json', data=res
|
||||
)
|
||||
assert resp.status_code == 201
|
||||
with scopes_disabled():
|
||||
cp1 = CartPosition.objects.get(pk=resp.data['id'])
|
||||
assert cp1.voucher == voucher
|
||||
assert cp1.seat == seat
|
||||
|
||||
|
||||
@pytest.mark.django_db
|
||||
def test_cartpos_create_with_voucher_unknown(token_client, organizer, event, item, quota):
|
||||
res = copy.deepcopy(CARTPOS_CREATE_PAYLOAD)
|
||||
res['item'] = item.pk
|
||||
res['voucher'] = 'TEST'
|
||||
resp = token_client.post(
|
||||
'/api/v1/organizers/{}/events/{}/cartpositions/'.format(
|
||||
organizer.slug, event.slug
|
||||
), format='json', data=res
|
||||
)
|
||||
assert resp.status_code == 400
|
||||
assert resp.data == ['The specified voucher does not exist.']
|
||||
|
||||
|
||||
@pytest.mark.django_db
|
||||
def test_cartpos_create_with_voucher_invalid_item(token_client, organizer, event, item, quota):
|
||||
with scopes_disabled():
|
||||
item2 = event.items.create(name="item2")
|
||||
voucher = event.vouchers.create(code="FOOBAR", item=item2)
|
||||
res = copy.deepcopy(CARTPOS_CREATE_PAYLOAD)
|
||||
res['item'] = item.pk
|
||||
res['voucher'] = voucher.code
|
||||
resp = token_client.post(
|
||||
'/api/v1/organizers/{}/events/{}/cartpositions/'.format(
|
||||
organizer.slug, event.slug
|
||||
), format='json', data=res
|
||||
)
|
||||
assert resp.status_code == 400
|
||||
assert resp.data == ['The specified voucher is not valid for the given item and variation.']
|
||||
|
||||
|
||||
@pytest.mark.django_db
|
||||
def test_cartpos_create_with_voucher_invalid_seat(token_client, organizer, event, item, quota, seat):
|
||||
with scopes_disabled():
|
||||
seat2 = event.seats.create(seat_number="A2", product=item, seat_guid="A2")
|
||||
voucher = event.vouchers.create(code="FOOBAR", item=item, seat=seat2)
|
||||
res = copy.deepcopy(CARTPOS_CREATE_PAYLOAD)
|
||||
res['item'] = item.pk
|
||||
res['voucher'] = voucher.code
|
||||
res['seat'] = seat.seat_guid
|
||||
resp = token_client.post(
|
||||
'/api/v1/organizers/{}/events/{}/cartpositions/'.format(
|
||||
organizer.slug, event.slug
|
||||
), format='json', data=res
|
||||
)
|
||||
assert resp.status_code == 400
|
||||
assert resp.data == ['The specified voucher is not valid for this seat.']
|
||||
|
||||
|
||||
@pytest.mark.django_db
|
||||
def test_cartpos_create_with_voucher_invalid_subevent(token_client, organizer, event, item, quota, subevent):
|
||||
with scopes_disabled():
|
||||
voucher = event.vouchers.create(code="FOOBAR", item=item, subevent=subevent)
|
||||
quota.subevent = subevent
|
||||
quota.save()
|
||||
res = copy.deepcopy(CARTPOS_CREATE_PAYLOAD)
|
||||
res['item'] = item.pk
|
||||
res['voucher'] = voucher.code
|
||||
res['subevent'] = subevent.pk
|
||||
resp = token_client.post(
|
||||
'/api/v1/organizers/{}/events/{}/cartpositions/'.format(
|
||||
organizer.slug, event.slug
|
||||
), format='json', data=res
|
||||
)
|
||||
assert resp.status_code == 400
|
||||
assert resp.data == ['The specified voucher is not valid for this subevent.']
|
||||
|
||||
|
||||
@pytest.mark.django_db
|
||||
def test_cartpos_create_with_voucher_expired(token_client, organizer, event, item, quota):
|
||||
with scopes_disabled():
|
||||
voucher = event.vouchers.create(code="FOOBAR", item=item, valid_until=now() - datetime.timedelta(days=1))
|
||||
res = copy.deepcopy(CARTPOS_CREATE_PAYLOAD)
|
||||
res['item'] = item.pk
|
||||
res['voucher'] = voucher.code
|
||||
resp = token_client.post(
|
||||
'/api/v1/organizers/{}/events/{}/cartpositions/'.format(
|
||||
organizer.slug, event.slug
|
||||
), format='json', data=res
|
||||
)
|
||||
assert resp.status_code == 400
|
||||
assert resp.data == ['The specified voucher is expired.']
|
||||
|
||||
|
||||
@pytest.mark.django_db
|
||||
def test_cartpos_create_with_voucher_redeemed(token_client, organizer, event, item, quota):
|
||||
with scopes_disabled():
|
||||
voucher = event.vouchers.create(code="FOOBAR", item=item, redeemed=1)
|
||||
res = copy.deepcopy(CARTPOS_CREATE_PAYLOAD)
|
||||
res['item'] = item.pk
|
||||
res['voucher'] = voucher.code
|
||||
resp = token_client.post(
|
||||
'/api/v1/organizers/{}/events/{}/cartpositions/'.format(
|
||||
organizer.slug, event.slug
|
||||
), format='json', data=res
|
||||
)
|
||||
assert resp.status_code == 400
|
||||
assert resp.data == ['The specified voucher has already been used the maximum number of times.']
|
||||
|
||||
|
||||
@pytest.mark.django_db
|
||||
def test_cartpos_create_bulk_with_voucher(token_client, organizer, event, item, quota):
|
||||
with scopes_disabled():
|
||||
voucher = event.vouchers.create(code="FOOBAR", item=item, max_usages=3, redeemed=1)
|
||||
res = copy.deepcopy(CARTPOS_CREATE_PAYLOAD)
|
||||
res['item'] = item.pk
|
||||
res['expires'] = (now() + datetime.timedelta(days=1)).isoformat()
|
||||
res['voucher'] = voucher.code
|
||||
resp = token_client.post(
|
||||
'/api/v1/organizers/{}/events/{}/cartpositions/bulk_create/'.format(
|
||||
organizer.slug, event.slug
|
||||
), format='json', data=[
|
||||
res,
|
||||
res
|
||||
]
|
||||
)
|
||||
assert resp.status_code == 200
|
||||
assert len(resp.data['results']) == 2
|
||||
assert resp.data['results'][0]['success']
|
||||
assert resp.data['results'][1]['success']
|
||||
|
||||
with scopes_disabled():
|
||||
assert CartPosition.objects.count() == 2
|
||||
cp1 = CartPosition.objects.get(pk=resp.data['results'][0]['data']['id'])
|
||||
cp2 = CartPosition.objects.get(pk=resp.data['results'][1]['data']['id'])
|
||||
assert cp1.voucher == voucher
|
||||
assert cp2.voucher == voucher
|
||||
|
||||
|
||||
@pytest.mark.django_db
|
||||
def test_cartpos_create_bulk_with_voucher_redeemed(token_client, organizer, event, item, quota):
|
||||
with scopes_disabled():
|
||||
voucher = event.vouchers.create(code="FOOBAR", item=item, max_usages=3, redeemed=2)
|
||||
res = copy.deepcopy(CARTPOS_CREATE_PAYLOAD)
|
||||
res['item'] = item.pk
|
||||
res['expires'] = (now() + datetime.timedelta(days=1)).isoformat()
|
||||
res['voucher'] = voucher.code
|
||||
resp = token_client.post(
|
||||
'/api/v1/organizers/{}/events/{}/cartpositions/bulk_create/'.format(
|
||||
organizer.slug, event.slug
|
||||
), format='json', data=[
|
||||
res,
|
||||
res
|
||||
]
|
||||
)
|
||||
assert resp.status_code == 200
|
||||
assert len(resp.data['results']) == 2
|
||||
assert resp.data['results'][0]['success']
|
||||
assert not resp.data['results'][1]['success']
|
||||
assert resp.data['results'][1]['errors'] == {'non_field_errors': ['The specified voucher has already been used the maximum number of times.']}
|
||||
|
||||
with scopes_disabled():
|
||||
assert CartPosition.objects.count() == 1
|
||||
cp1 = CartPosition.objects.get(pk=resp.data['results'][0]['data']['id'])
|
||||
assert cp1.voucher == voucher
|
||||
|
||||
@@ -2026,6 +2026,31 @@ def test_order_create_with_seat_consumed_from_cart(token_client, organizer, even
|
||||
assert p.seat == seat
|
||||
|
||||
|
||||
@pytest.mark.django_db
|
||||
def test_order_create_with_voucher_consumed_from_cart(token_client, organizer, event, item, quota, question):
|
||||
with scopes_disabled():
|
||||
voucher = event.vouchers.create(code="FOOBAR", item=item, max_usages=3, redeemed=2)
|
||||
CartPosition.objects.create(
|
||||
event=event, cart_id='aaa', item=item, voucher=voucher,
|
||||
price=21.5, expires=now() + datetime.timedelta(minutes=10),
|
||||
)
|
||||
res = copy.deepcopy(ORDER_CREATE_PAYLOAD)
|
||||
res['positions'][0]['item'] = item.pk
|
||||
res['positions'][0]['voucher'] = voucher.code
|
||||
res['positions'][0]['answers'][0]['question'] = question.pk
|
||||
res['consume_carts'] = ['aaa']
|
||||
resp = token_client.post(
|
||||
'/api/v1/organizers/{}/events/{}/orders/'.format(
|
||||
organizer.slug, event.slug
|
||||
), format='json', data=res
|
||||
)
|
||||
assert resp.status_code == 201
|
||||
with scopes_disabled():
|
||||
o = Order.objects.get(code=resp.data['code'])
|
||||
p = o.positions.first()
|
||||
assert p.voucher == voucher
|
||||
|
||||
|
||||
@pytest.mark.django_db
|
||||
def test_order_create_send_no_emails(token_client, organizer, event, item, quota, question):
|
||||
res = copy.deepcopy(ORDER_CREATE_PAYLOAD)
|
||||
|
||||
Reference in New Issue
Block a user