From 80235fce264b96caf1cb2fd99d2fa83a6ba241d3 Mon Sep 17 00:00:00 2001 From: Raphael Michel Date: Mon, 19 Oct 2015 00:16:48 +0200 Subject: [PATCH] Added tests for (and improved) download in control panel --- src/pretix/control/views/orders.py | 5 +- src/tests/control/test_orders.py | 210 ++++++++++++++++++++++++++--- 2 files changed, 195 insertions(+), 20 deletions(-) diff --git a/src/pretix/control/views/orders.py b/src/pretix/control/views/orders.py index a67150c54c..e35011f935 100644 --- a/src/pretix/control/views/orders.py +++ b/src/pretix/control/views/orders.py @@ -15,10 +15,10 @@ from django.views.generic import DetailView, ListView, TemplateView, View from pretix.base.models import ( CachedFile, CachedTicket, EventLock, Item, Order, Quota, ) +from pretix.base.services import tickets from pretix.base.services.export import export from pretix.base.services.orders import mark_order_paid from pretix.base.services.stats import order_overview -from pretix.base.services.tickets import generate from pretix.base.signals import ( register_data_exporters, register_payment_providers, register_ticket_outputs, @@ -232,7 +232,8 @@ class OrderDownload(OrderView): cf.save() ct.cachedfile = cf 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})) diff --git a/src/tests/control/test_orders.py b/src/tests/control/test_orders.py index 93797ea917..5cc62b996a 100644 --- a/src/tests/control/test_orders.py +++ b/src/tests/control/test_orders.py @@ -5,8 +5,8 @@ import pytest from django.utils.timezone import now from pretix.base.models import ( - Event, EventPermission, Item, Order, OrderPosition, Organizer, - OrganizerPermission, User, + CachedTicket, Event, EventPermission, Item, Order, OrderPosition, + Organizer, Quota, User, ) @@ -15,8 +15,9 @@ def env(): o = Organizer.objects.create(name='Dummy', slug='dummy') event = Event.objects.create( 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') EventPermission.objects.create( event=event, @@ -41,7 +42,7 @@ def env(): price=Decimal("14"), attendee_name="Peter" ) - return event, user, o + return event, user, o, ticket @pytest.mark.django_db @@ -57,6 +58,10 @@ def test_order_list(client, env): assert 'FOO' not in response.rendered_content response = client.get('/control/event/dummy/dummy/orders/?status=n') 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 @@ -68,17 +73,9 @@ def test_order_detail(client, env): @pytest.mark.django_db -def test_order_transition_cancel(client, env): - client.login(email='dummy@dummy.dummy', password='dummy') - client.post('/control/event/dummy/dummy/orders/FOO/transition', { - '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): +def test_order_transition_to_paid_in_time_success(client, env): + 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' @@ -88,13 +85,190 @@ def test_order_transition_to_paid_success(client, env): @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.status = Order.STATUS_PAID + o.expires = now() - timedelta(days=2) 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.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) 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']