forked from CGM_Public/pretix_original
New tests and minor fixes
This commit is contained in:
@@ -2,12 +2,16 @@ from datetime import timedelta
|
||||
from decimal import Decimal
|
||||
|
||||
import pytest
|
||||
from django.core import mail
|
||||
from django.utils.timezone import now
|
||||
from tests.base import SoupTest
|
||||
|
||||
from pretix.base.models import (
|
||||
CachedTicket, Event, EventPermission, Item, Order, OrderPosition,
|
||||
Organizer, Quota, User,
|
||||
CachedTicket, Event, EventPermission, InvoiceAddress, Item, Order,
|
||||
OrderPosition, Organizer, Quota, User,
|
||||
)
|
||||
from pretix.base.services.invoices import (
|
||||
generate_cancellation, generate_invoice,
|
||||
)
|
||||
|
||||
|
||||
@@ -30,7 +34,7 @@ def env():
|
||||
code='FOO', event=event, email='dummy@dummy.test',
|
||||
status=Order.STATUS_PENDING,
|
||||
datetime=now(), expires=now() + timedelta(days=10),
|
||||
total=0, payment_provider='banktransfer'
|
||||
total=14, payment_provider='banktransfer', locale='en'
|
||||
)
|
||||
ticket = Item.objects.create(event=event, name='Early-bird ticket',
|
||||
category=None, default_price=23,
|
||||
@@ -61,10 +65,23 @@ 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/?status=ne')
|
||||
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].id)
|
||||
assert 'FOO' in response.rendered_content
|
||||
response = client.get('/control/event/dummy/dummy/orders/?provider=foo')
|
||||
assert 'FOO' not in response.rendered_content
|
||||
response = client.get('/control/event/dummy/dummy/orders/?provider=banktransfer')
|
||||
assert 'FOO' in response.rendered_content
|
||||
|
||||
response = client.get('/control/event/dummy/dummy/orders/?status=o')
|
||||
assert 'FOO' not in response.rendered_content
|
||||
env[2].expires = now() - timedelta(days=10)
|
||||
env[2].save()
|
||||
response = client.get('/control/event/dummy/dummy/orders/?status=o')
|
||||
assert 'FOO' in response.rendered_content
|
||||
|
||||
|
||||
@pytest.mark.django_db
|
||||
@@ -75,6 +92,42 @@ def test_order_detail(client, env):
|
||||
assert 'Peter' in response.rendered_content
|
||||
|
||||
|
||||
@pytest.mark.django_db
|
||||
def test_order_set_contact(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/contact', {
|
||||
'email': 'admin@rami.io'
|
||||
})
|
||||
o = Order.objects.get(id=env[2].id)
|
||||
assert o.email == 'admin@rami.io'
|
||||
|
||||
|
||||
@pytest.mark.django_db
|
||||
def test_order_set_comment(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/comment', {
|
||||
'comment': 'Foo'
|
||||
})
|
||||
o = Order.objects.get(id=env[2].id)
|
||||
assert o.comment == 'Foo'
|
||||
|
||||
|
||||
@pytest.mark.django_db
|
||||
def test_order_transition_to_expired_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': 'e'
|
||||
})
|
||||
o = Order.objects.get(id=env[2].id)
|
||||
assert o.status == Order.STATUS_EXPIRED
|
||||
|
||||
|
||||
@pytest.mark.django_db
|
||||
def test_order_transition_to_paid_in_time_success(client, env):
|
||||
q = Quota.objects.create(event=env[0], size=0)
|
||||
@@ -103,45 +156,35 @@ def test_order_transition_to_paid_expired_quota_left(client, env):
|
||||
assert o.status == Order.STATUS_PAID
|
||||
|
||||
|
||||
@pytest.mark.django_db
|
||||
def test_order_transition_to_paid_expired_quota_full(client, env):
|
||||
o = Order.objects.get(id=env[2].id)
|
||||
o.status = Order.STATUS_EXPIRED
|
||||
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.get(id=env[2].id)
|
||||
assert o.status == Order.STATUS_EXPIRED
|
||||
|
||||
|
||||
@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_CANCELLED, Order.STATUS_EXPIRED, False),
|
||||
|
||||
(Order.STATUS_PAID, Order.STATUS_PENDING, True),
|
||||
(Order.STATUS_PAID, Order.STATUS_CANCELLED, False),
|
||||
(Order.STATUS_PAID, Order.STATUS_REFUNDED, True),
|
||||
(Order.STATUS_PAID, Order.STATUS_EXPIRED, False),
|
||||
|
||||
(Order.STATUS_PENDING, Order.STATUS_CANCELLED, True),
|
||||
(Order.STATUS_PENDING, Order.STATUS_PAID, True),
|
||||
(Order.STATUS_PENDING, Order.STATUS_REFUNDED, False),
|
||||
(Order.STATUS_PENDING, Order.STATUS_EXPIRED, True),
|
||||
|
||||
(Order.STATUS_REFUNDED, Order.STATUS_CANCELLED, False),
|
||||
(Order.STATUS_REFUNDED, Order.STATUS_PAID, False),
|
||||
(Order.STATUS_REFUNDED, Order.STATUS_PENDING, False)
|
||||
(Order.STATUS_REFUNDED, Order.STATUS_PENDING, False),
|
||||
(Order.STATUS_REFUNDED, Order.STATUS_EXPIRED, False),
|
||||
])
|
||||
def test_order_transition(client, env, process):
|
||||
o = Order.objects.get(id=env[2].id)
|
||||
o.status = process[0]
|
||||
o.save()
|
||||
client.login(email='dummy@dummy.dummy', password='dummy')
|
||||
client.get('/control/event/dummy/dummy/orders/FOO/transition?status=' + process[1])
|
||||
client.post('/control/event/dummy/dummy/orders/FOO/transition', {
|
||||
'status': process[1]
|
||||
})
|
||||
@@ -278,6 +321,101 @@ def test_order_download_success(client, env, mocker):
|
||||
assert dl == response['Location']
|
||||
|
||||
|
||||
@pytest.mark.django_db
|
||||
def test_order_invoice_create_forbidden(client, env):
|
||||
client.login(email='dummy@dummy.dummy', password='dummy')
|
||||
env[0].settings.set('invoice_generate', 'no')
|
||||
response = client.post('/control/event/dummy/dummy/orders/FOO/invoice', {}, follow=True)
|
||||
assert 'alert-danger' in response.rendered_content
|
||||
|
||||
|
||||
@pytest.mark.django_db
|
||||
def test_order_invoice_create_duplicate(client, env):
|
||||
client.login(email='dummy@dummy.dummy', password='dummy')
|
||||
generate_invoice(env[2])
|
||||
env[0].settings.set('invoice_generate', 'admin')
|
||||
response = client.post('/control/event/dummy/dummy/orders/FOO/invoice', {}, follow=True)
|
||||
assert 'alert-danger' in response.rendered_content
|
||||
|
||||
|
||||
@pytest.mark.django_db
|
||||
def test_order_invoice_create_ok(client, env):
|
||||
client.login(email='dummy@dummy.dummy', password='dummy')
|
||||
env[0].settings.set('invoice_generate', 'admin')
|
||||
response = client.post('/control/event/dummy/dummy/orders/FOO/invoice', {}, follow=True)
|
||||
assert 'alert-success' in response.rendered_content
|
||||
assert env[2].invoices.exists()
|
||||
|
||||
|
||||
@pytest.mark.django_db
|
||||
def test_order_invoice_regenerate(client, env):
|
||||
client.login(email='dummy@dummy.dummy', password='dummy')
|
||||
i = generate_invoice(env[2])
|
||||
InvoiceAddress.objects.create(name='Foo', order=env[2])
|
||||
env[0].settings.set('invoice_generate', 'admin')
|
||||
response = client.post('/control/event/dummy/dummy/orders/FOO/invoices/%d/regenerate' % i.pk, {}, follow=True)
|
||||
assert 'alert-success' in response.rendered_content
|
||||
i.refresh_from_db()
|
||||
assert 'Foo' in i.invoice_to
|
||||
assert env[2].invoices.exists()
|
||||
|
||||
|
||||
@pytest.mark.django_db
|
||||
def test_order_invoice_regenerate_canceled(client, env):
|
||||
client.login(email='dummy@dummy.dummy', password='dummy')
|
||||
i = generate_invoice(env[2])
|
||||
generate_cancellation(i)
|
||||
response = client.post('/control/event/dummy/dummy/orders/FOO/invoices/%d/regenerate' % i.pk, {}, follow=True)
|
||||
assert 'alert-danger' in response.rendered_content
|
||||
|
||||
|
||||
@pytest.mark.django_db
|
||||
def test_order_invoice_regenerate_unknown(client, env):
|
||||
client.login(email='dummy@dummy.dummy', password='dummy')
|
||||
response = client.post('/control/event/dummy/dummy/orders/FOO/invoices/%d/regenerate' % 3, {}, follow=True)
|
||||
assert 'alert-danger' in response.rendered_content
|
||||
|
||||
|
||||
@pytest.mark.django_db
|
||||
def test_order_invoice_reissue(client, env):
|
||||
client.login(email='dummy@dummy.dummy', password='dummy')
|
||||
i = generate_invoice(env[2])
|
||||
InvoiceAddress.objects.create(name='Foo', order=env[2])
|
||||
env[0].settings.set('invoice_generate', 'admin')
|
||||
response = client.post('/control/event/dummy/dummy/orders/FOO/invoices/%d/reissue' % i.pk, {}, follow=True)
|
||||
assert 'alert-success' in response.rendered_content
|
||||
i.refresh_from_db()
|
||||
assert env[2].invoices.count() == 3
|
||||
assert 'Foo' not in env[2].invoices.all()[0].invoice_to
|
||||
assert 'Foo' not in env[2].invoices.all()[1].invoice_to
|
||||
assert 'Foo' in env[2].invoices.all()[2].invoice_to
|
||||
|
||||
|
||||
@pytest.mark.django_db
|
||||
def test_order_invoice_reissue_canceled(client, env):
|
||||
client.login(email='dummy@dummy.dummy', password='dummy')
|
||||
i = generate_invoice(env[2])
|
||||
generate_cancellation(i)
|
||||
response = client.post('/control/event/dummy/dummy/orders/FOO/invoices/%d/reissue' % i.pk, {}, follow=True)
|
||||
assert 'alert-danger' in response.rendered_content
|
||||
|
||||
|
||||
@pytest.mark.django_db
|
||||
def test_order_invoice_reissue_unknown(client, env):
|
||||
client.login(email='dummy@dummy.dummy', password='dummy')
|
||||
response = client.post('/control/event/dummy/dummy/orders/FOO/invoices/%d/reissue' % 3, {}, follow=True)
|
||||
assert 'alert-danger' in response.rendered_content
|
||||
|
||||
|
||||
@pytest.mark.django_db
|
||||
def test_order_resend_link(client, env):
|
||||
mail.outbox = []
|
||||
client.login(email='dummy@dummy.dummy', password='dummy')
|
||||
response = client.post('/control/event/dummy/dummy/orders/FOO/resend', {}, follow=True)
|
||||
assert 'alert-success' in response.rendered_content
|
||||
assert 'FOO' in mail.outbox[0].body
|
||||
|
||||
|
||||
@pytest.mark.django_db
|
||||
def test_order_extend_not_pending(client, env):
|
||||
o = Order.objects.get(id=env[2].id)
|
||||
|
||||
@@ -1,4 +1,5 @@
|
||||
import datetime
|
||||
import json
|
||||
|
||||
from django.utils.timezone import now
|
||||
from tests.base import SoupTest, extract_form_fields
|
||||
@@ -71,6 +72,67 @@ class VoucherFormTest(SoupTest):
|
||||
else:
|
||||
assert doc.select(".alert-success")
|
||||
|
||||
def test_list(self):
|
||||
self.event.vouchers.create(item=self.ticket, code='ABCDEFG')
|
||||
doc = self.client.get('/control/event/%s/%s/vouchers/' % (self.orga.slug, self.event.slug))
|
||||
assert 'ABCDEFG' in doc.rendered_content
|
||||
|
||||
def test_csv(self):
|
||||
self.event.vouchers.create(item=self.ticket, code='ABCDEFG')
|
||||
doc = self.client.get('/control/event/%s/%s/vouchers/?download=yes' % (self.orga.slug, self.event.slug))
|
||||
assert doc.content.strip() == '"Voucher code","Valid until","Product","Reserve quota","Bypass quota","Price",' \
|
||||
'"Tag","Redeemed"\r\n"ABCDEFG","","Early-bird ticket","No","No","","",' \
|
||||
'"No"'.encode('utf-8')
|
||||
|
||||
def test_filter_status_valid(self):
|
||||
v = self.event.vouchers.create(item=self.ticket)
|
||||
doc = self.client.get('/control/event/%s/%s/vouchers/?status=v' % (self.orga.slug, self.event.slug))
|
||||
assert v.code in doc.rendered_content
|
||||
v.redeemed = True
|
||||
v.save()
|
||||
doc = self.client.get('/control/event/%s/%s/vouchers/?status=v' % (self.orga.slug, self.event.slug))
|
||||
assert v.code not in doc.rendered_content
|
||||
|
||||
def test_filter_status_redeemed(self):
|
||||
v = self.event.vouchers.create(item=self.ticket, redeemed=True)
|
||||
doc = self.client.get('/control/event/%s/%s/vouchers/?status=r' % (self.orga.slug, self.event.slug))
|
||||
assert v.code in doc.rendered_content
|
||||
v.redeemed = False
|
||||
v.save()
|
||||
doc = self.client.get('/control/event/%s/%s/vouchers/?status=r' % (self.orga.slug, self.event.slug))
|
||||
assert v.code not in doc.rendered_content
|
||||
|
||||
def test_filter_status_expired(self):
|
||||
v = self.event.vouchers.create(item=self.ticket, valid_until=now() + datetime.timedelta(days=1))
|
||||
doc = self.client.get('/control/event/%s/%s/vouchers/?status=e' % (self.orga.slug, self.event.slug))
|
||||
assert v.code not in doc.rendered_content
|
||||
v.valid_until = now() - datetime.timedelta(days=1)
|
||||
v.save()
|
||||
doc = self.client.get('/control/event/%s/%s/vouchers/?status=e' % (self.orga.slug, self.event.slug))
|
||||
assert v.code in doc.rendered_content
|
||||
|
||||
def test_filter_tag(self):
|
||||
self.event.vouchers.create(item=self.ticket, code='ABCDEFG', comment='Foo', tag='bar')
|
||||
doc = self.client.get('/control/event/%s/%s/vouchers/?tag=bar' % (self.orga.slug, self.event.slug))
|
||||
assert 'ABCDEFG' in doc.rendered_content
|
||||
doc = self.client.get('/control/event/%s/%s/vouchers/?tag=baz' % (self.orga.slug, self.event.slug))
|
||||
assert 'ABCDEFG' not in doc.rendered_content
|
||||
|
||||
def test_search_code(self):
|
||||
self.event.vouchers.create(item=self.ticket, code='ABCDEFG', comment='Foo')
|
||||
doc = self.client.get('/control/event/%s/%s/vouchers/?search=ABCDEFG' % (self.orga.slug, self.event.slug))
|
||||
assert 'ABCDEFG' in doc.rendered_content
|
||||
doc = self.client.get('/control/event/%s/%s/vouchers/?search=Foo' % (self.orga.slug, self.event.slug))
|
||||
assert 'ABCDEFG' in doc.rendered_content
|
||||
doc = self.client.get('/control/event/%s/%s/vouchers/?search=12345' % (self.orga.slug, self.event.slug))
|
||||
assert 'ABCDEFG' not in doc.rendered_content
|
||||
|
||||
def test_bulk_rng(self):
|
||||
rng = self.client.get('/control/event/%s/%s/vouchers/rng?num=7' % (self.orga.slug, self.event.slug))
|
||||
codes = json.loads(rng.content.decode('utf-8'))['codes']
|
||||
assert len(codes) == 7
|
||||
assert all([len(r) == 16 for r in codes])
|
||||
|
||||
def test_create_non_blocking_item_voucher(self):
|
||||
self._create_voucher({
|
||||
'itemvar': '%d' % self.ticket.pk
|
||||
@@ -331,3 +393,24 @@ class VoucherFormTest(SoupTest):
|
||||
'codes': 'ABCDE\n%s' % v.code,
|
||||
'itemvar': '%d' % self.shirt.pk,
|
||||
}, expected_failure=True)
|
||||
|
||||
def test_delete_voucher(self):
|
||||
v = self.event.vouchers.create(quota=self.quota_tickets)
|
||||
doc = self.get_doc('/control/event/%s/%s/vouchers/%s/delete' % (self.orga.slug, self.event.slug, v.pk),
|
||||
follow=True)
|
||||
assert not doc.select(".alert-danger")
|
||||
|
||||
doc = self.post_doc('/control/event/%s/%s/vouchers/%s/delete' % (self.orga.slug, self.event.slug, v.pk),
|
||||
{}, follow=True)
|
||||
assert doc.select(".alert-success")
|
||||
assert not self.event.vouchers.filter(pk=v.id).exists()
|
||||
|
||||
def test_delete_voucher_redeemed(self):
|
||||
v = self.event.vouchers.create(quota=self.quota_tickets, redeemed=True)
|
||||
doc = self.get_doc('/control/event/%s/%s/vouchers/%s/delete' % (self.orga.slug, self.event.slug, v.pk),
|
||||
follow=True)
|
||||
assert doc.select(".alert-danger")
|
||||
|
||||
doc = self.post_doc('/control/event/%s/%s/vouchers/%s/delete' % (self.orga.slug, self.event.slug, v.pk),
|
||||
{}, follow=True)
|
||||
assert doc.select(".alert-danger")
|
||||
|
||||
Reference in New Issue
Block a user