Skip to content

Commit 6fe2325

Browse files
authored
Merge pull request #337 from NHSDigital/PPHA-589-ensure-smoking-history-blocks-submission
PPHA-589: Ensure smoking responses must be complete before submitting
2 parents eae8ab9 + ec5eeef commit 6fe2325

12 files changed

Lines changed: 250 additions & 40 deletions

features/questionnaire.feature

Lines changed: 1 addition & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -71,7 +71,6 @@ Feature: Questionnaire
7171

7272
Then I am on "/types-tobacco-smoking"
7373
When I check "Cigarettes"
74-
And I check "Pipe"
7574
And I submit the form
7675

7776
Then I am on "/cigarettes-smoking-current"
@@ -89,17 +88,7 @@ Feature: Questionnaire
8988
And I submit the form
9089

9190
Then I am on "/cigarettes-smoking-change"
92-
When I check "Yes, I used to smoke more than 15 cigarettes a day" and submit
93-
94-
Then I am on "/cigarettes-smoking-increased-frequency"
95-
When I check "Weekly" and submit
96-
97-
Then I am on "/cigarettes-smoked-increased-amount"
98-
When I fill in "When you smoked more than 15 cigarettes a day, roughly how many cigarettes did you normally smoke a week?" with "20"
99-
And I submit the form
100-
101-
Then I am on "/cigarettes-smoked-increased-years"
102-
When I go to "/check-your-answers"
91+
When I check "No, it has not changed" and submit
10392

10493
Then I am on "/check-your-answers"
10594
And I see "Yes, I used to smoke" as a response to "Have you ever smoked tobacco?" under "Eligibility"

lung_cancer_screening/questions/models/response_set.py

Lines changed: 16 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -65,6 +65,7 @@ def _validate_complete_on_submission(self):
6565

6666
def _response_attrs(self):
6767
response_attrs = [
68+
'age_when_started_smoking_response',
6869
'asbestos_exposure_response',
6970
'cancer_diagnosis_response',
7071
'check_need_appointment_response',
@@ -87,8 +88,22 @@ def _response_attrs(self):
8788
return response_attrs
8889

8990

91+
def has_complete_smoking_history(self):
92+
if not self.tobacco_smoking_history.exists():
93+
return False
94+
95+
return all(
96+
tobacco_smoking_history.is_complete()
97+
for tobacco_smoking_history
98+
in self.tobacco_smoking_history.all()
99+
)
100+
101+
90102
def is_complete(self):
91-
return all(hasattr(self, attr) for attr in self._response_attrs())
103+
return all([
104+
all(hasattr(self, attr) for attr in self._response_attrs()),
105+
self.has_complete_smoking_history()
106+
])
92107

93108

94109
def is_eligible(self):

lung_cancer_screening/questions/models/tobacco_smoking_history.py

Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -168,6 +168,9 @@ def is_decreased(self):
168168
def is_normal(self):
169169
return self.level == self.Levels.NORMAL
170170

171+
def is_no_change(self):
172+
return self.level == self.Levels.NO_CHANGE
173+
171174
def is_current(self):
172175
if hasattr(self, "smoking_current_response"):
173176
return self.smoking_current_response.value
@@ -186,3 +189,19 @@ def is_rolling_tobacco(self):
186189
def url_type(self):
187190
return slugify(self.get_type_display())
188191

192+
def required_responses(self):
193+
if self.is_no_change():
194+
return []
195+
196+
return filter(
197+
None,
198+
[
199+
"smoking_current_response" if self.is_normal() else None,
200+
"smoked_total_years_response",
201+
"smoking_frequency_response",
202+
"smoked_amount_response",
203+
],
204+
)
205+
206+
def is_complete(self):
207+
return all(hasattr(self, response) for response in self.required_responses())

lung_cancer_screening/questions/tests/factories/response_set_factory.py

Lines changed: 24 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -43,59 +43,69 @@ class Params:
4343
),
4444
)
4545

46-
complete = factory.Trait(
46+
complete_without_smoking = factory.Trait(
4747
eligible=True,
4848
asbestos_exposure_response=factory.RelatedFactory(
4949
"lung_cancer_screening.questions.tests.factories.asbestos_exposure_response_factory.AsbestosExposureResponseFactory",
50-
factory_related_name="response_set"
50+
factory_related_name="response_set",
5151
),
5252
cancer_diagnosis_response=factory.RelatedFactory(
5353
"lung_cancer_screening.questions.tests.factories.cancer_diagnosis_response_factory.CancerDiagnosisResponseFactory",
54-
factory_related_name="response_set"
54+
factory_related_name="response_set",
5555
),
5656
education_response=factory.RelatedFactory(
5757
"lung_cancer_screening.questions.tests.factories.education_response_factory.EducationResponseFactory",
58-
factory_related_name="response_set"
58+
factory_related_name="response_set",
5959
),
6060
ethnicity_response=factory.RelatedFactory(
6161
"lung_cancer_screening.questions.tests.factories.ethnicity_response_factory.EthnicityResponseFactory",
62-
factory_related_name="response_set"
62+
factory_related_name="response_set",
6363
),
6464
family_history_lung_cancer_response=factory.RelatedFactory(
6565
"lung_cancer_screening.questions.tests.factories.family_history_lung_cancer_response_factory.FamilyHistoryLungCancerResponseFactory",
66-
factory_related_name="response_set"
66+
factory_related_name="response_set",
6767
),
6868
gender_response=factory.RelatedFactory(
6969
"lung_cancer_screening.questions.tests.factories.gender_response_factory.GenderResponseFactory",
70-
factory_related_name="response_set"
70+
factory_related_name="response_set",
7171
),
7272
height_response=factory.RelatedFactory(
7373
"lung_cancer_screening.questions.tests.factories.height_response_factory.HeightResponseFactory",
74-
factory_related_name="response_set"
74+
factory_related_name="response_set",
7575
),
7676
age_when_started_smoking_response=factory.RelatedFactory(
7777
"lung_cancer_screening.questions.tests.factories.age_when_started_smoking_response_factory.AgeWhenStartedSmokingResponseFactory",
78-
factory_related_name="response_set"
78+
factory_related_name="response_set",
7979
),
8080
periods_when_you_stopped_smoking_response=factory.RelatedFactory(
8181
"lung_cancer_screening.questions.tests.factories.periods_when_you_stopped_smoking_response_factory.PeriodsWhenYouStoppedSmokingResponseFactory",
82-
factory_related_name="response_set"
82+
factory_related_name="response_set",
8383
),
8484
relatives_age_when_diagnosed_response=factory.RelatedFactory(
8585
"lung_cancer_screening.questions.tests.factories.relatives_age_when_diagnosed_response_factory.RelativesAgeWhenDiagnosedResponseFactory",
86-
factory_related_name="response_set"
86+
factory_related_name="response_set",
8787
),
8888
respiratory_conditions_response=factory.RelatedFactory(
8989
"lung_cancer_screening.questions.tests.factories.respiratory_conditions_response_factory.RespiratoryConditionsResponseFactory",
90-
factory_related_name="response_set"
90+
factory_related_name="response_set",
9191
),
9292
sex_at_birth_response=factory.RelatedFactory(
9393
"lung_cancer_screening.questions.tests.factories.sex_at_birth_response_factory.SexAtBirthResponseFactory",
94-
factory_related_name="response_set"
94+
factory_related_name="response_set",
9595
),
9696
weight_response=factory.RelatedFactory(
9797
"lung_cancer_screening.questions.tests.factories.weight_response_factory.WeightResponseFactory",
98-
factory_related_name="response_set"
98+
factory_related_name="response_set",
99+
),
100+
)
101+
102+
complete = factory.Trait(
103+
complete_without_smoking=True,
104+
tobacco_smoking_history=factory.RelatedFactory(
105+
"lung_cancer_screening.questions.tests.factories.tobacco_smoking_history_factory.TobaccoSmokingHistoryFactory",
106+
factory_related_name="response_set",
107+
normal=True,
108+
complete=True,
99109
),
100110
)
101111

lung_cancer_screening/questions/tests/factories/tobacco_smoking_history_factory.py

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -68,3 +68,6 @@ class Params:
6868
decreased = factory.Trait(
6969
level=TobaccoSmokingHistory.Levels.DECREASED,
7070
)
71+
no_change = factory.Trait(
72+
level=TobaccoSmokingHistory.Levels.NO_CHANGE,
73+
)

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

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,7 @@
99
@tag("SmokingChange")
1010
class TestSmokingChangeForm(TestCase):
1111
def setUp(self):
12-
self.response_set = ResponseSetFactory.create(complete=True)
12+
self.response_set = ResponseSetFactory.create(complete_without_smoking=True)
1313
self.normal_smoking_history = TobaccoSmokingHistoryFactory.create(
1414
response_set=self.response_set,
1515
cigarettes=True,

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

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,7 @@
1010
@tag("SmokingFrequency")
1111
class TestSmokingFrequencyForm(TestCase):
1212
def setUp(self):
13-
self.response_set = ResponseSetFactory.create(complete=True)
13+
self.response_set = ResponseSetFactory.create(complete_without_smoking=True)
1414
self.normal_smoking_history = TobaccoSmokingHistoryFactory.create(
1515
response_set=self.response_set,
1616
normal=True,

lung_cancer_screening/questions/tests/unit/models/test_response_set.py

Lines changed: 20 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -193,13 +193,28 @@ def test_is_complete_returns_true_if_family_history_cancer_no_and_none_age_diagn
193193
self.assertTrue(response_set.is_complete())
194194

195195

196-
def test_is_ineligble_returns_false_when_any_eligibility_question_is_not_answered(self):
196+
def test_is_complete_returns_false_if_any_tobacco_smoking_history_is_not_complete(self):
197+
response_set = ResponseSetFactory.create(complete=True)
198+
response_set.tobacco_smoking_history.first().smoking_current_response.delete()
199+
response_set.refresh_from_db()
200+
201+
self.assertFalse(response_set.is_complete())
202+
203+
204+
def test_is_complete_returns_false_if_there_are_no_smoking_histories(self):
205+
response_set = ResponseSetFactory.create(complete=True)
206+
response_set.tobacco_smoking_history.all().delete()
207+
response_set.refresh_from_db()
208+
self.assertFalse(response_set.is_complete())
209+
210+
211+
def test_is_ineligible_returns_false_when_any_eligibility_question_is_not_answered(self):
197212
response_set = ResponseSetFactory.create()
198213

199214
self.assertFalse(response_set.is_eligible())
200215

201216

202-
def test_is_eligble_returns_true_when_smoked_age_and_need_appointment_are_eligible(self):
217+
def test_is_eligible_returns_true_when_smoked_age_and_need_appointment_are_eligible(self):
203218
HaveYouEverSmokedResponseFactory(
204219
response_set=self.response_set,
205220
eligible=True
@@ -216,7 +231,7 @@ def test_is_eligble_returns_true_when_smoked_age_and_need_appointment_are_eligib
216231
self.assertTrue(self.response_set.is_eligible())
217232

218233

219-
def test_is_ineligble_returns_false_when_smoking_is_inelgible(self):
234+
def test_is_ineligible_returns_false_when_smoking_is_ineligible(self):
220235
HaveYouEverSmokedResponseFactory(
221236
response_set=self.response_set,
222237
ineligible=True
@@ -233,7 +248,7 @@ def test_is_ineligble_returns_false_when_smoking_is_inelgible(self):
233248
self.assertFalse(self.response_set.is_eligible())
234249

235250

236-
def test_is_ineligble_returns_false_when_age_is_inelgible(self):
251+
def test_is_ineligible_returns_false_when_age_is_ineligible(self):
237252
HaveYouEverSmokedResponseFactory(
238253
response_set=self.response_set,
239254
eligible=True
@@ -250,7 +265,7 @@ def test_is_ineligble_returns_false_when_age_is_inelgible(self):
250265
self.assertFalse(self.response_set.is_eligible())
251266

252267

253-
def test_is_ineligble_returns_false_when_need_appointment_is_inelgible(self):
268+
def test_is_ineligible_returns_false_when_need_appointment_is_ineligible(self):
254269
HaveYouEverSmokedResponseFactory(
255270
response_set=self.response_set,
256271
eligible=True

0 commit comments

Comments
 (0)