mirror of
https://github.com/pretix/pretix.git
synced 2026-05-03 14:54:04 +00:00
Add a simple test mode (#1181)
- [x] Provide data model and configuration toggle - [x] Allow to delete individual test orders - [x] Add tests - [x] Add a prominent warning message to the backend if test mode orders exist (even though test mode is off), as this leads to wrong statistics - [x] Decide if and how to generate invoices for test orders as invoice numbers cannot be repeated or should not have gaps. - [x] Decide if and how we expose test orders through the API, since our difference pull mechanism relies on the fact that orders cannot be deleted. - [x] Decide if and how we want to couple test modes of payment providers? - [ ] pretix.eu: Ignore test orders for billing - [ ] Adjust payment providers: Mollie, bitpay, cash, fakepayment, sepadebit 
This commit is contained in:
@@ -248,8 +248,60 @@ class EventsTest(SoupTest):
|
||||
{'plugin:pretix.plugins.paypal': 'disable'})
|
||||
self.assertIn("Enable", doc.select("[name=\"plugin:pretix.plugins.paypal\"]")[0].text)
|
||||
|
||||
def test_testmode_enable(self):
|
||||
self.event1.testmode = False
|
||||
self.event1.save()
|
||||
self.post_doc('/control/event/%s/%s/live/' % (self.orga1.slug, self.event1.slug),
|
||||
{'testmode': 'true'})
|
||||
self.event1.refresh_from_db()
|
||||
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()
|
||||
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()
|
||||
|
||||
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()
|
||||
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()
|
||||
|
||||
def test_live_disable(self):
|
||||
self.event1.live = False
|
||||
self.event1.live = True
|
||||
self.event1.save()
|
||||
self.post_doc('/control/event/%s/%s/live/' % (self.orga1.slug, self.event1.slug),
|
||||
{'live': 'false'})
|
||||
@@ -261,7 +313,7 @@ class EventsTest(SoupTest):
|
||||
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(".btn-primary"))
|
||||
assert len(doc.select("input[name=live]"))
|
||||
self.post_doc('/control/event/%s/%s/live/' % (self.orga1.slug, self.event1.slug),
|
||||
{'live': 'true'})
|
||||
self.event1.refresh_from_db()
|
||||
@@ -272,19 +324,19 @@ class EventsTest(SoupTest):
|
||||
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(".btn-primary"))
|
||||
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')
|
||||
doc = self.get_doc('/control/event/%s/%s/live/' % (self.orga1.slug, self.event1.slug))
|
||||
assert len(doc.select(".btn-primary")) == 0
|
||||
assert len(doc.select("input[name=live]")) == 0
|
||||
|
||||
def test_live_require_a_quota(self):
|
||||
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
|
||||
assert len(doc.select("input[name=live]")) == 0
|
||||
|
||||
def test_payment_settings_provider(self):
|
||||
self.get_doc('/control/event/%s/%s/settings/payment/banktransfer' % (self.orga1.slug, self.event1.slug))
|
||||
|
||||
@@ -126,6 +126,15 @@ def test_order_list(client, env):
|
||||
response = client.get('/control/event/dummy/dummy/orders/?question=%d&answer=%d' % (q.pk, qo2.pk))
|
||||
assert 'FOO' not in response.rendered_content
|
||||
|
||||
response = client.get('/control/event/dummy/dummy/orders/?status=testmode')
|
||||
assert 'FOO' not in response.rendered_content
|
||||
assert 'TEST MODE' not in response.rendered_content
|
||||
env[2].testmode = True
|
||||
env[2].save()
|
||||
response = client.get('/control/event/dummy/dummy/orders/?status=testmode')
|
||||
assert 'FOO' in response.rendered_content
|
||||
assert 'TEST MODE' in response.rendered_content
|
||||
|
||||
|
||||
@pytest.mark.django_db
|
||||
def test_order_detail(client, env):
|
||||
@@ -134,6 +143,16 @@ def test_order_detail(client, env):
|
||||
assert 'Early-bird' in response.rendered_content
|
||||
assert 'Peter' in response.rendered_content
|
||||
assert 'Lukas Gelöscht' in response.rendered_content
|
||||
assert 'TEST MODE' not in response.rendered_content
|
||||
|
||||
|
||||
@pytest.mark.django_db
|
||||
def test_order_detail_show_test_mode(client, env):
|
||||
env[2].testmode = True
|
||||
env[2].save()
|
||||
client.login(email='dummy@dummy.dummy', password='dummy')
|
||||
response = client.get('/control/event/dummy/dummy/orders/FOO/')
|
||||
assert 'TEST MODE' in response.rendered_content
|
||||
|
||||
|
||||
@pytest.mark.django_db
|
||||
@@ -260,6 +279,26 @@ def test_order_deny(client, env):
|
||||
assert o.require_approval
|
||||
|
||||
|
||||
@pytest.mark.django_db
|
||||
def test_order_delete_require_testmode(client, env):
|
||||
client.login(email='dummy@dummy.dummy', password='dummy')
|
||||
res = client.get('/control/event/dummy/dummy/orders/FOO/delete', {}, follow=True)
|
||||
assert 'alert-danger' in res.rendered_content
|
||||
assert 'Only orders created in test mode can be deleted' in res.rendered_content
|
||||
client.post('/control/event/dummy/dummy/orders/FOO/delete', {}, follow=True)
|
||||
assert Order.objects.get(id=env[2].id)
|
||||
|
||||
|
||||
@pytest.mark.django_db
|
||||
def test_order_delete(client, env):
|
||||
o = Order.objects.get(id=env[2].id)
|
||||
o.testmode = True
|
||||
o.save()
|
||||
client.login(email='dummy@dummy.dummy', password='dummy')
|
||||
client.post('/control/event/dummy/dummy/orders/FOO/delete', {}, follow=True)
|
||||
assert not Order.objects.filter(id=env[2].id).exists()
|
||||
|
||||
|
||||
@pytest.mark.django_db
|
||||
@pytest.mark.parametrize("process", [
|
||||
# (Old status, new status, success expected)
|
||||
|
||||
Reference in New Issue
Block a user