def test_validate_membership_test_mode(event, customer, membership, requiring_ticket, membership_type): with pytest.raises(ValidationError) as excinfo: membership.testmode = True membership.save() validate_memberships_in_order( customer, [CartPosition(item=requiring_ticket, used_membership=membership)], event, lock=False, ignored_order=None, testmode=False, ) assert "test mode" in str(excinfo.value) with pytest.raises(ValidationError) as excinfo: membership.testmode = False membership.save() validate_memberships_in_order( customer, [CartPosition(item=requiring_ticket, used_membership=membership)], event, lock=False, ignored_order=None, testmode=True, ) assert "test mode" in str(excinfo.value)
def test_validate_membership_required(event, customer, membership, requiring_ticket, membership_type): with pytest.raises(ValidationError) as excinfo: validate_memberships_in_order(customer, [CartPosition(item=requiring_ticket, )], event, lock=False, ignored_order=None) assert "requires an active" in str(excinfo.value)
def test_validate_membership_wrong_type(event, customer, membership, requiring_ticket, membership_type): requiring_ticket.require_membership_types.clear() with pytest.raises(ValidationError) as excinfo: validate_memberships_in_order( customer, [CartPosition(item=requiring_ticket, used_membership=membership)], event, lock=False, ignored_order=None) assert "not allowed for the product" in str(excinfo.value)
def test_validate_membership_wrong_customer(event, customer, membership, requiring_ticket, membership_type): customer2 = event.organizer.customers.create(email="*****@*****.**") with pytest.raises(ValidationError) as excinfo: validate_memberships_in_order( customer2, [CartPosition(item=requiring_ticket, used_membership=membership)], event, lock=False, ignored_order=None) assert "different customer" in str(excinfo.value)
def test_validate_membership_wrong_date(event, customer, membership, requiring_ticket, membership_type): membership.date_start -= timedelta(days=100) membership.date_end -= timedelta(days=100) membership.save() with pytest.raises(ValidationError) as excinfo: validate_memberships_in_order( customer, [CartPosition(item=requiring_ticket, used_membership=membership)], event, lock=False, ignored_order=None) assert "taking place at" in str(excinfo.value)
def test_validate_membership_not_required(event, customer, membership, granting_ticket, membership_type): with pytest.raises(ValidationError) as excinfo: validate_memberships_in_order( customer, [CartPosition( item=granting_ticket, used_membership=membership, )], event, lock=False, ignored_order=None) assert "does not require" in str(excinfo.value)
def test_validate_membership_ensure_locking(event, customer, membership, requiring_ticket, membership_type, django_assert_num_queries): with django_assert_num_queries(4) as captured: validate_memberships_in_order(customer, [ CartPosition( item=requiring_ticket, used_membership=membership, ) ], event, lock=True, ignored_order=None) if 'sqlite' not in settings.DATABASES['default']['ENGINE']: assert any('FOR UPDATE' in s['sql'] for s in captured)
def test_validate_membership_max_usages(event, customer, membership, requiring_ticket, membership_type): membership_type.max_usages = 1 membership_type.allow_parallel_usage = True 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"}) with pytest.raises(ValidationError) as excinfo: validate_memberships_in_order( customer, [CartPosition(item=requiring_ticket, used_membership=membership)], event, lock=False, ignored_order=None) assert "more than 1 time" in str(excinfo.value) membership_type.max_usages = 2 membership_type.save() validate_memberships_in_order( customer, [CartPosition(item=requiring_ticket, used_membership=membership)], event, lock=False, ignored_order=None) with pytest.raises(ValidationError) as excinfo: validate_memberships_in_order(customer, [ CartPosition(item=requiring_ticket, used_membership=membership), CartPosition(item=requiring_ticket, used_membership=membership), ], event, lock=False, ignored_order=None) assert "more than 2 times" in str(excinfo.value)
def test_validate_membership_parallel(event, customer, membership, subevent, requiring_ticket, membership_type): se2 = event.subevents.create( name='Foo', date_from=TZ.localize(datetime(2021, 4, 28, 10, 0, 0, 0)), ) 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, subevent=subevent, price=Decimal("23"), attendee_name_parts={'full_name': "Peter"}) with pytest.raises(ValidationError) as excinfo: validate_memberships_in_order(customer, [ CartPosition(item=requiring_ticket, used_membership=membership, subevent=subevent) ], event, lock=False, ignored_order=None) assert "different ticket at the same time" in str(excinfo.value) validate_memberships_in_order(customer, [ CartPosition( item=requiring_ticket, used_membership=membership, subevent=se2) ], event, lock=False, ignored_order=None) with pytest.raises(ValidationError) as excinfo: validate_memberships_in_order(customer, [ CartPosition(item=requiring_ticket, used_membership=membership, subevent=se2), CartPosition(item=requiring_ticket, used_membership=membership, subevent=se2) ], event, lock=False, ignored_order=None) assert "different ticket at the same time" in str(excinfo.value) membership_type.allow_parallel_usage = True membership_type.save() validate_memberships_in_order(customer, [ CartPosition(item=requiring_ticket, used_membership=membership, subevent=subevent) ], event, lock=False, ignored_order=None)