Write some unit tests for excel stuff

This commit is contained in:
Jan Tuomi
2017-11-02 22:56:34 +02:00
parent 29070165eb
commit cf33d81d69
7 changed files with 107 additions and 72 deletions
@@ -0,0 +1,3 @@
Testi;Ukkeli;testi@ukkeli.fi;Espoo;1;0
Jäbä;Kakkeli;jaba@kakkeli.fi;Hamina;0;1
Kolmas;Kaveri;kolmas@kaveri.com;Mesta;1;1
1 Testi Ukkeli testi@ukkeli.fi Espoo 1 0
2 Jäbä Kakkeli jaba@kakkeli.fi Hamina 0 1
3 Kolmas Kaveri kolmas@kaveri.com Mesta 1 1
@@ -0,0 +1 @@
Testi;Ukkeli;testi@ukkeli.fi;Espoo;1;0
1 Testi Ukkeli testi@ukkeli.fi Espoo 1 0
+73 -7
View File
@@ -3,10 +3,12 @@
from django.test import TestCase, Client from django.test import TestCase, Client
from django.contrib.auth.models import User from django.contrib.auth.models import User
from members.management.commands.createsahkopiikkiuser import Command as SahkopiikkiCommand from members.management.commands.createsahkopiikkiuser import Command as SahkopiikkiCommand
from members.models import Member from members.models import Member, Payment, Request
from rest_framework.authtoken.models import Token from rest_framework.authtoken.models import Token
import logging import logging
import os
import pyexcel
class MemberRegisterTestCase(TestCase): class MemberRegisterTestCase(TestCase):
@@ -14,7 +16,13 @@ class MemberRegisterTestCase(TestCase):
def setUp(self): def setUp(self):
"""Setup testing environment by creating member and admin.""" """Setup testing environment by creating member and admin."""
memb = Member.objects.create(first_name="Tidus", last_name="Tester") memb = Member.objects.create(first_name="Tidus", last_name="Tester", email="tidus@tester.fi")
payment = Payment.objects.create(member=memb, source='AYY')
appl = Request.objects.create(
first_name="Liisa", last_name="Mattila",
email="liisa.mattila@pylly.com", POR="Kouvola",
AYY=True, jas=False)
username, password = 'test_admin', 'password123' username, password = 'test_admin', 'password123'
test_admin = User.objects.create_superuser( test_admin = User.objects.create_superuser(
username, 'myemail@test.com', password) username, 'myemail@test.com', password)
@@ -31,16 +39,27 @@ class MemberRegisterTestCase(TestCase):
def test_import_csv_single_line(self): def test_import_csv_single_line(self):
"""Test csv import only with single line in csv file.""" """Test csv import only with single line in csv file."""
data = 'Teppo, Tulppu, teppo@tulppu.fi, Ankkalinna, 0, 0'
response = self.c.post('/members/import_csv', {'textarea': data}, follow=True) current_dir = os.path.dirname(os.path.abspath(__file__))
with open(os.path.join(current_dir, 'test_resources', 'single_line_import.csv')) as csvFile:
response = self.c.post('/members/import_csv', {
'csvFile': csvFile,
'delimiter': ';',
'payment_source': 'AYY'
}, follow=True)
self.assertEqual(response.status_code, 200) self.assertEqual(response.status_code, 200)
def test_import_csv_multi_line(self): def test_import_csv_multi_line(self):
"""Test csv import with multilined csv.""" """Test csv import with multilined csv."""
data = ('Teppo, Tulppu, teppo@tulppu.fi, Ankkalinna, 0, 0\n'
'Reiska, Remontti, remontti@reiska.fi, Värisilmä, 1, 1')
response = self.c.post('/members/import_csv', {'textarea': data}, follow=True) current_dir = os.path.dirname(os.path.abspath(__file__))
with open(os.path.join(current_dir, 'test_resources', 'multi_line_import.csv')) as csvFile:
response = self.c.post('/members/import_csv', {
'csvFile': csvFile,
'delimiter': ';',
'payment_source': 'AYY'
}, follow=True)
self.assertEqual(response.status_code, 200) self.assertEqual(response.status_code, 200)
def test_autocomplete_search_found(self): def test_autocomplete_search_found(self):
@@ -87,3 +106,50 @@ class MemberRegisterTestCase(TestCase):
response = self.c.get('/members/check?email={}'.format(email), follow=True) response = self.c.get('/members/check?email={}'.format(email), follow=True)
self.assertEqual(response.status_code, 401) self.assertEqual(response.status_code, 401)
def test_export_members_excel(self):
"""Test if the user can download an excel file of the member register"""
resp = self.c.get('/members/export_members')
content_type = 'application/vnd.ms-excel'
self.assertIn(content_type, resp['Content-Type'])
content = resp.content
arrays = pyexcel.get_array(file_content=content, file_type='xlsx')
tidus_array = ['Tidus', 'Tester', 'tidus@tester.fi', '', '0', '0']
self.assertIn(tidus_array, arrays)
def test_export_payments_excel(self):
"""Test if the user can download an excel file of the payment register"""
resp = self.c.get('/members/export_payments')
content_type = 'application/vnd.ms-excel'
self.assertIn(content_type, resp['Content-Type'])
content = resp.content
arrays = pyexcel.get_array(file_content=content, file_type='xlsx')
created = Payment.objects.get(member__email='tidus@tester.fi').date.strftime('%Y-%m-%d %H:%M:%S')
tidus_array = ['Tidus Tester', created, 'AYY']
self.assertIn(tidus_array, arrays)
def test_export_applications_excel(self):
"""Test if the user can download an excel file of the member application register"""
resp = self.c.get('/members/export_applications')
content_type = 'application/vnd.ms-excel'
self.assertIn(content_type, resp['Content-Type'])
content = resp.content
arrays = pyexcel.get_array(file_content=content, file_type='xlsx')
submitted = Request.objects.get(email='liisa.mattila@pylly.com').submitted.strftime('%Y-%m-%d %H:%M:%S')
liisa_array = ['Liisa', 'Mattila', 'liisa.mattila@pylly.com', 'Kouvola', '1', '0', submitted]
self.assertIn(liisa_array, arrays)
def test_submit_member_application(self):
"""Test if submitting a member application works"""
data = {
'first_name': 'Seppo', 'last_name': 'Saastamoinen',
'email': 'seppo@saastamoin.en', 'jas': 'on',
'POR': 'Dipolin viinibaari'
}
resp = self.c.post('/members/submit_application', data=data)
self.assertEqual(resp.status_code, 200)
self.assertTrue(Request.objects.filter(email='seppo@saastamoin.en').exists())
+12 -25
View File
@@ -14,6 +14,7 @@ import html
from members.views.utils import * from members.views.utils import *
from members.tables import RequestTable from members.tables import RequestTable
from members.forms import ApplicationForm from members.forms import ApplicationForm
from members.views import error_view
@ensure_csrf_cookie @ensure_csrf_cookie
@@ -47,8 +48,7 @@ def application_edit(request, *args, **kwargs):
"""Edit member request information.""" """Edit member request information."""
i = kwargs.pop('index', None) i = kwargs.pop('index', None)
if i is None: if i is None:
return render( return error_view(request, _('No application id specified'))
request, 'error.html', {'error': _('No application id specified')})
else: else:
application = Request.objects.get(id=i) application = Request.objects.get(id=i)
form = ApplicationForm(instance=application) form = ApplicationForm(instance=application)
@@ -68,9 +68,7 @@ def application_accept(request, *args, **kwargs):
if id is not None: if id is not None:
application = Request.objects.get(id=id) application = Request.objects.get(id=id)
else: else:
return render(request, return error_view(request, _("Application missing 'id' field."))
'error.html',
{'error': _("Application missing 'id' field.")})
form = ApplicationForm(request.POST, instance=application) form = ApplicationForm(request.POST, instance=application)
if form.is_valid(): if form.is_valid():
@@ -78,9 +76,9 @@ def application_accept(request, *args, **kwargs):
application = form.save() application = form.save()
if Member.objects.filter(email=application.email).exists(): if Member.objects.filter(email=application.email).exists():
return render(request, return error_view(request, _(
'error.html', 'Email {} is already in use by a member. Application cannot be accepted.'
{'error': _('Email {} is already in use by a member. Application cannot be accepted.').format(application.email)}) ).format(application.email))
member = application.to_member() member = application.to_member()
member.save() member.save()
@@ -96,14 +94,10 @@ def application_accept(request, *args, **kwargs):
'/members/list?notification={}'.format(html.escape(notification))) '/members/list?notification={}'.format(html.escape(notification)))
except Exception as ex: except Exception as ex:
logging.exception('Exception while accepting application') logging.exception('Exception while accepting application')
return render(request, return error_view(request, str(ex))
'error.html',
{'error': str(ex)})
else: else:
logging.info(form) logging.info(form)
return render(request, return error_view(request, form.errors)
'error.html',
{'error': form.errors})
@ensure_csrf_cookie @ensure_csrf_cookie
@@ -115,8 +109,7 @@ def application_delete(request, *args, **kwargs):
try: try:
id = request.POST['id'] id = request.POST['id']
except KeyError: except KeyError:
return render( return error_view(request, _('No application id specified'))
request, 'error.html', {'error': _('No application id specified')})
try: try:
application = Request.objects.get(id=id) application = Request.objects.get(id=id)
@@ -130,9 +123,7 @@ def application_delete(request, *args, **kwargs):
'/members/applications?notification={}' '/members/applications?notification={}'
.format(html.escape(notification))) .format(html.escape(notification)))
except: except:
return render(request, return error_view(request, _('Could not delete application object'))
'error.html',
{'error': _('Could not delete application object')})
@ensure_csrf_cookie @ensure_csrf_cookie
@@ -143,9 +134,7 @@ def application_delete_confirm(request, *args, **kwargs):
"""Confirm application deletion.""" """Confirm application deletion."""
i = kwargs.pop('index', None) i = kwargs.pop('index', None)
if i is None: if i is None:
return render(request, return error_view(request, _('No application id specified'))
'error.html',
{'error': _('No application id specified')})
else: else:
application = Request.objects.get(id=i) application = Request.objects.get(id=i)
form = ApplicationForm(instance=application) form = ApplicationForm(instance=application)
@@ -172,6 +161,4 @@ def application_submit(request, *args, **kwargs):
form.save() form.save()
return render(request, 'application_success.html', {}) return render(request, 'application_success.html', {})
else: else:
return render(request, return error_view(request, form.errors)
'error.html',
{'error': form.errors})
+7 -18
View File
@@ -70,8 +70,7 @@ def member_delete_confirm(request, *args, **kwargs):
"""Render member deletion confirmation page.""" """Render member deletion confirmation page."""
i = kwargs.pop('index', None) i = kwargs.pop('index', None)
if i is None: if i is None:
return render(request, 'error.html', return error_view(request, _('No member id specified'))
{'error': _('No member id specified')})
else: else:
member = Member.objects.get(id=i) member = Member.objects.get(id=i)
form = MemberForm(instance=member) form = MemberForm(instance=member)
@@ -133,7 +132,7 @@ def member_submit(request, *args, **kwargs):
return HttpResponseRedirect( return HttpResponseRedirect(
'/members/list?notification={}'.format(html.escape(notification))) '/members/list?notification={}'.format(html.escape(notification)))
else: else:
return render(request, 'error.html', {'error': form.errors}) return error_view(request, form.errors)
@ensure_csrf_cookie @ensure_csrf_cookie
@@ -147,10 +146,7 @@ def member_update(request, *args, **kwargs):
if id is not None: if id is not None:
member = Member.objects.get(id=id) member = Member.objects.get(id=id)
else: else:
return render(request, return error_view(request, _("Member missing 'id' field."))
'error.html',
{'error': _("Member missing 'id' field.")})
logging.debug(member)
form = MemberForm(request.POST, instance=member) form = MemberForm(request.POST, instance=member)
if form.is_valid(): if form.is_valid():
@@ -164,10 +160,7 @@ def member_update(request, *args, **kwargs):
return HttpResponseRedirect( return HttpResponseRedirect(
'/members/list?notification={}'.format(html.escape(notification))) '/members/list?notification={}'.format(html.escape(notification)))
else: else:
return render( return error_view(request, form.errors)
request,
'error.html',
{'error': form.errors})
@ensure_csrf_cookie @ensure_csrf_cookie
@@ -179,8 +172,7 @@ def member_delete(request, *args, **kwargs):
try: try:
id = request.POST['id'] id = request.POST['id']
except KeyError: except KeyError:
return render(request, return error_view(request, _('No member id specified'))
'error.html', {'error': _('No member id specified')})
try: try:
member = Member.objects.get(id=id) member = Member.objects.get(id=id)
@@ -193,9 +185,7 @@ def member_delete(request, *args, **kwargs):
return HttpResponseRedirect( return HttpResponseRedirect(
'/members/list?notification={}'.format(html.escape(notification))) '/members/list?notification={}'.format(html.escape(notification)))
except: except:
return render(request, return error_view(request, _('Could not delete member object'))
'error.html',
{'error': _('Could not delete member object')})
@ensure_csrf_cookie @ensure_csrf_cookie
@@ -206,8 +196,7 @@ def member_edit(request, *args, **kwargs):
"""Edit member information.""" """Edit member information."""
i = kwargs.pop('index', None) i = kwargs.pop('index', None)
if i is None: if i is None:
return render( return error_view(request, _('No member id specified'))
request, 'error.html', {'error': _('No member id specified')})
else: else:
member = Member.objects.get(id=i) member = Member.objects.get(id=i)
form = MemberForm(instance=member) form = MemberForm(instance=member)
+7 -16
View File
@@ -14,6 +14,7 @@ import html
from members.views.utils import * from members.views.utils import *
from members.tables import PaymentTable from members.tables import PaymentTable
from members.forms import PaymentForm from members.forms import PaymentForm
from members.views import error_view
@ensure_csrf_cookie @ensure_csrf_cookie
@@ -73,7 +74,7 @@ def payment_submit(request, *args, **kwargs):
'/members/payments?notification={}' '/members/payments?notification={}'
.format(html.escape(notification))) .format(html.escape(notification)))
else: else:
return render(request, 'error.html', {'error': form.errors}) return error_view(request, form.errors)
@ensure_csrf_cookie @ensure_csrf_cookie
@@ -84,9 +85,7 @@ def payment_edit(request, *args, **kwargs):
"""Edit payment.""" """Edit payment."""
i = kwargs.pop('index', None) i = kwargs.pop('index', None)
if i is None: if i is None:
return render(request, return error_view(request, _('No payment id specified'))
'error.html',
{'error': _('No payment id specified')})
else: else:
payment = Payment.objects.get(id=i) payment = Payment.objects.get(id=i)
form = PaymentForm(instance=payment) form = PaymentForm(instance=payment)
@@ -103,9 +102,7 @@ def payment_delete_confirm(request, *args, **kwargs):
"""Render payment delete confirmation page.""" """Render payment delete confirmation page."""
i = kwargs.pop('index', None) i = kwargs.pop('index', None)
if i is None: if i is None:
return render(request, return error_view(request, _('No payment id specified'))
'error.html',
{'error': _('No payment id specified')})
else: else:
payment = Payment.objects.get(id=i) payment = Payment.objects.get(id=i)
form = PaymentForm(instance=payment) form = PaymentForm(instance=payment)
@@ -123,9 +120,7 @@ def payment_delete(request, *args, **kwargs):
try: try:
id = request.POST['id'] id = request.POST['id']
except KeyError: except KeyError:
return render(request, return error_view(request, _('No payment id specified'))
'error.html',
{'error': _('No payment id specified')})
try: try:
payment = Payment.objects.get(id=id) payment = Payment.objects.get(id=id)
@@ -138,9 +133,7 @@ def payment_delete(request, *args, **kwargs):
'/members/payments?notification={}' '/members/payments?notification={}'
.format(html.escape(notification))) .format(html.escape(notification)))
except: except:
return render(request, return error_view(request, _('Could not delete payment object'))
'error.html',
{'error': _('Could not delete payment object')})
@ensure_csrf_cookie @ensure_csrf_cookie
@@ -165,6 +158,4 @@ def payment_update(request, *args, **kwargs):
'/members/payments?notification={}' '/members/payments?notification={}'
.format(html.escape(notification))) .format(html.escape(notification)))
else: else:
return render(request, return error_view(request, _('Could not update payment object'))
'error.html',
{'error': _('Could not update payment object')})
+4 -6
View File
@@ -35,8 +35,8 @@ class MemberDetail(generics.RetrieveAPIView):
throttle_classes = (BurstRateThrottle, SustainedRateThrottle, ) throttle_classes = (BurstRateThrottle, SustainedRateThrottle, )
def error_view(request, message): def error_view(request, message, status=400):
return render(request, 'error.html', {'error': str(message)}) return render(request, 'error.html', {'error': message}, status=400)
def validate_recaptcha(response): def validate_recaptcha(response):
@@ -116,9 +116,7 @@ def import_csv(request, *args, **kwargs):
delimiter = request.POST.get('delimiter', ',') delimiter = request.POST.get('delimiter', ',')
payment_source = request.POST['payment_source'] payment_source = request.POST['payment_source']
except: except:
return render(request, return error_view(request, _('Missing CSV file'))
'error.html',
{'error': _('Missing CSV file')})
try: try:
result = MemberForm.csv_to_models(data, payment_source=payment_source, delimiter=delimiter) result = MemberForm.csv_to_models(data, payment_source=payment_source, delimiter=delimiter)
@@ -127,7 +125,7 @@ def import_csv(request, *args, **kwargs):
return error_view(request, ex.form_errors) return error_view(request, ex.form_errors)
except Exception as ex: except Exception as ex:
logging.exception('Other error in CSV import') logging.exception('Other error in CSV import')
return error_view(request, ex) return error_view(request, str(ex))
member_table = MemberTable(result.members, member_table = MemberTable(result.members,
request=request, request=request,