Skip to content

Commit ea5caad

Browse files
committed
Redirect users to exit page if not correct age
1 parent 02115af commit ea5caad

File tree

9 files changed

+160
-17
lines changed

9 files changed

+160
-17
lines changed

lung_cancer_screening/core/tests/acceptance/test_questionnaire.py

Lines changed: 8 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,8 @@
11
import os
22
from django.contrib.staticfiles.testing import StaticLiveServerTestCase
33
from playwright.sync_api import sync_playwright, expect
4-
4+
from datetime import datetime
5+
from dateutil.relativedelta import relativedelta
56

67
class TestQuestionnaire(StaticLiveServerTestCase):
78

@@ -33,12 +34,14 @@ def test_full_questionaire_user_journey(self):
3334
expect(page.locator("legend")).to_have_text(
3435
"What is your date of birth?")
3536

36-
page.fill("input[name='day']", "8")
37-
page.fill("input[name='month']", "9")
38-
page.fill("input[name='year']", "2000")
37+
age = datetime.now() - relativedelta(years=55)
38+
39+
page.fill("input[name='day']", str(age.day))
40+
page.fill("input[name='month']", str(age.month))
41+
page.fill("input[name='year']", str(age.year))
3942

4043
page.click("text=Continue")
4144

4245
expect(page).to_have_url(f"{self.live_server_url}/responses")
4346

44-
expect(page.locator(".responses")).to_have_text("2000-09-08")
47+
expect(page.locator(".responses")).to_have_text(age.strftime("%Y-%m-%d"))
Lines changed: 49 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,49 @@
1+
import os
2+
from django.contrib.staticfiles.testing import StaticLiveServerTestCase
3+
from playwright.sync_api import sync_playwright, expect
4+
from datetime import datetime
5+
from dateutil.relativedelta import relativedelta
6+
7+
8+
class TestQuestionnaire(StaticLiveServerTestCase):
9+
10+
@classmethod
11+
def setUpClass(cls):
12+
os.environ["DJANGO_ALLOW_ASYNC_UNSAFE"] = "true"
13+
super().setUpClass()
14+
cls.playwright = sync_playwright().start()
15+
cls.browser = cls.playwright.chromium.launch()
16+
17+
@classmethod
18+
def tearDownClass(cls):
19+
super().tearDownClass()
20+
cls.browser.close()
21+
cls.playwright.stop()
22+
23+
def test_participant_out_of_age_range(self):
24+
participant_id = '123'
25+
26+
page = self.browser.new_page()
27+
page.goto(f"{self.live_server_url}/start")
28+
29+
page.fill("input[name='participant_id']", participant_id)
30+
31+
page.click('text=Start now')
32+
33+
expect(page).to_have_url(f"{self.live_server_url}/date-of-birth")
34+
35+
expect(page.locator("legend")).to_have_text(
36+
"What is your date of birth?")
37+
38+
age = datetime.now() - relativedelta(years=20)
39+
40+
page.fill("input[name='day']", str(age.day))
41+
page.fill("input[name='month']", str(age.month))
42+
page.fill("input[name='year']", str(age.year))
43+
44+
page.click("text=Continue")
45+
46+
expect(page).to_have_url(f"{self.live_server_url}/age-range-exit")
47+
48+
expect(page.locator(".title")).to_have_text(
49+
"You do not need an NHS lung health check")
Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,13 @@
1+
{% extends 'layout.jinja' %}
2+
{% from 'button/macro.jinja' import button %}
3+
{% from 'input/macro.jinja' import input %}
4+
5+
{% block content %}
6+
<div class="nhsuk-grid-row">
7+
<div class="nhsuk-grid-column-two-thirds">
8+
<h2 class="title">You do not need an NHS lung health check</h2>
9+
10+
<p>The NHS lung health check is for people between the ages of 55 and 74.</p>
11+
</div>
12+
</div>
13+
{% endblock %}

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

Lines changed: 35 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,13 +1,27 @@
11
from django.test import TestCase
22
from django.urls import reverse
33
from datetime import date
4+
from dateutil.relativedelta import relativedelta
45

56
from lung_cancer_screening.questions.models.participant import Participant
67
from lung_cancer_screening.questions.models.questionnaire_response import QuestionnaireResponse
78

89
class TestPostDateOfBirth(TestCase):
910
def setUp(self):
1011
self.participant = Participant.objects.create(unique_id="12345")
12+
self.valid_age = date.today() - relativedelta(years=55)
13+
self.valid_params = {
14+
"day": self.valid_age.day,
15+
"month": self.valid_age.month,
16+
"year": self.valid_age.year
17+
}
18+
19+
self.invalid_age = date.today() - relativedelta(years=20)
20+
self.invalid_params = {
21+
"day": self.invalid_age.day,
22+
"month": self.invalid_age.month,
23+
"year": self.invalid_age.year
24+
}
1125

1226
session = self.client.session
1327
session['participant_id'] = self.participant.unique_id
@@ -44,33 +58,33 @@ def test_post_redirects_if_the_particpant_does_not_exist(self):
4458

4559
response = self.client.post(
4660
reverse("questions:date_of_birth"),
47-
{"day": "8", "month": "9", "year": "2000"}
61+
self.valid_params
4862
)
4963

5064
self.assertRedirects(response, reverse("questions:start"))
5165

5266
def test_post_stores_a_valid_questionnaire_response_for_the_participant(self):
5367
self.client.post(
5468
reverse("questions:date_of_birth"),
55-
{"day": "8", "month": "9", "year": "2000"}
69+
self.valid_params
5670
)
5771

5872
questionnaire_response = QuestionnaireResponse.objects.first()
59-
self.assertEqual(questionnaire_response.value, date(2000, 9, 8))
73+
self.assertEqual(questionnaire_response.value, self.valid_age)
6074
self.assertEqual(questionnaire_response.participant, self.participant)
6175

6276
def test_post_sets_the_participant_id_in_session(self):
6377
self.client.post(
6478
reverse("questions:date_of_birth"),
65-
{"day": "8", "month": "9", "year": "2000"}
79+
self.valid_params
6680
)
6781

6882
self.assertEqual(self.client.session["participant_id"], "12345")
6983

7084
def test_post_redirects_to_responses_path(self):
7185
response = self.client.post(
7286
reverse("questions:date_of_birth"),
73-
{"day": "8", "month": "9", "year": "2000"}
87+
self.valid_params
7488
)
7589

7690
self.assertRedirects(response, reverse("questions:responses"))
@@ -82,3 +96,19 @@ def test_post_responds_with_422_if_the_questionnaire_response_fails_to_create(se
8296
)
8397

8498
self.assertEqual(response.status_code, 422)
99+
100+
def test_post_does_not_create_a_questionnaire_response_if_the_user_is_not_in_the_correct_age_range(self):
101+
response = self.client.post(
102+
reverse("questions:date_of_birth"),
103+
self.invalid_params
104+
)
105+
106+
self.assertEqual(QuestionnaireResponse.objects.count(), 0)
107+
108+
def test_post_redirects_if_the_user_is_not_in_the_correct_age_range(self):
109+
response = self.client.post(
110+
reverse("questions:date_of_birth"),
111+
self.invalid_params
112+
)
113+
114+
self.assertRedirects(response, reverse("questions:age_range_exit"))

lung_cancer_screening/questions/urls.py

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -18,9 +18,11 @@
1818
from .views.start import start
1919
from .views.date_of_birth import date_of_birth
2020
from .views.responses import responses
21+
from .views.age_range_exit import age_range_exit
2122

2223
urlpatterns = [
2324
path('start', start, name='start'),
2425
path('date-of-birth', date_of_birth, name='date_of_birth'),
25-
path('responses', responses, name='responses')
26+
path('responses', responses, name='responses'),
27+
path('age-range-exit', age_range_exit, name='age_range_exit'),
2628
]
Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,11 @@
1+
from django.shortcuts import render, redirect
2+
from django.urls import reverse
3+
from django.core.exceptions import ValidationError
4+
5+
from lung_cancer_screening.questions.models.participant import Participant
6+
7+
def age_range_exit(request):
8+
return render(
9+
request,
10+
"age_range_exit.jinja"
11+
)

lung_cancer_screening/questions/views/date_of_birth.py

Lines changed: 12 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
from django.shortcuts import render, redirect
22
from django.urls import reverse
33
from datetime import date
4+
from dateutil.relativedelta import relativedelta
45

56
from ..models.participant import Participant
67
from ..models.questionnaire_response import QuestionnaireResponse
@@ -21,12 +22,18 @@ def date_of_birth(request):
2122
int(request.POST['day'])
2223
)
2324

24-
QuestionnaireResponse.objects.create(
25-
participant=participant,
26-
value=value
27-
)
25+
fifty_five_years_ago = date.today() - relativedelta(years=55)
26+
seventy_five_years_ago = date.today() - relativedelta(years=75)
27+
28+
if value in (fifty_five_years_ago, seventy_five_years_ago):
29+
QuestionnaireResponse.objects.create(
30+
participant=participant,
31+
value=value
32+
)
2833

29-
return redirect(reverse("questions:responses"))
34+
return redirect(reverse("questions:responses"))
35+
else:
36+
return redirect(reverse("questions:age_range_exit"))
3037

3138
# TODO: Understand how to do validation for dates - either model
3239
# or Form validator

poetry.lock

Lines changed: 28 additions & 1 deletion
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

pyproject.toml

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,7 @@ dependencies = [
1111
"psycopg2-binary (>=2.9.10,<3.0.0)",
1212
"nhsuk-frontend-jinja (>=0.3.1,<0.4.0)",
1313
"gunicorn (>=23.0.0,<24.0.0)",
14+
"python-dateutil (>=2.9.0.post0,<3.0.0)",
1415
]
1516

1617
[tool.poetry]

0 commit comments

Comments
 (0)