Skip to content

Commit 056ad20

Browse files
committed
Make HaveYouEverSmoked use simpler view pattern
1 parent 1468d89 commit 056ad20

6 files changed

Lines changed: 66 additions & 71 deletions

File tree

features/have_you_ever_smoked_page.feature

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,4 @@
1+
@HaveYouEverSmoked
12
Feature: Have you ever smoked page
23
Scenario: The page is accessible
34
Given I am logged in
@@ -36,6 +37,7 @@ Feature: Have you ever smoked page
3637
And I see "/have-you-ever-smoked?change=True" as a link to change "Have you ever smoked tobacco?" under "Eligibility"
3738
When I click the link to change "Have you ever smoked tobacco?" under "Eligibility"
3839
Then I am on "/have-you-ever-smoked?change=True"
40+
And I see "Yes, I used to smoke" selected
3941
When I fill in and submit my smoking status with "Yes, I currently smoke"
4042
Then I am on "/check-your-answers"
4143
And I see "Yes, I currently smoke" as a response to "Have you ever smoked tobacco?" under "Eligibility"

lung_cancer_screening/questions/models/have_you_ever_smoked_response.py

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -14,3 +14,9 @@ class HaveYouEverSmokedValues(models.IntegerChoices):
1414
class HaveYouEverSmokedResponse(BaseModel):
1515
response_set = models.OneToOneField(ResponseSet, on_delete=models.CASCADE, related_name='have_you_ever_smoked_response')
1616
value = models.IntegerField(choices=HaveYouEverSmokedValues.choices)
17+
18+
def has_smoked_regularly(self):
19+
return self.value in [
20+
HaveYouEverSmokedValues.YES_I_USED_TO_SMOKE_REGULARLY.value,
21+
HaveYouEverSmokedValues.YES_I_CURRENTLY_SMOKE.value
22+
]

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

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

33
from ...factories.response_set_factory import ResponseSetFactory
44
from ....models.have_you_ever_smoked_response import HaveYouEverSmokedResponse, HaveYouEverSmokedValues
55
from ....forms.have_you_ever_smoked_form import HaveYouEverSmokedForm
66

77

8+
@tag("HaveYouEverSmoked")
89
class TestHaveYouEverSmokedForm(TestCase):
910
def setUp(self):
1011
self.response_set = ResponseSetFactory()
Lines changed: 37 additions & 6 deletions
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

33
from ...factories.response_set_factory import ResponseSetFactory
44
from ...factories.have_you_ever_smoked_response_factory import HaveYouEverSmokedResponseFactory
55

66
from ....models.have_you_ever_smoked_response import HaveYouEverSmokedResponse, HaveYouEverSmokedValues
77

88

9+
@tag("HaveYouEverSmoked")
910
class TestHaveYouEverSmokedResponse(TestCase):
1011
def setUp(self):
1112
self.response_set = ResponseSetFactory()
@@ -16,22 +17,52 @@ def test_has_a_valid_factory(self):
1617

1718

1819
def test_has_response_set_as_foreign_key(self):
19-
response_set = ResponseSetFactory()
2020
response = HaveYouEverSmokedResponse.objects.create(
21-
response_set=response_set,
21+
response_set=self.response_set,
2222
value=HaveYouEverSmokedValues.YES_I_CURRENTLY_SMOKE
2323
)
2424

25-
self.assertEqual(response.response_set, response_set)
25+
self.assertEqual(response.response_set, self.response_set)
2626

2727
def test_has_value_as_enum(self):
28-
response_set = ResponseSetFactory()
2928
response = HaveYouEverSmokedResponse.objects.create(
30-
response_set=response_set,
29+
response_set=self.response_set,
3130
value=HaveYouEverSmokedValues.YES_I_USED_TO_SMOKE_REGULARLY
3231
)
3332

3433
self.assertEqual(
3534
response.get_value_display(),
3635
HaveYouEverSmokedValues.YES_I_USED_TO_SMOKE_REGULARLY.label
3736
)
37+
38+
def test_has_smoked_regularly_returns_truewhen_they_currently_smoke(self):
39+
response = HaveYouEverSmokedResponse.objects.create(
40+
response_set=self.response_set,
41+
value=HaveYouEverSmokedValues.YES_I_CURRENTLY_SMOKE
42+
)
43+
44+
self.assertTrue(response.has_smoked_regularly())
45+
46+
def test_has_smoked_regularly_returns_true_when_they_used_to_smoke_regularly(self):
47+
response = HaveYouEverSmokedResponse.objects.create(
48+
response_set=self.response_set,
49+
value=HaveYouEverSmokedValues.YES_I_USED_TO_SMOKE_REGULARLY
50+
)
51+
52+
self.assertTrue(response.has_smoked_regularly())
53+
54+
def test_has_smoked_regularly_returns_false_when_they_have_smoked_a_few_times(self):
55+
response = HaveYouEverSmokedResponse.objects.create(
56+
response_set=self.response_set,
57+
value=HaveYouEverSmokedValues.YES_BUT_ONLY_A_FEW_TIMES
58+
)
59+
60+
self.assertFalse(response.has_smoked_regularly())
61+
62+
def test_has_smoked_regularly_returns_false_when_they_have_never_smoked(self):
63+
response = HaveYouEverSmokedResponse.objects.create(
64+
response_set=self.response_set,
65+
value=HaveYouEverSmokedValues.NO_I_HAVE_NEVER_SMOKED
66+
)
67+
68+
self.assertFalse(response.has_smoked_regularly())

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

Lines changed: 4 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,13 @@
11
from dateutil.relativedelta import relativedelta
2-
from django.test import TestCase
2+
from django.test import TestCase, tag
33
from django.urls import reverse
44
from django.utils import timezone
55

66
from .helpers.authentication import login_user
77
from lung_cancer_screening.questions.models.have_you_ever_smoked_response import HaveYouEverSmokedResponse, HaveYouEverSmokedValues
88

9+
10+
@tag("HaveYouEverSmoked")
911
class TestGetHaveYouEverSmoked(TestCase):
1012
def setUp(self):
1113
self.user = login_user(self.client)
@@ -39,6 +41,7 @@ def test_get_responds_successfully(self):
3941
self.assertEqual(response.status_code, 200)
4042

4143

44+
@tag("HaveYouEverSmoked")
4245
class TestPostHaveYouEverSmoked(TestCase):
4346
def setUp(self):
4447
self.user = login_user(self.client)
@@ -144,15 +147,6 @@ def test_post_responds_with_422_if_the_date_response_fails_to_create(self):
144147

145148
self.assertEqual(response.status_code, 422)
146149

147-
def test_post_does_not_update_the_response_set_if_the_user_is_not_a_smoker(self):
148-
self.client.post(
149-
reverse("questions:have_you_ever_smoked"),
150-
{ "value": HaveYouEverSmokedValues.NO_I_HAVE_NEVER_SMOKED.value }
151-
)
152-
153-
response_set = self.user.responseset_set.first()
154-
if response_set:
155-
self.assertFalse(HaveYouEverSmokedResponse.objects.filter(response_set=response_set).exists())
156150

157151
def test_post_redirects_if_the_user_not_a_smoker(self):
158152
response = self.client.post(
Lines changed: 15 additions & 54 deletions
Original file line numberDiff line numberDiff line change
@@ -1,60 +1,21 @@
1-
from django.shortcuts import render, redirect
2-
from django.urls import reverse
1+
from django.urls import reverse, reverse_lazy
32

43
from .question_base_view import QuestionBaseView
54
from ..forms.have_you_ever_smoked_form import HaveYouEverSmokedForm
6-
from ..models.have_you_ever_smoked_response import HaveYouEverSmokedResponse, HaveYouEverSmokedValues
5+
from ..models.have_you_ever_smoked_response import (
6+
HaveYouEverSmokedResponse
7+
)
78

8-
class HaveYouEverSmokedView(QuestionBaseView):
9-
def get(self, request):
10-
response, _ = HaveYouEverSmokedResponse.objects.get_or_build(
11-
response_set=request.response_set
12-
)
13-
return render_template(
14-
request,
15-
HaveYouEverSmokedForm(
16-
instance=response
17-
)
18-
)
19-
20-
def post(self, request):
21-
response, _ = HaveYouEverSmokedResponse.objects.get_or_build(
22-
response_set=request.response_set
23-
)
24-
form = HaveYouEverSmokedForm(
25-
data=request.POST, instance=response
26-
)
27-
28-
if form.is_valid():
29-
has_smoked_values = (HaveYouEverSmokedValues.YES_I_USED_TO_SMOKE_REGULARLY.value, HaveYouEverSmokedValues.YES_I_CURRENTLY_SMOKE.value)
30-
have_you_ever_smoked = form.cleaned_data["value"]
31-
32-
if have_you_ever_smoked in has_smoked_values:
33-
response.value = have_you_ever_smoked
34-
response.save()
35-
36-
return self.redirect_to_response_or_next_question(
37-
request,
38-
"questions:date_of_birth"
39-
)
40-
else:
41-
return redirect(reverse("questions:non_smoker_exit"))
429

10+
class HaveYouEverSmokedView(QuestionBaseView):
11+
template_name = "have_you_ever_smoked.jinja"
12+
form_class = HaveYouEverSmokedForm
13+
model = HaveYouEverSmokedResponse
14+
success_url = reverse_lazy("questions:date_of_birth")
15+
back_link_url = reverse_lazy("questions:start")
16+
17+
def get_success_url(self):
18+
if self.object.has_smoked_regularly():
19+
return super().get_success_url()
4320
else:
44-
return render_template(
45-
request,
46-
form,
47-
status=422
48-
)
49-
50-
51-
def render_template(request, form, status=200):
52-
return render(
53-
request,
54-
"have_you_ever_smoked.jinja",
55-
{
56-
"form": form,
57-
"back_link_url": reverse("questions:start")
58-
},
59-
status=status
60-
)
21+
return reverse("questions:non_smoker_exit")

0 commit comments

Comments
 (0)