Integrate django-scopes (#1319)

* Install django-scopes

* Fix tests.api

* Update tasks and cronjobs

* Fix remaining tests

* Remove unused import

* Fix tests after rebase

* Disable scopes for get_Events_with_any_permission

* Disable scopes for a management command
This commit is contained in:
Raphael Michel
2019-06-17 10:46:55 +02:00
committed by GitHub
parent b1db5dbb3e
commit d85ddb5bda
130 changed files with 6253 additions and 4509 deletions
+18
View File
@@ -1,7 +1,9 @@
from datetime import datetime
import pytest
from django.test import utils
from django.utils.timezone import now
from django_scopes import scopes_disabled
from pytz import UTC
from rest_framework.test import APIClient
@@ -15,16 +17,19 @@ def client():
@pytest.fixture
@scopes_disabled()
def organizer():
return Organizer.objects.create(name='Dummy', slug='dummy')
@pytest.fixture
@scopes_disabled()
def meta_prop(organizer):
return organizer.meta_properties.create(name="type", default="Concert")
@pytest.fixture
@scopes_disabled()
def event(organizer, meta_prop):
e = Event.objects.create(
organizer=organizer, name='Dummy', slug='dummy',
@@ -37,6 +42,7 @@ def event(organizer, meta_prop):
@pytest.fixture
@scopes_disabled()
def event2(organizer, meta_prop):
e = Event.objects.create(
organizer=organizer, name='Dummy2', slug='dummy2',
@@ -48,6 +54,7 @@ def event2(organizer, meta_prop):
@pytest.fixture
@scopes_disabled()
def event3(organizer, meta_prop):
e = Event.objects.create(
organizer=organizer, name='Dummy3', slug='dummy3',
@@ -59,6 +66,7 @@ def event3(organizer, meta_prop):
@pytest.fixture
@scopes_disabled()
def team(organizer):
return Team.objects.create(
organizer=organizer,
@@ -73,6 +81,7 @@ def team(organizer):
@pytest.fixture
@scopes_disabled()
def device(organizer):
return Device.objects.create(
organizer=organizer,
@@ -89,6 +98,7 @@ def user():
@pytest.fixture
@scopes_disabled()
def user_client(client, team, user):
team.can_view_orders = True
team.can_view_vouchers = True
@@ -100,6 +110,7 @@ def user_client(client, team, user):
@pytest.fixture
@scopes_disabled()
def token_client(client, team):
team.can_view_orders = True
team.can_view_vouchers = True
@@ -117,6 +128,7 @@ def device_client(client, device):
@pytest.fixture
@scopes_disabled()
def subevent(event, meta_prop):
event.has_subevents = True
event.save()
@@ -127,6 +139,7 @@ def subevent(event, meta_prop):
@pytest.fixture
@scopes_disabled()
def subevent2(event2, meta_prop):
event2.has_subevents = True
event2.save()
@@ -137,10 +150,15 @@ def subevent2(event2, meta_prop):
@pytest.fixture
@scopes_disabled()
def taxrule(event):
return event.tax_rules.create(name="VAT", rate=19)
@pytest.fixture
@scopes_disabled()
def taxrule2(event2):
return event2.tax_rules.create(name="VAT", rate=25)
utils.setup_databases = scopes_disabled()(utils.setup_databases)
-1
View File
@@ -13,7 +13,6 @@ def test_no_auth(client):
def test_session_auth_no_teams(client, user):
client.login(email=user.email, password='dummy')
resp = client.get('/api/v1/organizers/')
print(resp.data)
assert resp.status_code == 200
assert len(resp.data['results']) == 0
+38 -22
View File
@@ -5,6 +5,7 @@ from unittest import mock
import pytest
from django.utils.timezone import now
from django_scopes import scopes_disabled
from pytz import UTC
from pretix.base.models import Question
@@ -175,7 +176,8 @@ def test_cartpos_create(token_client, organizer, event, item, quota, question):
), format='json', data=res
)
assert resp.status_code == 201
cp = CartPosition.objects.get(pk=resp.data['id'])
with scopes_disabled():
cp = CartPosition.objects.get(pk=resp.data['id'])
assert cp.price == Decimal('23.00')
assert cp.item == item
assert cp.attendee_name_parts == {'full_name': 'Peter'}
@@ -193,7 +195,8 @@ def test_cartpos_create_name_optional(token_client, organizer, event, item, quot
), format='json', data=res
)
assert resp.status_code == 201
cp = CartPosition.objects.get(pk=resp.data['id'])
with scopes_disabled():
cp = CartPosition.objects.get(pk=resp.data['id'])
assert cp.price == Decimal('23.00')
assert cp.item == item
assert cp.attendee_name_parts == {}
@@ -217,7 +220,8 @@ def test_cartpos_create_legacy_name(token_client, organizer, event, item, quota,
), format='json', data=res
)
assert resp.status_code == 201
cp = CartPosition.objects.get(pk=resp.data['id'])
with scopes_disabled():
cp = CartPosition.objects.get(pk=resp.data['id'])
assert cp.price == Decimal('23.00')
assert cp.item == item
assert cp.attendee_name_parts == {'_legacy': 'Peter'}
@@ -247,7 +251,8 @@ def test_cartpos_cart_id_optional(token_client, organizer, event, item, quota, q
), format='json', data=res
)
assert resp.status_code == 201
cp = CartPosition.objects.get(pk=resp.data['id'])
with scopes_disabled():
cp = CartPosition.objects.get(pk=resp.data['id'])
assert cp.price == Decimal('23.00')
assert cp.item == item
assert len(cp.cart_id) > 48
@@ -300,7 +305,8 @@ def test_cartpos_create_item_validation(token_client, organizer, event, item, it
assert resp.status_code == 400
assert resp.data == {'item': ['The specified item does not belong to this event.']}
var2 = item2.variations.create(value="A")
with scopes_disabled():
var2 = item2.variations.create(value="A")
res['item'] = item.pk
res['variation'] = var2.pk
@@ -312,7 +318,8 @@ def test_cartpos_create_item_validation(token_client, organizer, event, item, it
assert resp.status_code == 400
assert resp.data == {'non_field_errors': ['You cannot specify a variation for this item.']}
var1 = item.variations.create(value="A")
with scopes_disabled():
var1 = item.variations.create(value="A")
res['item'] = item.pk
res['variation'] = var1.pk
resp = token_client.post(
@@ -361,7 +368,8 @@ def test_cartpos_expires_optional(token_client, organizer, event, item, quota, q
), format='json', data=res
)
assert resp.status_code == 201
cp = CartPosition.objects.get(pk=resp.data['id'])
with scopes_disabled():
cp = CartPosition.objects.get(pk=resp.data['id'])
assert cp.price == Decimal('23.00')
assert cp.item == item
assert cp.expires - now() > datetime.timedelta(minutes=25)
@@ -410,7 +418,8 @@ def test_cartpos_create_answer_validation(token_client, organizer, event, item,
assert resp.data == {
'answers': [{'non_field_errors': ['You need to specify options if the question is of a choice type.']}]}
question.options.create(answer="L")
with scopes_disabled():
question.options.create(answer="L")
res['answers'][0]['options'] = [
question.options.first().pk,
question.options.last().pk,
@@ -445,8 +454,9 @@ def test_cartpos_create_answer_validation(token_client, organizer, event, item,
), format='json', data=res
)
assert resp.status_code == 201
pos = CartPosition.objects.get(pk=resp.data['id'])
answ = pos.answers.first()
with scopes_disabled():
pos = CartPosition.objects.get(pk=resp.data['id'])
answ = pos.answers.first()
assert answ.question == question
assert answ.answer == "XL, L"
@@ -460,8 +470,9 @@ def test_cartpos_create_answer_validation(token_client, organizer, event, item,
), format='json', data=res
)
assert resp.status_code == 201
pos = CartPosition.objects.get(pk=resp.data['id'])
answ = pos.answers.first()
with scopes_disabled():
pos = CartPosition.objects.get(pk=resp.data['id'])
answ = pos.answers.first()
assert answ.answer == "3.45"
question.type = Question.TYPE_NUMBER
@@ -486,8 +497,9 @@ def test_cartpos_create_answer_validation(token_client, organizer, event, item,
), format='json', data=res
)
assert resp.status_code == 201
pos = CartPosition.objects.get(pk=resp.data['id'])
answ = pos.answers.first()
with scopes_disabled():
pos = CartPosition.objects.get(pk=resp.data['id'])
answ = pos.answers.first()
assert answ.answer == "True"
question.type = Question.TYPE_BOOLEAN
@@ -499,8 +511,9 @@ def test_cartpos_create_answer_validation(token_client, organizer, event, item,
), format='json', data=res
)
assert resp.status_code == 201
pos = CartPosition.objects.get(pk=resp.data['id'])
answ = pos.answers.first()
with scopes_disabled():
pos = CartPosition.objects.get(pk=resp.data['id'])
answ = pos.answers.first()
assert answ.answer == "False"
question.type = Question.TYPE_BOOLEAN
@@ -523,8 +536,9 @@ def test_cartpos_create_answer_validation(token_client, organizer, event, item,
), format='json', data=res
)
assert resp.status_code == 201
pos = CartPosition.objects.get(pk=resp.data['id'])
answ = pos.answers.first()
with scopes_disabled():
pos = CartPosition.objects.get(pk=resp.data['id'])
answ = pos.answers.first()
assert answ.answer == "2018-05-14"
question.type = Question.TYPE_DATE
@@ -548,8 +562,9 @@ def test_cartpos_create_answer_validation(token_client, organizer, event, item,
), format='json', data=res
)
assert resp.status_code == 201
pos = CartPosition.objects.get(pk=resp.data['id'])
answ = pos.answers.first()
with scopes_disabled():
pos = CartPosition.objects.get(pk=resp.data['id'])
answ = pos.answers.first()
assert answ.answer == "2018-05-14 13:00:00+00:00"
question.type = Question.TYPE_DATETIME
@@ -574,8 +589,9 @@ def test_cartpos_create_answer_validation(token_client, organizer, event, item,
), format='json', data=res
)
assert resp.status_code == 201
pos = CartPosition.objects.get(pk=resp.data['id'])
answ = pos.answers.first()
with scopes_disabled():
pos = CartPosition.objects.get(pk=resp.data['id'])
answ = pos.answers.first()
assert answ.answer == "13:00:00"
question.type = Question.TYPE_TIME
+113 -65
View File
@@ -6,6 +6,7 @@ from unittest import mock
import pytest
from django.utils.timezone import now
from django_countries.fields import Country
from django_scopes import scopes_disabled
from i18nfield.strings import LazyI18nString
from pytz import UTC
@@ -157,7 +158,8 @@ def test_list_list(token_client, organizer, event, clist, item, subevent):
resp = token_client.get(
'/api/v1/organizers/{}/events/{}/checkinlists/?subevent={}'.format(organizer.slug, event.slug, subevent.pk))
assert [res] == resp.data['results']
se2 = event.subevents.create(name="Foobar", date_from=datetime.datetime(2017, 12, 27, 10, 0, 0, tzinfo=UTC))
with scopes_disabled():
se2 = event.subevents.create(name="Foobar", date_from=datetime.datetime(2017, 12, 27, 10, 0, 0, tzinfo=UTC))
resp = token_client.get(
'/api/v1/organizers/{}/events/{}/checkinlists/?subevent={}'.format(organizer.slug, event.slug, se2.pk))
assert [] == resp.data['results']
@@ -188,10 +190,11 @@ def test_list_create(token_client, organizer, event, item, item_on_wrong_event):
format='json'
)
assert resp.status_code == 201
cl = CheckinList.objects.get(pk=resp.data['id'])
assert cl.name == "VIP"
assert cl.limit_products.count() == 1
assert not cl.all_products
with scopes_disabled():
cl = CheckinList.objects.get(pk=resp.data['id'])
assert cl.name == "VIP"
assert cl.limit_products.count() == 1
assert not cl.all_products
resp = token_client.post(
'/api/v1/organizers/{}/events/{}/checkinlists/'.format(organizer.slug, event.slug),
@@ -271,18 +274,20 @@ def test_list_update(token_client, organizer, event, clist):
format='json'
)
assert resp.status_code == 200
cl = CheckinList.objects.get(pk=resp.data['id'])
with scopes_disabled():
cl = CheckinList.objects.get(pk=resp.data['id'])
assert cl.name == "VIP"
@pytest.mark.django_db
def test_list_all_items_positions(token_client, organizer, event, clist, clist_all, item, other_item, order):
p1 = dict(TEST_ORDERPOSITION1_RES)
p1["id"] = order.positions.first().pk
p1["item"] = item.pk
p2 = dict(TEST_ORDERPOSITION2_RES)
p2["id"] = order.positions.last().pk
p2["item"] = other_item.pk
with scopes_disabled():
p1 = dict(TEST_ORDERPOSITION1_RES)
p1["id"] = order.positions.first().pk
p1["item"] = item.pk
p2 = dict(TEST_ORDERPOSITION2_RES)
p2["id"] = order.positions.last().pk
p2["item"] = other_item.pk
# All items
resp = token_client.get('/api/v1/organizers/{}/events/{}/checkinlists/{}/positions/?ordering=positionid'.format(
@@ -292,7 +297,8 @@ def test_list_all_items_positions(token_client, organizer, event, clist, clist_a
assert [p1, p2] == resp.data['results']
# Check-ins on other list ignored
order.positions.first().checkins.create(list=clist)
with scopes_disabled():
order.positions.first().checkins.create(list=clist)
resp = token_client.get('/api/v1/organizers/{}/events/{}/checkinlists/{}/positions/?ordering=positionid'.format(
organizer.slug, event.slug, clist_all.pk
))
@@ -305,7 +311,8 @@ def test_list_all_items_positions(token_client, organizer, event, clist, clist_a
assert [] == resp.data['results']
# Only checked in
c = order.positions.first().checkins.create(list=clist_all)
with scopes_disabled():
c = order.positions.first().checkins.create(list=clist_all)
p1['checkins'] = [
{
'list': clist_all.pk,
@@ -341,7 +348,8 @@ def test_list_all_items_positions(token_client, organizer, event, clist, clist_a
# Order by checkin date
time.sleep(1)
c = order.positions.last().checkins.create(list=clist_all)
with scopes_disabled():
c = order.positions.last().checkins.create(list=clist_all)
p2['checkins'] = [
{
'list': clist_all.pk,
@@ -388,7 +396,8 @@ def test_list_all_items_positions(token_client, organizer, event, clist, clist_a
@pytest.mark.django_db
def test_list_limited_items_positions(token_client, organizer, event, clist, item, order):
p1 = dict(TEST_ORDERPOSITION1_RES)
p1["id"] = order.positions.first().pk
with scopes_disabled():
p1["id"] = order.positions.first().pk
p1["item"] = item.pk
# All items
@@ -402,12 +411,13 @@ def test_list_limited_items_positions(token_client, organizer, event, clist, ite
@pytest.mark.django_db
def test_list_limited_items_position_detail(token_client, organizer, event, clist, item, order):
p1 = dict(TEST_ORDERPOSITION1_RES)
p1["id"] = order.positions.first().pk
with scopes_disabled():
p1["id"] = order.positions.first().pk
p1["item"] = item.pk
# All items
resp = token_client.get('/api/v1/organizers/{}/events/{}/checkinlists/{}/positions/{}/'.format(
organizer.slug, event.slug, clist.pk, order.positions.first().pk
organizer.slug, event.slug, clist.pk, p1["id"]
))
assert resp.status_code == 200
assert p1 == resp.data
@@ -415,12 +425,13 @@ def test_list_limited_items_position_detail(token_client, organizer, event, clis
@pytest.mark.django_db
def test_status(token_client, organizer, event, clist_all, item, other_item, order):
op = order.positions.first()
var1 = item.variations.create(value="XS")
var2 = item.variations.create(value="S")
op.variation = var1
op.save()
Checkin.objects.create(position=op, list=clist_all)
with scopes_disabled():
op = order.positions.first()
var1 = item.variations.create(value="XS")
var2 = item.variations.create(value="S")
op.variation = var1
op.save()
Checkin.objects.create(position=op, list=clist_all)
resp = token_client.get('/api/v1/organizers/{}/events/{}/checkinlists/{}/status/'.format(
organizer.slug, event.slug, clist_all.pk,
))
@@ -464,21 +475,25 @@ def test_status(token_client, organizer, event, clist_all, item, other_item, ord
def test_custom_datetime(token_client, organizer, clist, event, order):
dt = now() - datetime.timedelta(days=1)
dt = dt.replace(microsecond=0)
with scopes_disabled():
p = order.positions.first().pk
resp = token_client.post('/api/v1/organizers/{}/events/{}/checkinlists/{}/positions/{}/redeem/'.format(
organizer.slug, event.slug, clist.pk, order.positions.first().pk
organizer.slug, event.slug, clist.pk, p
), {
'datetime': dt.isoformat()
}, format='json')
assert resp.status_code == 201
assert resp.data['status'] == 'ok'
assert Checkin.objects.last().datetime == dt
with scopes_disabled():
assert Checkin.objects.last().datetime == dt
@pytest.mark.django_db
def test_name_fallback(token_client, organizer, clist, event, order):
order.invoice_address.name_parts = {'_legacy': 'Paul'}
order.invoice_address.save()
op = order.positions.first()
with scopes_disabled():
op = order.positions.first()
op.attendee_name_cached = None
op.attendee_name_parts = {}
op.save()
@@ -493,8 +508,10 @@ def test_name_fallback(token_client, organizer, clist, event, order):
@pytest.mark.django_db
def test_by_secret(token_client, organizer, clist, event, order):
with scopes_disabled():
p = order.positions.first()
resp = token_client.post('/api/v1/organizers/{}/events/{}/checkinlists/{}/positions/{}/redeem/'.format(
organizer.slug, event.slug, clist.pk, order.positions.first().secret
organizer.slug, event.slug, clist.pk, p.secret
), {}, format='json')
assert resp.status_code == 201
assert resp.data['status'] == 'ok'
@@ -502,13 +519,15 @@ def test_by_secret(token_client, organizer, clist, event, order):
@pytest.mark.django_db
def test_only_once(token_client, organizer, clist, event, order):
with scopes_disabled():
p = order.positions.first()
resp = token_client.post('/api/v1/organizers/{}/events/{}/checkinlists/{}/positions/{}/redeem/'.format(
organizer.slug, event.slug, clist.pk, order.positions.first().pk
organizer.slug, event.slug, clist.pk, p.pk
), {}, format='json')
assert resp.status_code == 201
assert resp.data['status'] == 'ok'
resp = token_client.post('/api/v1/organizers/{}/events/{}/checkinlists/{}/positions/{}/redeem/'.format(
organizer.slug, event.slug, clist.pk, order.positions.first().pk
organizer.slug, event.slug, clist.pk, p.pk
), {}, format='json')
assert resp.status_code == 400
assert resp.data['status'] == 'error'
@@ -517,13 +536,15 @@ def test_only_once(token_client, organizer, clist, event, order):
@pytest.mark.django_db
def test_reupload_same_nonce(token_client, organizer, clist, event, order):
with scopes_disabled():
p = order.positions.first()
resp = token_client.post('/api/v1/organizers/{}/events/{}/checkinlists/{}/positions/{}/redeem/'.format(
organizer.slug, event.slug, clist.pk, order.positions.first().pk
organizer.slug, event.slug, clist.pk, p.pk
), {'nonce': 'foobar'}, format='json')
assert resp.status_code == 201
assert resp.data['status'] == 'ok'
resp = token_client.post('/api/v1/organizers/{}/events/{}/checkinlists/{}/positions/{}/redeem/'.format(
organizer.slug, event.slug, clist.pk, order.positions.first().pk
organizer.slug, event.slug, clist.pk, p.pk
), {'nonce': 'foobar'}, format='json')
assert resp.status_code == 201
assert resp.data['status'] == 'ok'
@@ -531,13 +552,15 @@ def test_reupload_same_nonce(token_client, organizer, clist, event, order):
@pytest.mark.django_db
def test_multiple_different_list(token_client, organizer, clist, clist_all, event, order):
with scopes_disabled():
p = order.positions.first()
resp = token_client.post('/api/v1/organizers/{}/events/{}/checkinlists/{}/positions/{}/redeem/'.format(
organizer.slug, event.slug, clist.pk, order.positions.first().pk
organizer.slug, event.slug, clist.pk, p.pk
), {'nonce': 'foobar'}, format='json')
assert resp.status_code == 201
assert resp.data['status'] == 'ok'
resp = token_client.post('/api/v1/organizers/{}/events/{}/checkinlists/{}/positions/{}/redeem/'.format(
organizer.slug, event.slug, clist_all.pk, order.positions.first().pk
organizer.slug, event.slug, clist_all.pk, p.pk
), {'nonce': 'baz'}, format='json')
assert resp.status_code == 201
assert resp.data['status'] == 'ok'
@@ -545,13 +568,15 @@ def test_multiple_different_list(token_client, organizer, clist, clist_all, even
@pytest.mark.django_db
def test_forced_multiple(token_client, organizer, clist, event, order):
with scopes_disabled():
p = order.positions.first()
resp = token_client.post('/api/v1/organizers/{}/events/{}/checkinlists/{}/positions/{}/redeem/'.format(
organizer.slug, event.slug, clist.pk, order.positions.first().pk
organizer.slug, event.slug, clist.pk, p.pk
), {}, format='json')
assert resp.status_code == 201
assert resp.data['status'] == 'ok'
resp = token_client.post('/api/v1/organizers/{}/events/{}/checkinlists/{}/positions/{}/redeem/'.format(
organizer.slug, event.slug, clist.pk, order.positions.first().pk
organizer.slug, event.slug, clist.pk, p.pk
), {'force': True}, format='json')
assert resp.status_code == 201
assert resp.data['status'] == 'ok'
@@ -559,17 +584,19 @@ def test_forced_multiple(token_client, organizer, clist, event, order):
@pytest.mark.django_db
def test_require_paid(token_client, organizer, clist, event, order):
with scopes_disabled():
p = order.positions.first()
order.status = Order.STATUS_PENDING
order.save()
resp = token_client.post('/api/v1/organizers/{}/events/{}/checkinlists/{}/positions/{}/redeem/'.format(
organizer.slug, event.slug, clist.pk, order.positions.first().pk
organizer.slug, event.slug, clist.pk, p.pk
), {}, format='json')
assert resp.status_code == 400
assert resp.data['status'] == 'error'
assert resp.data['reason'] == 'unpaid'
resp = token_client.post('/api/v1/organizers/{}/events/{}/checkinlists/{}/positions/{}/redeem/'.format(
organizer.slug, event.slug, clist.pk, order.positions.first().pk
organizer.slug, event.slug, clist.pk, p.pk
), {'ignore_unpaid': True}, format='json')
assert resp.status_code == 400
assert resp.data['status'] == 'error'
@@ -579,14 +606,14 @@ def test_require_paid(token_client, organizer, clist, event, order):
clist.save()
resp = token_client.post('/api/v1/organizers/{}/events/{}/checkinlists/{}/positions/{}/redeem/'.format(
organizer.slug, event.slug, clist.pk, order.positions.first().pk
organizer.slug, event.slug, clist.pk, p.pk
), {}, format='json')
assert resp.status_code == 400
assert resp.data['status'] == 'error'
assert resp.data['reason'] == 'unpaid'
resp = token_client.post('/api/v1/organizers/{}/events/{}/checkinlists/{}/positions/{}/redeem/'.format(
organizer.slug, event.slug, clist.pk, order.positions.first().pk
organizer.slug, event.slug, clist.pk, p.pk
), {'ignore_unpaid': True}, format='json')
assert resp.status_code == 201
assert resp.data['status'] == 'ok'
@@ -603,88 +630,105 @@ def question(event, item):
@pytest.mark.django_db
def test_question_number(token_client, organizer, clist, event, order, question):
question[0].options.all().delete()
with scopes_disabled():
p = order.positions.first()
question[0].options.all().delete()
question[0].type = 'N'
question[0].save()
resp = token_client.post('/api/v1/organizers/{}/events/{}/checkinlists/{}/positions/{}/redeem/'.format(
organizer.slug, event.slug, clist.pk, order.positions.first().pk
organizer.slug, event.slug, clist.pk, p.pk
), {}, format='json')
assert resp.status_code == 400
assert resp.data['status'] == 'incomplete'
assert resp.data['questions'] == [QuestionSerializer(question[0]).data]
with scopes_disabled():
assert resp.data['questions'] == [QuestionSerializer(question[0]).data]
resp = token_client.post('/api/v1/organizers/{}/events/{}/checkinlists/{}/positions/{}/redeem/'.format(
organizer.slug, event.slug, clist.pk, order.positions.first().pk
organizer.slug, event.slug, clist.pk, p.pk
), {'answers': {question[0].pk: "3.24"}}, format='json')
print(resp.data)
assert resp.status_code == 201
assert resp.data['status'] == 'ok'
assert order.positions.first().answers.get(question=question[0]).answer == '3.24'
with scopes_disabled():
assert order.positions.first().answers.get(question=question[0]).answer == '3.24'
@pytest.mark.django_db
def test_question_choice(token_client, organizer, clist, event, order, question):
with scopes_disabled():
p = order.positions.first()
resp = token_client.post('/api/v1/organizers/{}/events/{}/checkinlists/{}/positions/{}/redeem/'.format(
organizer.slug, event.slug, clist.pk, order.positions.first().pk
organizer.slug, event.slug, clist.pk, p.pk
), {}, format='json')
assert resp.status_code == 400
assert resp.data['status'] == 'incomplete'
assert resp.data['questions'] == [QuestionSerializer(question[0]).data]
with scopes_disabled():
assert resp.data['questions'] == [QuestionSerializer(question[0]).data]
resp = token_client.post('/api/v1/organizers/{}/events/{}/checkinlists/{}/positions/{}/redeem/'.format(
organizer.slug, event.slug, clist.pk, order.positions.first().pk
organizer.slug, event.slug, clist.pk, p.pk
), {'answers': {question[0].pk: str(question[1].pk)}}, format='json')
assert resp.status_code == 201
assert resp.data['status'] == 'ok'
assert order.positions.first().answers.get(question=question[0]).answer == 'M'
assert list(order.positions.first().answers.get(question=question[0]).options.all()) == [question[1]]
with scopes_disabled():
assert order.positions.first().answers.get(question=question[0]).answer == 'M'
assert list(order.positions.first().answers.get(question=question[0]).options.all()) == [question[1]]
@pytest.mark.django_db
def test_question_invalid(token_client, organizer, clist, event, order, question):
with scopes_disabled():
p = order.positions.first()
resp = token_client.post('/api/v1/organizers/{}/events/{}/checkinlists/{}/positions/{}/redeem/'.format(
organizer.slug, event.slug, clist.pk, order.positions.first().pk
organizer.slug, event.slug, clist.pk, p.pk
), {'answers': {question[0].pk: "A"}}, format='json')
assert resp.status_code == 400
assert resp.data['status'] == 'incomplete'
assert resp.data['questions'] == [QuestionSerializer(question[0]).data]
with scopes_disabled():
assert resp.data['questions'] == [QuestionSerializer(question[0]).data]
@pytest.mark.django_db
def test_question_required(token_client, organizer, clist, event, order, question):
with scopes_disabled():
p = order.positions.first()
question[0].required = True
question[0].save()
resp = token_client.post('/api/v1/organizers/{}/events/{}/checkinlists/{}/positions/{}/redeem/'.format(
organizer.slug, event.slug, clist.pk, order.positions.first().pk
organizer.slug, event.slug, clist.pk, p.pk
), {}, format='json')
assert resp.status_code == 400
assert resp.data['status'] == 'incomplete'
assert resp.data['questions'] == [QuestionSerializer(question[0]).data]
with scopes_disabled():
assert resp.data['questions'] == [QuestionSerializer(question[0]).data]
resp = token_client.post('/api/v1/organizers/{}/events/{}/checkinlists/{}/positions/{}/redeem/'.format(
organizer.slug, event.slug, clist.pk, order.positions.first().pk
organizer.slug, event.slug, clist.pk, p.pk
), {'answers': {question[0].pk: ""}}, format='json')
assert resp.status_code == 400
assert resp.data['status'] == 'incomplete'
assert resp.data['questions'] == [QuestionSerializer(question[0]).data]
with scopes_disabled():
assert resp.data['questions'] == [QuestionSerializer(question[0]).data]
@pytest.mark.django_db
def test_question_optional(token_client, organizer, clist, event, order, question):
with scopes_disabled():
p = order.positions.first()
question[0].required = False
question[0].save()
resp = token_client.post('/api/v1/organizers/{}/events/{}/checkinlists/{}/positions/{}/redeem/'.format(
organizer.slug, event.slug, clist.pk, order.positions.first().pk
organizer.slug, event.slug, clist.pk, p.pk
), {}, format='json')
assert resp.status_code == 400
assert resp.data['status'] == 'incomplete'
assert resp.data['questions'] == [QuestionSerializer(question[0]).data]
with scopes_disabled():
assert resp.data['questions'] == [QuestionSerializer(question[0]).data]
resp = token_client.post('/api/v1/organizers/{}/events/{}/checkinlists/{}/positions/{}/redeem/'.format(
organizer.slug, event.slug, clist.pk, order.positions.first().pk
organizer.slug, event.slug, clist.pk, p.pk
), {'answers': {question[0].pk: ""}}, format='json')
assert resp.status_code == 201
assert resp.data['status'] == 'ok'
@@ -692,20 +736,24 @@ def test_question_optional(token_client, organizer, clist, event, order, questio
@pytest.mark.django_db
def test_question_multiple_choice(token_client, organizer, clist, event, order, question):
with scopes_disabled():
p = order.positions.first()
question[0].type = 'M'
question[0].save()
resp = token_client.post('/api/v1/organizers/{}/events/{}/checkinlists/{}/positions/{}/redeem/'.format(
organizer.slug, event.slug, clist.pk, order.positions.first().pk
organizer.slug, event.slug, clist.pk, p.pk
), {}, format='json')
assert resp.status_code == 400
assert resp.data['status'] == 'incomplete'
assert resp.data['questions'] == [QuestionSerializer(question[0]).data]
with scopes_disabled():
assert resp.data['questions'] == [QuestionSerializer(question[0]).data]
resp = token_client.post('/api/v1/organizers/{}/events/{}/checkinlists/{}/positions/{}/redeem/'.format(
organizer.slug, event.slug, clist.pk, order.positions.first().pk
organizer.slug, event.slug, clist.pk, p.pk
), {'answers': {question[0].pk: "{},{}".format(question[1].pk, question[2].pk)}}, format='json')
assert resp.status_code == 201
assert resp.data['status'] == 'ok'
assert order.positions.first().answers.get(question=question[0]).answer == 'M, L'
assert set(order.positions.first().answers.get(question=question[0]).options.all()) == {question[1], question[2]}
with scopes_disabled():
assert order.positions.first().answers.get(question=question[0]).answer == 'M, L'
assert set(order.positions.first().answers.get(question=question[0]).options.all()) == {question[1], question[2]}
+43 -33
View File
@@ -5,6 +5,7 @@ from unittest import mock
import pytest
from django.conf import settings
from django_countries.fields import Country
from django_scopes import scopes_disabled
from pytz import UTC
from pretix.base.models import Event, InvoiceAddress, Order, OrderPosition
@@ -161,11 +162,12 @@ def test_event_create(token_client, organizer, event, meta_prop):
format='json'
)
assert resp.status_code == 201
assert not organizer.events.get(slug="2030").testmode
assert organizer.events.get(slug="2030").meta_values.filter(
property__name=meta_prop.name, value="Conference"
).exists()
assert organizer.events.get(slug="2030").plugins == settings.PRETIX_PLUGINS_DEFAULT
with scopes_disabled():
assert not organizer.events.get(slug="2030").testmode
assert organizer.events.get(slug="2030").meta_values.filter(
property__name=meta_prop.name, value="Conference"
).exists()
assert organizer.events.get(slug="2030").plugins == settings.PRETIX_PLUGINS_DEFAULT
resp = token_client.post(
'/api/v1/organizers/{}/events/'.format(organizer.slug),
@@ -278,13 +280,14 @@ def test_event_create_with_clone(token_client, organizer, event, meta_prop):
)
assert resp.status_code == 201
cloned_event = Event.objects.get(organizer=organizer.pk, slug='2030')
assert cloned_event.plugins == 'pretix.plugins.ticketoutputpdf'
assert cloned_event.is_public is False
assert cloned_event.testmode
assert organizer.events.get(slug="2030").meta_values.filter(
property__name=meta_prop.name, value="Conference"
).exists()
with scopes_disabled():
cloned_event = Event.objects.get(organizer=organizer.pk, slug='2030')
assert cloned_event.plugins == 'pretix.plugins.ticketoutputpdf'
assert cloned_event.is_public is False
assert cloned_event.testmode
assert organizer.events.get(slug="2030").meta_values.filter(
property__name=meta_prop.name, value="Conference"
).exists()
resp = token_client.post(
'/api/v1/organizers/{}/events/{}/clone/'.format(organizer.slug, event.slug),
@@ -310,12 +313,13 @@ def test_event_create_with_clone(token_client, organizer, event, meta_prop):
)
assert resp.status_code == 201
cloned_event = Event.objects.get(organizer=organizer.pk, slug='2031')
assert cloned_event.plugins == "pretix.plugins.banktransfer,pretix.plugins.ticketoutputpdf"
assert cloned_event.is_public is True
assert organizer.events.get(slug="2031").meta_values.filter(
property__name=meta_prop.name, value="Conference"
).exists()
with scopes_disabled():
cloned_event = Event.objects.get(organizer=organizer.pk, slug='2031')
assert cloned_event.plugins == "pretix.plugins.banktransfer,pretix.plugins.ticketoutputpdf"
assert cloned_event.is_public is True
assert organizer.events.get(slug="2031").meta_values.filter(
property__name=meta_prop.name, value="Conference"
).exists()
resp = token_client.post(
'/api/v1/organizers/{}/events/{}/clone/'.format(organizer.slug, event.slug),
@@ -339,8 +343,9 @@ def test_event_create_with_clone(token_client, organizer, event, meta_prop):
)
assert resp.status_code == 201
cloned_event = Event.objects.get(organizer=organizer.pk, slug='2032')
assert cloned_event.plugins == ""
with scopes_disabled():
cloned_event = Event.objects.get(organizer=organizer.pk, slug='2032')
assert cloned_event.plugins == ""
@pytest.mark.django_db
@@ -388,11 +393,12 @@ def test_event_update(token_client, organizer, event, item, meta_prop):
format='json'
)
assert resp.status_code == 200
event = Event.objects.get(organizer=organizer.pk, slug=resp.data['slug'])
assert event.currency == "DKK"
assert organizer.events.get(slug=resp.data['slug']).meta_values.filter(
property__name=meta_prop.name, value="Conference"
).exists()
with scopes_disabled():
event = Event.objects.get(organizer=organizer.pk, slug=resp.data['slug'])
assert event.currency == "DKK"
assert organizer.events.get(slug=resp.data['slug']).meta_values.filter(
property__name=meta_prop.name, value="Conference"
).exists()
resp = token_client.patch(
'/api/v1/organizers/{}/events/{}/'.format(organizer.slug, event.slug),
@@ -447,9 +453,10 @@ def test_event_update(token_client, organizer, event, item, meta_prop):
format='json'
)
assert resp.status_code == 200
assert organizer.events.get(slug=resp.data['slug']).meta_values.filter(
property__name=meta_prop.name, value="Workshop"
).exists()
with scopes_disabled():
assert organizer.events.get(slug=resp.data['slug']).meta_values.filter(
property__name=meta_prop.name, value="Workshop"
).exists()
resp = token_client.patch(
'/api/v1/organizers/{}/events/{}/'.format(organizer.slug, event.slug),
@@ -460,9 +467,10 @@ def test_event_update(token_client, organizer, event, item, meta_prop):
format='json'
)
assert resp.status_code == 200
assert not organizer.events.get(slug=resp.data['slug']).meta_values.filter(
property__name=meta_prop.name
).exists()
with scopes_disabled():
assert not organizer.events.get(slug=resp.data['slug']).meta_values.filter(
property__name=meta_prop.name
).exists()
resp = token_client.patch(
'/api/v1/organizers/{}/events/{}/'.format(organizer.slug, event.slug),
@@ -598,7 +606,8 @@ def test_event_detail(token_client, organizer, event, team):
def test_event_delete(token_client, organizer, event):
resp = token_client.delete('/api/v1/organizers/{}/events/{}/'.format(organizer.slug, event.slug))
assert resp.status_code == 204
assert not organizer.events.filter(pk=event.id).exists()
with scopes_disabled():
assert not organizer.events.filter(pk=event.id).exists()
@pytest.mark.django_db
@@ -607,4 +616,5 @@ def test_event_with_order_position_not_delete(token_client, organizer, event, it
assert resp.status_code == 403
assert resp.content.decode() == '{"detail":"The event can not be deleted as it already contains orders. Please ' \
'set \'live\' to false to hide the event and take the shop offline instead."}'
assert organizer.events.filter(pk=event.id).exists()
with scopes_disabled():
assert organizer.events.filter(pk=event.id).exists()
+109 -62
View File
@@ -5,6 +5,7 @@ from unittest import mock
import pytest
from django_countries.fields import Country
from django_scopes import scopes_disabled
from pytz import UTC
from pretix.base.models import (
@@ -169,7 +170,8 @@ def test_category_update(token_client, organizer, event, team, category):
format='json'
)
assert resp.status_code == 200
assert ItemCategory.objects.get(pk=category.pk).name == {"en": "Test"}
with scopes_disabled():
assert ItemCategory.objects.get(pk=category.pk).name == {"en": "Test"}
@pytest.mark.django_db
@@ -189,8 +191,9 @@ def test_category_delete(token_client, organizer, event, category3, item):
resp = token_client.delete(
'/api/v1/organizers/{}/events/{}/categories/{}/'.format(organizer.slug, event.slug, category3.pk))
assert resp.status_code == 204
assert not event.categories.filter(pk=category3.id).exists()
assert Item.objects.get(pk=item.pk).category is None
with scopes_disabled():
assert not event.categories.filter(pk=category3.id).exists()
assert Item.objects.get(pk=item.pk).category is None
@pytest.fixture
@@ -308,7 +311,8 @@ def test_item_detail(token_client, organizer, event, team, item):
@pytest.mark.django_db
def test_item_detail_variations(token_client, organizer, event, team, item):
var = item.variations.create(value="Children")
with scopes_disabled():
var = item.variations.create(value="Children")
res = dict(TEST_ITEM_RES)
res["id"] = item.pk
res["variations"] = [{
@@ -349,8 +353,9 @@ def test_item_detail_addons(token_client, organizer, event, team, item, category
@pytest.mark.django_db
def test_item_detail_bundles(token_client, organizer, event, team, item, category):
i = event.items.create(name="Included thing", default_price=2)
item.bundles.create(bundled_item=i, count=1, designated_price=2)
with scopes_disabled():
i = event.items.create(name="Included thing", default_price=2)
item.bundles.create(bundled_item=i, count=1, designated_price=2)
res = dict(TEST_ITEM_RES)
res["id"] = item.pk
@@ -398,7 +403,8 @@ def test_item_create(token_client, organizer, event, item, category, taxrule):
format='json'
)
assert resp.status_code == 201
assert Item.objects.get(pk=resp.data['id']).sales_channels == ["web", "pretixpos"]
with scopes_disabled():
assert Item.objects.get(pk=resp.data['id']).sales_channels == ["web", "pretixpos"]
@pytest.mark.django_db
@@ -445,9 +451,10 @@ def test_item_create_with_variation(token_client, organizer, event, item, catego
format='json'
)
assert resp.status_code == 201
new_item = Item.objects.get(pk=resp.data['id'])
assert new_item.variations.first().value.localize('de') == "Kommentar"
assert new_item.variations.first().value.localize('en') == "Comment"
with scopes_disabled():
new_item = Item.objects.get(pk=resp.data['id'])
assert new_item.variations.first().value.localize('de') == "Kommentar"
assert new_item.variations.first().value.localize('en') == "Comment"
@pytest.mark.django_db
@@ -490,10 +497,11 @@ def test_item_create_with_addon(token_client, organizer, event, item, category,
format='json'
)
assert resp.status_code == 201
item = Item.objects.get(pk=resp.data['id'])
assert item.addons.first().addon_category == category
assert item.addons.first().max_count == 10
assert 2 == Item.objects.all().count()
with scopes_disabled():
item = Item.objects.get(pk=resp.data['id'])
assert item.addons.first().addon_category == category
assert item.addons.first().max_count == 10
assert 2 == Item.objects.all().count()
resp = token_client.post(
'/api/v1/organizers/{}/events/{}/items/'.format(organizer.slug, event.slug),
@@ -534,7 +542,8 @@ def test_item_create_with_addon(token_client, organizer, event, item, category,
)
assert resp.status_code == 400
assert resp.content.decode() == '{"addons":["The add-on\'s category must belong to the same event as the item."]}'
assert 2 == Item.objects.all().count()
with scopes_disabled():
assert 2 == Item.objects.all().count()
resp = token_client.post(
'/api/v1/organizers/{}/events/{}/items/'.format(organizer.slug, event.slug),
@@ -575,7 +584,8 @@ def test_item_create_with_addon(token_client, organizer, event, item, category,
)
assert resp.status_code == 400
assert resp.content.decode() == '{"addons":["The maximum count needs to be greater than the minimum count."]}'
assert 2 == Item.objects.all().count()
with scopes_disabled():
assert 2 == Item.objects.all().count()
resp = token_client.post(
'/api/v1/organizers/{}/events/{}/items/'.format(organizer.slug, event.slug),
@@ -619,12 +629,14 @@ def test_item_create_with_addon(token_client, organizer, event, item, category,
'{"addons":["The minimum count needs to be equal to or greater than zero."]}',
'{"addons":[{"min_count":["Ensure this value is greater than or equal to 0."]}]}', # mysql
]
assert 2 == Item.objects.all().count()
with scopes_disabled():
assert 2 == Item.objects.all().count()
@pytest.mark.django_db
def test_item_create_with_bundle(token_client, organizer, event, item, category, item2, taxrule):
i = event.items.create(name="Included thing", default_price=2)
with scopes_disabled():
i = event.items.create(name="Included thing", default_price=2)
resp = token_client.post(
'/api/v1/organizers/{}/events/{}/items/'.format(organizer.slug, event.slug),
{
@@ -662,8 +674,9 @@ def test_item_create_with_bundle(token_client, organizer, event, item, category,
format='json'
)
assert resp.status_code == 201
item = Item.objects.get(pk=resp.data['id'])
b = item.bundles.first()
with scopes_disabled():
item = Item.objects.get(pk=resp.data['id'])
b = item.bundles.first()
assert b.bundled_item == i
assert b.bundled_variation is None
assert b.count == 2
@@ -708,7 +721,8 @@ def test_item_create_with_bundle(token_client, organizer, event, item, category,
assert resp.status_code == 400
assert resp.content.decode() == '{"bundles":["The bundled item must belong to the same event as the item."]}'
v = item2.variations.create(value="foo")
with scopes_disabled():
v = item2.variations.create(value="foo")
resp = token_client.post(
'/api/v1/organizers/{}/events/{}/items/'.format(organizer.slug, event.slug),
{
@@ -760,7 +774,8 @@ def test_item_update(token_client, organizer, event, item, category, item2, cate
format='json'
)
assert resp.status_code == 200
assert Item.objects.get(pk=item.pk).max_per_order == 2
with scopes_disabled():
assert Item.objects.get(pk=item.pk).max_per_order == 2
resp = token_client.patch(
'/api/v1/organizers/{}/events/{}/items/{}/'.format(organizer.slug, event.slug, item.pk),
@@ -896,21 +911,24 @@ def test_item_update_with_addon(token_client, organizer, event, item, category):
def test_items_delete(token_client, organizer, event, item):
resp = token_client.delete('/api/v1/organizers/{}/events/{}/items/{}/'.format(organizer.slug, event.slug, item.pk))
assert resp.status_code == 204
assert not event.items.filter(pk=item.id).exists()
with scopes_disabled():
assert not event.items.filter(pk=item.id).exists()
@pytest.mark.django_db
def test_items_with_order_position_not_delete(token_client, organizer, event, item, order_position):
resp = token_client.delete('/api/v1/organizers/{}/events/{}/items/{}/'.format(organizer.slug, event.slug, item.pk))
assert resp.status_code == 403
assert event.items.filter(pk=item.id).exists()
with scopes_disabled():
assert event.items.filter(pk=item.id).exists()
@pytest.mark.django_db
def test_items_with_cart_position_delete(token_client, organizer, event, item, cart_position):
resp = token_client.delete('/api/v1/organizers/{}/events/{}/items/{}/'.format(organizer.slug, event.slug, item.pk))
assert resp.status_code == 204
assert not event.items.filter(pk=item.id).exists()
with scopes_disabled():
assert not event.items.filter(pk=item.id).exists()
@pytest.fixture
@@ -996,7 +1014,8 @@ def test_variations_create(token_client, organizer, event, item, variation):
format='json'
)
assert resp.status_code == 201
var = ItemVariation.objects.get(pk=resp.data['id'])
with scopes_disabled():
var = ItemVariation.objects.get(pk=resp.data['id'])
assert var.position == 1
assert var.price == 23.0
@@ -1060,40 +1079,47 @@ def test_variations_update(token_client, organizer, event, item, item3, variatio
def test_variations_delete(token_client, organizer, event, item, variations, order):
resp = token_client.delete('/api/v1/organizers/{}/events/{}/items/{}/variations/{}/'.format(organizer.slug, event.slug, item.pk, variations[0].pk))
assert resp.status_code == 204
assert not item.variations.filter(pk=variations[0].pk).exists()
with scopes_disabled():
assert not item.variations.filter(pk=variations[0].pk).exists()
@pytest.mark.django_db
def test_variations_with_order_position_not_delete(token_client, organizer, event, item, order, variations, order_position):
assert item.variations.filter(pk=variations[0].id).exists()
with scopes_disabled():
assert item.variations.filter(pk=variations[0].id).exists()
resp = token_client.delete('/api/v1/organizers/{}/events/{}/items/{}/variations/{}/'.format(organizer.slug, event.slug, item.pk, variations[0].pk))
assert resp.status_code == 403
assert resp.content.decode() == '{"detail":"This variation cannot be deleted because it has already been ordered ' \
'by a user or currently is in a users\'s cart. Please set the variation as ' \
'\'inactive\' instead."}'
assert item.variations.filter(pk=variations[0].id).exists()
with scopes_disabled():
assert item.variations.filter(pk=variations[0].id).exists()
@pytest.mark.django_db
def test_variations_with_cart_position_not_delete(token_client, organizer, event, item, variations, cart_position):
assert item.variations.filter(pk=variations[0].id).exists()
with scopes_disabled():
assert item.variations.filter(pk=variations[0].id).exists()
resp = token_client.delete('/api/v1/organizers/{}/events/{}/items/{}/variations/{}/'.format(organizer.slug, event.slug, item.pk, variations[0].pk))
assert resp.status_code == 403
assert resp.content.decode() == '{"detail":"This variation cannot be deleted because it has already been ordered ' \
'by a user or currently is in a users\'s cart. Please set the variation as ' \
'\'inactive\' instead."}'
assert item.variations.filter(pk=variations[0].id).exists()
with scopes_disabled():
assert item.variations.filter(pk=variations[0].id).exists()
@pytest.mark.django_db
def test_only_variation_not_delete(token_client, organizer, event, item, variation):
assert item.variations.filter(pk=variation.id).exists()
with scopes_disabled():
assert item.variations.filter(pk=variation.id).exists()
resp = token_client.delete('/api/v1/organizers/{}/events/{}/items/{}/variations/{}/'.format(organizer.slug, event.slug, item.pk, variation.pk))
assert resp.status_code == 403
assert resp.content.decode() == '{"detail":"This variation cannot be deleted because it is the only variation. ' \
'Changing a product with variations to a product without variations is not ' \
'allowed."}'
assert item.variations.filter(pk=variation.id).exists()
with scopes_disabled():
assert item.variations.filter(pk=variation.id).exists()
@pytest.fixture
@@ -1144,7 +1170,8 @@ def test_bundles_create(token_client, organizer, event, item, item2, item3):
format='json'
)
assert resp.status_code == 201
b = ItemBundle.objects.get(pk=resp.data['id'])
with scopes_disabled():
b = ItemBundle.objects.get(pk=resp.data['id'])
assert b.bundled_item == item3
assert b.bundled_variation is None
assert b.designated_price == 1.5
@@ -1176,7 +1203,8 @@ def test_bundles_create(token_client, organizer, event, item, item2, item3):
assert resp.status_code == 400
assert resp.content.decode() == '{"non_field_errors":["The bundled item must not be the same item as the bundling one."]}'
item3.bundles.create(bundled_item=item, count=1, designated_price=3)
with scopes_disabled():
item3.bundles.create(bundled_item=item, count=1, designated_price=3)
resp = token_client.post(
'/api/v1/organizers/{}/events/{}/items/{}/bundles/'.format(organizer.slug, event.slug, item.pk),
{
@@ -1201,7 +1229,8 @@ def test_bundles_update(token_client, organizer, event, item, bundle):
format='json'
)
assert resp.status_code == 200
a = ItemBundle.objects.get(pk=bundle.pk)
with scopes_disabled():
a = ItemBundle.objects.get(pk=bundle.pk)
assert a.count == 3
@@ -1210,7 +1239,8 @@ def test_bundles_delete(token_client, organizer, event, item, bundle):
resp = token_client.delete('/api/v1/organizers/{}/events/{}/items/{}/bundles/{}/'.format(organizer.slug, event.slug,
item.pk, bundle.pk))
assert resp.status_code == 204
assert not item.bundles.filter(pk=bundle.id).exists()
with scopes_disabled():
assert not item.bundles.filter(pk=bundle.id).exists()
@pytest.fixture
@@ -1270,7 +1300,8 @@ def test_addons_create(token_client, organizer, event, item, category, category2
format='json'
)
assert resp.status_code == 201
addon = ItemAddOn.objects.get(pk=resp.data['id'])
with scopes_disabled():
addon = ItemAddOn.objects.get(pk=resp.data['id'])
assert addon.position == 1
assert addon.addon_category == category
@@ -1315,7 +1346,8 @@ def test_addons_update(token_client, organizer, event, item, addon):
format='json'
)
assert resp.status_code == 200
a = ItemAddOn.objects.get(pk=addon.pk)
with scopes_disabled():
a = ItemAddOn.objects.get(pk=addon.pk)
assert a.min_count == 100
assert a.max_count == 101
@@ -1337,7 +1369,8 @@ def test_addons_delete(token_client, organizer, event, item, addon):
resp = token_client.delete('/api/v1/organizers/{}/events/{}/items/{}/addons/{}/'.format(organizer.slug, event.slug,
item.pk, addon.pk))
assert resp.status_code == 204
assert not item.addons.filter(pk=addon.id).exists()
with scopes_disabled():
assert not item.addons.filter(pk=addon.id).exists()
@pytest.fixture
@@ -1372,7 +1405,8 @@ def test_quota_list(token_client, organizer, event, quota, item, subevent):
resp = token_client.get(
'/api/v1/organizers/{}/events/{}/quotas/?subevent={}'.format(organizer.slug, event.slug, subevent.pk))
assert [res] == resp.data['results']
se2 = event.subevents.create(name="Foobar", date_from=datetime(2017, 12, 27, 10, 0, 0, tzinfo=UTC))
with scopes_disabled():
se2 = event.subevents.create(name="Foobar", date_from=datetime(2017, 12, 27, 10, 0, 0, tzinfo=UTC))
resp = token_client.get(
'/api/v1/organizers/{}/events/{}/quotas/?subevent={}'.format(organizer.slug, event.slug, se2.pk))
assert [] == resp.data['results']
@@ -1404,7 +1438,8 @@ def test_quota_create(token_client, organizer, event, event2, item):
format='json'
)
assert resp.status_code == 201
quota = Quota.objects.get(pk=resp.data['id'])
with scopes_disabled():
quota = Quota.objects.get(pk=resp.data['id'])
assert quota.name == "Ticket Quota"
assert quota.size == 200
@@ -1550,7 +1585,8 @@ def test_quota_update(token_client, organizer, event, quota, item):
format='json'
)
assert resp.status_code == 200
quota = Quota.objects.get(pk=resp.data['id'])
with scopes_disabled():
quota = Quota.objects.get(pk=resp.data['id'])
assert quota.name == "Ticket Quota Update"
assert quota.size == 111
assert quota.all_logentries().count() == 1
@@ -1566,7 +1602,8 @@ def test_quota_update_unchanged(token_client, organizer, event, quota, item):
format='json'
)
assert resp.status_code == 200
quota = Quota.objects.get(pk=resp.data['id'])
with scopes_disabled():
quota = Quota.objects.get(pk=resp.data['id'])
assert quota.size == 200
assert quota.all_logentries().count() == 0
@@ -1575,7 +1612,8 @@ def test_quota_update_unchanged(token_client, organizer, event, quota, item):
def test_quota_delete(token_client, organizer, event, quota):
resp = token_client.delete('/api/v1/organizers/{}/events/{}/quotas/{}/'.format(organizer.slug, event.slug, quota.pk))
assert resp.status_code == 204
assert not event.quotas.filter(pk=quota.id).exists()
with scopes_disabled():
assert not event.quotas.filter(pk=quota.id).exists()
@pytest.mark.django_db
@@ -1690,11 +1728,12 @@ def test_question_create(token_client, organizer, event, event2, item):
format='json'
)
assert resp.status_code == 201
question = Question.objects.get(pk=resp.data['id'])
assert question.question == "What's your name?"
assert question.type == "S"
assert question.identifier is not None
assert len(question.items.all()) == 1
with scopes_disabled():
question = Question.objects.get(pk=resp.data['id'])
assert question.question == "What's your name?"
assert question.type == "S"
assert question.identifier is not None
assert len(question.items.all()) == 1
resp = token_client.post(
'/api/v1/organizers/{}/events/{}/questions/'.format(organizer.slug, event2.slug),
@@ -1784,7 +1823,8 @@ def test_question_create(token_client, organizer, event, event2, item):
format='json'
)
assert resp.status_code == 201
q2 = Question.objects.get(pk=resp.data['id'])
with scopes_disabled():
q2 = Question.objects.get(pk=resp.data['id'])
assert q2.dependency_question == question
@@ -1799,14 +1839,16 @@ def test_question_update(token_client, organizer, event, question):
format='json'
)
assert resp.status_code == 200
question = Question.objects.get(pk=resp.data['id'])
with scopes_disabled():
question = Question.objects.get(pk=resp.data['id'])
assert question.question == "What's your shoe size?"
assert question.type == "N"
@pytest.mark.django_db
def test_question_update_circular_dependency(token_client, organizer, event, question):
q2 = event.questions.create(question="T-Shirt size", type="B", identifier="FOO", dependency_question=question)
with scopes_disabled():
q2 = event.questions.create(question="T-Shirt size", type="B", identifier="FOO", dependency_question=question)
resp = token_client.patch(
'/api/v1/organizers/{}/events/{}/questions/{}/'.format(organizer.slug, event.slug, question.pk),
{
@@ -1836,7 +1878,8 @@ def test_question_update_options(token_client, organizer, event, question, item)
def test_question_delete(token_client, organizer, event, question):
resp = token_client.delete('/api/v1/organizers/{}/events/{}/questions/{}/'.format(organizer.slug, event.slug, question.pk))
assert resp.status_code == 204
assert not event.questions.filter(pk=question.id).exists()
with scopes_disabled():
assert not event.questions.filter(pk=question.id).exists()
TEST_OPTIONS_RES = {
@@ -1881,7 +1924,8 @@ def test_options_create(token_client, organizer, event, question):
format='json'
)
assert resp.status_code == 201
option = QuestionOption.objects.get(pk=resp.data['id'])
with scopes_disabled():
option = QuestionOption.objects.get(pk=resp.data['id'])
assert option.answer == "A"
resp = token_client.post(
@@ -1907,7 +1951,8 @@ def test_options_update(token_client, organizer, event, question, option):
format='json'
)
assert resp.status_code == 200
a = QuestionOption.objects.get(pk=option.pk)
with scopes_disabled():
a = QuestionOption.objects.get(pk=option.pk)
assert a.answer == "B"
@@ -1917,7 +1962,8 @@ def test_options_delete(token_client, organizer, event, question, option):
organizer.slug, event.slug, question.pk, option.pk
))
assert resp.status_code == 204
assert not question.options.filter(pk=option.id).exists()
with scopes_disabled():
assert not question.options.filter(pk=option.id).exists()
@pytest.mark.django_db
@@ -1948,11 +1994,12 @@ def test_question_create_with_option(token_client, organizer, event, item):
format='json'
)
assert resp.status_code == 201
question = Question.objects.get(pk=resp.data['id'])
assert str(question.options.first().answer) == "A"
assert question.options.first().identifier is not None
assert str(question.options.last().answer) == "B"
assert 2 == question.options.count()
with scopes_disabled():
question = Question.objects.get(pk=resp.data['id'])
assert str(question.options.first().answer) == "A"
assert question.options.first().identifier is not None
assert str(question.options.last().answer) == "B"
assert 2 == question.options.count()
resp = token_client.post(
'/api/v1/organizers/{}/events/{}/questions/'.format(organizer.slug, event.slug),
File diff suppressed because it is too large Load Diff
+42 -24
View File
@@ -4,6 +4,7 @@ from unittest import mock
import pytest
from django_countries.fields import Country
from django_scopes import scopes_disabled
from pytz import UTC
from pretix.base.models import InvoiceAddress, Order, OrderPosition
@@ -159,9 +160,10 @@ def test_subevent_create(token_client, organizer, event, subevent, meta_prop, it
)
assert resp.status_code == 201
assert not subevent.active
assert subevent.meta_values.filter(
property__name=meta_prop.name, value="Workshop"
).exists()
with scopes_disabled():
assert subevent.meta_values.filter(
property__name=meta_prop.name, value="Workshop"
).exists()
resp = token_client.post(
'/api/v1/organizers/{}/events/{}/subevents/'.format(organizer.slug, event.slug),
@@ -217,7 +219,8 @@ def test_subevent_create(token_client, organizer, event, subevent, meta_prop, it
)
assert resp.status_code == 201
assert item.default_price == Decimal('23.00')
assert event.subevents.get(id=resp.data['id']).item_price_overrides[item.pk] == Decimal('23.42')
with scopes_disabled():
assert event.subevents.get(id=resp.data['id']).item_price_overrides[item.pk] == Decimal('23.42')
resp = token_client.post(
'/api/v1/organizers/{}/events/{}/subevents/'.format(organizer.slug, event.slug),
@@ -261,7 +264,8 @@ def test_subevent_update(token_client, organizer, event, subevent, item, item2,
format='json'
)
assert resp.status_code == 200
subevent = event.subevents.get(id=subevent.id)
with scopes_disabled():
subevent = event.subevents.get(id=subevent.id)
assert subevent.date_from == datetime(2018, 12, 27, 10, 0, tzinfo=UTC)
assert subevent.date_to == datetime(2018, 12, 28, 10, 0, tzinfo=UTC)
@@ -297,9 +301,10 @@ def test_subevent_update(token_client, organizer, event, subevent, item, item2,
format='json'
)
assert resp.status_code == 200
assert organizer.events.get(slug=event.slug).subevents.get(id=resp.data['id']).meta_values.filter(
property__name=meta_prop.name, value="Conference"
).exists()
with scopes_disabled():
assert organizer.events.get(slug=event.slug).subevents.get(id=resp.data['id']).meta_values.filter(
property__name=meta_prop.name, value="Conference"
).exists()
resp = token_client.patch(
'/api/v1/organizers/{}/events/{}/subevents/{}/'.format(organizer.slug, event.slug, subevent.pk),
@@ -310,9 +315,10 @@ def test_subevent_update(token_client, organizer, event, subevent, item, item2,
format='json'
)
assert resp.status_code == 200
assert not subevent.meta_values.filter(
property__name=meta_prop.name
).exists()
with scopes_disabled():
assert not subevent.meta_values.filter(
property__name=meta_prop.name
).exists()
resp = token_client.patch(
'/api/v1/organizers/{}/events/{}/subevents/{}/'.format(organizer.slug, event.slug, subevent.pk),
@@ -339,7 +345,8 @@ def test_subevent_update(token_client, organizer, event, subevent, item, item2,
format='json'
)
assert resp.status_code == 200
assert subevent.items.get(id=item.pk).default_price == Decimal('23.00')
with scopes_disabled():
assert subevent.items.get(id=item.pk).default_price == Decimal('23.00')
assert subevent.item_price_overrides[item.pk] == Decimal('99.99')
resp = token_client.patch(
@@ -355,7 +362,8 @@ def test_subevent_update(token_client, organizer, event, subevent, item, item2,
format='json'
)
assert resp.status_code == 200
assert event.subevents.get(id=subevent.id).item_price_overrides[item.pk] == Decimal('88.88')
with scopes_disabled():
assert event.subevents.get(id=subevent.id).item_price_overrides[item.pk] == Decimal('88.88')
resp = token_client.patch(
'/api/v1/organizers/{}/events/{}/subevents/{}/'.format(organizer.slug, event.slug, subevent.pk),
@@ -370,7 +378,8 @@ def test_subevent_update(token_client, organizer, event, subevent, item, item2,
format='json'
)
assert resp.status_code == 200
assert item.pk not in event.subevents.get(id=subevent.id).item_price_overrides
with scopes_disabled():
assert item.pk not in event.subevents.get(id=subevent.id).item_price_overrides
resp = token_client.patch(
'/api/v1/organizers/{}/events/{}/subevents/{}/'.format(organizer.slug, event.slug, subevent.pk),
@@ -385,7 +394,8 @@ def test_subevent_update(token_client, organizer, event, subevent, item, item2,
format='json'
)
assert resp.status_code == 200
assert event.subevents.get(id=subevent.id).item_price_overrides[item.pk] == Decimal('12.34')
with scopes_disabled():
assert event.subevents.get(id=subevent.id).item_price_overrides[item.pk] == Decimal('12.34')
resp = token_client.patch(
'/api/v1/organizers/{}/events/{}/subevents/{}/'.format(organizer.slug, event.slug, subevent.pk),
@@ -395,7 +405,8 @@ def test_subevent_update(token_client, organizer, event, subevent, item, item2,
format='json'
)
assert resp.status_code == 200
assert item.pk not in event.subevents.get(id=subevent.id).item_price_overrides
with scopes_disabled():
assert item.pk not in event.subevents.get(id=subevent.id).item_price_overrides
resp = token_client.patch(
'/api/v1/organizers/{}/events/{}/subevents/{}/'.format(organizer.slug, event.slug, subevent.pk),
@@ -440,8 +451,9 @@ def test_subevent_update(token_client, organizer, event, subevent, item, item2,
format='json'
)
assert resp.status_code == 200
assert subevent.variations.get(id=variations[0].pk).default_price == Decimal('12.00')
assert subevent.var_price_overrides[variations[0].pk] == Decimal('99.99')
with scopes_disabled():
assert subevent.variations.get(id=variations[0].pk).default_price == Decimal('12.00')
assert subevent.var_price_overrides[variations[0].pk] == Decimal('99.99')
resp = token_client.patch(
'/api/v1/organizers/{}/events/{}/subevents/{}/'.format(organizer.slug, event.slug, subevent.pk),
@@ -456,7 +468,8 @@ def test_subevent_update(token_client, organizer, event, subevent, item, item2,
format='json'
)
assert resp.status_code == 200
assert event.subevents.get(id=subevent.id).var_price_overrides[variations[0].pk] == Decimal('88.88')
with scopes_disabled():
assert event.subevents.get(id=subevent.id).var_price_overrides[variations[0].pk] == Decimal('88.88')
resp = token_client.patch(
'/api/v1/organizers/{}/events/{}/subevents/{}/'.format(organizer.slug, event.slug, subevent.pk),
@@ -471,7 +484,8 @@ def test_subevent_update(token_client, organizer, event, subevent, item, item2,
format='json'
)
assert resp.status_code == 200
assert variations[0].pk not in event.subevents.get(id=subevent.id).var_price_overrides
with scopes_disabled():
assert variations[0].pk not in event.subevents.get(id=subevent.id).var_price_overrides
resp = token_client.patch(
'/api/v1/organizers/{}/events/{}/subevents/{}/'.format(organizer.slug, event.slug, subevent.pk),
@@ -486,7 +500,8 @@ def test_subevent_update(token_client, organizer, event, subevent, item, item2,
format='json'
)
assert resp.status_code == 200
assert event.subevents.get(id=subevent.id).var_price_overrides[variations[0].pk] == Decimal('12.34')
with scopes_disabled():
assert event.subevents.get(id=subevent.id).var_price_overrides[variations[0].pk] == Decimal('12.34')
resp = token_client.patch(
'/api/v1/organizers/{}/events/{}/subevents/{}/'.format(organizer.slug, event.slug, subevent.pk),
@@ -496,7 +511,8 @@ def test_subevent_update(token_client, organizer, event, subevent, item, item2,
format='json'
)
assert resp.status_code == 200
assert variations[0].pk not in event.subevents.get(id=subevent.id).var_price_overrides
with scopes_disabled():
assert variations[0].pk not in event.subevents.get(id=subevent.id).var_price_overrides
resp = token_client.patch(
'/api/v1/organizers/{}/events/{}/subevents/{}/'.format(organizer.slug, event.slug, subevent.pk),
@@ -544,7 +560,8 @@ def test_subevent_delete(token_client, organizer, event, subevent):
resp = token_client.delete('/api/v1/organizers/{}/events/{}/subevents/{}/'.format(organizer.slug, event.slug,
subevent.pk))
assert resp.status_code == 204
assert not event.subevents.filter(pk=subevent.id).exists()
with scopes_disabled():
assert not event.subevents.filter(pk=subevent.id).exists()
@pytest.mark.django_db
@@ -554,4 +571,5 @@ def test_subevent_with_order_position_not_delete(token_client, organizer, event,
assert resp.status_code == 403
assert resp.content.decode() == '{"detail":"The sub-event can not be deleted as it has already been used in ' \
'orders. Please set \'active\' to false instead to hide it from users."}'
assert event.subevents.filter(pk=subevent.id).exists()
with scopes_disabled():
assert event.subevents.filter(pk=subevent.id).exists()
+3 -1
View File
@@ -1,6 +1,7 @@
from decimal import Decimal
import pytest
from django_scopes import scopes_disabled
from pretix.base.models import TaxRule
@@ -80,7 +81,8 @@ def test_rule_delete(token_client, organizer, event, taxrule):
@pytest.mark.django_db
def test_rule_delete_forbidden(token_client, organizer, event, taxrule):
event.items.create(name="Budget Ticket", default_price=23, tax_rule=taxrule)
with scopes_disabled():
event.items.create(name="Budget Ticket", default_price=23, tax_rule=taxrule)
resp = token_client.delete(
'/api/v1/organizers/{}/events/{}/taxrules/{}/'.format(organizer.slug, event.slug, taxrule.pk),
)
+146 -108
View File
@@ -5,6 +5,7 @@ from decimal import Decimal
import pytest
from django.utils import timezone
from django.utils.timezone import now
from django_scopes import scopes_disabled
from pytz import UTC
from pretix.base.models import Event, Voucher
@@ -58,7 +59,8 @@ def test_voucher_list(token_client, organizer, event, voucher, item, quota, sube
i2 = copy.copy(item)
i2.pk = None
i2.save()
var2 = i2.variations.create(value="foo")
with scopes_disabled():
var2 = i2.variations.create(value="foo")
resp = token_client.get('/api/v1/organizers/{}/events/{}/vouchers/'.format(organizer.slug, event.slug))
assert resp.status_code == 200
@@ -136,9 +138,10 @@ def test_voucher_list(token_client, organizer, event, voucher, item, quota, sube
)
assert [] == resp.data['results']
var = item.variations.create(value='VIP')
voucher.variation = var
voucher.save()
with scopes_disabled():
var = item.variations.create(value='VIP')
voucher.variation = var
voucher.save()
res['variation'] = var.pk
resp = token_client.get(
'/api/v1/organizers/{}/events/{}/vouchers/?variation={}'.format(organizer.slug, event.slug, var.pk)
@@ -208,7 +211,8 @@ def test_voucher_list(token_client, organizer, event, voucher, item, quota, sube
resp = token_client.get(
'/api/v1/organizers/{}/events/{}/vouchers/?subevent={}'.format(organizer.slug, event.slug, subevent.pk))
assert [res] == resp.data['results']
se2 = event.subevents.create(name="Foobar", date_from=datetime.datetime(2017, 12, 27, 10, 0, 0, tzinfo=UTC))
with scopes_disabled():
se2 = event.subevents.create(name="Foobar", date_from=datetime.datetime(2017, 12, 27, 10, 0, 0, tzinfo=UTC))
resp = token_client.get(
'/api/v1/organizers/{}/events/{}/vouchers/?subevent={}'.format(organizer.slug, event.slug,
se2.pk))
@@ -237,7 +241,8 @@ def create_voucher(token_client, organizer, event, data, expected_failure=False)
assert resp.status_code == 400
else:
assert resp.status_code == 201
return Voucher.objects.get(pk=resp.data['id'])
with scopes_disabled():
return Voucher.objects.get(pk=resp.data['id'])
@pytest.mark.django_db
@@ -324,7 +329,8 @@ def test_create_non_blocking_item_voucher(token_client, organizer, event, item):
@pytest.mark.django_db
def test_create_non_blocking_variation_voucher(token_client, organizer, event, item):
variation = item.variations.create(value="XL")
with scopes_disabled():
variation = item.variations.create(value="XL")
v = create_voucher(
token_client, organizer, event,
data={
@@ -394,7 +400,8 @@ def test_create_blocking_item_voucher_quota_full_invalid(token_client, organizer
@pytest.mark.django_db
def test_create_blocking_variation_voucher_quota_free(token_client, organizer, event, item, quota):
variation = item.variations.create(value="XL")
with scopes_disabled():
variation = item.variations.create(value="XL")
quota.variations.add(variation)
v = create_voucher(
token_client, organizer, event,
@@ -421,7 +428,8 @@ def test_create_short_code(token_client, organizer, event, item):
@pytest.mark.django_db
def test_create_blocking_variation_voucher_quota_full(token_client, organizer, event, item, quota):
variation = item.variations.create(value="XL")
with scopes_disabled():
variation = item.variations.create(value="XL")
quota.variations.add(variation)
quota.size = 0
quota.save()
@@ -463,7 +471,8 @@ def test_create_blocking_quota_voucher_quota_full(token_client, organizer, event
@pytest.mark.django_db
def test_create_duplicate_code(token_client, organizer, event, quota):
v = event.vouchers.create(quota=quota)
with scopes_disabled():
v = event.vouchers.create(quota=quota)
create_voucher(
token_client, organizer, event,
data={
@@ -501,11 +510,12 @@ def test_subevent_required_for_blocking(token_client, organizer, event, item, su
@pytest.mark.django_db
def test_subevent_blocking_quota_free(token_client, organizer, event, item, quota, subevent):
se2 = event.subevents.create(name="Bar", date_from=now())
quota.subevent = subevent
quota.save()
q2 = event.quotas.create(event=event, name='Tickets', size=0, subevent=se2)
q2.items.add(item)
with scopes_disabled():
se2 = event.subevents.create(name="Bar", date_from=now())
quota.subevent = subevent
quota.save()
q2 = event.quotas.create(event=event, name='Tickets', size=0, subevent=se2)
q2.items.add(item)
v = create_voucher(
token_client, organizer, event,
@@ -521,12 +531,13 @@ def test_subevent_blocking_quota_free(token_client, organizer, event, item, quot
@pytest.mark.django_db
def test_subevent_blocking_quota_full(token_client, organizer, event, item, quota, subevent):
se2 = event.subevents.create(name="Bar", date_from=now())
quota.subevent = subevent
quota.size = 0
quota.save()
q2 = event.quotas.create(event=event, name='Tickets', size=5, subevent=se2)
q2.items.add(item)
with scopes_disabled():
se2 = event.subevents.create(name="Bar", date_from=now())
quota.subevent = subevent
quota.size = 0
quota.save()
q2 = event.quotas.create(event=event, name='Tickets', size=5, subevent=se2)
q2.items.add(item)
create_voucher(
token_client, organizer, event,
@@ -553,15 +564,16 @@ def change_voucher(token_client, organizer, event, voucher, data, expected_failu
@pytest.mark.django_db
def test_change_to_item_of_other_event(token_client, organizer, event, item):
e2 = Event.objects.create(
organizer=organizer,
name='Dummy2',
slug='dummy2',
date_from=datetime.datetime(2017, 12, 27, 10, 0, 0, tzinfo=UTC),
plugins='pretix.plugins.banktransfer,pretix.plugins.ticketoutputpdf'
)
ticket2 = e2.items.create(name='Late-bird ticket', default_price=23)
v = event.vouchers.create(item=item)
with scopes_disabled():
e2 = Event.objects.create(
organizer=organizer,
name='Dummy2',
slug='dummy2',
date_from=datetime.datetime(2017, 12, 27, 10, 0, 0, tzinfo=UTC),
plugins='pretix.plugins.banktransfer,pretix.plugins.ticketoutputpdf'
)
ticket2 = e2.items.create(name='Late-bird ticket', default_price=23)
v = event.vouchers.create(item=item)
change_voucher(
token_client, organizer, event, v,
data={
@@ -575,7 +587,8 @@ def test_change_to_item_of_other_event(token_client, organizer, event, item):
@pytest.mark.django_db
def test_change_non_blocking_voucher(token_client, organizer, event, item, quota):
v = event.vouchers.create(item=item)
with scopes_disabled():
v = event.vouchers.create(item=item)
change_voucher(
token_client, organizer, event, v,
data={
@@ -589,7 +602,8 @@ def test_change_non_blocking_voucher(token_client, organizer, event, item, quota
@pytest.mark.django_db
def test_change_voucher_reduce_max_usages(token_client, organizer, event, item, quota):
v = event.vouchers.create(item=item, max_usages=5, redeemed=3)
with scopes_disabled():
v = event.vouchers.create(item=item, max_usages=5, redeemed=3)
change_voucher(
token_client, organizer, event, v,
data={
@@ -604,7 +618,8 @@ def test_change_voucher_reduce_max_usages(token_client, organizer, event, item,
def test_change_blocking_voucher_unchanged_quota_full(token_client, organizer, event, item, quota):
quota.size = 0
quota.save()
v = event.vouchers.create(item=item, block_quota=True)
with scopes_disabled():
v = event.vouchers.create(item=item, block_quota=True)
change_voucher(
token_client, organizer, event, v,
data={
@@ -620,7 +635,8 @@ def test_change_blocking_voucher_unchanged_quota_full(token_client, organizer, e
def test_change_voucher_to_blocking_quota_full(token_client, organizer, event, item, quota):
quota.size = 0
quota.save()
v = event.vouchers.create(item=item)
with scopes_disabled():
v = event.vouchers.create(item=item)
change_voucher(
token_client, organizer, event, v,
data={
@@ -632,7 +648,8 @@ def test_change_voucher_to_blocking_quota_full(token_client, organizer, event, i
@pytest.mark.django_db
def test_change_voucher_to_blocking_quota_free(token_client, organizer, event, item, quota):
v = event.vouchers.create(item=item)
with scopes_disabled():
v = event.vouchers.create(item=item)
change_voucher(
token_client, organizer, event, v,
data={
@@ -646,8 +663,9 @@ def test_change_voucher_to_blocking_quota_free(token_client, organizer, event, i
def test_change_voucher_validity_to_valid_quota_full(token_client, organizer, event, item, quota):
quota.size = 0
quota.save()
v = event.vouchers.create(item=item, valid_until=now() - datetime.timedelta(days=3),
block_quota=True)
with scopes_disabled():
v = event.vouchers.create(item=item, valid_until=now() - datetime.timedelta(days=3),
block_quota=True)
change_voucher(
token_client, organizer, event, v,
data={
@@ -660,8 +678,9 @@ def test_change_voucher_validity_to_valid_quota_full(token_client, organizer, ev
@pytest.mark.django_db
def test_change_voucher_validity_to_valid_quota_free(token_client, organizer, event, item, quota):
v = event.vouchers.create(item=item, valid_until=now() - datetime.timedelta(days=3),
block_quota=True)
with scopes_disabled():
v = event.vouchers.create(item=item, valid_until=now() - datetime.timedelta(days=3),
block_quota=True)
change_voucher(
token_client, organizer, event, v,
data={
@@ -673,9 +692,10 @@ def test_change_voucher_validity_to_valid_quota_free(token_client, organizer, ev
@pytest.mark.django_db
def test_change_item_of_blocking_voucher_quota_free(token_client, organizer, event, item, quota):
ticket2 = event.items.create(name='Late-bird ticket', default_price=23)
quota.items.add(ticket2)
v = event.vouchers.create(item=item, block_quota=True)
with scopes_disabled():
ticket2 = event.items.create(name='Late-bird ticket', default_price=23)
quota.items.add(ticket2)
v = event.vouchers.create(item=item, block_quota=True)
change_voucher(
token_client, organizer, event, v,
data={
@@ -687,10 +707,11 @@ def test_change_item_of_blocking_voucher_quota_free(token_client, organizer, eve
@pytest.mark.django_db
def test_change_item_of_blocking_voucher_quota_full(token_client, organizer, event, item, quota):
ticket2 = event.items.create(name='Late-bird ticket', default_price=23)
quota2 = event.quotas.create(name='Late', size=0)
quota2.items.add(ticket2)
v = event.vouchers.create(item=item, block_quota=True)
with scopes_disabled():
ticket2 = event.items.create(name='Late-bird ticket', default_price=23)
quota2 = event.quotas.create(name='Late', size=0)
quota2.items.add(ticket2)
v = event.vouchers.create(item=item, block_quota=True)
change_voucher(
token_client, organizer, event, v,
data={
@@ -702,14 +723,15 @@ def test_change_item_of_blocking_voucher_quota_full(token_client, organizer, eve
@pytest.mark.django_db
def test_change_variation_of_blocking_voucher_quota_free(token_client, organizer, event):
shirt = event.items.create(name='Shirt', default_price=23)
vs = shirt.variations.create(value='S')
vm = shirt.variations.create(value='M')
qs = event.quotas.create(name='S', size=2)
qs.variations.add(vs)
qm = event.quotas.create(name='M', size=2)
qm.variations.add(vm)
v = event.vouchers.create(item=shirt, variation=vs, block_quota=True)
with scopes_disabled():
shirt = event.items.create(name='Shirt', default_price=23)
vs = shirt.variations.create(value='S')
vm = shirt.variations.create(value='M')
qs = event.quotas.create(name='S', size=2)
qs.variations.add(vs)
qm = event.quotas.create(name='M', size=2)
qm.variations.add(vm)
v = event.vouchers.create(item=shirt, variation=vs, block_quota=True)
change_voucher(
token_client, organizer, event, v,
data={
@@ -721,13 +743,14 @@ def test_change_variation_of_blocking_voucher_quota_free(token_client, organizer
@pytest.mark.django_db
def test_change_variation_of_blocking_voucher_without_quota_change(token_client, organizer, event):
shirt = event.items.create(name='Shirt', default_price=23)
vs = shirt.variations.create(value='S')
vm = shirt.variations.create(value='M')
q = event.quotas.create(name='S', size=0)
q.variations.add(vs)
q.variations.add(vm)
v = event.vouchers.create(item=shirt, variation=vs, block_quota=True)
with scopes_disabled():
shirt = event.items.create(name='Shirt', default_price=23)
vs = shirt.variations.create(value='S')
vm = shirt.variations.create(value='M')
q = event.quotas.create(name='S', size=0)
q.variations.add(vs)
q.variations.add(vm)
v = event.vouchers.create(item=shirt, variation=vs, block_quota=True)
change_voucher(
token_client, organizer, event, v,
data={
@@ -739,14 +762,15 @@ def test_change_variation_of_blocking_voucher_without_quota_change(token_client,
@pytest.mark.django_db
def test_change_variation_of_blocking_voucher_quota_full(token_client, organizer, event):
shirt = event.items.create(name='Shirt', default_price=23)
vs = shirt.variations.create(value='S')
vm = shirt.variations.create(value='M')
qs = event.quotas.create(name='S', size=2)
qs.variations.add(vs)
qm = event.quotas.create(name='M', size=0)
qm.variations.add(vm)
v = event.vouchers.create(item=shirt, variation=vs, block_quota=True)
with scopes_disabled():
shirt = event.items.create(name='Shirt', default_price=23)
vs = shirt.variations.create(value='S')
vm = shirt.variations.create(value='M')
qs = event.quotas.create(name='S', size=2)
qs.variations.add(vs)
qm = event.quotas.create(name='M', size=0)
qm.variations.add(vm)
v = event.vouchers.create(item=shirt, variation=vs, block_quota=True)
change_voucher(
token_client, organizer, event, v,
data={
@@ -758,9 +782,10 @@ def test_change_variation_of_blocking_voucher_quota_full(token_client, organizer
@pytest.mark.django_db
def test_change_quota_of_blocking_voucher_quota_free(token_client, organizer, event):
qs = event.quotas.create(name='S', size=2)
qm = event.quotas.create(name='M', size=2)
v = event.vouchers.create(quota=qs, block_quota=True)
with scopes_disabled():
qs = event.quotas.create(name='S', size=2)
qm = event.quotas.create(name='M', size=2)
v = event.vouchers.create(quota=qs, block_quota=True)
change_voucher(
token_client, organizer, event, v,
data={
@@ -772,9 +797,10 @@ def test_change_quota_of_blocking_voucher_quota_free(token_client, organizer, ev
@pytest.mark.django_db
def test_change_quota_of_blocking_voucher_quota_full(token_client, organizer, event):
qs = event.quotas.create(name='S', size=2)
qm = event.quotas.create(name='M', size=0)
v = event.vouchers.create(quota=qs, block_quota=True)
with scopes_disabled():
qs = event.quotas.create(name='S', size=2)
qm = event.quotas.create(name='M', size=0)
v = event.vouchers.create(quota=qs, block_quota=True)
change_voucher(
token_client, organizer, event, v,
data={
@@ -786,11 +812,12 @@ def test_change_quota_of_blocking_voucher_quota_full(token_client, organizer, ev
@pytest.mark.django_db
def test_change_item_of_blocking_voucher_without_quota_change(token_client, organizer, event, item, quota):
quota.size = 0
quota.save()
ticket2 = event.items.create(name='Standard Ticket', default_price=23)
quota.items.add(ticket2)
v = event.vouchers.create(item=item, block_quota=True)
with scopes_disabled():
quota.size = 0
quota.save()
ticket2 = event.items.create(name='Standard Ticket', default_price=23)
quota.items.add(ticket2)
v = event.vouchers.create(item=item, block_quota=True)
change_voucher(
token_client, organizer, event, v,
data={
@@ -802,8 +829,9 @@ def test_change_item_of_blocking_voucher_without_quota_change(token_client, orga
@pytest.mark.django_db
def test_change_code_to_duplicate(token_client, organizer, event, item, quota):
v1 = event.vouchers.create(quota=quota)
v2 = event.vouchers.create(quota=quota)
with scopes_disabled():
v1 = event.vouchers.create(quota=quota)
v2 = event.vouchers.create(quota=quota)
change_voucher(
token_client, organizer, event, v1,
data={
@@ -815,13 +843,14 @@ def test_change_code_to_duplicate(token_client, organizer, event, item, quota):
@pytest.mark.django_db
def test_change_subevent_blocking_quota_free(token_client, organizer, event, item, quota, subevent):
quota.subevent = subevent
quota.save()
se2 = event.subevents.create(name="Bar", date_from=now())
q2 = event.quotas.create(event=event, name='Tickets', size=5, subevent=se2)
q2.items.add(item)
with scopes_disabled():
quota.subevent = subevent
quota.save()
se2 = event.subevents.create(name="Bar", date_from=now())
q2 = event.quotas.create(event=event, name='Tickets', size=5, subevent=se2)
q2.items.add(item)
v = event.vouchers.create(item=item, block_quota=True, subevent=subevent)
v = event.vouchers.create(item=item, block_quota=True, subevent=subevent)
change_voucher(
token_client, organizer, event, v,
data={
@@ -833,13 +862,14 @@ def test_change_subevent_blocking_quota_free(token_client, organizer, event, ite
@pytest.mark.django_db
def test_change_subevent_blocking_quota_full(token_client, organizer, event, item, quota, subevent):
quota.subevent = subevent
quota.save()
se2 = event.subevents.create(name="Bar", date_from=now())
q2 = event.quotas.create(event=event, name='Tickets', size=0, subevent=se2)
q2.items.add(item)
with scopes_disabled():
quota.subevent = subevent
quota.save()
se2 = event.subevents.create(name="Bar", date_from=now())
q2 = event.quotas.create(event=event, name='Tickets', size=0, subevent=se2)
q2.items.add(item)
v = event.vouchers.create(item=item, block_quota=True, subevent=subevent)
v = event.vouchers.create(item=item, block_quota=True, subevent=subevent)
change_voucher(
token_client, organizer, event, v,
data={
@@ -851,27 +881,32 @@ def test_change_subevent_blocking_quota_full(token_client, organizer, event, ite
@pytest.mark.django_db
def test_delete_voucher(token_client, organizer, event, quota):
v = event.vouchers.create(quota=quota)
with scopes_disabled():
v = event.vouchers.create(quota=quota)
resp = token_client.delete(
'/api/v1/organizers/{}/events/{}/vouchers/{}/'.format(organizer.slug, event.slug, v.pk),
)
assert resp.status_code == 204
assert not event.vouchers.filter(pk=v.id).exists()
with scopes_disabled():
assert not event.vouchers.filter(pk=v.id).exists()
@pytest.mark.django_db
def test_delete_voucher_redeemed(token_client, organizer, event, quota):
v = event.vouchers.create(quota=quota, redeemed=1)
with scopes_disabled():
v = event.vouchers.create(quota=quota, redeemed=1)
resp = token_client.delete(
'/api/v1/organizers/{}/events/{}/vouchers/{}/'.format(organizer.slug, event.slug, v.pk),
)
assert resp.status_code == 403
assert event.vouchers.filter(pk=v.id).exists()
with scopes_disabled():
assert event.vouchers.filter(pk=v.id).exists()
@pytest.mark.django_db
def test_redeemed_is_not_writable(token_client, organizer, event, item):
v = event.vouchers.create(item=item)
with scopes_disabled():
v = event.vouchers.create(item=item)
change_voucher(
token_client, organizer, event, v,
data={
@@ -919,13 +954,14 @@ def test_create_multiple_vouchers(token_client, organizer, event, item):
], format='json'
)
assert resp.status_code == 201
assert Voucher.objects.count() == 2
assert resp.data[0]['code'] == 'ABCDEFGHI'
v1 = Voucher.objects.get(code='ABCDEFGHI')
assert not v1.block_quota
assert resp.data[1]['code'] == 'JKLMNOPQR'
v2 = Voucher.objects.get(code='JKLMNOPQR')
assert v2.block_quota
with scopes_disabled():
assert Voucher.objects.count() == 2
assert resp.data[0]['code'] == 'ABCDEFGHI'
v1 = Voucher.objects.get(code='ABCDEFGHI')
assert not v1.block_quota
assert resp.data[1]['code'] == 'JKLMNOPQR'
v2 = Voucher.objects.get(code='JKLMNOPQR')
assert v2.block_quota
@pytest.mark.django_db
@@ -967,7 +1003,8 @@ def test_create_multiple_vouchers_one_invalid(token_client, organizer, event, it
)
assert resp.status_code == 400
assert resp.data == [{}, {'code': ['Ensure this field has at least 5 characters.']}]
assert Voucher.objects.count() == 0
with scopes_disabled():
assert Voucher.objects.count() == 0
@pytest.mark.django_db
@@ -1009,4 +1046,5 @@ def test_create_multiple_vouchers_duplicate_code(token_client, organizer, event,
)
assert resp.status_code == 400
assert resp.data == [{}, {'code': ['Duplicate voucher code in request.']}]
assert Voucher.objects.count() == 0
with scopes_disabled():
assert Voucher.objects.count() == 0
+31 -19
View File
@@ -3,6 +3,7 @@ import datetime
from unittest import mock
import pytest
from django_scopes import scopes_disabled
from pytz import UTC
from pretix.base.models import WaitingListEntry
@@ -44,8 +45,9 @@ TEST_WLE_RES = {
@pytest.mark.django_db
def test_wle_list(token_client, organizer, event, wle, item, subevent):
var = item.variations.create(value="Children")
var2 = item.variations.create(value="Children")
with scopes_disabled():
var = item.variations.create(value="Children")
var2 = item.variations.create(value="Children")
res = dict(TEST_WLE_RES)
wle.variation = var
wle.save()
@@ -97,7 +99,8 @@ def test_wle_list(token_client, organizer, event, wle, item, subevent):
'/api/v1/organizers/{}/events/{}/waitinglistentries/?has_voucher=true'.format(organizer.slug, event.slug))
assert [] == resp.data['results']
v = event.vouchers.create(item=item, price_mode='set', value=12, tag='Foo')
with scopes_disabled():
v = event.vouchers.create(item=item, price_mode='set', value=12, tag='Foo')
wle.voucher = v
wle.save()
res['voucher'] = v.pk
@@ -112,7 +115,8 @@ def test_wle_list(token_client, organizer, event, wle, item, subevent):
resp = token_client.get(
'/api/v1/organizers/{}/events/{}/waitinglistentries/?subevent={}'.format(organizer.slug, event.slug, subevent.pk))
assert [res] == resp.data['results']
se2 = event.subevents.create(name="Foobar", date_from=datetime.datetime(2017, 12, 27, 10, 0, 0, tzinfo=UTC))
with scopes_disabled():
se2 = event.subevents.create(name="Foobar", date_from=datetime.datetime(2017, 12, 27, 10, 0, 0, tzinfo=UTC))
resp = token_client.get(
'/api/v1/organizers/{}/events/{}/waitinglistentries/?subevent={}'.format(organizer.slug, event.slug,
se2.pk))
@@ -136,19 +140,22 @@ def test_delete_wle(token_client, organizer, event, wle, item):
'/api/v1/organizers/{}/events/{}/waitinglistentries/{}/'.format(organizer.slug, event.slug, wle.pk),
)
assert resp.status_code == 204
assert not event.waitinglistentries.filter(pk=wle.id).exists()
with scopes_disabled():
assert not event.waitinglistentries.filter(pk=wle.id).exists()
@pytest.mark.django_db
def test_delete_wle_assigned(token_client, organizer, event, wle, item):
v = event.vouchers.create(item=item, price_mode='set', value=12, tag='Foo')
with scopes_disabled():
v = event.vouchers.create(item=item, price_mode='set', value=12, tag='Foo')
wle.voucher = v
wle.save()
resp = token_client.delete(
'/api/v1/organizers/{}/events/{}/waitinglistentries/{}/'.format(organizer.slug, event.slug, wle.pk),
)
assert resp.status_code == 403
assert event.waitinglistentries.filter(pk=wle.id).exists()
with scopes_disabled():
assert event.waitinglistentries.filter(pk=wle.id).exists()
def create_wle(token_client, organizer, event, data, expected_failure=False):
@@ -159,9 +166,9 @@ def create_wle(token_client, organizer, event, data, expected_failure=False):
if expected_failure:
assert resp.status_code == 400
else:
print(resp.data)
assert resp.status_code == 201
return WaitingListEntry.objects.get(pk=resp.data['id'])
with scopes_disabled():
return WaitingListEntry.objects.get(pk=resp.data['id'])
@pytest.mark.django_db
@@ -205,7 +212,8 @@ def test_wle_require_fields(token_client, organizer, event, item, quota):
},
expected_failure=True
)
v = item.variations.create(value="S")
with scopes_disabled():
v = item.variations.create(value="S")
create_wle(
token_client, organizer, event,
data={
@@ -300,7 +308,8 @@ def test_wle_change_email(token_client, organizer, event, item, wle, quota):
@pytest.mark.django_db
def test_wle_change_assigned(token_client, organizer, event, item, wle, quota):
v = event.vouchers.create(item=item, price_mode='set', value=12, tag='Foo')
with scopes_disabled():
v = event.vouchers.create(item=item, price_mode='set', value=12, tag='Foo')
wle.voucher = v
wle.save()
change_wle(
@@ -315,8 +324,9 @@ def test_wle_change_assigned(token_client, organizer, event, item, wle, quota):
@pytest.mark.django_db
def test_wle_change_to_available_item(token_client, organizer, event, item, wle, quota):
i = event.items.create(name="Budget Ticket", default_price=23)
q = event.quotas.create(name="Budget Ticket", size=1)
with scopes_disabled():
i = event.items.create(name="Budget Ticket", default_price=23)
q = event.quotas.create(name="Budget Ticket", size=1)
q.items.add(i)
change_wle(
token_client, organizer, event, wle,
@@ -330,9 +340,10 @@ def test_wle_change_to_available_item(token_client, organizer, event, item, wle,
@pytest.mark.django_db
def test_wle_change_to_unavailable_item(token_client, organizer, event, item, wle, quota):
i = event.items.create(name="Budget Ticket", default_price=23)
v = i.variations.create(value="S")
q = event.quotas.create(name="Budget Ticket", size=0)
with scopes_disabled():
i = event.items.create(name="Budget Ticket", default_price=23)
v = i.variations.create(value="S")
q = event.quotas.create(name="Budget Ticket", size=0)
q.items.add(i)
q.variations.add(v)
change_wle(
@@ -349,9 +360,10 @@ def test_wle_change_to_unavailable_item(token_client, organizer, event, item, wl
@pytest.mark.django_db
def test_wle_change_to_unavailable_item_missing_var(token_client, organizer, event, item, wle, quota):
i = event.items.create(name="Budget Ticket", default_price=23)
v = i.variations.create(value="S")
q = event.quotas.create(name="Budget Ticket", size=0)
with scopes_disabled():
i = event.items.create(name="Budget Ticket", default_price=23)
v = i.variations.create(value="S")
q = event.quotas.create(name="Budget Ticket", size=0)
q.items.add(i)
q.variations.add(v)
change_wle(
+16 -12
View File
@@ -1,6 +1,7 @@
import copy
import pytest
from django_scopes import scopes_disabled
from pretix.api.models import WebHook
@@ -64,12 +65,13 @@ def test_hook_create(token_client, organizer, event):
format='json'
)
assert resp.status_code == 201
cl = WebHook.objects.get(pk=resp.data['id'])
assert cl.target_url == "https://google.com"
assert cl.limit_events.count() == 1
assert set(cl.listeners.values_list('action_type', flat=True)) == {'pretix.event.order.placed',
'pretix.event.order.paid'}
assert not cl.all_events
with scopes_disabled():
cl = WebHook.objects.get(pk=resp.data['id'])
assert cl.target_url == "https://google.com"
assert cl.limit_events.count() == 1
assert set(cl.listeners.values_list('action_type', flat=True)) == {'pretix.event.order.placed',
'pretix.event.order.paid'}
assert not cl.all_events
@pytest.mark.django_db
@@ -136,9 +138,10 @@ def test_hook_patch_url(token_client, organizer, event, webhook):
assert resp.status_code == 200
webhook.refresh_from_db()
assert webhook.target_url == "https://pretix.eu"
assert webhook.limit_events.count() == 1
assert set(webhook.listeners.values_list('action_type', flat=True)) == {'pretix.event.order.placed',
'pretix.event.order.paid'}
with scopes_disabled():
assert webhook.limit_events.count() == 1
assert set(webhook.listeners.values_list('action_type', flat=True)) == {'pretix.event.order.placed',
'pretix.event.order.paid'}
assert webhook.enabled
@@ -153,9 +156,10 @@ def test_hook_patch_types(token_client, organizer, event, webhook):
)
assert resp.status_code == 200
webhook.refresh_from_db()
assert webhook.limit_events.count() == 1
assert set(webhook.listeners.values_list('action_type', flat=True)) == {'pretix.event.order.placed',
'pretix.event.order.canceled'}
with scopes_disabled():
assert webhook.limit_events.count() == 1
assert set(webhook.listeners.values_list('action_type', flat=True)) == {'pretix.event.order.placed',
'pretix.event.order.canceled'}
assert webhook.enabled