Skip to content

Commit c10fe9b

Browse files
authored
Merge pull request #219 from NHSDigital/spike-use-django-forms-more-succinctly
SPIKE: Test more succint views with DoB
2 parents 509b40c + b8ed727 commit c10fe9b

7 files changed

Lines changed: 55 additions & 77 deletions

File tree

features/date_of_birth_page.feature

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,4 @@
1+
@DateOfBirth
12
Feature: Date of birth page
23
Scenario: The page is accessible
34
Given I am logged in
@@ -45,6 +46,7 @@ Feature: Date of birth page
4546
And I see "/date-of-birth?change=True" as a link to change "Date of birth" under "Eligibility"
4647
When I click the link to change "Date of birth" under "Eligibility"
4748
Then I am on "/date-of-birth?change=True"
49+
And I see a date 55 years ago filled in
4850
When I fill in and submit my date of birth as 60 years ago
4951
Then I am on "/check-your-answers"
5052
And I see a date 60 years ago as a response to "Date of birth" under "Eligibility"

features/steps/form_steps.py

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -112,3 +112,10 @@ def when_i_submit_the_form(context):
112112
@then(u'I see "{value}" selected')
113113
def then_i_see_value_selected(context, value):
114114
assert context.page.get_by_label(value, exact=True).is_checked()
115+
116+
@then(u'I see a date {years} years ago filled in')
117+
def then_i_see_a_date_x_years_ago_filled_in(context, years):
118+
date_of_birth = datetime.now() - relativedelta(years=int(years))
119+
assert context.page.get_by_label('Day').input_value() == str(date_of_birth.day)
120+
assert context.page.get_by_label('Month').input_value() == str(date_of_birth.month)
121+
assert context.page.get_by_label('Year').input_value() == str(date_of_birth.year)

lung_cancer_screening/questions/models/date_of_birth_response.py

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,6 @@
11
from django.db import models
2+
from datetime import date
3+
from dateutil.relativedelta import relativedelta
24

35
from .base import BaseModel
46
from .response_set import ResponseSet
@@ -7,3 +9,9 @@
79
class DateOfBirthResponse(BaseModel):
810
response_set = models.OneToOneField(ResponseSet, on_delete=models.CASCADE, related_name='date_of_birth_response')
911
value = models.DateField()
12+
13+
def is_currently_in_age_range(self):
14+
fifty_five_years_ago = date.today() - relativedelta(years=55)
15+
seventy_five_years_ago = date.today() - relativedelta(years=75)
16+
17+
return seventy_five_years_ago < self.value <= fifty_five_years_ago

lung_cancer_screening/questions/tests/unit/forms/test_date_of_birth_form.py

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,12 @@
1-
from django.test import TestCase
1+
from django.test import TestCase, tag
22
from datetime import date
33

44
from ...factories.response_set_factory import ResponseSetFactory
55
from ....models.date_of_birth_response import DateOfBirthResponse
66
from ....forms.date_of_birth_form import DateOfBirthForm
77

88

9+
@tag("DateOfBirth")
910
class TestDateOfBirthForm(TestCase):
1011
def setUp(self):
1112
self.response_set = ResponseSetFactory()
Lines changed: 22 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,12 +1,14 @@
1-
from django.test import TestCase
1+
from django.test import TestCase, tag
22
from datetime import date
3+
from dateutil.relativedelta import relativedelta
34

45
from ...factories.response_set_factory import ResponseSetFactory
56
from ...factories.date_of_birth_response_factory import DateOfBirthResponseFactory
67

78
from ....models.date_of_birth_response import DateOfBirthResponse
89

910

11+
@tag("DateOfBirth")
1012
class TestDateOfBirthResponse(TestCase):
1113
def setUp(self):
1214
self.response_set = ResponseSetFactory()
@@ -17,19 +19,33 @@ def test_has_a_valid_factory(self):
1719

1820

1921
def test_has_response_set_as_foreign_key(self):
20-
response_set = ResponseSetFactory()
2122
response = DateOfBirthResponse.objects.create(
22-
response_set=response_set,
23+
response_set=self.response_set,
2324
value=date(2000, 9, 8)
2425
)
2526

26-
self.assertEqual(response.response_set, response_set)
27+
self.assertEqual(response.response_set, self.response_set)
2728

2829
def test_has_value_as_date(self):
29-
response_set = ResponseSetFactory()
3030
response = DateOfBirthResponse.objects.create(
31-
response_set=response_set,
31+
response_set=self.response_set,
3232
value=date(2000, 9, 8)
3333
)
3434

3535
self.assertIsInstance(response.value, date)
36+
37+
def test_is_currently_in_age_range_returns_true_when_in_range(self):
38+
fifty_five_years_ago = date.today() - relativedelta(years=55)
39+
response = DateOfBirthResponseFactory.build(
40+
value=fifty_five_years_ago
41+
)
42+
43+
self.assertTrue(response.is_currently_in_age_range())
44+
45+
def test_is_currently_in_age_range_returns_false_when_too_old(self):
46+
fifty_five_years_ago = date.today() - relativedelta(years=55)
47+
response = DateOfBirthResponseFactory.build(
48+
value=fifty_five_years_ago
49+
)
50+
51+
self.assertTrue(response.is_currently_in_age_range())

lung_cancer_screening/questions/tests/unit/views/test_date_of_birth.py

Lines changed: 3 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
from django.test import TestCase
1+
from django.test import TestCase, tag
22
from django.urls import reverse
33
from datetime import date
44
from dateutil.relativedelta import relativedelta
@@ -8,6 +8,7 @@
88
from lung_cancer_screening.questions.models.date_of_birth_response import DateOfBirthResponse
99

1010

11+
@tag("DateOfBirth")
1112
class TestGetDateOfBirth(TestCase):
1213
def setUp(self):
1314
self.user = login_user(self.client)
@@ -44,6 +45,7 @@ def test_get_responds_successfully(self):
4445
self.assertEqual(response.status_code, 200)
4546

4647

48+
@tag("DateOfBirth")
4749
class TestPostDateOfBirth(TestCase):
4850
def setUp(self):
4951
self.user = login_user(self.client)
@@ -179,17 +181,6 @@ def test_post_responds_with_422_if_the_resource_is_invalid(self):
179181

180182
self.assertEqual(response.status_code, 422)
181183

182-
def test_post_does_not_set_date_of_birth_if_user_not_in_correct_age_range(
183-
self
184-
):
185-
self.client.post(
186-
reverse("questions:date_of_birth"),
187-
self.invalid_params
188-
)
189-
190-
response_set = self.user.responseset_set.first()
191-
if response_set:
192-
self.assertFalse(DateOfBirthResponse.objects.filter(response_set=response_set).exists())
193184

194185
def test_post_redirects_if_user_not_in_correct_age_range(self):
195186
response = self.client.post(
Lines changed: 11 additions & 58 deletions
Original file line numberDiff line numberDiff line change
@@ -1,66 +1,19 @@
1-
from django.shortcuts import render, redirect
2-
from django.urls import reverse
3-
from datetime import date
4-
from dateutil.relativedelta import relativedelta
1+
from django.urls import reverse, reverse_lazy
52

63
from .question_base_view import QuestionBaseView
74
from ..forms.date_of_birth_form import DateOfBirthForm
85
from ..models.date_of_birth_response import DateOfBirthResponse
96

107

118
class DateOfBirthView(QuestionBaseView):
12-
def get(self, request):
13-
response, _ = DateOfBirthResponse.objects.get_or_build(
14-
response_set=request.response_set
15-
)
16-
return render_template(
17-
request,
18-
DateOfBirthForm(instance=response)
19-
)
20-
21-
def post(self, request):
22-
response, _ = DateOfBirthResponse.objects.get_or_build(
23-
response_set=request.response_set
24-
)
25-
form = DateOfBirthForm(
26-
instance=response,
27-
data=request.POST
28-
)
29-
30-
if form.is_valid():
31-
fifty_five_years_ago = date.today() - relativedelta(years=55)
32-
seventy_five_years_ago = date.today() - relativedelta(years=75)
33-
date_of_birth = form.cleaned_data["value"]
34-
35-
age_in_range = (
36-
seventy_five_years_ago < date_of_birth <= fifty_five_years_ago
37-
)
38-
if age_in_range:
39-
response.value = date_of_birth
40-
response.save()
41-
42-
return self.redirect_to_response_or_next_question(
43-
request,
44-
"questions:check_need_appointment"
45-
)
46-
else:
47-
return redirect(reverse("questions:age_range_exit"))
48-
9+
template_name = "question_form.jinja"
10+
form_class = DateOfBirthForm
11+
model = DateOfBirthResponse
12+
success_url = reverse_lazy("questions:check_need_appointment")
13+
back_link_url = reverse_lazy("questions:have_you_ever_smoked")
14+
15+
def get_success_url(self):
16+
if self.object.is_currently_in_age_range():
17+
return super().get_success_url()
4918
else:
50-
return render_template(
51-
request,
52-
form,
53-
status=422
54-
)
55-
56-
57-
def render_template(request, form, status=200):
58-
return render(
59-
request,
60-
"question_form.jinja",
61-
{
62-
"form": form,
63-
"back_link_url": reverse("questions:have_you_ever_smoked")
64-
},
65-
status=status
66-
)
19+
return reverse("questions:age_range_exit")

0 commit comments

Comments
 (0)