Memberships: Check valid_from/valid_until for parallel usage (#3975)

This commit is contained in:
Raphael Michel
2024-03-15 16:40:41 +01:00
committed by GitHub
parent b6221ab6d9
commit 9f794290dc
5 changed files with 272 additions and 16 deletions

View File

@@ -215,6 +215,7 @@ def test_validate_membership_ensure_locking(event, customer, membership, requiri
customer,
[
CartPosition(
event=event,
item=requiring_ticket,
used_membership=membership,
)
@@ -449,6 +450,7 @@ def test_validate_membership_parallel(event, customer, membership, subevent, req
customer,
[
CartPosition(
event=event,
item=requiring_ticket,
used_membership=membership,
subevent=subevent
@@ -464,6 +466,7 @@ def test_validate_membership_parallel(event, customer, membership, subevent, req
customer,
[
CartPosition(
event=event,
item=requiring_ticket,
used_membership=membership,
subevent=se2
@@ -479,11 +482,13 @@ def test_validate_membership_parallel(event, customer, membership, subevent, req
customer,
[
CartPosition(
event=event,
item=requiring_ticket,
used_membership=membership,
subevent=se2
),
CartPosition(
event=event,
item=requiring_ticket,
used_membership=membership,
subevent=se2
@@ -501,6 +506,7 @@ def test_validate_membership_parallel(event, customer, membership, subevent, req
customer,
[
CartPosition(
event=event,
item=requiring_ticket,
used_membership=membership,
subevent=subevent
@@ -512,6 +518,205 @@ def test_validate_membership_parallel(event, customer, membership, subevent, req
)
@pytest.mark.django_db
def test_validate_membership_parallel_validity_dynamic(event, customer, membership, requiring_ticket, membership_type):
requiring_ticket.validity_mode = Item.VALIDITY_MODE_DYNAMIC
requiring_ticket.validity_dynamic_start_choice = False
requiring_ticket.validity_dynamic_duration_days = 1
requiring_ticket.save()
membership_type.allow_parallel_usage = False
membership_type.save()
o1 = Order.objects.create(
status=Order.STATUS_PENDING,
event=event,
email='admin@localhost',
datetime=now() - timedelta(days=3),
expires=now() + timedelta(days=11),
total=Decimal("23"),
)
OrderPosition.objects.create(
order=o1,
item=requiring_ticket,
used_membership=membership,
variation=None,
price=Decimal("23"),
attendee_name_parts={'full_name': "Peter"},
valid_from=now(),
valid_until=now().replace(hour=23, minute=59, second=59),
)
with pytest.raises(ValidationError) as excinfo:
validate_memberships_in_order(
customer,
[
CartPosition(
event=event,
item=requiring_ticket,
used_membership=membership,
)
],
event,
lock=False,
ignored_order=None
)
assert "different ticket that overlaps" in str(excinfo.value)
requiring_ticket.validity_dynamic_start_choice = True
requiring_ticket.save()
validate_memberships_in_order(
customer,
[
CartPosition(
event=event,
item=requiring_ticket,
used_membership=membership,
)
],
event,
lock=False,
ignored_order=None,
valid_from_not_chosen=True
)
with pytest.raises(ValidationError) as excinfo:
validate_memberships_in_order(
customer,
[
CartPosition(
event=event,
item=requiring_ticket,
used_membership=membership,
)
],
event,
lock=False,
ignored_order=None,
valid_from_not_chosen=False
)
assert "different ticket that overlaps" in str(excinfo.value)
validate_memberships_in_order(
customer,
[
CartPosition(
event=event,
item=requiring_ticket,
used_membership=membership,
requested_valid_from=now() + timedelta(days=1)
)
],
event,
lock=False,
ignored_order=None,
)
membership_type.allow_parallel_usage = True
membership_type.save()
validate_memberships_in_order(
customer,
[
CartPosition(
event=event,
item=requiring_ticket,
used_membership=membership,
)
],
event,
lock=False,
ignored_order=None
)
@pytest.mark.django_db
def test_validate_membership_parallel_validity_fixed(event, customer, membership, requiring_ticket, membership_type):
requiring_ticket.validity_mode = Item.VALIDITY_MODE_FIXED
requiring_ticket.validity_fixed_from = now().replace(hour=2, minute=20, second=0)
requiring_ticket.validity_fixed_until = now().replace(hour=6, minute=20, second=0)
requiring_ticket.save()
membership_type.allow_parallel_usage = False
membership_type.save()
o1 = Order.objects.create(
status=Order.STATUS_PENDING,
event=event,
email='admin@localhost',
datetime=now() - timedelta(days=3),
expires=now() + timedelta(days=11),
total=Decimal("23"),
)
OrderPosition.objects.create(
order=o1,
item=requiring_ticket,
used_membership=membership,
variation=None,
price=Decimal("23"),
attendee_name_parts={'full_name': "Peter"},
valid_from=now().replace(hour=2, minute=20, second=0),
valid_until=now().replace(hour=6, minute=20, second=0),
)
requiring_ticket.validity_fixed_from = now().replace(hour=5, minute=20, second=0)
requiring_ticket.validity_fixed_until = now().replace(hour=8, minute=20, second=0)
requiring_ticket.save()
with pytest.raises(ValidationError) as excinfo:
validate_memberships_in_order(
customer,
[
CartPosition(
event=event,
item=requiring_ticket,
used_membership=membership,
)
],
event,
lock=False,
ignored_order=None
)
assert "different ticket that overlaps" in str(excinfo.value)
requiring_ticket.validity_fixed_from = now().replace(hour=6, minute=20, second=1)
requiring_ticket.validity_fixed_until = now().replace(hour=8, minute=20, second=0)
requiring_ticket.save()
validate_memberships_in_order(
customer,
[
CartPosition(
event=event,
item=requiring_ticket,
used_membership=membership,
)
],
event,
lock=False,
ignored_order=None,
valid_from_not_chosen=True
)
requiring_ticket.validity_fixed_from = now().replace(hour=0, minute=20, second=0)
requiring_ticket.validity_fixed_until = now().replace(hour=1, minute=20, second=0)
requiring_ticket.save()
validate_memberships_in_order(
customer,
[
CartPosition(
event=event,
item=requiring_ticket,
used_membership=membership,
)
],
event,
lock=False,
ignored_order=None,
valid_from_not_chosen=True
)
@pytest.mark.django_db
def test_use_membership(event, customer, membership, requiring_ticket):
cp1 = CartPosition.objects.create(