From 9a574104446c323f91a3e70823163b6bb480ef49 Mon Sep 17 00:00:00 2001 From: DerGut Date: Mon, 28 May 2018 13:23:50 +0200 Subject: [PATCH] Adds some tests for the models and forms --- creator/forms.py | 4 +- creator/views.py | 4 +- tests/creator/test_forms.py | 119 ++++++++++++++++++++++++++++++ tests/creator/test_models.py | 39 ++++++++-- tests/creator/test_unsubscribe.py | 2 - 5 files changed, 154 insertions(+), 14 deletions(-) create mode 100644 tests/creator/test_forms.py diff --git a/creator/forms.py b/creator/forms.py index ea85970..5a7dbfa 100644 --- a/creator/forms.py +++ b/creator/forms.py @@ -28,7 +28,7 @@ ) -class DetailsForm(forms.Form): +class TimesheetDetailsForm(forms.Form): # Important details surname = forms.CharField( widget=forms.TextInput(attrs={'placeholder': ''}) @@ -135,5 +135,5 @@ def _post_clean(self): return data -class SubscriptionForm(DetailsForm): +class SubscriptionForm(TimesheetDetailsForm): email = forms.EmailField(required=True) diff --git a/creator/views.py b/creator/views.py index acf42a3..f86c15e 100644 --- a/creator/views.py +++ b/creator/views.py @@ -7,7 +7,7 @@ from django.views.generic.edit import FormView from easy_pdf.views import PDFTemplateView -from creator.forms import DetailsForm, SubscriptionForm +from creator.forms import TimesheetDetailsForm, SubscriptionForm from creator.models import Subscription logger = logging.getLogger(__name__) @@ -15,7 +15,7 @@ class DetailsFormView(FormView): template_name = 'creator/home.html' - form_class = DetailsForm + form_class = TimesheetDetailsForm success_url = '/result/' def form_valid(self, form): diff --git a/tests/creator/test_forms.py b/tests/creator/test_forms.py new file mode 100644 index 0000000..be545a6 --- /dev/null +++ b/tests/creator/test_forms.py @@ -0,0 +1,119 @@ +from django.test import TestCase + +from creator.forms import TimesheetDetailsForm, SubscriptionForm + + +class TimesheetDetailsFormTestCase(TestCase): + def setUp(self): + self.valid_data = { + 'surname': 'Test', + 'first_name': 'Test', + 'unit_of_organisation': 'Test', + 'hours': 23, + 'days_worked': '2018-05-01 to 2018-05-30' + } + + def test_valid_input_data(self): + form = TimesheetDetailsForm(data=self.valid_data) + + self.assertTrue(form.is_valid()) + + def test_no_surname_provided(self): + del self.valid_data['surname'] + form = TimesheetDetailsForm(data=self.valid_data) + + self.assertFalse(form.is_valid()) + self.assertTrue(form.has_error('surname')) + + def test_no_first_name_provided(self): + del self.valid_data['first_name'] + form = TimesheetDetailsForm(data=self.valid_data) + + self.assertFalse(form.is_valid()) + self.assertTrue(form.has_error('first_name')) + + def test_negative_hours(self): + self.valid_data['hours'] = -23 + form = TimesheetDetailsForm(data=self.valid_data) + + self.assertFalse(form.is_valid()) + self.assertTrue(form.has_error('hours')) + self.assertEqual( + form.errors['hours'], + ['Please provide a positive number of hours to work'] + ) + + def test_too_many_hours_for_days_worked(self): + self.valid_data['hours'] = 1000 + form = TimesheetDetailsForm(data=self.valid_data) + + self.assertFalse(form.is_valid()) + non_form_errors = form.non_field_errors() + self.assertTrue(len(non_form_errors)) + self.assertEqual( + non_form_errors[0], + 'Too many hours for specified range of month' + ) + + def test_working_days_range_not_in_same_month(self): + self.valid_data['days_worked'] = '2018-05-15 to 2018-06-15' + form = TimesheetDetailsForm(data=self.valid_data) + + self.assertFalse(form.is_valid()) + self.assertTrue(form.has_error('days_worked')) + self.assertEqual( + form.errors['days_worked'], + ['First day and last day are not within the same month'] + ) + + def test_working_days_range_not_in_same_year(self): + self.valid_data['days_worked'] = '2018-05-01 to 2019-05-30' + form = TimesheetDetailsForm(data=self.valid_data) + + self.assertFalse(form.is_valid()) + self.assertTrue(form.has_error('days_worked')) + self.assertEqual( + form.errors['days_worked'], + ['First day and last day are not within the same year'] + ) + + def test_working_days_range_not_in_same_year_and_month(self): + self.valid_data['days_worked'] = '2018-12-15 to 2019-01-15' + form = TimesheetDetailsForm(data=self.valid_data) + + self.assertFalse(form.is_valid()) + self.assertTrue(form.has_error('days_worked')) + self.assertEqual( + form.errors['days_worked'], + ['First day and last day are not within the same year'] + ) + + +class SubscriptionFormTestCase(TestCase): + def setUp(self): + self.valid_data = self.valid_data = { + 'surname': 'Test', + 'first_name': 'Test', + 'unit_of_organisation': 'Test', + 'hours': 23, + 'days_worked': '2018-05-01 to 2018-05-30' + } + + def test_valid_email(self): + self.valid_data['email'] = 'test@bestemailaddressintheworld.com' + form = SubscriptionForm(data=self.valid_data) + + self.assertTrue(form.is_valid()) + + def test_invalid_email(self): + self.valid_data['email'] = 'this_should_be_invalid' + form = SubscriptionForm(data=self.valid_data) + + self.assertFalse(form.is_valid()) + self.assertTrue(form.has_error('email')) + + def test_no_email(self): + form = SubscriptionForm(data=self.valid_data) + + self.assertFalse(form.is_valid()) + self.assertTrue(form.has_error('email')) diff --git a/tests/creator/test_models.py b/tests/creator/test_models.py index 8b1563e..6434360 100644 --- a/tests/creator/test_models.py +++ b/tests/creator/test_models.py @@ -1,14 +1,11 @@ -import datetime - from django.test import TestCase from freezegun import freeze_time +from creator.exceptions import TimesheetCreationError from creator.models import Subscription -TEST_DATE1 = "2018-04-30" - -class SubscriptionTestCase(TestCase): +class SubscriptionManagerTestCase(TestCase): def setUp(self): with freeze_time("2018-04-15"): self.subscription_today = Subscription.objects.create( @@ -19,9 +16,6 @@ def setUp(self): unit_of_organisation='Test' ) - def tearDown(self): - Subscription.objects.all().delete() - def test_due_subscriptions_at_end_of_month(self): with freeze_time("2018-04-29"): subscriptions = Subscription.objects.due_subscriptions() @@ -34,3 +28,32 @@ def test_due_subscriptions_within_month(self): subscriptions = Subscription.objects.due_subscriptions() self.assertEqual(len(subscriptions), 0) + + +class SubscriptionTestCase(TestCase): + def test_generate_pdf_with_valid_data(self): + with freeze_time("2018-04-15"): + subscription = Subscription.objects.create( + email='test@test.com', + first_name='test', + surname='test', + hours=5, + unit_of_organisation='Test' + ) + pdf = subscription.generate_pdf() + self.assertIsInstance(pdf, bytes) + + def test_generate_pdf_with_invalid_data(self): + with freeze_time("2018-04-15"): + subscription = Subscription.objects.create( + email='test@test.com', + first_name='test', + surname='test', + hours=500, + unit_of_organisation='Test' + ) + self.assertRaisesMessage( + TimesheetCreationError, + "Too many hours for specified range of month", + subscription.generate_pdf + ) diff --git a/tests/creator/test_unsubscribe.py b/tests/creator/test_unsubscribe.py index a2912ee..8b12b04 100644 --- a/tests/creator/test_unsubscribe.py +++ b/tests/creator/test_unsubscribe.py @@ -27,8 +27,6 @@ class UnsubscribeClientTestCase(TestCase): class UnsubscribeTestCase(TestCase): @freeze_time(TEST_DATE) def setUp(self): - today = datetime.datetime.today() - self.subscription = Subscription.objects.create( email='test@test.com', first_name='test',