diff --git a/src/pretix/control/views/event.py b/src/pretix/control/views/event.py index 4c4f999b0..e37481543 100644 --- a/src/pretix/control/views/event.py +++ b/src/pretix/control/views/event.py @@ -262,6 +262,7 @@ class EventSettingsFormView(EventPermissionRequiredMixin, FormView): messages.success(self.request, _('Your changes have been saved.')) return redirect(self.get_success_url()) else: + messages.error(self.request, _('We could not save your changes. See below for details.')) return self.get(request) @@ -310,6 +311,7 @@ class DisplaySettings(EventSettingsFormView): 'active.')) return redirect(self.get_success_url()) else: + messages.error(self.request, _('We could not save your changes. See below for details.')) return self.get(request) @@ -355,6 +357,7 @@ class MailSettings(EventSettingsFormView): messages.success(self.request, _('Your changes have been saved.')) return redirect(self.get_success_url()) else: + messages.error(self.request, _('We could not save your changes. See below for details.')) return self.get(request) diff --git a/src/pretix/testutils/mock.py b/src/pretix/testutils/mock.py new file mode 100644 index 000000000..21dd60ca5 --- /dev/null +++ b/src/pretix/testutils/mock.py @@ -0,0 +1,10 @@ +from contextlib import contextmanager + +from pytest_mock import MockFixture + + +@contextmanager +def mocker_context(): + result = MockFixture() + yield result + result.stopall() diff --git a/src/tests/control/test_events.py b/src/tests/control/test_events.py index d8a796386..72b901b16 100644 --- a/src/tests/control/test_events.py +++ b/src/tests/control/test_events.py @@ -1,14 +1,16 @@ import datetime +from decimal import Decimal from tests.base import SoupTest, extract_form_fields from pretix.base.models import ( Event, EventPermission, Organizer, OrganizerPermission, User, ) +from pretix.presale.style import regenerate_css +from pretix.testutils.mock import mocker_context class EventsTest(SoupTest): - def setUp(self): super().setUp() self.user = User.objects.create_user('dummy@dummy.dummy', 'dummy') @@ -17,7 +19,7 @@ class EventsTest(SoupTest): self.event1 = Event.objects.create( organizer=self.orga1, name='30C3', slug='30c3', date_from=datetime.datetime(2013, 12, 26, tzinfo=datetime.timezone.utc), - plugins='pretix.plugins.banktransfer' + plugins='pretix.plugins.banktransfer,tests.testdummy' ) self.event2 = Event.objects.create( organizer=self.orga1, name='31C3', slug='31c3', @@ -47,7 +49,6 @@ class EventsTest(SoupTest): doc = self.post_doc('/control/event/%s/%s/settings/' % (self.orga1.slug, self.event1.slug), extract_form_fields(doc.select('.container-fluid form')[0])) - print(doc) assert len(doc.select(".alert-success")) > 0 assert doc.select("[name=date_to]")[0]['value'] == "2013-12-30 17:00:00" assert doc.select("[name=settings-max_items_per_order]")[0]['value'] == "12" @@ -102,3 +103,79 @@ class EventsTest(SoupTest): self.event1.settings.set('payment_banktransfer__enabled', True) doc = self.get_doc('/control/event/%s/%s/live/' % (self.orga1.slug, self.event1.slug)) assert len(doc.select(".btn-primary")) == 0 + + def test_payment_settings(self): + self.get_doc('/control/event/%s/%s/settings/payment' % (self.orga1.slug, self.event1.slug)) + self.post_doc('/control/event/%s/%s/settings/payment' % (self.orga1.slug, self.event1.slug), { + 'payment_banktransfer__enabled': 'true', + 'payment_banktransfer__fee_abs': '12.23', + 'payment_banktransfer_bank_details_0': 'Test', + 'settings-payment_term_days': '2', + 'settings-tax_rate_default': '19.00', + }) + self.event1.settings._flush() + assert self.event1.settings.get('payment_banktransfer__enabled', as_type=bool) + assert self.event1.settings.get('payment_banktransfer__fee_abs', as_type=Decimal) == Decimal('12.23') + + def test_payment_settings_dont_require_fields_of_inactive_providers(self): + doc = self.post_doc('/control/event/%s/%s/settings/payment' % (self.orga1.slug, self.event1.slug), { + 'settings-tax_rate_default': '19.00', + 'settings-payment_term_days': '2' + }, follow=True) + assert doc.select('.alert-success') + + def test_payment_settings_require_fields_of_active_providers(self): + doc = self.post_doc('/control/event/%s/%s/settings/payment' % (self.orga1.slug, self.event1.slug), { + 'payment_banktransfer__enabled': 'true', + 'payment_banktransfer__fee_abs': '12.23', + 'settings-payment_term_days': '2', + 'settings-tax_rate_default': '19.00', + }) + assert doc.select('.alert-danger') + + def test_invoice_settings(self): + doc = self.get_doc('/control/event/%s/%s/settings/invoice' % (self.orga1.slug, self.event1.slug)) + data = extract_form_fields(doc.select("form")[0]) + data['invoice_address_required'] = 'on' + doc = self.post_doc('/control/event/%s/%s/settings/invoice' % (self.orga1.slug, self.event1.slug), + data, follow=True) + assert doc.select('.alert-success') + self.event1.settings._flush() + assert self.event1.settings.get('invoice_address_required', as_type=bool) + + def test_display_settings(self): + with mocker_context() as mocker: + mocked = mocker.patch('pretix.presale.style.regenerate_css.apply_async') + + doc = self.get_doc('/control/event/%s/%s/settings/display' % (self.orga1.slug, self.event1.slug)) + data = extract_form_fields(doc.select("form")[0]) + data['primary_color'] = '#FF0000' + doc = self.post_doc('/control/event/%s/%s/settings/display' % (self.orga1.slug, self.event1.slug), + data, follow=True) + assert doc.select('.alert-success') + self.event1.settings._flush() + assert self.event1.settings.get('primary_color') == '#FF0000' + mocked.assert_any_call(args=(self.event1.pk,)) + + def test_email_settings(self): + with mocker_context() as mocker: + mocked = mocker.patch('pretix.base.email.CustomSMTPBackend.test') + + doc = self.get_doc('/control/event/%s/%s/settings/email' % (self.orga1.slug, self.event1.slug)) + data = extract_form_fields(doc.select("form")[0]) + data['test'] = '1' + doc = self.post_doc('/control/event/%s/%s/settings/email' % (self.orga1.slug, self.event1.slug), + data, follow=True) + assert doc.select('.alert-success') + self.event1.settings._flush() + assert mocked.called + + def test_ticket_settings(self): + doc = self.get_doc('/control/event/%s/%s/settings/tickets' % (self.orga1.slug, self.event1.slug)) + data = extract_form_fields(doc.select("form")[0]) + data['ticket_download'] = 'on' + data['ticketoutput_testdummy__enabled'] = 'on' + doc = self.post_doc('/control/event/%s/%s/settings/tickets' % (self.orga1.slug, self.event1.slug), + data, follow=True) + self.event1.settings._flush() + assert self.event1.settings.get('ticket_download', as_type=bool)