mirror of
https://github.com/pretix/pretix.git
synced 2026-05-04 15:04:03 +00:00
Added multi-domain capabilities
This commit is contained in:
@@ -0,0 +1,35 @@
|
||||
from django.db import DEFAULT_DB_ALIAS, connections
|
||||
from django.test.utils import CaptureQueriesContext
|
||||
|
||||
|
||||
# Inspired by /django/test/testcases.py
|
||||
# but copied over to work without the unit test module
|
||||
|
||||
class _AssertNumQueriesContext(CaptureQueriesContext):
|
||||
def __init__(self, num, connection):
|
||||
self.num = num
|
||||
super(_AssertNumQueriesContext, self).__init__(connection)
|
||||
|
||||
def __exit__(self, exc_type, exc_value, traceback):
|
||||
super(_AssertNumQueriesContext, self).__exit__(exc_type, exc_value, traceback)
|
||||
if exc_type is not None:
|
||||
return
|
||||
executed = len(self)
|
||||
assert executed == self.num, "%d queries executed, %d expected\nCaptured queries were:\n%s" % (
|
||||
executed, self.num,
|
||||
'\n'.join(
|
||||
query['sql'] for query in self.captured_queries
|
||||
)
|
||||
)
|
||||
|
||||
|
||||
def assert_num_queries(num, func=None, *args, **kwargs):
|
||||
using = kwargs.pop("using", DEFAULT_DB_ALIAS)
|
||||
conn = connections[using]
|
||||
|
||||
context = _AssertNumQueriesContext(num, conn)
|
||||
if func is None:
|
||||
return context
|
||||
|
||||
with context:
|
||||
func(*args, **kwargs)
|
||||
|
||||
0
src/tests/multidomain/__init__.py
Normal file
0
src/tests/multidomain/__init__.py
Normal file
88
src/tests/multidomain/test_middlewares.py
Normal file
88
src/tests/multidomain/test_middlewares.py
Normal file
@@ -0,0 +1,88 @@
|
||||
import pytest
|
||||
from django.conf import settings
|
||||
from django.template import Context, Template
|
||||
from django.utils.timezone import now
|
||||
|
||||
from pretix.base.models import Event, Organizer
|
||||
from pretix.multidomain.models import KnownDomain
|
||||
|
||||
|
||||
@pytest.fixture
|
||||
def env():
|
||||
o = Organizer.objects.create(name='MRMCD', slug='mrmcd')
|
||||
event = Event.objects.create(
|
||||
organizer=o, name='MRMCD2015', slug='2015',
|
||||
date_from=now()
|
||||
)
|
||||
settings.SITE_URL = 'http://example.com'
|
||||
return o, event
|
||||
|
||||
|
||||
@pytest.mark.django_db
|
||||
def test_control_only_on_main_domain(env, client):
|
||||
KnownDomain.objects.create(domainname='foobar', organizer=env[0])
|
||||
r = client.get('/control/login', HTTP_HOST='foobar')
|
||||
assert r.status_code == 302
|
||||
assert r['Location'] == 'http://example.com/control/login'
|
||||
|
||||
|
||||
@pytest.mark.django_db
|
||||
def test_unknown_domain(env, client):
|
||||
r = client.get('/control/login', HTTP_HOST='foobar')
|
||||
assert r.status_code == 400
|
||||
|
||||
|
||||
@pytest.mark.django_db
|
||||
def test_event_on_custom_domain(env, client):
|
||||
KnownDomain.objects.create(domainname='foobar', organizer=env[0])
|
||||
r = client.get('/2015/', HTTP_HOST='foobar')
|
||||
assert r.status_code == 200
|
||||
|
||||
|
||||
@pytest.mark.django_db
|
||||
def test_event_with_custom_domain_on_main_domain(env, client):
|
||||
KnownDomain.objects.create(domainname='foobar', organizer=env[0])
|
||||
r = client.get('/mrmcd/2015/', HTTP_HOST='example.com')
|
||||
assert r.status_code == 302
|
||||
assert r['Location'] == 'http://foobar/2015/'
|
||||
|
||||
|
||||
@pytest.mark.django_db
|
||||
def test_event_on_custom_domain_only_with_wrong_organizer(env, client):
|
||||
organizer2 = Organizer.objects.create(name='Dummy', slug='dummy')
|
||||
Event.objects.create(
|
||||
organizer=organizer2, name='D1234', slug='1234',
|
||||
date_from=now()
|
||||
)
|
||||
KnownDomain.objects.create(domainname='foobar', organizer=env[0])
|
||||
r = client.get('/dummy/1234/', HTTP_HOST='foobar')
|
||||
assert r.status_code == 404
|
||||
|
||||
|
||||
@pytest.mark.django_db
|
||||
def test_unknown_event_on_custom_domain(env, client):
|
||||
organizer2 = Organizer.objects.create(name='Dummy', slug='dummy')
|
||||
Event.objects.create(
|
||||
organizer=organizer2, name='D1234', slug='1234',
|
||||
date_from=now()
|
||||
)
|
||||
KnownDomain.objects.create(domainname='foobar', organizer=env[0])
|
||||
r = client.get('/1234/', HTTP_HOST='foobar')
|
||||
assert r.status_code == 404
|
||||
|
||||
|
||||
@pytest.mark.django_db
|
||||
def test_cookie_domain_on_custom_domain(env, client):
|
||||
KnownDomain.objects.create(domainname='foobar', organizer=env[0])
|
||||
r = client.get('/2015/', HTTP_HOST='foobar')
|
||||
assert r.status_code == 200
|
||||
assert r.client.cookies['pretix_csrftoken']['domain'] == 'foobar'
|
||||
assert r.client.cookies['pretix_session']['domain'] == 'foobar'
|
||||
|
||||
|
||||
@pytest.mark.django_db
|
||||
def test_cookie_domain_on_main_domain(env, client):
|
||||
r = client.get('/mrmcd/2015/', HTTP_HOST='example.com')
|
||||
assert r.status_code == 200
|
||||
assert r.client.cookies['pretix_csrftoken']['domain'] == 'example.com'
|
||||
assert r.client.cookies['pretix_session']['domain'] == 'example.com'
|
||||
56
src/tests/multidomain/test_templatetag.py
Normal file
56
src/tests/multidomain/test_templatetag.py
Normal file
@@ -0,0 +1,56 @@
|
||||
import pytest
|
||||
from django.conf import settings
|
||||
from django.template import Context, Template
|
||||
from django.utils.timezone import now
|
||||
|
||||
from pretix.base.models import Event, Organizer
|
||||
from pretix.multidomain.models import KnownDomain
|
||||
|
||||
|
||||
@pytest.fixture
|
||||
def env():
|
||||
o = Organizer.objects.create(name='MRMCD', slug='mrmcd')
|
||||
event = Event.objects.create(
|
||||
organizer=o, name='MRMCD2015', slug='2015',
|
||||
date_from=now()
|
||||
)
|
||||
settings.SITE_URL = 'http://example.com'
|
||||
return o, event
|
||||
|
||||
|
||||
TEMPLATE_FRONT_PAGE = Template("{% load eventurl %} {% eventurl event 'presale:event.index' %}")
|
||||
TEMPLATE_KWARGS = Template("{% load eventurl %} {% eventurl event 'presale:event.checkout' step='payment' %}")
|
||||
|
||||
|
||||
@pytest.mark.django_db
|
||||
def test_event_main_domain_front_page(env):
|
||||
rendered = TEMPLATE_FRONT_PAGE.render(Context({
|
||||
'event': env[1]
|
||||
})).strip()
|
||||
assert rendered == '/mrmcd/2015/'
|
||||
|
||||
|
||||
@pytest.mark.django_db
|
||||
def test_event_custom_domain_front_page(env):
|
||||
KnownDomain.objects.create(domainname='foobar', organizer=env[0])
|
||||
rendered = TEMPLATE_FRONT_PAGE.render(Context({
|
||||
'event': env[1]
|
||||
})).strip()
|
||||
assert rendered == 'http://foobar/2015/'
|
||||
|
||||
|
||||
@pytest.mark.django_db
|
||||
def test_event_main_domain_kwargs(env):
|
||||
rendered = TEMPLATE_KWARGS.render(Context({
|
||||
'event': env[1]
|
||||
})).strip()
|
||||
assert rendered == '/mrmcd/2015/checkout/payment/'
|
||||
|
||||
|
||||
@pytest.mark.django_db
|
||||
def test_event_custom_domain_kwargs(env):
|
||||
KnownDomain.objects.create(domainname='foobar', organizer=env[0])
|
||||
rendered = TEMPLATE_KWARGS.render(Context({
|
||||
'event': env[1]
|
||||
})).strip()
|
||||
assert rendered == 'http://foobar/2015/checkout/payment/'
|
||||
96
src/tests/multidomain/test_urlreverse.py
Normal file
96
src/tests/multidomain/test_urlreverse.py
Normal file
@@ -0,0 +1,96 @@
|
||||
import pytest
|
||||
from django.conf import settings
|
||||
from django.utils.timezone import now
|
||||
from tests import assert_num_queries
|
||||
|
||||
from pretix.base.models import Event, Organizer
|
||||
from pretix.multidomain.models import KnownDomain
|
||||
from pretix.multidomain.urlreverse import build_absolute_uri, eventreverse
|
||||
|
||||
|
||||
@pytest.fixture
|
||||
def env():
|
||||
o = Organizer.objects.create(name='MRMCD', slug='mrmcd')
|
||||
event = Event.objects.create(
|
||||
organizer=o, name='MRMCD2015', slug='2015',
|
||||
date_from=now()
|
||||
)
|
||||
settings.SITE_URL = 'http://example.com'
|
||||
return o, event
|
||||
|
||||
|
||||
@pytest.mark.django_db
|
||||
def test_event_main_domain_front_page(env):
|
||||
assert eventreverse(env[1], 'presale:event.index') == '/mrmcd/2015/'
|
||||
|
||||
|
||||
@pytest.mark.django_db
|
||||
def test_event_custom_domain_kwargs(env):
|
||||
KnownDomain.objects.create(domainname='foobar', organizer=env[0])
|
||||
assert eventreverse(env[1], 'presale:event.checkout', {'step': 'payment'}) == 'http://foobar/2015/checkout/payment/'
|
||||
|
||||
|
||||
@pytest.mark.django_db
|
||||
def test_event_main_domain_kwargs(env):
|
||||
assert eventreverse(env[1], 'presale:event.checkout', {'step': 'payment'}) == '/mrmcd/2015/checkout/payment/'
|
||||
|
||||
|
||||
@pytest.mark.django_db
|
||||
def test_event_custom_domain_front_page(env):
|
||||
KnownDomain.objects.create(domainname='foobar', organizer=env[0])
|
||||
assert eventreverse(env[1], 'presale:event.index') == 'http://foobar/2015/'
|
||||
|
||||
|
||||
@pytest.mark.django_db
|
||||
def test_event_custom_domain_keep_port(env):
|
||||
settings.SITE_URL = 'http://example.com:8081'
|
||||
KnownDomain.objects.create(domainname='foobar', organizer=env[0])
|
||||
assert eventreverse(env[1], 'presale:event.index') == 'http://foobar:8081/2015/'
|
||||
|
||||
|
||||
@pytest.mark.django_db
|
||||
def test_event_custom_domain_keep_scheme(env):
|
||||
settings.SITE_URL = 'https://example.com'
|
||||
KnownDomain.objects.create(domainname='foobar', organizer=env[0])
|
||||
assert eventreverse(env[1], 'presale:event.index') == 'https://foobar/2015/'
|
||||
|
||||
|
||||
@pytest.mark.django_db
|
||||
def test_event_main_domain_cache(env):
|
||||
env[0].get_cache().clear()
|
||||
with assert_num_queries(1):
|
||||
eventreverse(env[1], 'presale:event.index')
|
||||
with assert_num_queries(0):
|
||||
eventreverse(env[1], 'presale:event.index')
|
||||
|
||||
|
||||
@pytest.mark.django_db
|
||||
def test_event_custom_domain_cache(env):
|
||||
KnownDomain.objects.create(domainname='foobar', organizer=env[0])
|
||||
env[0].get_cache().clear()
|
||||
with assert_num_queries(1):
|
||||
eventreverse(env[1], 'presale:event.index')
|
||||
with assert_num_queries(0):
|
||||
eventreverse(env[1], 'presale:event.index')
|
||||
|
||||
|
||||
@pytest.mark.django_db
|
||||
def test_event_custom_domain_cache_clear(env):
|
||||
kd = KnownDomain.objects.create(domainname='foobar', organizer=env[0])
|
||||
env[0].get_cache().clear()
|
||||
with assert_num_queries(1):
|
||||
eventreverse(env[1], 'presale:event.index')
|
||||
kd.delete()
|
||||
with assert_num_queries(1):
|
||||
eventreverse(env[1], 'presale:event.index')
|
||||
|
||||
|
||||
@pytest.mark.django_db
|
||||
def test_event_main_domain_absolute(env):
|
||||
assert build_absolute_uri(env[1], 'presale:event.index') == 'http://example.com/mrmcd/2015/'
|
||||
|
||||
|
||||
@pytest.mark.django_db
|
||||
def test_event_custom_domain_absolute(env):
|
||||
KnownDomain.objects.create(domainname='foobar', organizer=env[0])
|
||||
assert build_absolute_uri(env[1], 'presale:event.index') == 'http://foobar/2015/'
|
||||
@@ -34,7 +34,7 @@ class CheckoutTestCase(TestCase):
|
||||
self._set_session('email', 'admin@localhost')
|
||||
|
||||
def test_empty_cart(self):
|
||||
response = self.client.get('/%s/%s/checkout/' % (self.orga.slug, self.event.slug), follow=True)
|
||||
response = self.client.get('/%s/%s/checkout/start' % (self.orga.slug, self.event.slug), follow=True)
|
||||
self.assertRedirects(response, '/%s/%s/' % (self.orga.slug, self.event.slug),
|
||||
target_status_code=200)
|
||||
|
||||
|
||||
Reference in New Issue
Block a user