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

![download](https://user-images.githubusercontent.com/64280/53009081-fe420d80-343a-11e9-8361-b8511c988598.png)
This commit is contained in:
Raphael Michel
2019-02-20 17:51:26 +01:00
committed by GitHub
parent 8ffc96bf31
commit 67059fe323
49 changed files with 759 additions and 91 deletions

View File

@@ -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))

View File

@@ -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)