Fixed IBAN validation and amount field in exenses claim and added some tests

This commit is contained in:
Leo Kivikunnas
2019-06-03 19:35:08 +03:00
parent 7e31f72301
commit 2bf19d357e
5 changed files with 727 additions and 686 deletions
+21 -34
View File
@@ -1,43 +1,30 @@
"""Expenses claim form.""" """Expenses claim form."""
from django import forms from django import forms
from string import ascii_uppercase
class IBANField(forms.CharField):
"""Field that validates Bank Account numbers
acording to the IBAN standard."""
def to_python(self, data):
"""1. Remove spaces
2. Move the country code and two check digits to the end
3. Replace all letters so that A=10, B=11 ... Z=35"""
# TODO: Field validation not working?
if not data:
return data
print(data)
data.replace(" ", "")
data = data[4:] + data[0:4]
LETTERS = {letter: str(index) for index,
letter in enumerate(ascii_uppercase, start=10)}
data = data.upper()
data = [LETTERS[char] for char in data if char in LETTERS]
print(data)
return ''.join(data)
def validate(self, data):
"""Validate value constructed by normalize"""
super().validate(data)
if int(data) % 97 != 1:
raise forms.ValidationError("Invalid IBAN number!")
return data
class ExpensesClaim(forms.Form): class ExpensesClaim(forms.Form):
"""Expenses claim form""" """Expenses claim form"""
name = forms.CharField(label='Nimi', max_length=100) name = forms.CharField(label='Nimi', max_length=100)
iban = IBANField(label='IBAN', max_length=100) iban = forms.CharField(label='IBAN', max_length=100)
amount = forms.CharField(label="Summa", max_length=100) amount = forms.DecimalField(label="Summa", decimal_places=2)
def clean_iban(self):
"""Validate IBAN."""
data = self.cleaned_data['iban']
# Remove spaces.
data = data.replace(" ", "")
# Move first 4 symbols to the end of the string.
data = data[4:] + data[0:4]
LETTERS = {letter: str(index) for index,
letter in enumerate(ascii_uppercase, start=10)}
data = data.upper()
# Replace all letters with numbers, so that A=10, B=11, ..., Z=35.
data = [LETTERS[char] if char in LETTERS else char for char in data]
data = ''.join(data)
# If data modulo 97 != 1 the IBAN number is invalid.
if int(data) % 97 != 1:
raise forms.ValidationError("Invalid IBAN number!")
return data
+3 -2
View File
@@ -1,6 +1,7 @@
Dis is claim Dis is claim
<form action="" method="get"> <form action="" method="post">
{{ form }} {{ form }}
<input type="submit" value="Submit"> <input type="submit" value="Submit">
</form> {% csrf_token %}
</form>
+52 -1
View File
@@ -1,3 +1,54 @@
from django.test import TestCase from django.test import TestCase
from .forms import ExpensesClaim
# Create your tests here.
class ExpensesClaimTest(TestCase):
"""Test expenses claim form."""
def test_valid_data1(self):
form = ExpensesClaim({
'name': "John Doe",
'iban': "FI37 1590 3000 0007 76",
'amount': 12.54
})
self.assertTrue(form.is_valid())
def test_valid_data2(self):
form = ExpensesClaim({
'name': "John Cena",
'iban': "AL35202111090000000001234567",
'amount': 12
})
self.assertTrue(form.is_valid())
def test_valid_data3(self):
form = ExpensesClaim({
'name': "John Wayne",
'iban': "BR1500000000000010932840814P2",
'amount': 12.0
})
self.assertTrue(form.is_valid())
def test_invalid_iban(self):
form = ExpensesClaim({
'name': "John Lennon",
'iban': "FI3734 1590 3000 0007 76",
'amount': 12.54
})
self.assertFalse(form.is_valid())
def test_invalid_amount(self):
form = ExpensesClaim({
'name': "John Kenedy",
'iban': "FI37 1590 3000 0007 76",
'amount': "asd"
})
self.assertFalse(form.is_valid())
def test_invalid_amount_decimal_places(self):
form = ExpensesClaim({
'name': "John Travolta",
'iban': "FI37 1590 3000 0007 76",
'amount': 12.544
})
self.assertFalse(form.is_valid())
+2
View File
@@ -2,8 +2,10 @@
from django.shortcuts import render from django.shortcuts import render
from django.views.decorators.http import require_http_methods from django.views.decorators.http import require_http_methods
from django.http import HttpResponse
from .forms import ExpensesClaim from .forms import ExpensesClaim
# Allow only GET or POST # Allow only GET or POST
@require_http_methods(["GET", "POST"]) @require_http_methods(["GET", "POST"])
def claim(request): def claim(request):
+649 -649
View File
File diff suppressed because it is too large Load Diff