Skip to content

Commit ea9bd3b

Browse files
committed
fixup! Ensure all non eligibility questions can only be answered when eligible
1 parent b9abce2 commit ea9bd3b

3 files changed

Lines changed: 58 additions & 80 deletions

File tree

features/age_when_started_smoking.feature

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -2,12 +2,13 @@
22
Feature: Age when started smoking
33
Scenario: The page is accessible
44
Given I am logged in
5-
And I am 60 years old
5+
And I have answered questions showing I am eligible
66
When I go to "/age-when-started-smoking"
77
Then there are no accessibility violations
88

99
Scenario: Form errors
1010
Given I am logged in
11+
And I have answered questions showing I am eligible
1112
And I am 60 years old
1213
When I go to "/age-when-started-smoking"
1314
And I click "Continue"
@@ -21,15 +22,15 @@ Feature: Age when started smoking
2122

2223
Scenario: Navigating backwards and forwards
2324
Given I am logged in
24-
And I am 60 years old
25+
And I have answered questions showing I am eligible
2526
When I go to "/age-when-started-smoking"
2627
Then I see a back link to "/relatives-age-when-diagnosed"
2728
When I fill in "How old were you when you started smoking?" as "18" and submit
2829
Then I am on "/check-your-answers"
2930

3031
Scenario: Checking responses and changing them
3132
Given I am logged in
32-
And I am 60 years old
33+
And I have answered questions showing I am eligible
3334
When I go to "/age-when-started-smoking"
3435
And I fill in "How old were you when you started smoking?" as "18" and submit
3536
When I go to "/check-your-answers"
Lines changed: 50 additions & 76 deletions
Original file line numberDiff line numberDiff line change
@@ -1,23 +1,15 @@
11
from django.test import TestCase, tag
22
from django.urls import reverse
3-
from django.utils import timezone
4-
from dateutil.relativedelta import relativedelta
5-
6-
7-
8-
from lung_cancer_screening.questions.tests.factories.date_of_birth_response_factory import DateOfBirthResponseFactory
9-
10-
from ...factories.response_set_factory import ResponseSetFactory
11-
123

134
from .helpers.authentication import login_user
5+
from ...factories.response_set_factory import ResponseSetFactory
146

157
@tag("AgeWhenStartedSmoking")
168
class TestGetAgeWhenStartedSmoking(TestCase):
179
def setUp(self):
1810
self.user = login_user(self.client)
1911

20-
def test_get_redirects_if_the_user_is_not_logged_in(self):
12+
def test_redirects_if_the_user_is_not_logged_in(self):
2113
self.client.logout()
2214

2315
response = self.client.get(
@@ -30,9 +22,7 @@ def test_get_redirects_if_the_user_is_not_logged_in(self):
3022
fetch_redirect_response=False
3123
)
3224

33-
def test_get_redirects_when_submitted_response_set_exists_within_last_year(
34-
self
35-
):
25+
def test_redirects_when_an_submitted_response_set_exists_within_the_last_year(self):
3626
ResponseSetFactory.create(
3727
user=self.user,
3828
recently_submitted=True
@@ -44,7 +34,18 @@ def test_get_redirects_when_submitted_response_set_exists_within_last_year(
4434

4535
self.assertRedirects(response, reverse("questions:confirmation"))
4636

47-
def test_get_responds_successfully(self):
37+
def test_redirects_when_the_user_is_not_eligible(self):
38+
ResponseSetFactory.create(user=self.user, eligible=False)
39+
40+
response = self.client.get(
41+
reverse("questions:age_when_started_smoking")
42+
)
43+
44+
self.assertRedirects(response, reverse("questions:have_you_ever_smoked"))
45+
46+
def test_responds_successfully(self):
47+
ResponseSetFactory.create(user=self.user, eligible=True)
48+
4849
response = self.client.get(
4950
reverse("questions:age_when_started_smoking")
5051
)
@@ -57,7 +58,7 @@ def setUp(self):
5758

5859
self.valid_params = {"value": 18}
5960

60-
def test_post_redirects_if_the_user_is_not_logged_in(self):
61+
def test_redirects_if_the_user_is_not_logged_in(self):
6162
self.client.logout()
6263

6364
response = self.client.post(
@@ -71,73 +72,41 @@ def test_post_redirects_if_the_user_is_not_logged_in(self):
7172
fetch_redirect_response=False
7273
)
7374

74-
def test_post_creates_unsubmitted_response_set_when_no_response_set_exists(
75-
self
76-
):
77-
self.client.post(
78-
reverse("questions:age_when_started_smoking")
79-
)
80-
81-
response_set = self.user.responseset_set.first()
82-
self.assertEqual(self.user.responseset_set.count(), 1)
83-
self.assertEqual(response_set.submitted_at, None)
84-
self.assertEqual(response_set.user, self.user)
85-
86-
def test_post_updates_unsubmitted_response_set_when_one_exists(self):
87-
response_set = self.user.responseset_set.create()
88-
DateOfBirthResponseFactory(
89-
response_set=response_set
90-
)
91-
92-
self.client.post(
93-
reverse("questions:age_when_started_smoking")
94-
)
95-
96-
response_set.refresh_from_db()
97-
self.assertEqual(self.user.responseset_set.count(), 1)
98-
self.assertEqual(response_set.submitted_at, None)
99-
self.assertEqual(response_set.user, self.user)
100-
101-
def test_post_creates_new_unsubmitted_response_set_when_submitted_exists_over_year_ago(
102-
self
103-
):
75+
def test_redirects_when_an_submitted_response_set_exists_within_the_last_year(self):
10476
ResponseSetFactory.create(
10577
user=self.user,
106-
not_recently_submitted=True
78+
recently_submitted=True
10779
)
10880

109-
self.client.post(
110-
reverse("questions:age_when_started_smoking")
81+
response = self.client.post(
82+
reverse("questions:age_when_started_smoking"),
83+
self.valid_params
11184
)
11285

113-
self.assertEqual(self.user.responseset_set.count(), 2)
114-
self.assertEqual(self.user.responseset_set.unsubmitted().count(), 1)
86+
self.assertRedirects(response, reverse("questions:confirmation"))
11587

116-
response_set = self.user.responseset_set.last()
117-
self.assertEqual(response_set.submitted_at, None)
118-
self.assertEqual(response_set.user, self.user)
119-
120-
def test_post_redirects_when_submitted_response_set_exists_within_last_year(
121-
self
122-
):
123-
ResponseSetFactory.create(
124-
user=self.user,
125-
recently_submitted=True
126-
)
88+
def test_redirects_when_the_user_is_not_eligible(self):
89+
ResponseSetFactory.create(user=self.user)
12790

12891
response = self.client.post(
129-
reverse("questions:age_when_started_smoking")
92+
reverse("questions:age_when_started_smoking"),
93+
self.valid_params
13094
)
13195

132-
self.assertRedirects(response, reverse("questions:confirmation"))
96+
self.assertRedirects(response, reverse("questions:have_you_ever_smoked"))
97+
98+
def test_creates_an_age_when_started_smoking_response(self):
99+
response_set = ResponseSetFactory.create(user=self.user, eligible=True)
100+
101+
self.client.post(reverse("questions:age_when_started_smoking"), self.valid_params)
133102

134-
def test_post_redirects_to_responses(self):
135-
self.response_set = ResponseSetFactory()
136-
DateOfBirthResponseFactory(
137-
response_set=self.response_set,
138-
value=timezone.now() - relativedelta(years=int(60))
103+
response_set.refresh_from_db()
104+
self.assertEqual(
105+
response_set.age_when_started_smoking_response.value, self.valid_params["value"]
139106
)
140-
self.user.responseset_set.set({self.response_set})
107+
108+
def test_redirects_to_responses(self):
109+
ResponseSetFactory.create(user=self.user, eligible=True)
141110

142111
response = self.client.post(
143112
reverse("questions:age_when_started_smoking"),
@@ -146,13 +115,8 @@ def test_post_redirects_to_responses(self):
146115

147116
self.assertRedirects(response, reverse("questions:responses"))
148117

149-
def test_post_redirects_to_responses_if_change_query_param_is_true(self):
150-
self.response_set = ResponseSetFactory()
151-
DateOfBirthResponseFactory(
152-
response_set=self.response_set,
153-
value=timezone.now() - relativedelta(years=int(60))
154-
)
155-
self.user.responseset_set.set({self.response_set})
118+
def test_redirects_to_responses_if_change_query_param_is_true(self):
119+
ResponseSetFactory.create(user=self.user, eligible=True)
156120

157121
response = self.client.post(
158122
reverse("questions:age_when_started_smoking"),
@@ -163,3 +127,13 @@ def test_post_redirects_to_responses_if_change_query_param_is_true(self):
163127
)
164128

165129
self.assertRedirects(response, reverse("questions:responses"))
130+
131+
def test_responds_with_422_if_the_response_fails_to_create(self):
132+
ResponseSetFactory.create(user=self.user, eligible=True)
133+
134+
response = self.client.post(
135+
reverse("questions:age_when_started_smoking"),
136+
{"value": "not a valid age"}
137+
)
138+
139+
self.assertEqual(response.status_code, 422)

lung_cancer_screening/questions/views/age_when_started_smoking.py

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,13 @@
11
from django.urls import reverse_lazy
2+
from django.contrib.auth.mixins import LoginRequiredMixin
23

4+
from .mixins.ensure_response_set import EnsureResponseSet
5+
from .mixins.ensure_eligible import EnsureEligibleMixin
36
from .question_base_view import QuestionBaseView
47
from ..forms.age_when_started_smoking_form import AgeWhenStartedSmokingForm
58
from ..models.age_when_started_smoking_response import AgeWhenStartedSmokingResponse
69

7-
class AgeWhenStartedSmokingView(QuestionBaseView):
10+
class AgeWhenStartedSmokingView(LoginRequiredMixin, EnsureResponseSet, EnsureEligibleMixin, QuestionBaseView):
811
template_name = "question_form.jinja"
912
form_class = AgeWhenStartedSmokingForm
1013
model = AgeWhenStartedSmokingResponse

0 commit comments

Comments
 (0)