mirror of
https://github.com/pretix/pretix.git
synced 2026-09-13 16:14:40 +00:00
Added tests for (and improved) download in control panel
This commit is contained in:
@@ -15,10 +15,10 @@ from django.views.generic import DetailView, ListView, TemplateView, View
|
|||||||
from pretix.base.models import (
|
from pretix.base.models import (
|
||||||
CachedFile, CachedTicket, EventLock, Item, Order, Quota,
|
CachedFile, CachedTicket, EventLock, Item, Order, Quota,
|
||||||
)
|
)
|
||||||
|
from pretix.base.services import tickets
|
||||||
from pretix.base.services.export import export
|
from pretix.base.services.export import export
|
||||||
from pretix.base.services.orders import mark_order_paid
|
from pretix.base.services.orders import mark_order_paid
|
||||||
from pretix.base.services.stats import order_overview
|
from pretix.base.services.stats import order_overview
|
||||||
from pretix.base.services.tickets import generate
|
|
||||||
from pretix.base.signals import (
|
from pretix.base.signals import (
|
||||||
register_data_exporters, register_payment_providers,
|
register_data_exporters, register_payment_providers,
|
||||||
register_ticket_outputs,
|
register_ticket_outputs,
|
||||||
@@ -232,7 +232,8 @@ class OrderDownload(OrderView):
|
|||||||
cf.save()
|
cf.save()
|
||||||
ct.cachedfile = cf
|
ct.cachedfile = cf
|
||||||
ct.save()
|
ct.save()
|
||||||
generate(self.order.identity, self.output.identifier)
|
if not ct.cachedfile.file.name:
|
||||||
|
tickets.generate(self.order.identity, self.output.identifier)
|
||||||
return redirect(reverse('cachedfile.download', kwargs={'id': ct.cachedfile.id}))
|
return redirect(reverse('cachedfile.download', kwargs={'id': ct.cachedfile.id}))
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
@@ -5,8 +5,8 @@ import pytest
|
|||||||
from django.utils.timezone import now
|
from django.utils.timezone import now
|
||||||
|
|
||||||
from pretix.base.models import (
|
from pretix.base.models import (
|
||||||
Event, EventPermission, Item, Order, OrderPosition, Organizer,
|
CachedTicket, Event, EventPermission, Item, Order, OrderPosition,
|
||||||
OrganizerPermission, User,
|
Organizer, Quota, User,
|
||||||
)
|
)
|
||||||
|
|
||||||
|
|
||||||
@@ -15,8 +15,9 @@ def env():
|
|||||||
o = Organizer.objects.create(name='Dummy', slug='dummy')
|
o = Organizer.objects.create(name='Dummy', slug='dummy')
|
||||||
event = Event.objects.create(
|
event = Event.objects.create(
|
||||||
organizer=o, name='Dummy', slug='dummy',
|
organizer=o, name='Dummy', slug='dummy',
|
||||||
date_from=now(), plugins='pretix.plugins.banktransfer'
|
date_from=now(), plugins='pretix.plugins.banktransfer,tests.testdummy'
|
||||||
)
|
)
|
||||||
|
event.settings.set('ticketoutput_testdummy__enabled', True)
|
||||||
user = User.objects.create_user('dummy@dummy.dummy', 'dummy')
|
user = User.objects.create_user('dummy@dummy.dummy', 'dummy')
|
||||||
EventPermission.objects.create(
|
EventPermission.objects.create(
|
||||||
event=event,
|
event=event,
|
||||||
@@ -41,7 +42,7 @@ def env():
|
|||||||
price=Decimal("14"),
|
price=Decimal("14"),
|
||||||
attendee_name="Peter"
|
attendee_name="Peter"
|
||||||
)
|
)
|
||||||
return event, user, o
|
return event, user, o, ticket
|
||||||
|
|
||||||
|
|
||||||
@pytest.mark.django_db
|
@pytest.mark.django_db
|
||||||
@@ -57,6 +58,10 @@ def test_order_list(client, env):
|
|||||||
assert 'FOO' not in response.rendered_content
|
assert 'FOO' not in response.rendered_content
|
||||||
response = client.get('/control/event/dummy/dummy/orders/?status=n')
|
response = client.get('/control/event/dummy/dummy/orders/?status=n')
|
||||||
assert 'FOO' in response.rendered_content
|
assert 'FOO' in response.rendered_content
|
||||||
|
response = client.get('/control/event/dummy/dummy/orders/?item=15')
|
||||||
|
assert 'FOO' not in response.rendered_content
|
||||||
|
response = client.get('/control/event/dummy/dummy/orders/?item=%s' % env[3].identity)
|
||||||
|
assert 'FOO' in response.rendered_content
|
||||||
|
|
||||||
|
|
||||||
@pytest.mark.django_db
|
@pytest.mark.django_db
|
||||||
@@ -68,17 +73,9 @@ def test_order_detail(client, env):
|
|||||||
|
|
||||||
|
|
||||||
@pytest.mark.django_db
|
@pytest.mark.django_db
|
||||||
def test_order_transition_cancel(client, env):
|
def test_order_transition_to_paid_in_time_success(client, env):
|
||||||
client.login(email='dummy@dummy.dummy', password='dummy')
|
q = Quota.objects.create(event=env[0], size=0)
|
||||||
client.post('/control/event/dummy/dummy/orders/FOO/transition', {
|
q.items.add(env[3])
|
||||||
'status': 'c'
|
|
||||||
})
|
|
||||||
o = Order.objects.current.get(identity=env[2].identity)
|
|
||||||
assert o.status == Order.STATUS_CANCELLED
|
|
||||||
|
|
||||||
|
|
||||||
@pytest.mark.django_db
|
|
||||||
def test_order_transition_to_paid_success(client, env):
|
|
||||||
client.login(email='dummy@dummy.dummy', password='dummy')
|
client.login(email='dummy@dummy.dummy', password='dummy')
|
||||||
client.post('/control/event/dummy/dummy/orders/FOO/transition', {
|
client.post('/control/event/dummy/dummy/orders/FOO/transition', {
|
||||||
'status': 'p'
|
'status': 'p'
|
||||||
@@ -88,13 +85,190 @@ def test_order_transition_to_paid_success(client, env):
|
|||||||
|
|
||||||
|
|
||||||
@pytest.mark.django_db
|
@pytest.mark.django_db
|
||||||
def test_order_transition_to_unpaid_success(client, env):
|
def test_order_transition_to_paid_expired_quota_left(client, env):
|
||||||
o = Order.objects.current.get(identity=env[2].identity)
|
o = Order.objects.current.get(identity=env[2].identity)
|
||||||
o.status = Order.STATUS_PAID
|
o.expires = now() - timedelta(days=2)
|
||||||
o.save()
|
o.save()
|
||||||
|
q = Quota.objects.create(event=env[0], size=10)
|
||||||
|
q.items.add(env[3])
|
||||||
client.login(email='dummy@dummy.dummy', password='dummy')
|
client.login(email='dummy@dummy.dummy', password='dummy')
|
||||||
client.post('/control/event/dummy/dummy/orders/FOO/transition', {
|
client.post('/control/event/dummy/dummy/orders/FOO/transition', {
|
||||||
'status': 'n'
|
'status': 'p'
|
||||||
|
})
|
||||||
|
o = Order.objects.current.get(identity=env[2].identity)
|
||||||
|
assert o.status == Order.STATUS_PAID
|
||||||
|
|
||||||
|
|
||||||
|
@pytest.mark.django_db
|
||||||
|
def test_order_transition_to_paid_expired_quota_full(client, env):
|
||||||
|
o = Order.objects.current.get(identity=env[2].identity)
|
||||||
|
o.expires = now() - timedelta(days=2)
|
||||||
|
o.save()
|
||||||
|
q = Quota.objects.create(event=env[0], size=0)
|
||||||
|
q.items.add(env[3])
|
||||||
|
client.login(email='dummy@dummy.dummy', password='dummy')
|
||||||
|
client.post('/control/event/dummy/dummy/orders/FOO/transition', {
|
||||||
|
'status': 'p'
|
||||||
})
|
})
|
||||||
o = Order.objects.current.get(identity=env[2].identity)
|
o = Order.objects.current.get(identity=env[2].identity)
|
||||||
assert o.status == Order.STATUS_PENDING
|
assert o.status == Order.STATUS_PENDING
|
||||||
|
|
||||||
|
|
||||||
|
@pytest.mark.django_db
|
||||||
|
@pytest.mark.parametrize("process", [
|
||||||
|
# (Old status, new status, success expected)
|
||||||
|
(Order.STATUS_CANCELLED, Order.STATUS_PAID, False),
|
||||||
|
(Order.STATUS_CANCELLED, Order.STATUS_PENDING, False),
|
||||||
|
(Order.STATUS_CANCELLED, Order.STATUS_REFUNDED, False),
|
||||||
|
|
||||||
|
(Order.STATUS_PAID, Order.STATUS_PENDING, True),
|
||||||
|
(Order.STATUS_PAID, Order.STATUS_CANCELLED, False),
|
||||||
|
(Order.STATUS_PAID, Order.STATUS_REFUNDED, True),
|
||||||
|
|
||||||
|
(Order.STATUS_PENDING, Order.STATUS_CANCELLED, True),
|
||||||
|
(Order.STATUS_PENDING, Order.STATUS_PAID, True),
|
||||||
|
(Order.STATUS_PENDING, Order.STATUS_REFUNDED, False),
|
||||||
|
|
||||||
|
(Order.STATUS_REFUNDED, Order.STATUS_CANCELLED, False),
|
||||||
|
(Order.STATUS_REFUNDED, Order.STATUS_PAID, False),
|
||||||
|
(Order.STATUS_REFUNDED, Order.STATUS_PENDING, False)
|
||||||
|
])
|
||||||
|
def test_order_transition(client, env, process):
|
||||||
|
o = Order.objects.current.get(identity=env[2].identity)
|
||||||
|
o.status = process[0]
|
||||||
|
o.save()
|
||||||
|
client.login(email='dummy@dummy.dummy', password='dummy')
|
||||||
|
client.post('/control/event/dummy/dummy/orders/FOO/transition', {
|
||||||
|
'status': process[1]
|
||||||
|
})
|
||||||
|
o = Order.objects.current.get(identity=env[2].identity)
|
||||||
|
if process[2]:
|
||||||
|
assert o.status == process[1]
|
||||||
|
else:
|
||||||
|
assert o.status == process[0]
|
||||||
|
|
||||||
|
|
||||||
|
@pytest.mark.django_db
|
||||||
|
def test_order_detail_download_buttons_hidden_if_not_paid(client, env):
|
||||||
|
o = Order.objects.current.get(identity=env[2].identity)
|
||||||
|
o.status = Order.STATUS_PENDING
|
||||||
|
o.save()
|
||||||
|
env[0].settings.set('ticket_download', True)
|
||||||
|
del env[0].settings['ticket_download_date']
|
||||||
|
env[0].settings.set('ticketoutput_testdummy__enabled', True)
|
||||||
|
client.login(email='dummy@dummy.dummy', password='dummy')
|
||||||
|
response = client.get('/control/event/dummy/dummy/orders/FOO/')
|
||||||
|
assert '/control/event/dummy/dummy/orders/FOO/download/testdummy' not in response.rendered_content
|
||||||
|
|
||||||
|
|
||||||
|
@pytest.mark.django_db
|
||||||
|
def test_order_detail_download_buttons_visible(client, env):
|
||||||
|
o = Order.objects.current.get(identity=env[2].identity)
|
||||||
|
o.status = Order.STATUS_PAID
|
||||||
|
o.save()
|
||||||
|
env[0].settings.set('ticket_download', True)
|
||||||
|
del env[0].settings['ticket_download_date']
|
||||||
|
env[0].settings.set('ticketoutput_testdummy__enabled', True)
|
||||||
|
client.login(email='dummy@dummy.dummy', password='dummy')
|
||||||
|
response = client.get('/control/event/dummy/dummy/orders/FOO/')
|
||||||
|
assert '/control/event/dummy/dummy/orders/FOO/download/testdummy' in response.rendered_content
|
||||||
|
|
||||||
|
|
||||||
|
@pytest.mark.django_db
|
||||||
|
def test_order_detail_download_buttons_hidden_of(client, env):
|
||||||
|
o = Order.objects.current.get(identity=env[2].identity)
|
||||||
|
o.status = Order.STATUS_PAID
|
||||||
|
o.save()
|
||||||
|
env[0].settings.set('ticket_download', False)
|
||||||
|
del env[0].settings['ticket_download_date']
|
||||||
|
env[0].settings.set('ticketoutput_testdummy__enabled', True)
|
||||||
|
client.login(email='dummy@dummy.dummy', password='dummy')
|
||||||
|
response = client.get('/control/event/dummy/dummy/orders/FOO/')
|
||||||
|
assert '/control/event/dummy/dummy/orders/FOO/download/testdummy' not in response.rendered_content
|
||||||
|
|
||||||
|
|
||||||
|
@pytest.mark.django_db
|
||||||
|
def test_order_detail_download_buttons_visible_before_date(client, env):
|
||||||
|
o = Order.objects.current.get(identity=env[2].identity)
|
||||||
|
o.status = Order.STATUS_PAID
|
||||||
|
o.save()
|
||||||
|
env[0].settings.set('ticket_download', True)
|
||||||
|
env[0].settings.set('ticketoutput_testdummy__enabled', True)
|
||||||
|
env[0].settings['ticket_download_date'] = now() + timedelta(days=30)
|
||||||
|
client.login(email='dummy@dummy.dummy', password='dummy')
|
||||||
|
response = client.get('/control/event/dummy/dummy/orders/FOO/')
|
||||||
|
assert '/control/event/dummy/dummy/orders/FOO/download/testdummy' in response.rendered_content
|
||||||
|
|
||||||
|
|
||||||
|
@pytest.mark.django_db
|
||||||
|
def test_order_detail_download_buttons_hidden_if_provider_disabled(client, env):
|
||||||
|
o = Order.objects.current.get(identity=env[2].identity)
|
||||||
|
o.status = Order.STATUS_PAID
|
||||||
|
o.save()
|
||||||
|
env[0].settings.set('ticket_download', True)
|
||||||
|
del env[0].settings['ticket_download_date']
|
||||||
|
env[0].settings.set('ticketoutput_testdummy__enabled', False)
|
||||||
|
client.login(email='dummy@dummy.dummy', password='dummy')
|
||||||
|
response = client.get('/control/event/dummy/dummy/orders/FOO/')
|
||||||
|
assert '/control/event/dummy/dummy/orders/FOO/download/testdummy' not in response.rendered_content
|
||||||
|
|
||||||
|
|
||||||
|
@pytest.mark.django_db
|
||||||
|
def test_order_download_unpaid(client, env):
|
||||||
|
env[0].settings.set('ticket_download', True)
|
||||||
|
del env[0].settings['ticket_download_date']
|
||||||
|
env[0].settings.set('ticketoutput_testdummy__enabled', True)
|
||||||
|
client.login(email='dummy@dummy.dummy', password='dummy')
|
||||||
|
response = client.get('/control/event/dummy/dummy/orders/FOO/download/testdummy', follow=True)
|
||||||
|
assert 'alert-danger' in response.rendered_content
|
||||||
|
|
||||||
|
|
||||||
|
@pytest.mark.django_db
|
||||||
|
def test_order_download_unknown_provider(client, env):
|
||||||
|
o = Order.objects.current.get(identity=env[2].identity)
|
||||||
|
o.status = Order.STATUS_PAID
|
||||||
|
o.save()
|
||||||
|
env[0].settings.set('ticket_download', True)
|
||||||
|
del env[0].settings['ticket_download_date']
|
||||||
|
client.login(email='dummy@dummy.dummy', password='dummy')
|
||||||
|
response = client.get('/control/event/dummy/dummy/orders/FOO/download/foobar', follow=True)
|
||||||
|
assert 'alert-danger' in response.rendered_content
|
||||||
|
|
||||||
|
|
||||||
|
@pytest.mark.django_db
|
||||||
|
def test_order_download_disabled_provider(client, env):
|
||||||
|
o = Order.objects.current.get(identity=env[2].identity)
|
||||||
|
o.status = Order.STATUS_PAID
|
||||||
|
o.save()
|
||||||
|
env[0].settings.set('ticket_download', True)
|
||||||
|
del env[0].settings['ticket_download_date']
|
||||||
|
env[0].settings.set('ticketoutput_testdummy__enabled', False)
|
||||||
|
client.login(email='dummy@dummy.dummy', password='dummy')
|
||||||
|
response = client.get('/control/event/dummy/dummy/orders/FOO/download/testdummy', follow=True)
|
||||||
|
assert 'alert-danger' in response.rendered_content
|
||||||
|
|
||||||
|
|
||||||
|
@pytest.mark.django_db
|
||||||
|
def test_order_download_success(client, env, mocker):
|
||||||
|
from pretix.base.services import tickets
|
||||||
|
mocker.patch('pretix.base.services.tickets.generate')
|
||||||
|
o = Order.objects.current.get(identity=env[2].identity)
|
||||||
|
o.status = Order.STATUS_PAID
|
||||||
|
o.save()
|
||||||
|
env[0].settings.set('ticket_download', True)
|
||||||
|
del env[0].settings['ticket_download_date']
|
||||||
|
env[0].settings.set('ticketoutput_testdummy__enabled', True)
|
||||||
|
client.login(email='dummy@dummy.dummy', password='dummy')
|
||||||
|
response = client.get('/control/event/dummy/dummy/orders/FOO/download/testdummy')
|
||||||
|
assert response.status_code == 302
|
||||||
|
tickets.generate.assert_any_call(o.identity, 'testdummy')
|
||||||
|
assert 'download' in response['Location']
|
||||||
|
dl = response['Location']
|
||||||
|
assert CachedTicket.objects.filter(order=o, provider='testdummy').exists()
|
||||||
|
|
||||||
|
# test caching
|
||||||
|
tickets.generate.reset_mock()
|
||||||
|
response = client.get('/control/event/dummy/dummy/orders/FOO/download/testdummy')
|
||||||
|
assert response.status_code == 302
|
||||||
|
assert tickets.generate.assert_not_called()
|
||||||
|
assert dl == response['Location']
|
||||||
|
|||||||
Reference in New Issue
Block a user