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

View File

@@ -239,7 +239,7 @@ class Login2FAFormTest(TestCase):
def test_totp_invalid(self):
response = self.client.get('/control/login/2fa')
assert 'token' in response.rendered_content
assert 'token' in response.content.decode()
d = TOTPDevice.objects.create(user=self.user, name='test')
totp = TOTP(d.bin_key, d.step, d.t0, d.digits, d.drift)
totp.time = time.time()
@@ -251,7 +251,7 @@ class Login2FAFormTest(TestCase):
def test_totp_valid(self):
response = self.client.get('/control/login/2fa')
assert 'token' in response.rendered_content
assert 'token' in response.content.decode()
d = TOTPDevice.objects.create(user=self.user, name='test')
totp = TOTP(d.bin_key, d.step, d.t0, d.digits, d.drift)
totp.time = time.time()
@@ -274,7 +274,7 @@ class Login2FAFormTest(TestCase):
d = U2FDevice.objects.create(user=self.user, name='test', json_data="{}")
response = self.client.get('/control/login/2fa')
assert 'token' in response.rendered_content
assert 'token' in response.content.decode()
response = self.client.post('/control/login/2fa'.format(d.pk), {
'token': '{"response": "true"}'
})
@@ -291,7 +291,7 @@ class Login2FAFormTest(TestCase):
d = U2FDevice.objects.create(user=self.user, name='test', json_data="{}")
response = self.client.get('/control/login/2fa')
assert 'token' in response.rendered_content
assert 'token' in response.content.decode()
response = self.client.post('/control/login/2fa'.format(d.pk), {
'token': '{"response": "true"}'
})

View File

@@ -3,6 +3,7 @@ from decimal import Decimal
import pytest
from django.utils.timezone import now
from django_scopes import scopes_disabled
from pretix.base.models import (
Checkin, Event, Item, ItemAddOn, ItemCategory, LogEntry, Order,
@@ -58,12 +59,14 @@ def dashboard_env():
@pytest.mark.django_db
@scopes_disabled()
def test_dashboard(dashboard_env):
c = checkin_widget(dashboard_env[0])
assert '0/2' in c[0]['content']
@pytest.mark.django_db
@scopes_disabled()
def test_dashboard_pending_not_count(dashboard_env):
c = checkin_widget(dashboard_env[0])
order_pending = Order.objects.create(
@@ -83,6 +86,7 @@ def test_dashboard_pending_not_count(dashboard_env):
@pytest.mark.django_db
@scopes_disabled()
def test_dashboard_with_checkin(dashboard_env):
op = OrderPosition.objects.get(
order=dashboard_env[3],
@@ -256,11 +260,13 @@ def test_checkins_list_mixed(client, checkin_list_env, query, expected):
@pytest.mark.django_db
def test_manual_checkins(client, checkin_list_env):
client.login(email='dummy@dummy.dummy', password='dummy')
assert not checkin_list_env[5][3].checkins.exists()
with scopes_disabled():
assert not checkin_list_env[5][3].checkins.exists()
client.post('/control/event/dummy/dummy/checkinlists/{}/'.format(checkin_list_env[6].pk), {
'checkin': [checkin_list_env[5][3].pk]
})
assert checkin_list_env[5][3].checkins.exists()
with scopes_disabled():
assert checkin_list_env[5][3].checkins.exists()
assert LogEntry.objects.filter(
action_type='pretix.event.checkin', object_id=checkin_list_env[5][3].order.pk
).exists()
@@ -269,7 +275,8 @@ def test_manual_checkins(client, checkin_list_env):
@pytest.mark.django_db
def test_manual_checkins_revert(client, checkin_list_env):
client.login(email='dummy@dummy.dummy', password='dummy')
assert not checkin_list_env[5][3].checkins.exists()
with scopes_disabled():
assert not checkin_list_env[5][3].checkins.exists()
client.post('/control/event/dummy/dummy/checkinlists/{}/'.format(checkin_list_env[6].pk), {
'checkin': [checkin_list_env[5][3].pk]
})
@@ -277,7 +284,8 @@ def test_manual_checkins_revert(client, checkin_list_env):
'checkin': [checkin_list_env[5][3].pk],
'revert': 'true'
})
assert not checkin_list_env[5][3].checkins.exists()
with scopes_disabled():
assert not checkin_list_env[5][3].checkins.exists()
assert LogEntry.objects.filter(
action_type='pretix.event.checkin', object_id=checkin_list_env[5][3].order.pk
).exists()
@@ -381,11 +389,11 @@ def test_checkins_attendee_name_from_addon_available(client, checkin_list_with_a
class CheckinListFormTest(SoupTest):
@scopes_disabled()
def setUp(self):
super().setUp()
self.user = User.objects.create_user('dummy@dummy.dummy', 'dummy')
self.orga1 = Organizer.objects.create(name='CCC', slug='ccc')
self.orga2 = Organizer.objects.create(name='MRM', slug='mrm')
self.event1 = Event.objects.create(
organizer=self.orga1, name='30C3', slug='30c3',
date_from=datetime(2013, 12, 26, tzinfo=timezone.utc),
@@ -404,12 +412,14 @@ class CheckinListFormTest(SoupTest):
doc = self.post_doc('/control/event/%s/%s/checkinlists/add' % (self.orga1.slug, self.event1.slug), form_data)
assert doc.select(".alert-success")
self.assertIn("All", doc.select("#page-wrapper table")[0].text)
assert self.event1.checkin_lists.get(
name='All', all_products=True
)
with scopes_disabled():
assert self.event1.checkin_lists.get(
name='All', all_products=True
)
def test_update(self):
cl = self.event1.checkin_lists.create(name='All', all_products=True)
with scopes_disabled():
cl = self.event1.checkin_lists.create(name='All', all_products=True)
doc = self.get_doc('/control/event/%s/%s/checkinlists/%s/change' % (self.orga1.slug, self.event1.slug, cl.id))
form_data = extract_form_fields(doc.select('.container-fluid form')[0])
form_data['all_products'] = ''
@@ -419,14 +429,17 @@ class CheckinListFormTest(SoupTest):
assert doc.select(".alert-success")
cl.refresh_from_db()
assert not cl.all_products
assert list(cl.limit_products.all()) == [self.item_ticket]
with scopes_disabled():
assert list(cl.limit_products.all()) == [self.item_ticket]
def test_delete(self):
cl = self.event1.checkin_lists.create(name='All', all_products=True)
with scopes_disabled():
cl = self.event1.checkin_lists.create(name='All', all_products=True)
doc = self.get_doc('/control/event/%s/%s/checkinlists/%s/delete' % (self.orga1.slug, self.event1.slug, cl.id))
form_data = extract_form_fields(doc.select('.container-fluid form')[0])
doc = self.post_doc('/control/event/%s/%s/checkinlists/%s/delete' % (self.orga1.slug, self.event1.slug, cl.id),
form_data)
assert doc.select(".alert-success")
self.assertNotIn("VAT", doc.select("#page-wrapper")[0].text)
assert not self.event1.checkin_lists.exists()
with scopes_disabled():
assert not self.event1.checkin_lists.exists()

View File

@@ -1,5 +1,6 @@
import pytest
from django.utils.timezone import now
from django_scopes import scopes_disabled
from pretix.base.models import Device, Event, Organizer, Team, User
from pretix.base.models.devices import generate_api_token
@@ -40,7 +41,7 @@ def admin_team(organizer):
def test_list_of_devices(event, admin_user, client, device):
client.login(email='dummy@dummy.dummy', password='dummy')
resp = client.get('/control/organizer/dummy/devices')
assert 'Cashdesk' in resp.rendered_content
assert 'Cashdesk' in resp.content.decode()
@pytest.mark.django_db
@@ -50,11 +51,13 @@ def test_create_device(event, admin_user, admin_team, client):
'name': 'Foo',
'limit_events': str(event.pk),
}, follow=True)
d = Device.objects.last()
assert d.name == 'Foo'
assert not d.all_events
assert list(d.limit_events.all()) == [event]
assert d.initialization_token in resp.content.decode()
print(resp.status_code, resp.content)
with scopes_disabled():
d = Device.objects.last()
assert d.name == 'Foo'
assert not d.all_events
assert list(d.limit_events.all()) == [event]
assert d.initialization_token in resp.content.decode()
@pytest.mark.django_db
@@ -67,13 +70,15 @@ def test_update_device(event, admin_user, admin_team, device, client):
device.refresh_from_db()
assert device.name == 'Cashdesk 2'
assert not device.all_events
assert list(device.limit_events.all()) == [event]
with scopes_disabled():
assert list(device.limit_events.all()) == [event]
@pytest.mark.django_db
def test_revoke_device(event, admin_user, admin_team, device, client):
client.login(email='dummy@dummy.dummy', password='dummy')
device.api_token = generate_api_token()
with scopes_disabled():
device.api_token = generate_api_token()
device.initialized = now()
device.save()

View File

@@ -3,6 +3,7 @@ from decimal import Decimal
import pytz
from django.utils.timezone import now
from django_scopes import scopes_disabled
from i18nfield.strings import LazyI18nString
from pytz import timezone
from tests.base import SoupTest, extract_form_fields
@@ -15,6 +16,7 @@ from pretix.testutils.mock import mocker_context
class EventsTest(SoupTest):
@scopes_disabled()
def setUp(self):
super().setUp()
self.user = User.objects.create_user('dummy@dummy.dummy', 'dummy')
@@ -49,7 +51,8 @@ class EventsTest(SoupTest):
self.assertNotIn("MRMCD14", tabletext)
def test_quick_setup_later(self):
self.event1.quotas.create(name='foo', size=2)
with scopes_disabled():
self.event1.quotas.create(name='foo', size=2)
resp = self.client.get('/control/event/%s/%s/quickstart/' % (self.orga1.slug, self.event1.slug))
self.assertRedirects(resp, '/control/event/%s/%s/' % (self.orga1.slug, self.event1.slug))
@@ -86,18 +89,19 @@ class EventsTest(SoupTest):
assert self.event1.settings.payment_banktransfer__enabled
assert self.event1.settings.get('payment_banktransfer_bank_details', as_type=LazyI18nString).localize('en') == "Foo"
assert 'pretix.plugins.banktransfer' in self.event1.plugins
assert self.event1.items.count() == 2
i = self.event1.items.first()
assert str(i.name) == "Normal ticket"
assert i.default_price == Decimal('13.90')
i = self.event1.items.last()
assert str(i.name) == "Reduced ticket"
assert i.default_price == Decimal('13.20')
assert self.event1.quotas.count() == 1
q = self.event1.quotas.first()
assert q.name == 'Tickets'
assert q.size == 300
assert q.items.count() == 2
with scopes_disabled():
assert self.event1.items.count() == 2
i = self.event1.items.first()
assert str(i.name) == "Normal ticket"
assert i.default_price == Decimal('13.90')
i = self.event1.items.last()
assert str(i.name) == "Reduced ticket"
assert i.default_price == Decimal('13.20')
assert self.event1.quotas.count() == 1
q = self.event1.quotas.first()
assert q.name == 'Tickets'
assert q.size == 300
assert q.items.count() == 2
def test_quick_setup_single_quota(self):
doc = self.get_doc('/control/event/%s/%s/quickstart/' % (self.orga1.slug, self.event1.slug))
@@ -132,22 +136,23 @@ class EventsTest(SoupTest):
assert self.event1.settings.payment_banktransfer__enabled
assert self.event1.settings.get('payment_banktransfer_bank_details', as_type=LazyI18nString).localize('en') == "Foo"
assert 'pretix.plugins.banktransfer' in self.event1.plugins
assert self.event1.items.count() == 2
i = self.event1.items.first()
assert str(i.name) == "Normal ticket"
assert i.default_price == Decimal('13.90')
i = self.event1.items.last()
assert str(i.name) == "Reduced ticket"
assert i.default_price == Decimal('13.20')
assert self.event1.quotas.count() == 2
q = self.event1.quotas.first()
assert q.name == 'Normal ticket'
assert q.size == 100
assert q.items.count() == 1
q = self.event1.quotas.last()
assert q.name == 'Reduced ticket'
assert q.size == 50
assert q.items.count() == 1
with scopes_disabled():
assert self.event1.items.count() == 2
i = self.event1.items.first()
assert str(i.name) == "Normal ticket"
assert i.default_price == Decimal('13.90')
i = self.event1.items.last()
assert str(i.name) == "Reduced ticket"
assert i.default_price == Decimal('13.20')
assert self.event1.quotas.count() == 2
q = self.event1.quotas.first()
assert q.name == 'Normal ticket'
assert q.size == 100
assert q.items.count() == 1
q = self.event1.quotas.last()
assert q.name == 'Reduced ticket'
assert q.size == 50
assert q.items.count() == 1
def test_quick_setup_dual_quota(self):
doc = self.get_doc('/control/event/%s/%s/quickstart/' % (self.orga1.slug, self.event1.slug))
@@ -182,22 +187,23 @@ class EventsTest(SoupTest):
assert self.event1.settings.payment_banktransfer__enabled
assert self.event1.settings.get('payment_banktransfer_bank_details', as_type=LazyI18nString).localize('en') == "Foo"
assert 'pretix.plugins.banktransfer' in self.event1.plugins
assert self.event1.items.count() == 2
i = self.event1.items.first()
assert str(i.name) == "Normal ticket"
assert i.default_price == Decimal('13.90')
i = self.event1.items.last()
assert str(i.name) == "Reduced ticket"
assert i.default_price == Decimal('13.20')
assert self.event1.quotas.count() == 3
q = self.event1.quotas.first()
assert q.name == 'Normal ticket'
assert q.size == 100
assert q.items.count() == 1
q = self.event1.quotas.last()
assert q.name == 'Tickets'
assert q.size == 120
assert q.items.count() == 2
with scopes_disabled():
assert self.event1.items.count() == 2
i = self.event1.items.first()
assert str(i.name) == "Normal ticket"
assert i.default_price == Decimal('13.90')
i = self.event1.items.last()
assert str(i.name) == "Reduced ticket"
assert i.default_price == Decimal('13.20')
assert self.event1.quotas.count() == 3
q = self.event1.quotas.first()
assert q.name == 'Normal ticket'
assert q.size == 100
assert q.items.count() == 1
q = self.event1.quotas.last()
assert q.name == 'Tickets'
assert q.size == 120
assert q.items.count() == 2
def test_settings(self):
doc = self.get_doc('/control/event/%s/%s/settings/' % (self.orga1.slug, self.event1.slug))
@@ -257,48 +263,52 @@ class EventsTest(SoupTest):
assert self.event1.testmode
def test_testmode_disable(self):
o = Order.objects.create(
code='FOO', event=self.event1, email='dummy@dummy.test',
status=Order.STATUS_PENDING,
datetime=now(), expires=now() + datetime.timedelta(days=10),
total=14, locale='en', testmode=True
)
o2 = Order.objects.create(
code='FOO2', event=self.event1, email='dummy@dummy.test',
status=Order.STATUS_PENDING,
datetime=now(), expires=now() + datetime.timedelta(days=10),
total=14, locale='en'
)
self.event1.testmode = True
self.event1.save()
with scopes_disabled():
o = Order.objects.create(
code='FOO', event=self.event1, email='dummy@dummy.test',
status=Order.STATUS_PENDING,
datetime=now(), expires=now() + datetime.timedelta(days=10),
total=14, locale='en', testmode=True
)
o2 = Order.objects.create(
code='FOO2', event=self.event1, email='dummy@dummy.test',
status=Order.STATUS_PENDING,
datetime=now(), expires=now() + datetime.timedelta(days=10),
total=14, locale='en'
)
self.event1.testmode = True
self.event1.save()
self.post_doc('/control/event/%s/%s/live/' % (self.orga1.slug, self.event1.slug),
{'testmode': 'false'})
self.event1.refresh_from_db()
assert not self.event1.testmode
assert Order.objects.filter(pk=o.pk).exists()
assert Order.objects.filter(pk=o2.pk).exists()
with scopes_disabled():
assert Order.objects.filter(pk=o.pk).exists()
assert Order.objects.filter(pk=o2.pk).exists()
def test_testmode_disable_delete(self):
o = Order.objects.create(
code='FOO', event=self.event1, email='dummy@dummy.test',
status=Order.STATUS_PENDING,
datetime=now(), expires=now() + datetime.timedelta(days=10),
total=14, locale='en', testmode=True
)
o2 = Order.objects.create(
code='FOO2', event=self.event1, email='dummy@dummy.test',
status=Order.STATUS_PENDING,
datetime=now(), expires=now() + datetime.timedelta(days=10),
total=14, locale='en'
)
self.event1.testmode = True
self.event1.save()
with scopes_disabled():
o = Order.objects.create(
code='FOO', event=self.event1, email='dummy@dummy.test',
status=Order.STATUS_PENDING,
datetime=now(), expires=now() + datetime.timedelta(days=10),
total=14, locale='en', testmode=True
)
o2 = Order.objects.create(
code='FOO2', event=self.event1, email='dummy@dummy.test',
status=Order.STATUS_PENDING,
datetime=now(), expires=now() + datetime.timedelta(days=10),
total=14, locale='en'
)
self.event1.testmode = True
self.event1.save()
self.post_doc('/control/event/%s/%s/live/' % (self.orga1.slug, self.event1.slug),
{'testmode': 'false', 'delete': 'yes'})
self.event1.refresh_from_db()
assert not self.event1.testmode
assert not Order.objects.filter(pk=o.pk).exists()
assert Order.objects.filter(pk=o2.pk).exists()
with scopes_disabled():
assert not Order.objects.filter(pk=o.pk).exists()
assert Order.objects.filter(pk=o2.pk).exists()
def test_live_disable(self):
self.event1.live = True
@@ -309,9 +319,10 @@ class EventsTest(SoupTest):
assert not self.event1.live
def test_live_ok(self):
self.event1.items.create(name='Test', default_price=5)
self.event1.settings.set('payment_banktransfer__enabled', True)
self.event1.quotas.create(name='Test quota')
with scopes_disabled():
self.event1.items.create(name='Test', default_price=5)
self.event1.settings.set('payment_banktransfer__enabled', True)
self.event1.quotas.create(name='Test quota')
doc = self.get_doc('/control/event/%s/%s/live/' % (self.orga1.slug, self.event1.slug))
assert len(doc.select("input[name=live]"))
self.post_doc('/control/event/%s/%s/live/' % (self.orga1.slug, self.event1.slug),
@@ -320,16 +331,18 @@ class EventsTest(SoupTest):
assert self.event1.live
def test_live_dont_require_payment_method_free(self):
self.event1.items.create(name='Test', default_price=0)
self.event1.settings.set('payment_banktransfer__enabled', False)
self.event1.quotas.create(name='Test quota')
with scopes_disabled():
self.event1.items.create(name='Test', default_price=0)
self.event1.settings.set('payment_banktransfer__enabled', False)
self.event1.quotas.create(name='Test quota')
doc = self.get_doc('/control/event/%s/%s/live/' % (self.orga1.slug, self.event1.slug))
assert len(doc.select("input[name=live]"))
def test_live_require_payment_method(self):
self.event1.items.create(name='Test', default_price=5)
self.event1.settings.set('payment_banktransfer__enabled', False)
self.event1.quotas.create(name='Test quota')
with scopes_disabled():
self.event1.items.create(name='Test', default_price=5)
self.event1.settings.set('payment_banktransfer__enabled', False)
self.event1.quotas.create(name='Test quota')
doc = self.get_doc('/control/event/%s/%s/live/' % (self.orga1.slug, self.event1.slug))
assert len(doc.select("input[name=live]")) == 0
@@ -378,7 +391,8 @@ class EventsTest(SoupTest):
self.event1.save(update_fields=['presale_end'])
def test_payment_settings_relative_date_payment_after_presale_end(self):
tr19 = self.event1.tax_rules.create(rate=Decimal('19.00'))
with scopes_disabled():
tr19 = self.event1.tax_rules.create(rate=Decimal('19.00'))
self.event1.presale_end = self.event1.date_from - datetime.timedelta(days=5)
self.event1.save(update_fields=['presale_end'])
doc = self.post_doc('/control/event/%s/%s/settings/payment' % (self.orga1.slug, self.event1.slug), {
@@ -578,23 +592,24 @@ class EventsTest(SoupTest):
'copy-copy_from_event': ''
})
ev = Event.objects.get(slug='33c3')
assert ev.name == LazyI18nString({'de': '33C3', 'en': '33C3'})
assert ev.settings.locales == ['en', 'de']
assert ev.settings.locale == 'en'
assert ev.currency == 'EUR'
assert ev.settings.timezone == 'Europe/Berlin'
assert ev.organizer == self.orga1
assert ev.location == LazyI18nString({'de': 'Hamburg', 'en': 'Hamburg'})
assert Team.objects.filter(limit_events=ev, members=self.user).exists()
with scopes_disabled():
ev = Event.objects.get(slug='33c3')
assert ev.name == LazyI18nString({'de': '33C3', 'en': '33C3'})
assert ev.settings.locales == ['en', 'de']
assert ev.settings.locale == 'en'
assert ev.currency == 'EUR'
assert ev.settings.timezone == 'Europe/Berlin'
assert ev.organizer == self.orga1
assert ev.location == LazyI18nString({'de': 'Hamburg', 'en': 'Hamburg'})
assert Team.objects.filter(limit_events=ev, members=self.user).exists()
berlin_tz = timezone('Europe/Berlin')
assert ev.date_from == berlin_tz.localize(datetime.datetime(2016, 12, 27, 10, 0, 0)).astimezone(pytz.utc)
assert ev.date_to == berlin_tz.localize(datetime.datetime(2016, 12, 30, 19, 0, 0)).astimezone(pytz.utc)
assert ev.presale_start == berlin_tz.localize(datetime.datetime(2016, 11, 1, 10, 0, 0)).astimezone(pytz.utc)
assert ev.presale_end == berlin_tz.localize(datetime.datetime(2016, 11, 30, 18, 0, 0)).astimezone(pytz.utc)
berlin_tz = timezone('Europe/Berlin')
assert ev.date_from == berlin_tz.localize(datetime.datetime(2016, 12, 27, 10, 0, 0)).astimezone(pytz.utc)
assert ev.date_to == berlin_tz.localize(datetime.datetime(2016, 12, 30, 19, 0, 0)).astimezone(pytz.utc)
assert ev.presale_start == berlin_tz.localize(datetime.datetime(2016, 11, 1, 10, 0, 0)).astimezone(pytz.utc)
assert ev.presale_end == berlin_tz.localize(datetime.datetime(2016, 11, 30, 18, 0, 0)).astimezone(pytz.utc)
assert ev.tax_rules.filter(rate=Decimal('19.00')).exists()
assert ev.tax_rules.filter(rate=Decimal('19.00')).exists()
def test_create_event_with_subevents_success(self):
doc = self.get_doc('/control/events/add')
@@ -635,20 +650,22 @@ class EventsTest(SoupTest):
'event_wizard-prefix': 'event_wizard',
'copy-copy_from_event': ''
})
ev = Event.objects.get(slug='33c3')
assert ev.has_subevents
assert ev.subevents.count() == 1
with scopes_disabled():
ev = Event.objects.get(slug='33c3')
assert ev.has_subevents
assert ev.subevents.count() == 1
def test_create_event_copy_success(self):
tr = self.event1.tax_rules.create(
rate=19, name="VAT"
)
self.event1.items.create(
name='Early-bird ticket',
category=None, default_price=23, tax_rule=tr,
admission=True
)
self.event1.settings.tax_rate_default = tr
with scopes_disabled():
tr = self.event1.tax_rules.create(
rate=19, name="VAT"
)
self.event1.items.create(
name='Early-bird ticket',
category=None, default_price=23, tax_rule=tr,
admission=True
)
self.event1.settings.tax_rate_default = tr
doc = self.get_doc('/control/events/add')
doc = self.post_doc('/control/events/add', {
@@ -688,34 +705,36 @@ class EventsTest(SoupTest):
'copy-copy_from_event': self.event1.pk
})
ev = Event.objects.get(slug='33c3')
assert ev.name == LazyI18nString({'de': '33C3', 'en': '33C3'})
assert ev.settings.locales == ['en', 'de']
assert ev.settings.locale == 'en'
assert ev.currency == 'EUR'
assert ev.settings.timezone == 'Europe/Berlin'
assert ev.organizer == self.orga1
assert ev.location == LazyI18nString({'de': 'Hamburg', 'en': 'Hamburg'})
assert Team.objects.filter(limit_events=ev, members=self.user).exists()
assert ev.items.count() == 1
with scopes_disabled():
ev = Event.objects.get(slug='33c3')
assert ev.name == LazyI18nString({'de': '33C3', 'en': '33C3'})
assert ev.settings.locales == ['en', 'de']
assert ev.settings.locale == 'en'
assert ev.currency == 'EUR'
assert ev.settings.timezone == 'Europe/Berlin'
assert ev.organizer == self.orga1
assert ev.location == LazyI18nString({'de': 'Hamburg', 'en': 'Hamburg'})
assert Team.objects.filter(limit_events=ev, members=self.user).exists()
assert ev.items.count() == 1
berlin_tz = timezone('Europe/Berlin')
assert ev.date_from == berlin_tz.localize(datetime.datetime(2016, 12, 27, 10, 0, 0)).astimezone(pytz.utc)
assert ev.date_to == berlin_tz.localize(datetime.datetime(2016, 12, 30, 19, 0, 0)).astimezone(pytz.utc)
assert ev.presale_start == berlin_tz.localize(datetime.datetime(2016, 11, 1, 10, 0, 0)).astimezone(pytz.utc)
assert ev.presale_end == berlin_tz.localize(datetime.datetime(2016, 11, 30, 18, 0, 0)).astimezone(pytz.utc)
berlin_tz = timezone('Europe/Berlin')
assert ev.date_from == berlin_tz.localize(datetime.datetime(2016, 12, 27, 10, 0, 0)).astimezone(pytz.utc)
assert ev.date_to == berlin_tz.localize(datetime.datetime(2016, 12, 30, 19, 0, 0)).astimezone(pytz.utc)
assert ev.presale_start == berlin_tz.localize(datetime.datetime(2016, 11, 1, 10, 0, 0)).astimezone(pytz.utc)
assert ev.presale_end == berlin_tz.localize(datetime.datetime(2016, 11, 30, 18, 0, 0)).astimezone(pytz.utc)
assert ev.tax_rules.filter(rate=Decimal('19.00')).count() == 1
assert ev.tax_rules.filter(rate=Decimal('19.00')).count() == 1
def test_create_event_clone_success(self):
tr = self.event1.tax_rules.create(
rate=19, name="VAT"
)
self.event1.items.create(
name='Early-bird ticket',
category=None, default_price=23, tax_rule=tr,
admission=True
)
with scopes_disabled():
tr = self.event1.tax_rules.create(
rate=19, name="VAT"
)
self.event1.items.create(
name='Early-bird ticket',
category=None, default_price=23, tax_rule=tr,
admission=True
)
self.event1.settings.tax_rate_default = tr
doc = self.get_doc('/control/events/add?clone=' + str(self.event1.pk))
tabletext = doc.select("form")[0].text
@@ -754,24 +773,25 @@ class EventsTest(SoupTest):
assert not doc.select("#id_copy-copy_from_event_1")
ev = Event.objects.get(slug='33c3')
assert ev.name == LazyI18nString({'de': '33C3', 'en': '33C3'})
assert ev.settings.locales == ['en', 'de']
assert ev.settings.locale == 'en'
assert ev.currency == 'EUR'
assert ev.settings.timezone == 'Europe/Berlin'
assert ev.organizer == self.orga1
assert ev.location == LazyI18nString({'de': 'Hamburg', 'en': 'Hamburg'})
assert Team.objects.filter(limit_events=ev, members=self.user).exists()
assert ev.items.count() == 1
with scopes_disabled():
ev = Event.objects.get(slug='33c3')
assert ev.name == LazyI18nString({'de': '33C3', 'en': '33C3'})
assert ev.settings.locales == ['en', 'de']
assert ev.settings.locale == 'en'
assert ev.currency == 'EUR'
assert ev.settings.timezone == 'Europe/Berlin'
assert ev.organizer == self.orga1
assert ev.location == LazyI18nString({'de': 'Hamburg', 'en': 'Hamburg'})
assert Team.objects.filter(limit_events=ev, members=self.user).exists()
assert ev.items.count() == 1
berlin_tz = timezone('Europe/Berlin')
assert ev.date_from == berlin_tz.localize(datetime.datetime(2016, 12, 27, 10, 0, 0)).astimezone(pytz.utc)
assert ev.date_to == berlin_tz.localize(datetime.datetime(2016, 12, 30, 19, 0, 0)).astimezone(pytz.utc)
assert ev.presale_start == berlin_tz.localize(datetime.datetime(2016, 11, 1, 10, 0, 0)).astimezone(pytz.utc)
assert ev.presale_end == berlin_tz.localize(datetime.datetime(2016, 11, 30, 18, 0, 0)).astimezone(pytz.utc)
berlin_tz = timezone('Europe/Berlin')
assert ev.date_from == berlin_tz.localize(datetime.datetime(2016, 12, 27, 10, 0, 0)).astimezone(pytz.utc)
assert ev.date_to == berlin_tz.localize(datetime.datetime(2016, 12, 30, 19, 0, 0)).astimezone(pytz.utc)
assert ev.presale_start == berlin_tz.localize(datetime.datetime(2016, 11, 1, 10, 0, 0)).astimezone(pytz.utc)
assert ev.presale_end == berlin_tz.localize(datetime.datetime(2016, 11, 30, 18, 0, 0)).astimezone(pytz.utc)
assert ev.tax_rules.filter(rate=Decimal('19.00')).count() == 1
assert ev.tax_rules.filter(rate=Decimal('19.00')).count() == 1
def test_create_event_only_date_from(self):
# date_to, presale_start & presale_end are optional fields
@@ -806,19 +826,20 @@ class EventsTest(SoupTest):
'copy-copy_from_event': ''
})
ev = Event.objects.get(slug='33c3')
assert ev.name == LazyI18nString({'en': '33C3'})
assert ev.settings.locales == ['en']
assert ev.settings.locale == 'en'
assert ev.currency == 'EUR'
assert ev.settings.timezone == 'UTC'
assert ev.organizer == self.orga1
assert ev.location == LazyI18nString({'en': 'Hamburg'})
assert Team.objects.filter(limit_events=ev, members=self.user).exists()
assert ev.date_from == datetime.datetime(2016, 12, 27, 10, 0, 0, tzinfo=pytz.utc)
assert ev.date_to is None
assert ev.presale_start is None
assert ev.presale_end is None
with scopes_disabled():
ev = Event.objects.get(slug='33c3')
assert ev.name == LazyI18nString({'en': '33C3'})
assert ev.settings.locales == ['en']
assert ev.settings.locale == 'en'
assert ev.currency == 'EUR'
assert ev.settings.timezone == 'UTC'
assert ev.organizer == self.orga1
assert ev.location == LazyI18nString({'en': 'Hamburg'})
assert Team.objects.filter(limit_events=ev, members=self.user).exists()
assert ev.date_from == datetime.datetime(2016, 12, 27, 10, 0, 0, tzinfo=pytz.utc)
assert ev.date_to is None
assert ev.presale_start is None
assert ev.presale_end is None
def test_create_event_missing_date_from(self):
# date_from is mandatory
@@ -909,6 +930,7 @@ class EventsTest(SoupTest):
class SubEventsTest(SoupTest):
@scopes_disabled()
def setUp(self):
super().setUp()
self.user = User.objects.create_user('dummy@dummy.dummy', 'dummy')
@@ -967,22 +989,23 @@ class SubEventsTest(SoupTest):
'item-%d-price' % self.ticket.pk: '12'
})
assert doc.select(".alert-success")
se = self.event1.subevents.first()
assert str(se.name) == "SE2"
assert se.active
assert se.date_from.isoformat() == "2017-07-01T10:00:00+00:00"
assert se.date_to.isoformat() == "2017-07-01T12:00:00+00:00"
assert str(se.location) == "Hamburg"
assert se.presale_start.isoformat() == "2017-06-20T10:00:00+00:00"
assert not se.presale_end
assert se.quotas.count() == 1
q = se.quotas.last()
assert q.name == "Q1"
assert q.size == 50
assert list(q.items.all()) == [self.ticket]
sei = SubEventItem.objects.get(subevent=se, item=self.ticket)
assert sei.price == 12
assert se.checkinlist_set.count() == 1
with scopes_disabled():
se = self.event1.subevents.first()
assert str(se.name) == "SE2"
assert se.active
assert se.date_from.isoformat() == "2017-07-01T10:00:00+00:00"
assert se.date_to.isoformat() == "2017-07-01T12:00:00+00:00"
assert str(se.location) == "Hamburg"
assert se.presale_start.isoformat() == "2017-06-20T10:00:00+00:00"
assert not se.presale_end
assert se.quotas.count() == 1
q = se.quotas.last()
assert q.name == "Q1"
assert q.size == 50
assert list(q.items.all()) == [self.ticket]
sei = SubEventItem.objects.get(subevent=se, item=self.ticket)
assert sei.price == 12
assert se.checkinlist_set.count() == 1
def test_modify(self):
doc = self.get_doc('/control/event/ccc/30c3/subevents/%d/' % self.subevent1.pk)
@@ -1022,14 +1045,15 @@ class SubEventsTest(SoupTest):
assert str(se.location) == "Hamburg"
assert se.presale_start.isoformat() == "2017-06-20T10:00:00+00:00"
assert not se.presale_end
assert se.quotas.count() == 1
q = se.quotas.last()
assert q.name == "Q1"
assert q.size == 50
assert list(q.items.all()) == [self.ticket]
sei = SubEventItem.objects.get(subevent=se, item=self.ticket)
assert sei.price == 12
assert se.checkinlist_set.count() == 1
with scopes_disabled():
assert se.quotas.count() == 1
q = se.quotas.last()
assert q.name == "Q1"
assert q.size == 50
assert list(q.items.all()) == [self.ticket]
sei = SubEventItem.objects.get(subevent=se, item=self.ticket)
assert sei.price == 12
assert se.checkinlist_set.count() == 1
def test_delete(self):
doc = self.get_doc('/control/event/ccc/30c3/subevents/%d/delete' % self.subevent1.pk)
@@ -1039,30 +1063,34 @@ class SubEventsTest(SoupTest):
# deleting the second event
doc = self.post_doc('/control/event/ccc/30c3/subevents/%d/delete' % self.subevent2.pk, {})
assert doc.select(".alert-success")
assert not SubEvent.objects.filter(pk=self.subevent2.pk).exists()
assert not SubEvent.objects.filter(pk=self.subevent1.pk).exists()
with scopes_disabled():
assert not SubEvent.objects.filter(pk=self.subevent2.pk).exists()
assert not SubEvent.objects.filter(pk=self.subevent1.pk).exists()
def test_delete_with_orders(self):
o = Order.objects.create(
code='FOO', event=self.event1, email='dummy@dummy.test',
status=Order.STATUS_PENDING,
datetime=now(), expires=now() + datetime.timedelta(days=10),
total=14, locale='en'
)
OrderPosition.objects.create(
order=o,
item=self.ticket,
subevent=self.subevent1,
price=Decimal("14"),
)
with scopes_disabled():
o = Order.objects.create(
code='FOO', event=self.event1, email='dummy@dummy.test',
status=Order.STATUS_PENDING,
datetime=now(), expires=now() + datetime.timedelta(days=10),
total=14, locale='en'
)
OrderPosition.objects.create(
order=o,
item=self.ticket,
subevent=self.subevent1,
price=Decimal("14"),
)
doc = self.get_doc('/control/event/ccc/30c3/subevents/%d/delete' % self.subevent1.pk, follow=True)
assert doc.select(".alert-danger")
doc = self.post_doc('/control/event/ccc/30c3/subevents/%d/delete' % self.subevent1.pk, {}, follow=True)
assert doc.select(".alert-danger")
assert self.event1.subevents.filter(pk=self.subevent1.pk).exists()
with scopes_disabled():
assert self.event1.subevents.filter(pk=self.subevent1.pk).exists()
def test_create_bulk(self):
self.event1.subevents.all().delete()
with scopes_disabled():
self.event1.subevents.all().delete()
self.event1.settings.timezone = 'Europe/Berlin'
doc = self.get_doc('/control/event/ccc/30c3/subevents/bulk_add')
@@ -1120,7 +1148,8 @@ class SubEventsTest(SoupTest):
'checkinlist_set-0-limit_products': str(self.ticket.pk),
})
assert doc.select(".alert-success")
ses = list(self.event1.subevents.order_by('date_from'))
with scopes_disabled():
ses = list(self.event1.subevents.order_by('date_from'))
assert len(ses) == 10
assert str(ses[0].name) == "Foo"
@@ -1128,25 +1157,28 @@ class SubEventsTest(SoupTest):
assert ses[0].date_to.isoformat() == "2018-04-03T13:29:31+00:00"
assert not ses[0].presale_start
assert ses[0].presale_end.isoformat() == "2018-04-02T11:29:31+00:00"
assert ses[0].quotas.count() == 1
assert list(ses[0].quotas.first().items.all()) == [self.ticket]
assert SubEventItem.objects.get(subevent=ses[0], item=self.ticket).price == 16
assert ses[0].checkinlist_set.count() == 1
with scopes_disabled():
assert ses[0].quotas.count() == 1
assert list(ses[0].quotas.first().items.all()) == [self.ticket]
assert SubEventItem.objects.get(subevent=ses[0], item=self.ticket).price == 16
assert ses[0].checkinlist_set.count() == 1
assert str(ses[1].name) == "Foo"
assert ses[1].date_from.isoformat() == "2019-04-03T11:29:31+00:00"
assert ses[1].date_to.isoformat() == "2019-04-03T13:29:31+00:00"
assert not ses[1].presale_start
assert ses[1].presale_end.isoformat() == "2019-04-02T11:29:31+00:00"
assert ses[1].quotas.count() == 1
assert list(ses[1].quotas.first().items.all()) == [self.ticket]
assert SubEventItem.objects.get(subevent=ses[0], item=self.ticket).price == 16
assert ses[1].checkinlist_set.count() == 1
with scopes_disabled():
assert ses[1].quotas.count() == 1
assert list(ses[1].quotas.first().items.all()) == [self.ticket]
assert SubEventItem.objects.get(subevent=ses[0], item=self.ticket).price == 16
assert ses[1].checkinlist_set.count() == 1
assert ses[-1].date_from.isoformat() == "2027-04-03T11:29:31+00:00"
def test_create_bulk_daily_interval(self):
self.event1.subevents.all().delete()
with scopes_disabled():
self.event1.subevents.all().delete()
self.event1.settings.timezone = 'Europe/Berlin'
doc = self.get_doc('/control/event/ccc/30c3/subevents/bulk_add')
@@ -1194,7 +1226,8 @@ class SubEventsTest(SoupTest):
'checkinlist_set-MAX_NUM_FORMS': '1000',
})
assert doc.select(".alert-success")
ses = list(self.event1.subevents.order_by('date_from'))
with scopes_disabled():
ses = list(self.event1.subevents.order_by('date_from'))
assert len(ses) == 183
assert ses[0].date_from.isoformat() == "2018-04-03T11:29:31+00:00"
@@ -1202,7 +1235,8 @@ class SubEventsTest(SoupTest):
assert ses[-1].date_from.isoformat() == "2019-04-02T11:29:31+00:00"
def test_create_bulk_exclude(self):
self.event1.subevents.all().delete()
with scopes_disabled():
self.event1.subevents.all().delete()
self.event1.settings.timezone = 'Europe/Berlin'
doc = self.get_doc('/control/event/ccc/30c3/subevents/bulk_add')
@@ -1265,7 +1299,8 @@ class SubEventsTest(SoupTest):
'checkinlist_set-MAX_NUM_FORMS': '1000',
})
assert doc.select(".alert-success")
ses = list(self.event1.subevents.order_by('date_from'))
with scopes_disabled():
ses = list(self.event1.subevents.order_by('date_from'))
assert len(ses) == 314
assert ses[0].date_from.isoformat() == "2018-04-03T11:29:31+00:00"
@@ -1273,7 +1308,8 @@ class SubEventsTest(SoupTest):
assert ses[6].date_from.isoformat() == "2018-04-10T11:29:31+00:00"
def test_create_bulk_monthly_interval(self):
self.event1.subevents.all().delete()
with scopes_disabled():
self.event1.subevents.all().delete()
self.event1.settings.timezone = 'Europe/Berlin'
doc = self.post_doc('/control/event/ccc/30c3/subevents/bulk_add', {
@@ -1320,7 +1356,8 @@ class SubEventsTest(SoupTest):
'checkinlist_set-MAX_NUM_FORMS': '1000',
})
assert doc.select(".alert-success")
ses = list(self.event1.subevents.order_by('date_from'))
with scopes_disabled():
ses = list(self.event1.subevents.order_by('date_from'))
assert len(ses) == 12
assert ses[0].date_from.isoformat() == "2018-04-30T11:29:31+00:00"
@@ -1328,7 +1365,8 @@ class SubEventsTest(SoupTest):
assert ses[-1].date_from.isoformat() == "2019-03-29T12:29:31+00:00"
def test_create_bulk_weekly_interval(self):
self.event1.subevents.all().delete()
with scopes_disabled():
self.event1.subevents.all().delete()
self.event1.settings.timezone = 'Europe/Berlin'
doc = self.post_doc('/control/event/ccc/30c3/subevents/bulk_add', {
@@ -1375,7 +1413,8 @@ class SubEventsTest(SoupTest):
'checkinlist_set-MAX_NUM_FORMS': '1000',
})
assert doc.select(".alert-success")
ses = list(self.event1.subevents.order_by('date_from'))
with scopes_disabled():
ses = list(self.event1.subevents.order_by('date_from'))
assert len(ses) == 52
assert ses[0].date_from.isoformat() == "2018-04-05T11:29:31+00:00"
@@ -1385,25 +1424,27 @@ class SubEventsTest(SoupTest):
def test_delete_bulk(self):
self.subevent2.active = True
self.subevent2.save()
o = Order.objects.create(
code='FOO', event=self.event1, email='dummy@dummy.test',
status=Order.STATUS_PENDING,
datetime=now(), expires=now() + datetime.timedelta(days=10),
total=14, locale='en'
)
OrderPosition.objects.create(
order=o,
item=self.ticket,
subevent=self.subevent1,
price=Decimal("14"),
)
with scopes_disabled():
o = Order.objects.create(
code='FOO', event=self.event1, email='dummy@dummy.test',
status=Order.STATUS_PENDING,
datetime=now(), expires=now() + datetime.timedelta(days=10),
total=14, locale='en'
)
OrderPosition.objects.create(
order=o,
item=self.ticket,
subevent=self.subevent1,
price=Decimal("14"),
)
doc = self.post_doc('/control/event/ccc/30c3/subevents/bulk_action', {
'subevent': [str(self.subevent1.pk), str(self.subevent2.pk)],
'action': 'delete_confirm'
}, follow=True)
assert doc.select(".alert-success")
assert not self.event1.subevents.filter(pk=self.subevent2.pk).exists()
assert self.event1.subevents.get(pk=self.subevent1.pk).active is False
with scopes_disabled():
assert not self.event1.subevents.filter(pk=self.subevent2.pk).exists()
assert self.event1.subevents.get(pk=self.subevent1.pk).active is False
def test_disable_bulk(self):
self.subevent2.active = True
@@ -1413,7 +1454,8 @@ class SubEventsTest(SoupTest):
'action': 'disable'
}, follow=True)
assert doc.select(".alert-success")
assert self.event1.subevents.get(pk=self.subevent2.pk).active is False
with scopes_disabled():
assert self.event1.subevents.get(pk=self.subevent2.pk).active is False
def test_enable_bulk(self):
self.subevent2.active = False
@@ -1423,10 +1465,12 @@ class SubEventsTest(SoupTest):
'action': 'enable'
}, follow=True)
assert doc.select(".alert-success")
assert self.event1.subevents.get(pk=self.subevent2.pk).active is True
with scopes_disabled():
assert self.event1.subevents.get(pk=self.subevent2.pk).active is True
class EventDeletionTest(SoupTest):
@scopes_disabled()
def setUp(self):
super().setUp()
self.user = User.objects.create_user('dummy@dummy.dummy', 'dummy')
@@ -1454,21 +1498,24 @@ class EventDeletionTest(SoupTest):
'slug': '30c3'
})
assert not self.orga1.events.exists()
with scopes_disabled():
assert not self.orga1.events.exists()
def test_delete_wrong_slug(self):
self.post_doc('/control/event/ccc/30c3/delete/', {
'user_pw': 'dummy',
'slug': '31c3'
})
assert self.orga1.events.exists()
with scopes_disabled():
assert self.orga1.events.exists()
def test_delete_wrong_pw(self):
self.post_doc('/control/event/ccc/30c3/delete/', {
'user_pw': 'invalid',
'slug': '30c3'
})
assert self.orga1.events.exists()
with scopes_disabled():
assert self.orga1.events.exists()
def test_delete_orders(self):
Order.objects.create(
@@ -1481,4 +1528,5 @@ class EventDeletionTest(SoupTest):
'user_pw': 'dummy',
'slug': '30c3'
})
assert self.orga1.events.exists()
with scopes_disabled():
assert self.orga1.events.exists()

View File

@@ -2,6 +2,7 @@ import datetime
from decimal import Decimal
from django.utils.timezone import now
from django_scopes import scopes_disabled
from tests.base import SoupTest, extract_form_fields
from pretix.base.models import (
@@ -11,6 +12,7 @@ from pretix.base.models import (
class ItemFormTest(SoupTest):
@scopes_disabled()
def setUp(self):
super().setUp()
self.user = User.objects.create_user('dummy@dummy.dummy', 'dummy')
@@ -47,11 +49,13 @@ class CategoriesTest(ItemFormTest):
assert doc.select(".alert-success")
self.assertIn("T-Shirts", doc.select("#page-wrapper table")[0].text)
self.assertNotIn("Entry tickets", doc.select("#page-wrapper table")[0].text)
assert str(ItemCategory.objects.get(id=c.id).name) == 'T-Shirts'
with scopes_disabled():
assert str(ItemCategory.objects.get(id=c.id).name) == 'T-Shirts'
def test_sort(self):
c1 = ItemCategory.objects.create(event=self.event1, name="Entry tickets", position=0)
ItemCategory.objects.create(event=self.event1, name="T-Shirts", position=1)
with scopes_disabled():
c1 = ItemCategory.objects.create(event=self.event1, name="Entry tickets", position=0)
ItemCategory.objects.create(event=self.event1, name="T-Shirts", position=1)
doc = self.get_doc('/control/event/%s/%s/categories/' % (self.orga1.slug, self.event1.slug))
self.assertIn("Entry tickets", doc.select("table > tbody > tr")[0].text)
self.assertIn("T-Shirts", doc.select("table > tbody > tr")[1].text)
@@ -67,14 +71,16 @@ class CategoriesTest(ItemFormTest):
self.assertIn("T-Shirts", doc.select("table > tbody > tr")[1].text)
def test_delete(self):
c = ItemCategory.objects.create(event=self.event1, name="Entry tickets")
with scopes_disabled():
c = ItemCategory.objects.create(event=self.event1, name="Entry tickets")
doc = self.get_doc('/control/event/%s/%s/categories/%s/delete' % (self.orga1.slug, self.event1.slug, c.id))
form_data = extract_form_fields(doc.select('.container-fluid form')[0])
doc = self.post_doc('/control/event/%s/%s/categories/%s/delete' % (self.orga1.slug, self.event1.slug, c.id),
form_data)
assert doc.select(".alert-success")
self.assertNotIn("Entry tickets", doc.select("#page-wrapper")[0].text)
assert not ItemCategory.objects.filter(id=c.id).exists()
with scopes_disabled():
assert not ItemCategory.objects.filter(id=c.id).exists()
class QuestionsTest(ItemFormTest):
@@ -90,8 +96,9 @@ class QuestionsTest(ItemFormTest):
self.assertIn("shoe size", doc.select("#page-wrapper table")[0].text)
def test_update_choices(self):
c = Question.objects.create(event=self.event1, question="What country are you from?", type="C", required=True)
o1 = c.options.create(answer='Germany')
with scopes_disabled():
c = Question.objects.create(event=self.event1, question="What country are you from?", type="C", required=True)
o1 = c.options.create(answer='Germany')
doc = self.get_doc('/control/event/%s/%s/questions/%s/change' % (self.orga1.slug, self.event1.slug, c.id))
form_data = extract_form_fields(doc.select('.container-fluid form')[0])
form_data['form-TOTAL_FORMS'] = '1'
@@ -104,12 +111,14 @@ class QuestionsTest(ItemFormTest):
self.post_doc('/control/event/%s/%s/questions/%s/change' % (self.orga1.slug, self.event1.slug, c.id),
form_data)
c.refresh_from_db()
assert c.options.exists()
assert str(c.options.first().answer) == 'England'
with scopes_disabled():
assert c.options.exists()
assert str(c.options.first().answer) == 'England'
def test_delete_choices(self):
c = Question.objects.create(event=self.event1, question="What country are you from?", type="C", required=True)
o1 = c.options.create(answer='Germany')
with scopes_disabled():
c = Question.objects.create(event=self.event1, question="What country are you from?", type="C", required=True)
o1 = c.options.create(answer='Germany')
doc = self.get_doc('/control/event/%s/%s/questions/%s/change' % (self.orga1.slug, self.event1.slug, c.id))
form_data = extract_form_fields(doc.select('.container-fluid form')[0])
form_data['form-TOTAL_FORMS'] = '1'
@@ -123,10 +132,12 @@ class QuestionsTest(ItemFormTest):
self.post_doc('/control/event/%s/%s/questions/%s/change' % (self.orga1.slug, self.event1.slug, c.id),
form_data)
c.refresh_from_db()
assert not c.options.exists()
with scopes_disabled():
assert not c.options.exists()
def test_add_choices(self):
c = Question.objects.create(event=self.event1, question="What country are you from?", type="N", required=True)
with scopes_disabled():
c = Question.objects.create(event=self.event1, question="What country are you from?", type="N", required=True)
doc = self.get_doc('/control/event/%s/%s/questions/%s/change' % (self.orga1.slug, self.event1.slug, c.id))
form_data = extract_form_fields(doc.select('.container-fluid form')[0])
form_data['type'] = 'C'
@@ -139,12 +150,14 @@ class QuestionsTest(ItemFormTest):
form_data['form-0-answer_0'] = 'Germany'
self.post_doc('/control/event/%s/%s/questions/%s/change' % (self.orga1.slug, self.event1.slug, c.id),
form_data)
c = Question.objects.get(id=c.id)
assert c.options.exists()
assert str(c.options.first().answer) == 'Germany'
with scopes_disabled():
c = Question.objects.get(id=c.id)
assert c.options.exists()
assert str(c.options.first().answer) == 'Germany'
def test_update(self):
c = Question.objects.create(event=self.event1, question="What is your shoe size?", type="N", required=True)
with scopes_disabled():
c = Question.objects.create(event=self.event1, question="What is your shoe size?", type="N", required=True)
doc = self.get_doc('/control/event/%s/%s/questions/%s/change' % (self.orga1.slug, self.event1.slug, c.id))
form_data = extract_form_fields(doc.select('.container-fluid form')[0])
form_data['items'] = self.item1.id
@@ -153,13 +166,15 @@ class QuestionsTest(ItemFormTest):
form_data)
self.assertIn("How old", doc.select("#page-wrapper table")[0].text)
self.assertNotIn("shoe size", doc.select("#page-wrapper table")[0].text)
c = Question.objects.get(id=c.id)
self.assertTrue(c.required)
assert str(Question.objects.get(id=c.id).question) == 'How old are you?'
with scopes_disabled():
c = Question.objects.get(id=c.id)
self.assertTrue(c.required)
assert str(Question.objects.get(id=c.id).question) == 'How old are you?'
def test_sort(self):
q1 = Question.objects.create(event=self.event1, question="Vegetarian?", type="N", required=True, position=0)
Question.objects.create(event=self.event1, question="Food allergies?", position=1)
with scopes_disabled():
q1 = Question.objects.create(event=self.event1, question="Vegetarian?", type="N", required=True, position=0)
Question.objects.create(event=self.event1, question="Food allergies?", position=1)
doc = self.get_doc('/control/event/%s/%s/questions/' % (self.orga1.slug, self.event1.slug))
self.assertIn("Vegetarian?", doc.select("table > tbody > tr")[0].text)
self.assertIn("Food allergies?", doc.select("table > tbody > tr")[1].text)
@@ -175,32 +190,35 @@ class QuestionsTest(ItemFormTest):
self.assertIn("Food allergies?", doc.select("table > tbody > tr")[1].text)
def test_delete(self):
c = Question.objects.create(event=self.event1, question="What is your shoe size?", type="N", required=True)
with scopes_disabled():
c = Question.objects.create(event=self.event1, question="What is your shoe size?", type="N", required=True)
doc = self.get_doc('/control/event/%s/%s/questions/%s/delete' % (self.orga1.slug, self.event1.slug, c.id))
form_data = extract_form_fields(doc.select('.container-fluid form')[0])
doc = self.post_doc('/control/event/%s/%s/questions/%s/delete' % (self.orga1.slug, self.event1.slug, c.id),
form_data)
assert doc.select(".alert-success")
self.assertNotIn("shoe size", doc.select("#page-wrapper")[0].text)
assert not Question.objects.filter(id=c.id).exists()
with scopes_disabled():
assert not Question.objects.filter(id=c.id).exists()
def test_question_view(self):
c = Question.objects.create(event=self.event1, question="What is your shoe size?", type="N", required=True)
with scopes_disabled():
c = Question.objects.create(event=self.event1, question="What is your shoe size?", type="N", required=True)
item1 = Item.objects.create(event=self.event1, name="Standard", default_price=0, position=1)
o = Order.objects.create(code='FOO', event=self.event1, email='dummy@dummy.test',
status=Order.STATUS_PENDING, datetime=now(),
expires=now() + datetime.timedelta(days=10),
total=14, locale='en')
op = OrderPosition.objects.create(order=o, item=item1, variation=None, price=Decimal("14"),
attendee_name_parts={'full_name': "Peter"})
op.answers.create(question=c, answer='42')
op = OrderPosition.objects.create(order=o, item=item1, variation=None, price=Decimal("14"),
attendee_name_parts={'full_name': "Michael"})
op.answers.create(question=c, answer='42')
op = OrderPosition.objects.create(order=o, item=item1, variation=None, price=Decimal("14"),
attendee_name_parts={'full_name': "Petra"})
op.answers.create(question=c, answer='39')
item1 = Item.objects.create(event=self.event1, name="Standard", default_price=0, position=1)
o = Order.objects.create(code='FOO', event=self.event1, email='dummy@dummy.test',
status=Order.STATUS_PENDING, datetime=now(),
expires=now() + datetime.timedelta(days=10),
total=14, locale='en')
op = OrderPosition.objects.create(order=o, item=item1, variation=None, price=Decimal("14"),
attendee_name_parts={'full_name': "Peter"})
op.answers.create(question=c, answer='42')
op = OrderPosition.objects.create(order=o, item=item1, variation=None, price=Decimal("14"),
attendee_name_parts={'full_name': "Michael"})
op.answers.create(question=c, answer='42')
op = OrderPosition.objects.create(order=o, item=item1, variation=None, price=Decimal("14"),
attendee_name_parts={'full_name': "Petra"})
op.answers.create(question=c, answer='39')
doc = self.get_doc('/control/event/%s/%s/questions/%s/' % (self.orga1.slug, self.event1.slug, c.id))
tbl = doc.select('.container-fluid table.table-bordered tbody')[0]
@@ -219,9 +237,10 @@ class QuestionsTest(ItemFormTest):
assert tbl.select('tr')[0].select('td')[0].text.strip() == '42'
def test_set_dependency(self):
q1 = Question.objects.create(event=self.event1, question="What country are you from?", type="C", required=True)
q2 = Question.objects.create(event=self.event1, question="What city are you from?", type="T", required=True)
o1 = q1.options.create(answer='Germany')
with scopes_disabled():
q1 = Question.objects.create(event=self.event1, question="What country are you from?", type="C", required=True)
q2 = Question.objects.create(event=self.event1, question="What city are you from?", type="T", required=True)
o1 = q1.options.create(answer='Germany')
doc = self.get_doc('/control/event/%s/%s/questions/%s/change' % (self.orga1.slug, self.event1.slug, q2.id))
form_data = extract_form_fields(doc.select('.container-fluid form')[0])
form_data['items'] = self.item1.id
@@ -235,10 +254,11 @@ class QuestionsTest(ItemFormTest):
assert q2.dependency_value == o1.identifier
def test_set_dependency_circular(self):
q1 = Question.objects.create(event=self.event1, question="What country are you from?", type="C", required=True)
o1 = q1.options.create(answer='Germany')
q2 = Question.objects.create(event=self.event1, question="What city are you from?", type="C", required=True,
dependency_question=q1, dependency_value=o1.identifier)
with scopes_disabled():
q1 = Question.objects.create(event=self.event1, question="What country are you from?", type="C", required=True)
o1 = q1.options.create(answer='Germany')
q2 = Question.objects.create(event=self.event1, question="What city are you from?", type="C", required=True,
dependency_question=q1, dependency_value=o1.identifier)
doc = self.get_doc('/control/event/%s/%s/questions/%s/change' % (self.orga1.slug, self.event1.slug, q1.id))
form_data = extract_form_fields(doc.select('.container-fluid form')[0])
form_data['dependency_question'] = q2.pk
@@ -248,8 +268,9 @@ class QuestionsTest(ItemFormTest):
assert not doc.select(".alert-success")
def test_set_dependency_to_non_choice(self):
q1 = Question.objects.create(event=self.event1, question="What country are you from?", type="N", required=True)
q2 = Question.objects.create(event=self.event1, question="What city are you from?", type="T", required=True)
with scopes_disabled():
q1 = Question.objects.create(event=self.event1, question="What country are you from?", type="N", required=True)
q2 = Question.objects.create(event=self.event1, question="What city are you from?", type="T", required=True)
doc = self.get_doc('/control/event/%s/%s/questions/%s/change' % (self.orga1.slug, self.event1.slug, q2.id))
form_data = extract_form_fields(doc.select('.container-fluid form')[0])
form_data['dependency_question'] = q1.pk
@@ -271,11 +292,12 @@ class QuotaTest(ItemFormTest):
self.assertIn("Full house", doc.select("#page-wrapper table")[0].text)
def test_update(self):
c = Quota.objects.create(event=self.event1, name="Full house", size=500)
item1 = Item.objects.create(event=self.event1, name="Standard", default_price=0)
item2 = Item.objects.create(event=self.event1, name="Business", default_price=0)
ItemVariation.objects.create(item=item2, value="Silver")
ItemVariation.objects.create(item=item2, value="Gold")
with scopes_disabled():
c = Quota.objects.create(event=self.event1, name="Full house", size=500)
item1 = Item.objects.create(event=self.event1, name="Standard", default_price=0)
item2 = Item.objects.create(event=self.event1, name="Business", default_price=0)
ItemVariation.objects.create(item=item2, value="Silver")
ItemVariation.objects.create(item=item2, value="Gold")
doc = self.get_doc('/control/event/%s/%s/quotas/%s/change' % (self.orga1.slug, self.event1.slug, c.id))
[i for i in doc.select('[name=itemvars]') if i.get('value') == str(item1.id)][0]['checked'] = 'checked'
form_data = extract_form_fields(doc.select('.container-fluid form')[0])
@@ -285,35 +307,41 @@ class QuotaTest(ItemFormTest):
doc = self.get_doc('/control/event/%s/%s/quotas/' % (self.orga1.slug, self.event1.slug))
self.assertIn("350", doc.select("#page-wrapper table")[0].text)
self.assertNotIn("500", doc.select("#page-wrapper table")[0].text)
assert Quota.objects.get(id=c.id).size == 350
assert item1 in Quota.objects.get(id=c.id).items.all()
with scopes_disabled():
assert Quota.objects.get(id=c.id).size == 350
assert item1 in Quota.objects.get(id=c.id).items.all()
def test_update_subevent(self):
self.event1.has_subevents = True
self.event1.save()
se1 = self.event1.subevents.create(name="Foo", date_from=now())
se2 = self.event1.subevents.create(name="Bar", date_from=now())
c = Quota.objects.create(event=self.event1, name="Full house", size=500, subevent=se1)
with scopes_disabled():
se1 = self.event1.subevents.create(name="Foo", date_from=now())
se2 = self.event1.subevents.create(name="Bar", date_from=now())
c = Quota.objects.create(event=self.event1, name="Full house", size=500, subevent=se1)
doc = self.get_doc('/control/event/%s/%s/quotas/%s/change' % (self.orga1.slug, self.event1.slug, c.id))
form_data = extract_form_fields(doc.select('.container-fluid form')[0])
form_data['subevent'] = se2.pk
self.post_doc('/control/event/%s/%s/quotas/%s/change' % (self.orga1.slug, self.event1.slug, c.id),
form_data)
assert Quota.objects.get(id=c.id).subevent == se2
with scopes_disabled():
assert Quota.objects.get(id=c.id).subevent == se2
def test_delete(self):
c = Quota.objects.create(event=self.event1, name="Full house", size=500)
with scopes_disabled():
c = Quota.objects.create(event=self.event1, name="Full house", size=500)
doc = self.get_doc('/control/event/%s/%s/quotas/%s/delete' % (self.orga1.slug, self.event1.slug, c.id))
form_data = extract_form_fields(doc.select('.container-fluid form')[0])
doc = self.post_doc('/control/event/%s/%s/quotas/%s/delete' % (self.orga1.slug, self.event1.slug, c.id),
form_data)
assert doc.select(".alert-success")
self.assertNotIn("Full house", doc.select("#page-wrapper")[0].text)
assert not Quota.objects.filter(id=c.id).exists()
with scopes_disabled():
assert not Quota.objects.filter(id=c.id).exists()
class ItemsTest(ItemFormTest):
@scopes_disabled()
def setUp(self):
super().setUp()
self.item2 = Item.objects.create(event=self.event1, name="Business", default_price=0, position=2,
@@ -341,7 +369,7 @@ class ItemsTest(ItemFormTest):
'tax_rate': '19.00'
})
resp = self.client.get('/control/event/%s/%s/items/' % (self.orga1.slug, self.event1.slug))
assert 'T-Shirt' in resp.rendered_content
assert 'T-Shirt' in resp.content.decode()
def test_update(self):
self.client.post('/control/event/%s/%s/items/%d/' % (self.orga1.slug, self.event1.slug, self.item1.id), {
@@ -366,20 +394,23 @@ class ItemsTest(ItemFormTest):
'form-0-min_count': '1',
'form-0-max_count': '2',
})
assert self.item2.addons.exists()
assert self.item2.addons.first().addon_category == self.addoncat
with scopes_disabled():
assert self.item2.addons.exists()
assert self.item2.addons.first().addon_category == self.addoncat
a = self.item2.addons.first()
self.client.post('/control/event/%s/%s/items/%d/addons' % (self.orga1.slug, self.event1.slug, self.item2.id), {
'form-TOTAL_FORMS': '1',
'form-INITIAL_FORMS': '1',
'form-MIN_NUM_FORMS': '0',
'form-MAX_NUM_FORMS': '1000',
'form-0-id': str(self.item2.addons.first().pk),
'form-0-id': str(a.pk),
'form-0-addon_category': str(self.addoncat.pk),
'form-0-min_count': '1',
'form-0-max_count': '2',
'form-0-DELETE': 'on',
})
assert not self.item2.addons.exists()
with scopes_disabled():
assert not self.item2.addons.exists()
# Do not allow duplicates
self.client.post('/control/event/%s/%s/items/%d/addons' % (self.orga1.slug, self.event1.slug, self.item2.id), {
@@ -396,7 +427,8 @@ class ItemsTest(ItemFormTest):
'form-1-min_count': '1',
'form-1-max_count': '2',
})
assert not self.item2.addons.exists()
with scopes_disabled():
assert not self.item2.addons.exists()
def test_manipulate_bundles(self):
self.client.post('/control/event/%s/%s/items/%d/bundles' % (self.orga1.slug, self.event1.slug, self.item2.id), {
@@ -409,8 +441,9 @@ class ItemsTest(ItemFormTest):
'form-0-count': '2',
'form-0-designated_price': '2.00',
})
assert self.item2.bundles.exists()
assert self.item2.bundles.first().bundled_item == self.item1
with scopes_disabled():
assert self.item2.bundles.exists()
assert self.item2.bundles.first().bundled_item == self.item1
self.client.post('/control/event/%s/%s/items/%d/bundles' % (self.orga1.slug, self.event1.slug, self.item2.id), {
'form-TOTAL_FORMS': '1',
'form-INITIAL_FORMS': '1',
@@ -422,7 +455,8 @@ class ItemsTest(ItemFormTest):
'form-0-designated_price': '2.00',
'form-0-DELETE': 'on',
})
assert not self.item2.bundles.exists()
with scopes_disabled():
assert not self.item2.bundles.exists()
# Do not allow self-reference
self.client.post('/control/event/%s/%s/items/%d/addons' % (self.orga1.slug, self.event1.slug, self.item2.id), {
@@ -435,10 +469,12 @@ class ItemsTest(ItemFormTest):
'form-0-count': '2',
'form-0-designated_price': '2.00',
})
assert not self.item2.bundles.exists()
with scopes_disabled():
assert not self.item2.bundles.exists()
# Do not allow multi-level bundles
self.item1.bundles.create(bundled_item=self.item1, count=1, designated_price=0)
with scopes_disabled():
self.item1.bundles.create(bundled_item=self.item1, count=1, designated_price=0)
self.client.post('/control/event/%s/%s/items/%d/bundles' % (self.orga1.slug, self.event1.slug, self.item2.id), {
'form-TOTAL_FORMS': '1',
'form-INITIAL_FORMS': '0',
@@ -449,7 +485,8 @@ class ItemsTest(ItemFormTest):
'form-0-count': '2',
'form-0-designated_price': '2.00',
})
assert not self.item2.bundles.exists()
with scopes_disabled():
assert not self.item2.bundles.exists()
def test_update_variations(self):
self.client.post('/control/event/%s/%s/items/%d/variations' % (self.orga1.slug, self.event1.slug, self.item2.id), {
@@ -491,39 +528,45 @@ class ItemsTest(ItemFormTest):
'active': 'yes',
'allow_cancel': 'yes'
})
assert not self.item2.variations.filter(pk=self.var2.pk).exists()
with scopes_disabled():
assert not self.item2.variations.filter(pk=self.var2.pk).exists()
def test_delete(self):
self.client.post('/control/event/%s/%s/items/%d/delete' % (self.orga1.slug, self.event1.slug, self.item1.id),
{})
assert not self.event1.items.filter(pk=self.item1.pk).exists()
with scopes_disabled():
assert not self.event1.items.filter(pk=self.item1.pk).exists()
self.client.post('/control/event/%s/%s/items/%d/delete' % (self.orga1.slug, self.event1.slug, self.item2.id),
{})
assert not self.event1.items.filter(pk=self.item2.pk).exists()
with scopes_disabled():
assert not self.event1.items.filter(pk=self.item2.pk).exists()
def test_delete_ordered(self):
o = Order.objects.create(
code='FOO', event=self.event1, email='dummy@dummy.test',
status=Order.STATUS_PENDING,
datetime=now(), expires=now() + datetime.timedelta(days=10),
total=14, locale='en'
)
OrderPosition.objects.create(
order=o,
item=self.item1,
variation=None,
price=Decimal("14"),
attendee_name_parts={'full_name': "Peter"}
)
with scopes_disabled():
o = Order.objects.create(
code='FOO', event=self.event1, email='dummy@dummy.test',
status=Order.STATUS_PENDING,
datetime=now(), expires=now() + datetime.timedelta(days=10),
total=14, locale='en'
)
OrderPosition.objects.create(
order=o,
item=self.item1,
variation=None,
price=Decimal("14"),
attendee_name_parts={'full_name': "Peter"}
)
self.client.post('/control/event/%s/%s/items/%d/delete' % (self.orga1.slug, self.event1.slug, self.item1.id),
{})
assert self.event1.items.filter(pk=self.item1.pk).exists()
with scopes_disabled():
assert self.event1.items.filter(pk=self.item1.pk).exists()
self.item1.refresh_from_db()
assert not self.item1.active
def test_create_copy(self):
q = Question.objects.create(event=self.event1, question="Size", type="N")
q.items.add(self.item2)
with scopes_disabled():
q = Question.objects.create(event=self.event1, question="Size", type="N")
q.items.add(self.item2)
self.item2.sales_channels = ["web", "bar"]
self.client.post('/control/event/%s/%s/items/add' % (self.orga1.slug, self.event1.slug), {
@@ -533,22 +576,24 @@ class ItemsTest(ItemFormTest):
'copy_from': str(self.item2.pk),
'has_variations': '1'
})
i_old = Item.objects.get(name__icontains='Business')
i_new = Item.objects.get(name__icontains='Intermediate')
assert i_new.category == i_old.category
assert i_new.description == i_old.description
assert i_new.active == i_old.active
assert i_new.available_from == i_old.available_from
assert i_new.available_until == i_old.available_until
assert i_new.require_voucher == i_old.require_voucher
assert i_new.hide_without_voucher == i_old.hide_without_voucher
assert i_new.allow_cancel == i_old.allow_cancel
assert i_new.sales_channels == i_old.sales_channels
assert set(i_new.questions.all()) == set(i_old.questions.all())
assert set([str(v.value) for v in i_new.variations.all()]) == set([str(v.value) for v in i_old.variations.all()])
with scopes_disabled():
i_old = Item.objects.get(name__icontains='Business')
i_new = Item.objects.get(name__icontains='Intermediate')
assert i_new.category == i_old.category
assert i_new.description == i_old.description
assert i_new.active == i_old.active
assert i_new.available_from == i_old.available_from
assert i_new.available_until == i_old.available_until
assert i_new.require_voucher == i_old.require_voucher
assert i_new.hide_without_voucher == i_old.hide_without_voucher
assert i_new.allow_cancel == i_old.allow_cancel
assert i_new.sales_channels == i_old.sales_channels
assert set(i_new.questions.all()) == set(i_old.questions.all())
assert set([str(v.value) for v in i_new.variations.all()]) == set([str(v.value) for v in i_old.variations.all()])
def test_add_to_existing_quota(self):
q = Quota.objects.create(event=self.event1, name="New Test Quota", size=50)
with scopes_disabled():
q = Quota.objects.create(event=self.event1, name="New Test Quota", size=50)
doc = self.get_doc('/control/event/%s/%s/items/add' % (self.orga1.slug, self.event1.slug))
form_data = extract_form_fields(doc.select('.container-fluid form')[0])
@@ -558,10 +603,11 @@ class ItemsTest(ItemFormTest):
form_data['quota_add_existing'] = str(q.pk)
doc = self.post_doc('/control/event/%s/%s/items/add' % (self.orga1.slug, self.event1.slug), form_data)
i = Item.objects.get(name__icontains='Existing')
with scopes_disabled():
i = Item.objects.get(name__icontains='Existing')
assert doc.select(".alert-success")
assert q.items.filter(pk=i.pk).exists()
assert doc.select(".alert-success")
assert q.items.filter(pk=i.pk).exists()
def test_add_to_new_quota(self):
doc = self.get_doc('/control/event/%s/%s/items/add' % (self.orga1.slug, self.event1.slug))
@@ -574,8 +620,9 @@ class ItemsTest(ItemFormTest):
doc = self.post_doc('/control/event/%s/%s/items/add' % (self.orga1.slug, self.event1.slug), form_data)
assert doc.select(".alert-success")
assert Quota.objects.filter(name__icontains='New Quota').exists()
assert Item.objects.filter(name__icontains='New Item').exists()
i = Item.objects.get(name__icontains='New Item')
q = Quota.objects.get(name__icontains='New Quota')
assert q.items.filter(pk=i.pk).exists()
with scopes_disabled():
assert Quota.objects.filter(name__icontains='New Quota').exists()
assert Item.objects.filter(name__icontains='New Item').exists()
i = Item.objects.get(name__icontains='New Item')
q = Quota.objects.get(name__icontains='New Quota')
assert q.items.filter(pk=i.pk).exists()

File diff suppressed because it is too large Load Diff

View File

@@ -1,11 +1,13 @@
import datetime
from django_scopes import scopes_disabled
from tests.base import SoupTest, extract_form_fields
from pretix.base.models import Event, Organizer, Team, User
class OrganizerTest(SoupTest):
@scopes_disabled()
def setUp(self):
super().setUp()
self.user = User.objects.create_user('dummy@dummy.dummy', 'dummy')

View File

@@ -2,6 +2,7 @@ import datetime
from decimal import Decimal
from django.utils.timezone import now
from django_scopes import scopes_disabled
from tests.base import SoupTest
from pretix.base.models import (
@@ -10,6 +11,7 @@ from pretix.base.models import (
class OrderSearchTest(SoupTest):
@scopes_disabled()
def setUp(self):
super().setUp()
self.user = User.objects.create_user('dummy@dummy.dummy', 'dummy')
@@ -67,21 +69,21 @@ class OrderSearchTest(SoupTest):
self.client.login(email='dummy@dummy.dummy', password='dummy')
def test_team_limit_event(self):
resp = self.client.get('/control/search/orders/').rendered_content
resp = self.client.get('/control/search/orders/').content.decode()
assert 'FO1' in resp
assert 'FO2' not in resp
def test_team_limit_event_wrong_permission(self):
self.team.can_view_orders = False
self.team.save()
resp = self.client.get('/control/search/orders/').rendered_content
resp = self.client.get('/control/search/orders/').content.decode()
assert 'FO1' not in resp
assert 'FO2' not in resp
def test_team_all_events(self):
self.team.all_events = True
self.team.save()
resp = self.client.get('/control/search/orders/').rendered_content
resp = self.client.get('/control/search/orders/').content.decode()
assert 'FO1' in resp
assert 'FO2' in resp
@@ -89,13 +91,13 @@ class OrderSearchTest(SoupTest):
self.team.all_events = True
self.team.can_view_orders = False
self.team.save()
resp = self.client.get('/control/search/orders/').rendered_content
resp = self.client.get('/control/search/orders/').content.decode()
assert 'FO1' not in resp
assert 'FO2' not in resp
def test_team_none(self):
self.team.members.clear()
resp = self.client.get('/control/search/orders/').rendered_content
resp = self.client.get('/control/search/orders/').content.decode()
assert 'FO1' not in resp
assert 'FO2' not in resp
@@ -104,44 +106,44 @@ class OrderSearchTest(SoupTest):
self.user.staffsession_set.create(date_start=now(), session_key=self.client.session.session_key)
self.user.save()
self.team.members.clear()
resp = self.client.get('/control/search/orders/').rendered_content
resp = self.client.get('/control/search/orders/').content.decode()
assert 'FO1' in resp
assert 'FO2' in resp
def test_filter_email(self):
resp = self.client.get('/control/search/orders/?query=dummy1@dummy').rendered_content
resp = self.client.get('/control/search/orders/?query=dummy1@dummy').content.decode()
assert 'FO1' in resp
resp = self.client.get('/control/search/orders/?query=dummynope').rendered_content
resp = self.client.get('/control/search/orders/?query=dummynope').content.decode()
assert 'FO1' not in resp
def test_filter_attendee_name(self):
resp = self.client.get('/control/search/orders/?query=Pete').rendered_content
resp = self.client.get('/control/search/orders/?query=Pete').content.decode()
assert 'FO1' in resp
resp = self.client.get('/control/search/orders/?query=Mark').rendered_content
resp = self.client.get('/control/search/orders/?query=Mark').content.decode()
assert 'FO1' not in resp
def test_filter_attendee_email(self):
resp = self.client.get('/control/search/orders/?query=att.com').rendered_content
resp = self.client.get('/control/search/orders/?query=att.com').content.decode()
assert 'FO1' in resp
resp = self.client.get('/control/search/orders/?query=nope.com').rendered_content
resp = self.client.get('/control/search/orders/?query=nope.com').content.decode()
assert 'FO1' not in resp
def test_filter_invoice_address(self):
resp = self.client.get('/control/search/orders/?query=Ltd').rendered_content
resp = self.client.get('/control/search/orders/?query=Ltd').content.decode()
assert 'FO1' in resp
resp = self.client.get('/control/search/orders/?query=Miller').rendered_content
resp = self.client.get('/control/search/orders/?query=Miller').content.decode()
assert 'FO1' in resp
def test_filter_code(self):
resp = self.client.get('/control/search/orders/?query=FO1').rendered_content
resp = self.client.get('/control/search/orders/?query=FO1').content.decode()
assert '30C3-FO1' in resp
resp = self.client.get('/control/search/orders/?query=30c3-FO1').rendered_content
resp = self.client.get('/control/search/orders/?query=30c3-FO1').content.decode()
assert '30C3-FO1' in resp
resp = self.client.get('/control/search/orders/?query=30C3-fO1A').rendered_content
resp = self.client.get('/control/search/orders/?query=30C3-fO1A').content.decode()
assert '30C3-FO1' in resp
resp = self.client.get('/control/search/orders/?query=30C3-fo14').rendered_content
resp = self.client.get('/control/search/orders/?query=30C3-fo14').content.decode()
assert '30C3-FO1' in resp
resp = self.client.get('/control/search/orders/?query=31c3-FO1').rendered_content
resp = self.client.get('/control/search/orders/?query=31c3-FO1').content.decode()
assert '30C3-FO1' not in resp
resp = self.client.get('/control/search/orders/?query=FO2').rendered_content
resp = self.client.get('/control/search/orders/?query=FO2').content.decode()
assert '30C3-FO1' not in resp

View File

@@ -2,12 +2,14 @@ import datetime
import json
import re
from django_scopes import scopes_disabled
from tests.base import SoupTest
from pretix.base.models import Event, Organizer, Team, User
class MailSettingPreviewTest(SoupTest):
@scopes_disabled()
def setUp(self):
self.user = User.objects.create_user('dummy@dummy.dummy', 'dummy')
self.orga1 = Organizer.objects.create(name='CCC', slug='ccc')
@@ -32,10 +34,11 @@ class MailSettingPreviewTest(SoupTest):
self.target = '/control/event/{}/{}/settings/email/preview'
def test_permission(self):
self.event2 = Event.objects.create(
organizer=self.orga2, name='30M3', slug='30m3',
date_from=datetime.datetime(2013, 12, 26, tzinfo=datetime.timezone.utc),
)
with scopes_disabled():
self.event2 = Event.objects.create(
organizer=self.orga2, name='30M3', slug='30m3',
date_from=datetime.datetime(2013, 12, 26, tzinfo=datetime.timezone.utc),
)
response = self.client.post(self.target.format(
self.orga2.slug, self.event2.slug), {
'test': 'test1'

View File

@@ -4,12 +4,14 @@ from io import BytesIO
from zipfile import ZipFile
from django.utils.timezone import now
from django_scopes import scopes_disabled
from tests.base import SoupTest
from pretix.base.models import Event, Order, Organizer, Team, User
class EventShredderTest(SoupTest):
@scopes_disabled()
def setUp(self):
super().setUp()
self.user = User.objects.create_user('dummy@dummy.dummy', 'dummy')

View File

@@ -2,6 +2,7 @@ import datetime
from decimal import Decimal
from django.utils.timezone import now
from django_scopes import scopes_disabled
from tests.base import SoupTest, extract_form_fields
from pretix.base.models import Event, Order, Organizer, Team, User
@@ -9,6 +10,7 @@ from pretix.base.models.orders import OrderFee
class TaxRateFormTest(SoupTest):
@scopes_disabled()
def setUp(self):
super().setUp()
self.user = User.objects.create_user('dummy@dummy.dummy', 'dummy')
@@ -32,12 +34,14 @@ class TaxRateFormTest(SoupTest):
doc = self.post_doc('/control/event/%s/%s/settings/tax/add' % (self.orga1.slug, self.event1.slug), form_data)
assert doc.select(".alert-success")
self.assertIn("VAT", doc.select("#page-wrapper table")[0].text)
assert self.event1.tax_rules.get(
rate=19, price_includes_tax=True, eu_reverse_charge=False
)
with scopes_disabled():
assert self.event1.tax_rules.get(
rate=19, price_includes_tax=True, eu_reverse_charge=False
)
def test_update(self):
tr = self.event1.tax_rules.create(rate=19, name="VAT")
with scopes_disabled():
tr = self.event1.tax_rules.create(rate=19, name="VAT")
doc = self.get_doc('/control/event/%s/%s/settings/tax/%s/' % (self.orga1.slug, self.event1.slug, tr.id))
form_data = extract_form_fields(doc.select('.container-fluid form')[0])
form_data['rate'] = '20.00'
@@ -48,67 +52,77 @@ class TaxRateFormTest(SoupTest):
assert tr.rate == Decimal('20.00')
def test_delete(self):
tr = self.event1.tax_rules.create(rate=19, name="VAT")
with scopes_disabled():
tr = self.event1.tax_rules.create(rate=19, name="VAT")
doc = self.get_doc('/control/event/%s/%s/settings/tax/%s/delete' % (self.orga1.slug, self.event1.slug, tr.id))
form_data = extract_form_fields(doc.select('.container-fluid form')[0])
doc = self.post_doc('/control/event/%s/%s/settings/tax/%s/delete' % (self.orga1.slug, self.event1.slug, tr.id),
form_data)
assert doc.select(".alert-success")
self.assertNotIn("VAT", doc.select("#page-wrapper")[0].text)
assert not self.event1.tax_rules.exists()
with scopes_disabled():
assert not self.event1.tax_rules.exists()
def test_delete_item_existing(self):
tr = self.event1.tax_rules.create(rate=19, name="VAT")
self.event1.items.create(name="foo", default_price=12, tax_rule=tr)
with scopes_disabled():
tr = self.event1.tax_rules.create(rate=19, name="VAT")
self.event1.items.create(name="foo", default_price=12, tax_rule=tr)
doc = self.get_doc('/control/event/%s/%s/settings/tax/%s/delete' % (self.orga1.slug, self.event1.slug, tr.id))
form_data = extract_form_fields(doc.select('.container-fluid form')[0])
doc = self.post_doc('/control/event/%s/%s/settings/tax/%s/delete' % (self.orga1.slug, self.event1.slug, tr.id),
form_data)
self.assertIn("VAT", doc.select("#page-wrapper")[0].text)
assert self.event1.tax_rules.exists()
with scopes_disabled():
assert self.event1.tax_rules.exists()
def test_delete_default_rule(self):
tr = self.event1.tax_rules.create(rate=19, name="VAT")
with scopes_disabled():
tr = self.event1.tax_rules.create(rate=19, name="VAT")
self.event1.settings.tax_rate_default = tr
doc = self.get_doc('/control/event/%s/%s/settings/tax/%s/delete' % (self.orga1.slug, self.event1.slug, tr.id))
form_data = extract_form_fields(doc.select('.container-fluid form')[0])
doc = self.post_doc('/control/event/%s/%s/settings/tax/%s/delete' % (self.orga1.slug, self.event1.slug, tr.id),
form_data)
self.assertIn("VAT", doc.select("#page-wrapper")[0].text)
assert self.event1.tax_rules.exists()
with scopes_disabled():
assert self.event1.tax_rules.exists()
def test_delete_fee_existing(self):
tr = self.event1.tax_rules.create(rate=19, name="VAT")
o = self.event1.orders.create(
code='FOO', event=self.event1, email='dummy@dummy.test',
status=Order.STATUS_PENDING,
datetime=now(), expires=now() + datetime.timedelta(days=10),
total=14, locale='en',
)
o.fees.create(fee_type=OrderFee.FEE_TYPE_PAYMENT, value=Decimal('0.25'), tax_rate=Decimal('19.00'),
tax_value=Decimal('0.05'), tax_rule=tr)
with scopes_disabled():
tr = self.event1.tax_rules.create(rate=19, name="VAT")
o = self.event1.orders.create(
code='FOO', event=self.event1, email='dummy@dummy.test',
status=Order.STATUS_PENDING,
datetime=now(), expires=now() + datetime.timedelta(days=10),
total=14, locale='en',
)
o.fees.create(fee_type=OrderFee.FEE_TYPE_PAYMENT, value=Decimal('0.25'), tax_rate=Decimal('19.00'),
tax_value=Decimal('0.05'), tax_rule=tr)
doc = self.get_doc('/control/event/%s/%s/settings/tax/%s/delete' % (self.orga1.slug, self.event1.slug, tr.id))
form_data = extract_form_fields(doc.select('.container-fluid form')[0])
doc = self.post_doc('/control/event/%s/%s/settings/tax/%s/delete' % (self.orga1.slug, self.event1.slug, tr.id),
form_data)
self.assertIn("VAT", doc.select("#page-wrapper")[0].text)
assert self.event1.tax_rules.exists()
with scopes_disabled():
assert self.event1.tax_rules.exists()
def test_delete_orderpos_existing(self):
tr = self.event1.tax_rules.create(rate=19, name="VAT")
i = self.event1.items.create(name="foo", default_price=12)
o = self.event1.orders.create(
code='FOO', event=self.event1, email='dummy@dummy.test',
status=Order.STATUS_PENDING,
datetime=now(), expires=now() + datetime.timedelta(days=10),
total=12, locale='en'
)
o.positions.create(
item=i, price=12, tax_rule=tr, tax_rate=19, tax_value=12 - 12 / 1.19
)
with scopes_disabled():
tr = self.event1.tax_rules.create(rate=19, name="VAT")
i = self.event1.items.create(name="foo", default_price=12)
o = self.event1.orders.create(
code='FOO', event=self.event1, email='dummy@dummy.test',
status=Order.STATUS_PENDING,
datetime=now(), expires=now() + datetime.timedelta(days=10),
total=12, locale='en'
)
o.positions.create(
item=i, price=12, tax_rule=tr, tax_rate=19, tax_value=12 - 12 / 1.19
)
doc = self.get_doc('/control/event/%s/%s/settings/tax/%s/delete' % (self.orga1.slug, self.event1.slug, tr.id))
form_data = extract_form_fields(doc.select('.container-fluid form')[0])
doc = self.post_doc('/control/event/%s/%s/settings/tax/%s/delete' % (self.orga1.slug, self.event1.slug, tr.id),
form_data)
self.assertIn("VAT", doc.select("#page-wrapper")[0].text)
assert self.event1.tax_rules.exists()
with scopes_disabled():
assert self.event1.tax_rules.exists()

View File

@@ -1,6 +1,7 @@
import pytest
from django.core import mail as djmail
from django.utils.timezone import now
from django_scopes import scopes_disabled
from pretix.base.models import Event, Organizer, Team, User
@@ -35,15 +36,15 @@ def admin_user(admin_team):
def test_list_of_teams(event, admin_user, client):
client.login(email='dummy@dummy.dummy', password='dummy')
resp = client.get('/control/organizer/dummy/teams')
assert 'Admin team' in resp.rendered_content
assert 'Admin team' in resp.content.decode()
@pytest.mark.django_db
def test_team_detail_view(event, admin_user, admin_team, client):
client.login(email='dummy@dummy.dummy', password='dummy')
resp = client.get('/control/organizer/dummy/team/{}/'.format(admin_team.pk))
assert 'Admin team' in resp.rendered_content
assert admin_user.email in resp.rendered_content
assert 'Admin team' in resp.content.decode()
assert admin_user.email in resp.content.decode()
@pytest.mark.django_db
@@ -55,10 +56,11 @@ def test_team_add_user(event, admin_user, admin_team, client):
resp = client.post('/control/organizer/dummy/team/{}/'.format(admin_team.pk), {
'user': u.email
}, follow=True)
assert 'Admin team' in resp.rendered_content
assert admin_user.email in resp.rendered_content
assert u.email in resp.rendered_content
assert u in admin_team.members.all()
assert 'Admin team' in resp.content.decode()
assert admin_user.email in resp.content.decode()
assert u.email in resp.content.decode()
with scopes_disabled():
assert u in admin_team.members.all()
@pytest.mark.django_db
@@ -69,10 +71,11 @@ def test_team_create_invite(event, admin_user, admin_team, client):
resp = client.post('/control/organizer/dummy/team/{}/'.format(admin_team.pk), {
'user': 'foo@example.org'
}, follow=True)
assert 'Admin team' in resp.rendered_content
assert admin_user.email in resp.rendered_content
assert 'foo@example.org' in resp.rendered_content
assert admin_team.invites.first().email == 'foo@example.org'
assert 'Admin team' in resp.content.decode()
assert admin_user.email in resp.content.decode()
assert 'foo@example.org' in resp.content.decode()
with scopes_disabled():
assert admin_team.invites.first().email == 'foo@example.org'
assert len(djmail.outbox) == 1
@@ -84,21 +87,23 @@ def test_team_create_token(event, admin_user, admin_team, client):
resp = client.post('/control/organizer/dummy/team/{}/'.format(admin_team.pk), {
'name': 'Test token'
}, follow=True)
assert 'Test token' in resp.rendered_content
assert admin_team.tokens.first().name == 'Test token'
assert admin_team.tokens.first().token in resp.rendered_content
assert 'Test token' in resp.content.decode()
with scopes_disabled():
assert admin_team.tokens.first().name == 'Test token'
assert admin_team.tokens.first().token in resp.content.decode()
@pytest.mark.django_db
def test_team_remove_token(event, admin_user, admin_team, client):
client.login(email='dummy@dummy.dummy', password='dummy')
tk = admin_team.tokens.create(name='Test token')
with scopes_disabled():
tk = admin_team.tokens.create(name='Test token')
resp = client.post('/control/organizer/dummy/team/{}/'.format(admin_team.pk), {
'remove-token': str(tk.pk)
}, follow=True)
assert tk.token not in resp.rendered_content
assert 'Test token' in resp.rendered_content
assert tk.token not in resp.content.decode()
assert 'Test token' in resp.content.decode()
tk.refresh_from_db()
assert not tk.active
@@ -112,9 +117,9 @@ def test_team_resend_invite(event, admin_user, admin_team, client):
resp = client.post('/control/organizer/dummy/team/{}/'.format(admin_team.pk), {
'resend-invite': str(inv.pk)
}, follow=True)
assert 'Admin team' in resp.rendered_content
assert admin_user.email in resp.rendered_content
assert 'foo@example.org' in resp.rendered_content
assert 'Admin team' in resp.content.decode()
assert admin_user.email in resp.content.decode()
assert 'foo@example.org' in resp.content.decode()
assert len(djmail.outbox) == 1
@@ -122,13 +127,15 @@ def test_team_resend_invite(event, admin_user, admin_team, client):
def test_team_revoke_invite(event, admin_user, admin_team, client):
client.login(email='dummy@dummy.dummy', password='dummy')
inv = admin_team.invites.create(email='foo@example.org')
with scopes_disabled():
inv = admin_team.invites.create(email='foo@example.org')
resp = client.post('/control/organizer/dummy/team/{}/'.format(admin_team.pk), {
'remove-invite': str(inv.pk)
}, follow=True)
assert 'Admin team' in resp.rendered_content
assert admin_user.email in resp.rendered_content
assert not admin_team.invites.exists()
assert 'Admin team' in resp.content.decode()
assert admin_user.email in resp.content.decode()
with scopes_disabled():
assert not admin_team.invites.exists()
@pytest.mark.django_db
@@ -136,14 +143,16 @@ def test_team_remove_user(event, admin_user, admin_team, client):
client.login(email='dummy@dummy.dummy', password='dummy')
u = User.objects.create_user('dummy2@dummy.dummy', 'dummy')
admin_team.members.add(u)
with scopes_disabled():
admin_team.members.add(u)
resp = client.post('/control/organizer/dummy/team/{}/'.format(admin_team.pk), {
'remove-member': u.pk
}, follow=True)
assert 'Admin team' in resp.rendered_content
assert admin_user.email in resp.rendered_content
assert u not in admin_team.members.all()
assert 'Admin team' in resp.content.decode()
assert admin_user.email in resp.content.decode()
with scopes_disabled():
assert u not in admin_team.members.all()
@pytest.mark.django_db
@@ -153,30 +162,34 @@ def test_team_remove_last_admin(event, admin_user, admin_team, client):
resp = client.post('/control/organizer/dummy/team/{}/'.format(admin_team.pk), {
'remove-member': admin_user.pk
}, follow=True)
assert 'alert-danger' in resp.rendered_content
assert admin_user in admin_team.members.all()
assert 'alert-danger' in resp.content.decode()
with scopes_disabled():
assert admin_user in admin_team.members.all()
t2 = Team.objects.create(organizer=event.organizer, name='Admin team 2')
resp = client.post('/control/organizer/dummy/team/{}/'.format(admin_team.pk), {
'remove-member': admin_user.pk
}, follow=True)
assert 'alert-danger' in resp.rendered_content
assert admin_user in admin_team.members.all()
assert 'alert-danger' in resp.content.decode()
with scopes_disabled():
assert admin_user in admin_team.members.all()
t2.members.add(admin_user)
resp = client.post('/control/organizer/dummy/team/{}/'.format(admin_team.pk), {
'remove-member': admin_user.pk
}, follow=True)
assert 'alert-danger' in resp.rendered_content
assert admin_user in admin_team.members.all()
assert 'alert-danger' in resp.content.decode()
with scopes_disabled():
assert admin_user in admin_team.members.all()
t2.can_change_teams = True
t2.save()
resp = client.post('/control/organizer/dummy/team/{}/'.format(admin_team.pk), {
'remove-member': admin_user.pk
}, follow=True)
assert 'alert-danger' not in resp.rendered_content
assert admin_user not in admin_team.members.all()
assert 'alert-danger' not in resp.content.decode()
with scopes_disabled():
assert admin_user not in admin_team.members.all()
@pytest.mark.django_db
@@ -188,12 +201,13 @@ def test_create_team(event, admin_user, admin_team, client):
'limit_events': str(event.pk),
'can_change_event_settings': 'on'
}, follow=True)
t = Team.objects.last()
assert t.can_change_event_settings
assert t.can_create_events
assert not t.can_change_organizer_settings
assert list(t.limit_events.all()) == [event]
assert list(t.members.all()) == [admin_user]
with scopes_disabled():
t = Team.objects.last()
assert t.can_change_event_settings
assert t.can_create_events
assert not t.can_change_organizer_settings
assert list(t.limit_events.all()) == [event]
assert list(t.members.all()) == [admin_user]
@pytest.mark.django_db
@@ -208,7 +222,8 @@ def test_update_team(event, admin_user, admin_team, client):
admin_team.refresh_from_db()
assert admin_team.can_change_event_settings
assert not admin_team.can_change_organizer_settings
assert list(admin_team.limit_events.all()) == [event]
with scopes_disabled():
assert list(admin_team.limit_events.all()) == [event]
@pytest.mark.django_db
@@ -218,17 +233,19 @@ def test_update_last_team_to_be_no_admin(event, admin_user, admin_team, client):
'name': 'Admin',
'can_change_event_settings': 'on'
}, follow=True)
assert 'alert-danger' in resp.rendered_content
assert 'alert-danger' in resp.content.decode()
@pytest.mark.django_db
def test_remove_team(event, admin_user, admin_team, client):
client.login(email='dummy@dummy.dummy', password='dummy')
t2 = Team.objects.create(organizer=event.organizer, name='Admin team 2')
with scopes_disabled():
t2 = Team.objects.create(organizer=event.organizer, name='Admin team 2')
resp = client.post('/control/organizer/dummy/team/{}/delete'.format(t2.pk), {}, follow=True)
assert Team.objects.count() == 1
assert 'alert-success' in resp.rendered_content
with scopes_disabled():
assert Team.objects.count() == 1
assert 'alert-success' in resp.content.decode()
@pytest.mark.django_db
@@ -236,8 +253,9 @@ def test_remove_last_admin_team(event, admin_user, admin_team, client):
client.login(email='dummy@dummy.dummy', password='dummy')
resp = client.post('/control/organizer/dummy/team/{}/delete'.format(admin_team.pk), {}, follow=True)
assert Team.objects.count() == 1
assert 'alert-danger' in resp.rendered_content
with scopes_disabled():
assert Team.objects.count() == 1
assert 'alert-danger' in resp.content.decode()
@pytest.mark.django_db
@@ -245,7 +263,8 @@ def test_resend_invalid_invite(event, admin_user, admin_team, client):
client.login(email='dummy@dummy.dummy', password='dummy')
djmail.outbox = []
inv = admin_team.invites.create(email='foo@example.org')
with scopes_disabled():
inv = admin_team.invites.create(email='foo@example.org')
resp = client.post('/control/organizer/dummy/team/{}/'.format(admin_team.pk), {
'resend-invite': inv.pk + 1
}, follow=True)
@@ -256,7 +275,8 @@ def test_resend_invalid_invite(event, admin_user, admin_team, client):
@pytest.mark.django_db
def test_invite_invalid_token(event, admin_team, client):
i = admin_team.invites.create(email='foo@bar.com')
with scopes_disabled():
i = admin_team.invites.create(email='foo@bar.com')
resp = client.get('/control/invite/foo{}bar'.format(i.token), follow=True)
assert b'alert-danger' in resp.content
assert b'invalid link' in resp.content
@@ -265,9 +285,10 @@ def test_invite_invalid_token(event, admin_team, client):
@pytest.mark.django_db
def test_invite_existing_team_member(event, admin_team, client):
u = User.objects.create_user('dummy2@dummy.dummy', 'dummy')
admin_team.members.add(u)
client.login(email='dummy2@dummy.dummy', password='dummy')
i = admin_team.invites.create(email='foo@bar.com')
with scopes_disabled():
admin_team.members.add(u)
client.login(email='dummy2@dummy.dummy', password='dummy')
i = admin_team.invites.create(email='foo@bar.com')
resp = client.get('/control/invite/{}'.format(i.token), follow=True)
assert b'alert-danger' in resp.content
assert b'already are part of' in resp.content
@@ -277,16 +298,19 @@ def test_invite_existing_team_member(event, admin_team, client):
def test_invite_authenticated(event, admin_team, client):
u = User.objects.create_user('dummy2@dummy.dummy', 'dummy')
client.login(email='dummy2@dummy.dummy', password='dummy')
i = admin_team.invites.create(email='foo@bar.com')
with scopes_disabled():
i = admin_team.invites.create(email='foo@bar.com')
resp = client.get('/control/invite/{}'.format(i.token), follow=True)
assert b'alert-success' in resp.content
assert u in admin_team.members.all()
assert not admin_team.invites.exists()
with scopes_disabled():
assert u in admin_team.members.all()
assert not admin_team.invites.exists()
@pytest.mark.django_db
def test_invite_new_user(event, admin_team, client):
i = admin_team.invites.create(email='foo@bar.com')
with scopes_disabled():
i = admin_team.invites.create(email='foo@bar.com')
resp = client.get('/control/invite/{}'.format(i.token), follow=True)
assert b'<form' in resp.content
resp = client.post('/control/invite/{}'.format(i.token), {
@@ -296,5 +320,6 @@ def test_invite_new_user(event, admin_team, client):
}, follow=True)
assert b'alert-success' in resp.content
assert admin_team.members.filter(email='dummy@example.org').exists()
assert not admin_team.invites.exists()
with scopes_disabled():
assert admin_team.members.filter(email='dummy@example.org').exists()
assert not admin_team.invites.exists()

View File

@@ -146,14 +146,14 @@ class UserSettings2FATest(SoupTest):
def test_enable_require_device(self):
r = self.client.post('/control/settings/2fa/enable', follow=True)
assert 'alert-danger' in r.rendered_content
assert 'alert-danger' in r.content.decode()
self.user.refresh_from_db()
assert not self.user.require_2fa
def test_enable(self):
U2FDevice.objects.create(user=self.user, name='Test')
r = self.client.post('/control/settings/2fa/enable', follow=True)
assert 'alert-success' in r.rendered_content
assert 'alert-success' in r.content.decode()
self.user.refresh_from_db()
assert self.user.require_2fa
@@ -161,7 +161,7 @@ class UserSettings2FATest(SoupTest):
self.user.require_2fa = True
self.user.save()
r = self.client.post('/control/settings/2fa/disable', follow=True)
assert 'alert-success' in r.rendered_content
assert 'alert-success' in r.content.decode()
self.user.refresh_from_db()
assert not self.user.require_2fa
@@ -192,7 +192,7 @@ class UserSettings2FATest(SoupTest):
'devicetype': 'u2f',
'name': 'Foo'
})
assert 'alert-danger' in r.rendered_content
assert 'alert-danger' in r.content.decode()
def test_create_u2f(self):
with mocker_context() as mocker:
@@ -227,7 +227,7 @@ class UserSettings2FATest(SoupTest):
}, follow=True)
d.refresh_from_db()
assert d.confirmed
assert 'alert-success' in r.rendered_content
assert 'alert-success' in r.content.decode()
self.user.refresh_from_db()
assert self.user.require_2fa
@@ -242,7 +242,7 @@ class UserSettings2FATest(SoupTest):
r = self.client.post('/control/settings/2fa/totp/{}/confirm'.format(d.pk), {
'token': str(totp.token() - 2)
}, follow=True)
assert 'alert-danger' in r.rendered_content
assert 'alert-danger' in r.content.decode()
d.refresh_from_db()
assert not d.confirmed
@@ -257,7 +257,7 @@ class UserSettings2FATest(SoupTest):
r = self.client.post('/control/settings/2fa/u2f/{}/confirm'.format(d.pk), {
'token': 'FOO'
}, follow=True)
assert 'alert-danger' in r.rendered_content
assert 'alert-danger' in r.content.decode()
d.refresh_from_db()
assert not d.confirmed
@@ -279,7 +279,7 @@ class UserSettings2FATest(SoupTest):
}, follow=True)
d.refresh_from_db()
assert d.confirmed
assert 'alert-success' in r.rendered_content
assert 'alert-success' in r.content.decode()
self.user.refresh_from_db()
assert self.user.require_2fa

View File

@@ -3,6 +3,7 @@ from decimal import Decimal
import pytest
from django.utils.timezone import now
from django_scopes import scope
from pretix.base.models import (
Event, Item, ItemCategory, Order, OrderPosition, Organizer, Question,
@@ -167,18 +168,19 @@ def logged_in_client(client, event):
])
@pytest.mark.django_db
def test_one_view(logged_in_client, url, expected, event, item, item_category, order, question, quota, voucher):
payment = order.payments.first()
refund = order.refunds.first()
url = url.format(
event=event.slug, orga=event.organizer.slug,
category=item_category.pk,
item=item.pk,
order_code=order.code,
question=question.pk,
quota=quota.pk,
voucher=voucher.pk,
payment=payment.pk,
refund=refund.pk
)
with scope(organizer=event.organizer):
payment = order.payments.first()
refund = order.refunds.first()
url = url.format(
event=event.slug, orga=event.organizer.slug,
category=item_category.pk,
item=item.pk,
order_code=order.code,
question=question.pk,
quota=quota.pk,
voucher=voucher.pk,
payment=payment.pk,
refund=refund.pk
)
response = logged_in_client.get(url)
assert response.status_code == expected

View File

@@ -3,6 +3,7 @@ import decimal
import json
from django.utils.timezone import now
from django_scopes import scopes_disabled
from tests.base import SoupTest, extract_form_fields
from pretix.base.models import (
@@ -12,6 +13,7 @@ from pretix.base.models import (
class VoucherFormTest(SoupTest):
@scopes_disabled()
def setUp(self):
super().setUp()
self.user = User.objects.create_user('dummy@dummy.dummy', 'dummy')
@@ -38,30 +40,34 @@ class VoucherFormTest(SoupTest):
self.quota_tickets.items.add(self.ticket)
def _create_voucher(self, data, expected_failure=False):
count_before = self.event.vouchers.count()
with scopes_disabled():
count_before = self.event.vouchers.count()
doc = self.get_doc('/control/event/%s/%s/vouchers/add' % (self.orga.slug, self.event.slug))
form_data = extract_form_fields(doc.select('.container-fluid form')[0])
form_data.update(data)
doc = self.post_doc('/control/event/%s/%s/vouchers/add' % (self.orga.slug, self.event.slug), form_data)
if expected_failure:
assert doc.select(".alert-danger, .has-error")
assert count_before == self.event.vouchers.count()
else:
assert doc.select(".alert-success")
assert count_before + 1 == self.event.vouchers.count()
with scopes_disabled():
if expected_failure:
assert doc.select(".alert-danger, .has-error")
assert count_before == self.event.vouchers.count()
else:
assert doc.select(".alert-success")
assert count_before + 1 == self.event.vouchers.count()
def _create_bulk_vouchers(self, data, expected_failure=False):
count_before = self.event.vouchers.count()
with scopes_disabled():
count_before = self.event.vouchers.count()
doc = self.get_doc('/control/event/%s/%s/vouchers/bulk_add' % (self.orga.slug, self.event.slug))
form_data = extract_form_fields(doc.select('.container-fluid form')[0])
form_data.update(data)
doc = self.post_doc('/control/event/%s/%s/vouchers/bulk_add' % (self.orga.slug, self.event.slug), form_data)
if expected_failure:
assert doc.select(".alert-danger")
assert count_before == self.event.vouchers.count()
else:
assert doc.select(".alert-success")
assert count_before + len(form_data.get('codes').split("\n")) == self.event.vouchers.count()
with scopes_disabled():
if expected_failure:
assert doc.select(".alert-danger")
assert count_before == self.event.vouchers.count()
else:
assert doc.select(".alert-success")
assert count_before + len(form_data.get('codes').split("\n")) == self.event.vouchers.count()
def _change_voucher(self, v, data, expected_failure=False):
doc = self.get_doc('/control/event/%s/%s/vouchers/%s/' % (self.orga.slug, self.event.slug, v.pk))
@@ -74,59 +80,66 @@ class VoucherFormTest(SoupTest):
assert doc.select(".alert-success")
def test_list(self):
self.event.vouchers.create(item=self.ticket, code='ABCDEFG')
with scopes_disabled():
self.event.vouchers.create(item=self.ticket, code='ABCDEFG')
doc = self.client.get('/control/event/%s/%s/vouchers/' % (self.orga.slug, self.event.slug))
assert 'ABCDEFG' in doc.rendered_content
assert 'ABCDEFG' in doc.content.decode()
def test_csv(self):
self.event.vouchers.create(item=self.ticket, code='ABCDEFG')
with scopes_disabled():
self.event.vouchers.create(item=self.ticket, code='ABCDEFG')
doc = self.client.get('/control/event/%s/%s/vouchers/?download=yes' % (self.orga.slug, self.event.slug))
assert doc.content.strip() == '"Voucher code","Valid until","Product","Reserve quota","Bypass quota",' \
'"Price effect","Value","Tag","Redeemed","Maximum usages"\r\n"ABCDEFG","",' \
'"Early-bird ticket","No","No","No effect","","","0","1"'.encode('utf-8')
assert doc.content.decode().strip() == '"Voucher code","Valid until","Product","Reserve quota",' \
'"Bypass quota","Price effect","Value","Tag","Redeemed","Maximum usages"' \
'\r\n"ABCDEFG","","Early-bird ticket","No","No","No effect","","","0","1"'
def test_filter_status_valid(self):
v = self.event.vouchers.create(item=self.ticket)
with scopes_disabled():
v = self.event.vouchers.create(item=self.ticket)
doc = self.client.get('/control/event/%s/%s/vouchers/?status=v' % (self.orga.slug, self.event.slug))
assert v.code in doc.rendered_content
assert v.code in doc.content.decode()
v.redeemed = 1
v.save()
doc = self.client.get('/control/event/%s/%s/vouchers/?status=v' % (self.orga.slug, self.event.slug))
assert v.code not in doc.rendered_content
assert v.code not in doc.content.decode()
def test_filter_status_redeemed(self):
v = self.event.vouchers.create(item=self.ticket, redeemed=1)
with scopes_disabled():
v = self.event.vouchers.create(item=self.ticket, redeemed=1)
doc = self.client.get('/control/event/%s/%s/vouchers/?status=r' % (self.orga.slug, self.event.slug))
assert v.code in doc.rendered_content
assert v.code in doc.content.decode()
v.redeemed = 0
v.save()
doc = self.client.get('/control/event/%s/%s/vouchers/?status=r' % (self.orga.slug, self.event.slug))
assert v.code not in doc.rendered_content
assert v.code not in doc.content.decode()
def test_filter_status_expired(self):
v = self.event.vouchers.create(item=self.ticket, valid_until=now() + datetime.timedelta(days=1))
with scopes_disabled():
v = self.event.vouchers.create(item=self.ticket, valid_until=now() + datetime.timedelta(days=1))
doc = self.client.get('/control/event/%s/%s/vouchers/?status=e' % (self.orga.slug, self.event.slug))
assert v.code not in doc.rendered_content
assert v.code not in doc.content.decode()
v.valid_until = now() - datetime.timedelta(days=1)
v.save()
doc = self.client.get('/control/event/%s/%s/vouchers/?status=e' % (self.orga.slug, self.event.slug))
assert v.code in doc.rendered_content
assert v.code in doc.content.decode()
def test_filter_tag(self):
self.event.vouchers.create(item=self.ticket, code='ABCDEFG', comment='Foo', tag='bar')
with scopes_disabled():
self.event.vouchers.create(item=self.ticket, code='ABCDEFG', comment='Foo', tag='bar')
doc = self.client.get('/control/event/%s/%s/vouchers/?tag=bar' % (self.orga.slug, self.event.slug))
assert 'ABCDEFG' in doc.rendered_content
assert 'ABCDEFG' in doc.content.decode()
doc = self.client.get('/control/event/%s/%s/vouchers/?tag=baz' % (self.orga.slug, self.event.slug))
assert 'ABCDEFG' not in doc.rendered_content
assert 'ABCDEFG' not in doc.content.decode()
def test_search_code(self):
self.event.vouchers.create(item=self.ticket, code='ABCDEFG', comment='Foo')
with scopes_disabled():
self.event.vouchers.create(item=self.ticket, code='ABCDEFG', comment='Foo')
doc = self.client.get('/control/event/%s/%s/vouchers/?search=ABCDEFG' % (self.orga.slug, self.event.slug))
assert 'ABCDEFG' in doc.rendered_content
assert 'ABCDEFG' in doc.content.decode()
doc = self.client.get('/control/event/%s/%s/vouchers/?search=Foo' % (self.orga.slug, self.event.slug))
assert 'ABCDEFG' in doc.rendered_content
assert 'ABCDEFG' in doc.content.decode()
doc = self.client.get('/control/event/%s/%s/vouchers/?search=12345' % (self.orga.slug, self.event.slug))
assert 'ABCDEFG' not in doc.rendered_content
assert 'ABCDEFG' not in doc.content.decode()
def test_bulk_rng(self):
rng = self.client.get('/control/event/%s/%s/vouchers/rng?num=7' % (self.orga.slug, self.event.slug))
@@ -135,19 +148,22 @@ class VoucherFormTest(SoupTest):
assert all([len(r) == 16 for r in codes])
def test_display_voucher_code(self):
count_before = self.event.vouchers.count()
with scopes_disabled():
count_before = self.event.vouchers.count()
doc = self.get_doc('/control/event/%s/%s/vouchers/add' % (self.orga.slug, self.event.slug))
form_data = extract_form_fields(doc.select('.container-fluid form')[0])
form_data.update({
'itemvar': '%d' % self.ticket.pk
})
doc = self.post_doc('/control/event/%s/%s/vouchers/add' % (self.orga.slug, self.event.slug), form_data)
v = Voucher.objects.latest('pk')
assert v.code in doc.select(".alert-success")[0].text
assert count_before + 1 == self.event.vouchers.count()
with scopes_disabled():
v = Voucher.objects.latest('pk')
assert v.code in doc.select(".alert-success")[0].text
assert count_before + 1 == self.event.vouchers.count()
def test_create_voucher_for_addon_item(self):
c = self.event.categories.create(name="Foo", is_addon=True)
with scopes_disabled():
c = self.event.categories.create(name="Foo", is_addon=True)
self.ticket.category = c
self.ticket.save()
self._create_voucher({
@@ -158,7 +174,8 @@ class VoucherFormTest(SoupTest):
self._create_voucher({
'itemvar': '%d' % self.ticket.pk
})
v = Voucher.objects.latest('pk')
with scopes_disabled():
v = Voucher.objects.latest('pk')
assert not v.block_quota
assert v.item.pk == self.ticket.pk
assert v.variation is None
@@ -168,7 +185,8 @@ class VoucherFormTest(SoupTest):
self._create_voucher({
'itemvar': '%d-%d' % (self.shirt.pk, self.shirt_red.pk)
})
v = Voucher.objects.latest('pk')
with scopes_disabled():
v = Voucher.objects.latest('pk')
assert not v.block_quota
assert v.item.pk == self.shirt.pk
assert v.variation.pk == self.shirt_red.pk
@@ -178,7 +196,8 @@ class VoucherFormTest(SoupTest):
self._create_voucher({
'itemvar': 'q-%d' % self.quota_tickets.pk
})
v = Voucher.objects.latest('pk')
with scopes_disabled():
v = Voucher.objects.latest('pk')
assert not v.block_quota
assert v.item is None
assert v.variation is None
@@ -189,7 +208,8 @@ class VoucherFormTest(SoupTest):
'itemvar': '%d' % self.ticket.pk,
'block_quota': 'on'
})
v = Voucher.objects.latest('pk')
with scopes_disabled():
v = Voucher.objects.latest('pk')
assert v.block_quota
def test_create_blocking_item_voucher_quota_full(self):
@@ -213,7 +233,8 @@ class VoucherFormTest(SoupTest):
'itemvar': '%d-%d' % (self.shirt.pk, self.shirt_red.pk),
'block_quota': 'on'
})
v = Voucher.objects.latest('pk')
with scopes_disabled():
v = Voucher.objects.latest('pk')
assert v.block_quota
def test_create_short_code(self):
@@ -235,7 +256,8 @@ class VoucherFormTest(SoupTest):
'itemvar': 'q-%d' % self.quota_tickets.pk,
'block_quota': 'on'
})
v = Voucher.objects.latest('pk')
with scopes_disabled():
v = Voucher.objects.latest('pk')
assert v.block_quota
def test_create_blocking_quota_voucher_quota_full(self):
@@ -247,7 +269,8 @@ class VoucherFormTest(SoupTest):
}, expected_failure=True)
def test_change_non_blocking_voucher(self):
v = self.event.vouchers.create(item=self.ticket)
with scopes_disabled():
v = self.event.vouchers.create(item=self.ticket)
self._change_voucher(v, {
'itemvar': 'q-%d' % self.quota_tickets.pk
})
@@ -259,14 +282,16 @@ class VoucherFormTest(SoupTest):
def test_change_blocking_voucher_unchanged_quota_full(self):
self.quota_tickets.size = 0
self.quota_tickets.save()
v = self.event.vouchers.create(item=self.ticket, block_quota=True)
with scopes_disabled():
v = self.event.vouchers.create(item=self.ticket, block_quota=True)
self._change_voucher(v, {
})
v.refresh_from_db()
assert v.block_quota
def test_change_voucher_reduce_max_usages(self):
v = self.event.vouchers.create(item=self.ticket, max_usages=5, redeemed=3)
with scopes_disabled():
v = self.event.vouchers.create(item=self.ticket, max_usages=5, redeemed=3)
self._change_voucher(v, {
'max_usages': '2'
}, expected_failure=True)
@@ -274,13 +299,15 @@ class VoucherFormTest(SoupTest):
def test_change_voucher_to_blocking_quota_full(self):
self.quota_tickets.size = 0
self.quota_tickets.save()
v = self.event.vouchers.create(item=self.ticket)
with scopes_disabled():
v = self.event.vouchers.create(item=self.ticket)
self._change_voucher(v, {
'block_quota': 'on'
}, expected_failure=True)
def test_change_voucher_to_blocking_quota_free(self):
v = self.event.vouchers.create(item=self.ticket)
with scopes_disabled():
v = self.event.vouchers.create(item=self.ticket)
self._change_voucher(v, {
'block_quota': 'on'
})
@@ -290,8 +317,9 @@ class VoucherFormTest(SoupTest):
def test_change_voucher_validity_to_valid_quota_full(self):
self.quota_tickets.size = 0
self.quota_tickets.save()
v = self.event.vouchers.create(item=self.ticket, valid_until=now() - datetime.timedelta(days=3),
block_quota=True)
with scopes_disabled():
v = self.event.vouchers.create(item=self.ticket, valid_until=now() - datetime.timedelta(days=3),
block_quota=True)
self._change_voucher(v, {
'valid_until_0': (now() + datetime.timedelta(days=3)).strftime('%Y-%m-%d'),
'valid_until_1': (now() + datetime.timedelta(days=3)).strftime('%H:%M:%S')
@@ -300,8 +328,9 @@ class VoucherFormTest(SoupTest):
assert v.valid_until < now()
def test_change_voucher_validity_to_valid_quota_free(self):
v = self.event.vouchers.create(item=self.ticket, valid_until=now() - datetime.timedelta(days=3),
block_quota=True)
with scopes_disabled():
v = self.event.vouchers.create(item=self.ticket, valid_until=now() - datetime.timedelta(days=3),
block_quota=True)
self._change_voucher(v, {
'valid_until_0': (now() + datetime.timedelta(days=3)).strftime('%Y-%m-%d'),
'valid_until_1': (now() + datetime.timedelta(days=3)).strftime('%H:%M:%S')
@@ -310,9 +339,10 @@ class VoucherFormTest(SoupTest):
assert v.valid_until > now()
def test_change_item_of_blocking_voucher_quota_free(self):
ticket2 = Item.objects.create(event=self.event, name='Late-bird ticket', default_price=23)
self.quota_tickets.items.add(ticket2)
v = self.event.vouchers.create(item=self.ticket, block_quota=True)
with scopes_disabled():
ticket2 = Item.objects.create(event=self.event, name='Late-bird ticket', default_price=23)
self.quota_tickets.items.add(ticket2)
v = self.event.vouchers.create(item=self.ticket, block_quota=True)
self._change_voucher(v, {
'itemvar': '%d' % ticket2.pk,
})
@@ -320,72 +350,81 @@ class VoucherFormTest(SoupTest):
def test_change_item_of_blocking_voucher_quota_full(self):
self.quota_shirts.size = 0
self.quota_shirts.save()
hoodie = Item.objects.create(event=self.event, name='Hoodie', default_price=23)
self.quota_shirts.items.add(hoodie)
v = self.event.vouchers.create(item=self.ticket, block_quota=True)
with scopes_disabled():
hoodie = Item.objects.create(event=self.event, name='Hoodie', default_price=23)
self.quota_shirts.items.add(hoodie)
v = self.event.vouchers.create(item=self.ticket, block_quota=True)
self._change_voucher(v, {
'itemvar': '%d' % hoodie.pk,
}, expected_failure=True)
def test_change_variation_of_blocking_voucher_quota_free(self):
self.quota_shirts.variations.remove(self.shirt_blue)
self.quota_tickets.variations.add(self.shirt_blue)
v = self.event.vouchers.create(item=self.shirt, variation=self.shirt_red, block_quota=True)
with scopes_disabled():
self.quota_shirts.variations.remove(self.shirt_blue)
self.quota_tickets.variations.add(self.shirt_blue)
v = self.event.vouchers.create(item=self.shirt, variation=self.shirt_red, block_quota=True)
self._change_voucher(v, {
'itemvar': '%d-%d' % (self.shirt.pk, self.shirt_blue.pk),
})
def test_change_variation_of_blocking_voucher_quota_full(self):
self.quota_shirts.variations.remove(self.shirt_blue)
self.quota_tickets.variations.add(self.shirt_blue)
self.quota_tickets.size = 0
self.quota_tickets.save()
v = self.event.vouchers.create(item=self.shirt, variation=self.shirt_red, block_quota=True)
with scopes_disabled():
self.quota_shirts.variations.remove(self.shirt_blue)
self.quota_tickets.variations.add(self.shirt_blue)
self.quota_tickets.size = 0
self.quota_tickets.save()
v = self.event.vouchers.create(item=self.shirt, variation=self.shirt_red, block_quota=True)
self._change_voucher(v, {
'itemvar': '%d-%d' % (self.shirt.pk, self.shirt_blue.pk),
}, expected_failure=True)
def test_change_quota_of_blocking_voucher_quota_free(self):
v = self.event.vouchers.create(quota=self.quota_tickets, block_quota=True)
with scopes_disabled():
v = self.event.vouchers.create(quota=self.quota_tickets, block_quota=True)
self._change_voucher(v, {
'itemvar': 'q-%d' % self.quota_shirts.pk,
})
def test_change_quota_of_blocking_voucher_quota_full(self):
self.quota_shirts.size = 0
self.quota_shirts.save()
v = self.event.vouchers.create(quota=self.quota_tickets, block_quota=True)
with scopes_disabled():
self.quota_shirts.size = 0
self.quota_shirts.save()
v = self.event.vouchers.create(quota=self.quota_tickets, block_quota=True)
self._change_voucher(v, {
'itemvar': 'q-%d' % self.quota_shirts.pk,
}, expected_failure=True)
def test_change_item_of_blocking_voucher_without_quota_change(self):
self.quota_tickets.size = 0
self.quota_tickets.save()
ticket2 = Item.objects.create(event=self.event, name='Standard Ticket', default_price=23)
self.quota_tickets.items.add(ticket2)
v = self.event.vouchers.create(item=self.ticket, block_quota=True)
with scopes_disabled():
self.quota_tickets.size = 0
self.quota_tickets.save()
ticket2 = Item.objects.create(event=self.event, name='Standard Ticket', default_price=23)
self.quota_tickets.items.add(ticket2)
v = self.event.vouchers.create(item=self.ticket, block_quota=True)
self._change_voucher(v, {
'itemvar': '%d' % ticket2.pk,
})
def test_change_variation_of_blocking_voucher_without_quota_change(self):
self.quota_shirts.size = 0
self.quota_shirts.save()
v = self.event.vouchers.create(item=self.shirt, variation=self.shirt_red, block_quota=True)
with scopes_disabled():
self.quota_shirts.size = 0
self.quota_shirts.save()
v = self.event.vouchers.create(item=self.shirt, variation=self.shirt_red, block_quota=True)
self._change_voucher(v, {
'itemvar': '%d-%d' % (self.shirt.pk, self.shirt_blue.pk),
})
def test_create_duplicate_code(self):
v = self.event.vouchers.create(quota=self.quota_tickets)
with scopes_disabled():
v = self.event.vouchers.create(quota=self.quota_tickets)
self._create_voucher({
'code': v.code,
}, expected_failure=True)
def test_change_code_to_duplicate(self):
v1 = self.event.vouchers.create(quota=self.quota_tickets)
v2 = self.event.vouchers.create(quota=self.quota_tickets)
with scopes_disabled():
v1 = self.event.vouchers.create(quota=self.quota_tickets)
v2 = self.event.vouchers.create(quota=self.quota_tickets)
self._change_voucher(v1, {
'code': v2.code
}, expected_failure=True)
@@ -430,14 +469,16 @@ class VoucherFormTest(SoupTest):
}, expected_failure=True)
def test_create_bulk_with_duplicate_code(self):
v = self.event.vouchers.create(quota=self.quota_tickets)
with scopes_disabled():
v = self.event.vouchers.create(quota=self.quota_tickets)
self._create_bulk_vouchers({
'codes': 'ABCDE\n%s' % v.code,
'itemvar': '%d' % self.shirt.pk,
}, expected_failure=True)
def test_delete_voucher(self):
v = self.event.vouchers.create(quota=self.quota_tickets)
with scopes_disabled():
v = self.event.vouchers.create(quota=self.quota_tickets)
doc = self.get_doc('/control/event/%s/%s/vouchers/%s/delete' % (self.orga.slug, self.event.slug, v.pk),
follow=True)
assert not doc.select(".alert-danger")
@@ -445,10 +486,12 @@ class VoucherFormTest(SoupTest):
doc = self.post_doc('/control/event/%s/%s/vouchers/%s/delete' % (self.orga.slug, self.event.slug, v.pk),
{}, follow=True)
assert doc.select(".alert-success")
assert not self.event.vouchers.filter(pk=v.id).exists()
with scopes_disabled():
assert not self.event.vouchers.filter(pk=v.id).exists()
def test_delete_voucher_redeemed(self):
v = self.event.vouchers.create(quota=self.quota_tickets, redeemed=1)
with scopes_disabled():
v = self.event.vouchers.create(quota=self.quota_tickets, redeemed=1)
doc = self.get_doc('/control/event/%s/%s/vouchers/%s/delete' % (self.orga.slug, self.event.slug, v.pk),
follow=True)
assert doc.select(".alert-danger")
@@ -465,13 +508,14 @@ class VoucherFormTest(SoupTest):
})
def test_subevent_non_blocking_quota_no_date(self):
self.event.has_subevents = True
self.event.save()
se1 = self.event.subevents.create(name="Foo", date_from=now())
self.event.subevents.create(name="Bar", date_from=now())
with scopes_disabled():
self.event.has_subevents = True
self.event.save()
se1 = self.event.subevents.create(name="Foo", date_from=now())
self.event.subevents.create(name="Bar", date_from=now())
self.quota_tickets.subevent = se1
self.quota_tickets.save()
self.quota_tickets.subevent = se1
self.quota_tickets.save()
self._create_voucher({
'itemvar': 'q-%d' % self.quota_tickets.pk,
@@ -486,15 +530,16 @@ class VoucherFormTest(SoupTest):
}, expected_failure=True)
def test_subevent_blocking_quota_free(self):
self.event.has_subevents = True
self.event.save()
se1 = self.event.subevents.create(name="Foo", date_from=now())
se2 = self.event.subevents.create(name="Bar", date_from=now())
with scopes_disabled():
self.event.has_subevents = True
self.event.save()
se1 = self.event.subevents.create(name="Foo", date_from=now())
se2 = self.event.subevents.create(name="Bar", date_from=now())
self.quota_tickets.subevent = se1
self.quota_tickets.save()
q2 = Quota.objects.create(event=self.event, name='Tickets', size=0, subevent=se2)
q2.items.add(self.ticket)
self.quota_tickets.subevent = se1
self.quota_tickets.save()
q2 = Quota.objects.create(event=self.event, name='Tickets', size=0, subevent=se2)
q2.items.add(self.ticket)
self._create_voucher({
'itemvar': '%d' % self.ticket.pk,
@@ -505,14 +550,15 @@ class VoucherFormTest(SoupTest):
def test_subevent_blocking_quota_full(self):
self.event.has_subevents = True
self.event.save()
se1 = self.event.subevents.create(name="Foo", date_from=now())
se2 = self.event.subevents.create(name="Bar", date_from=now())
with scopes_disabled():
se1 = self.event.subevents.create(name="Foo", date_from=now())
se2 = self.event.subevents.create(name="Bar", date_from=now())
self.quota_tickets.subevent = se1
self.quota_tickets.size = 0
self.quota_tickets.save()
q2 = Quota.objects.create(event=self.event, name='Tickets', size=5, subevent=se2)
q2.items.add(self.ticket)
self.quota_tickets.subevent = se1
self.quota_tickets.size = 0
self.quota_tickets.save()
q2 = Quota.objects.create(event=self.event, name='Tickets', size=5, subevent=se2)
q2.items.add(self.ticket)
self._create_voucher({
'itemvar': '%d' % self.ticket.pk,
@@ -521,32 +567,33 @@ class VoucherFormTest(SoupTest):
}, expected_failure=True)
def test_order_warning_deduplication(self):
shirt_voucher = Voucher.objects.create(
event=self.event, item=self.shirt, price_mode='set', value=0.0, max_usages=100
)
with scopes_disabled():
shirt_voucher = Voucher.objects.create(
event=self.event, item=self.shirt, price_mode='set', value=0.0, max_usages=100
)
shirt_order = Order.objects.create(
code='DEDUP', event=self.event, email='dummy@dummy.test',
status=Order.STATUS_PAID,
datetime=now(), expires=now() + datetime.timedelta(days=10),
total=0, locale='en'
)
shirt_order = Order.objects.create(
code='DEDUP', event=self.event, email='dummy@dummy.test',
status=Order.STATUS_PAID,
datetime=now(), expires=now() + datetime.timedelta(days=10),
total=0, locale='en'
)
OrderPosition.objects.create(
order=shirt_order,
item=self.shirt,
variation=self.shirt_red,
price=decimal.Decimal("0"),
voucher=shirt_voucher
)
OrderPosition.objects.create(
order=shirt_order,
item=self.shirt,
variation=self.shirt_red,
price=decimal.Decimal("0"),
voucher=shirt_voucher
)
OrderPosition.objects.create(
order=shirt_order,
item=self.shirt,
variation=self.shirt_blue,
price=decimal.Decimal("0"),
voucher=shirt_voucher
)
OrderPosition.objects.create(
order=shirt_order,
item=self.shirt,
variation=self.shirt_blue,
price=decimal.Decimal("0"),
voucher=shirt_voucher
)
shirt_voucher.redeemed = 2
shirt_voucher.save()

View File

@@ -2,6 +2,7 @@ from datetime import timedelta
import pytest
from django.utils.timezone import now
from django_scopes import scopes_disabled
from pretix.base.models import (
Event, Item, Organizer, Quota, Team, User, Voucher, WaitingListEntry,
@@ -51,51 +52,52 @@ def test_list(client, env):
client.login(email='dummy@dummy.dummy', password='dummy')
response = client.get('/control/event/dummy/dummy/waitinglist/')
assert 'success@example.org' not in response.rendered_content
assert 'expired@example.org' not in response.rendered_content
assert 'foo0@bar.com' in response.rendered_content
assert 'valid@example.org' not in response.rendered_content
assert 'success@example.org' not in response.content.decode()
assert 'expired@example.org' not in response.content.decode()
assert 'foo0@bar.com' in response.content.decode()
assert 'valid@example.org' not in response.content.decode()
assert response.context['estimate'] == 23 * 5
response = client.get('/control/event/dummy/dummy/waitinglist/?status=a')
assert 'success@example.org' in response.rendered_content
assert 'foo0@bar.com' in response.rendered_content
assert 'expired@example.org' in response.rendered_content
assert 'valid@example.org' in response.rendered_content
assert 'success@example.org' in response.content.decode()
assert 'foo0@bar.com' in response.content.decode()
assert 'expired@example.org' in response.content.decode()
assert 'valid@example.org' in response.content.decode()
response = client.get('/control/event/dummy/dummy/waitinglist/?status=s')
assert 'success@example.org' in response.rendered_content
assert 'foo0@bar.com' not in response.rendered_content
assert 'expired@example.org' in response.rendered_content
assert 'valid@example.org' in response.rendered_content
assert 'success@example.org' in response.content.decode()
assert 'foo0@bar.com' not in response.content.decode()
assert 'expired@example.org' in response.content.decode()
assert 'valid@example.org' in response.content.decode()
response = client.get('/control/event/dummy/dummy/waitinglist/?status=v')
assert 'success@example.org' not in response.rendered_content
assert 'foo0@bar.com' not in response.rendered_content
assert 'expired@example.org' not in response.rendered_content
assert 'valid@example.org' in response.rendered_content
assert 'success@example.org' not in response.content.decode()
assert 'foo0@bar.com' not in response.content.decode()
assert 'expired@example.org' not in response.content.decode()
assert 'valid@example.org' in response.content.decode()
response = client.get('/control/event/dummy/dummy/waitinglist/?status=r')
assert 'success@example.org' in response.rendered_content
assert 'foo0@bar.com' not in response.rendered_content
assert 'expired@example.org' not in response.rendered_content
assert 'valid@example.org' not in response.rendered_content
assert 'success@example.org' in response.content.decode()
assert 'foo0@bar.com' not in response.content.decode()
assert 'expired@example.org' not in response.content.decode()
assert 'valid@example.org' not in response.content.decode()
response = client.get('/control/event/dummy/dummy/waitinglist/?status=e')
assert 'success@example.org' not in response.rendered_content
assert 'expired@example.org' in response.rendered_content
assert 'foo0@bar.com' not in response.rendered_content
assert 'valid@example.org' not in response.rendered_content
assert 'success@example.org' not in response.content.decode()
assert 'expired@example.org' in response.content.decode()
assert 'foo0@bar.com' not in response.content.decode()
assert 'valid@example.org' not in response.content.decode()
response = client.get('/control/event/dummy/dummy/waitinglist/?item=%d' % env[3].pk)
assert 'item2@example.org' not in response.rendered_content
assert 'foo0@bar.com' in response.rendered_content
assert 'item2@example.org' not in response.content.decode()
assert 'foo0@bar.com' in response.content.decode()
@pytest.mark.django_db
def test_assign_single(client, env):
client.login(email='dummy@dummy.dummy', password='dummy')
wle = WaitingListEntry.objects.filter(voucher__isnull=True).last()
with scopes_disabled():
wle = WaitingListEntry.objects.filter(voucher__isnull=True).last()
client.post('/control/event/dummy/dummy/waitinglist/', {
'assign': wle.pk
@@ -107,7 +109,8 @@ def test_assign_single(client, env):
@pytest.mark.django_db
def test_priority_single(client, env):
client.login(email='dummy@dummy.dummy', password='dummy')
wle = WaitingListEntry.objects.filter(voucher__isnull=True).last()
with scopes_disabled():
wle = WaitingListEntry.objects.filter(voucher__isnull=True).last()
assert wle.priority == 0
client.post('/control/event/dummy/dummy/waitinglist/', {
@@ -130,17 +133,20 @@ def test_priority_single(client, env):
@pytest.mark.django_db
def test_delete_single(client, env):
client.login(email='dummy@dummy.dummy', password='dummy')
wle = WaitingListEntry.objects.first()
with scopes_disabled():
wle = WaitingListEntry.objects.first()
client.post('/control/event/dummy/dummy/waitinglist/%s/delete' % (wle.id))
with pytest.raises(WaitingListEntry.DoesNotExist):
WaitingListEntry.objects.get(id=wle.id)
with scopes_disabled():
WaitingListEntry.objects.get(id=wle.id)
@pytest.mark.django_db
def test_dashboard(client, env):
quota = Quota.objects.create(name="Test", size=2, event=env[0])
quota.items.add(env[3])
w = waitinglist_widgets(env[0])
with scopes_disabled():
quota = Quota.objects.create(name="Test", size=2, event=env[0])
quota.items.add(env[3])
w = waitinglist_widgets(env[0])
assert '1' in w[0]['content']
assert '5' in w[1]['content']

View File

@@ -1,5 +1,6 @@
import pytest
from django.utils.timezone import now
from django_scopes import scopes_disabled
from pretix.api.models import WebHook
from pretix.base.models import Event, Organizer, Team, User
@@ -48,7 +49,7 @@ def admin_team(organizer):
def test_list_of_webhooks(event, admin_user, client, webhook):
client.login(email='dummy@dummy.dummy', password='dummy')
resp = client.get('/control/organizer/dummy/webhooks')
assert 'https://google.com' in resp.rendered_content
assert 'https://google.com' in resp.content.decode()
@pytest.mark.django_db
@@ -60,11 +61,12 @@ def test_create_webhook(event, admin_user, admin_team, client):
'events': 'pretix.event.order.paid',
'limit_events': str(event.pk),
}, follow=True)
w = WebHook.objects.last()
assert w.target_url == "https://google.com"
assert w.limit_events.count() == 1
assert list(w.listeners.values_list('action_type', flat=True)) == ['pretix.event.order.paid']
assert not w.all_events
with scopes_disabled():
w = WebHook.objects.last()
assert w.target_url == "https://google.com"
assert w.limit_events.count() == 1
assert list(w.listeners.values_list('action_type', flat=True)) == ['pretix.event.order.paid']
assert not w.all_events
@pytest.mark.django_db
@@ -78,10 +80,11 @@ def test_update_webhook(event, admin_user, admin_team, webhook, client):
}, follow=True)
webhook.refresh_from_db()
assert webhook.target_url == "https://google.com"
assert webhook.limit_events.count() == 1
assert list(webhook.listeners.values_list('action_type', flat=True)) == ['pretix.event.order.canceled',
'pretix.event.order.paid']
assert not webhook.all_events
with scopes_disabled():
assert webhook.limit_events.count() == 1
assert list(webhook.listeners.values_list('action_type', flat=True)) == ['pretix.event.order.canceled',
'pretix.event.order.paid']
assert not webhook.all_events
@pytest.mark.django_db
@@ -98,4 +101,4 @@ def test_webhook_logs(event, admin_user, admin_team, webhook, client):
response_body='bar'
)
resp = client.get('/control/organizer/dummy/webhook/{}/logs'.format(webhook.pk))
assert 'pretix.event.order.paid' in resp.rendered_content
assert 'pretix.event.order.paid' in resp.content.decode()