Skip to content

Commit c0fd2a1

Browse files
committed
PPHA-477: Adding cancer diagnosis page and tests
1 parent d96a12e commit c0fd2a1

16 files changed

Lines changed: 253 additions & 112 deletions

lung_cancer_screening/core/tests/acceptance/helpers/user_interaction_helpers.py

Lines changed: 0 additions & 101 deletions
This file was deleted.
Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,23 @@
1+
from django import forms
2+
from ...nhsuk_forms.typed_choice_field import TypedChoiceField
3+
from ..models.cancer_diagnosis_response import CancerDiagnosisResponse
4+
5+
6+
class CancerDiagnosisForm(forms.ModelForm):
7+
def __init__(self, *args, **kwargs):
8+
super().__init__(*args, **kwargs)
9+
10+
self.fields["value"] = TypedChoiceField(
11+
choices=[(True, 'Yes'), (False, 'No')],
12+
widget=forms.RadioSelect,
13+
label="If you have ever been diagnosed with cancer",
14+
label_classes="nhsuk-fieldset__legend--l",
15+
coerce=lambda x: x == 'True',
16+
error_messages={
17+
'required': 'Select if you have been diagnosed with cancer'
18+
}
19+
)
20+
21+
class Meta:
22+
model = CancerDiagnosisResponse
23+
fields = ['value']
Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,9 @@
1+
{% extends 'question_form.jinja' %}
2+
3+
{% block prelude %}
4+
5+
<h1 class="nhsuk-heading-l">If you have ever been diagnosed with cancer</h1>
6+
7+
<p>If you have ever been diagnosed with any type of cancer it may impact your chances of developing lung cancer.
8+
9+
{% endblock prelude %}
Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,19 @@
1+
# Generated by Django 5.2.9 on 2025-12-30 09:30
2+
3+
import django.db.models.deletion
4+
from django.db import migrations, models
5+
6+
7+
class Migration(migrations.Migration):
8+
9+
dependencies = [
10+
('questions', '0033_weightresponse'),
11+
]
12+
13+
operations = [
14+
migrations.AlterField(
15+
model_name='haveyoueversmokedresponse',
16+
name='response_set',
17+
field=models.OneToOneField(on_delete=django.db.models.deletion.CASCADE, related_name='have_you_ever_smoked_response', to='questions.responseset'),
18+
),
19+
]
Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,27 @@
1+
# Generated by Django 5.2.9 on 2025-12-30 09:41
2+
3+
import django.db.models.deletion
4+
from django.db import migrations, models
5+
6+
7+
class Migration(migrations.Migration):
8+
9+
dependencies = [
10+
('questions', '0034_alter_haveyoueversmokedresponse_response_set'),
11+
]
12+
13+
operations = [
14+
migrations.CreateModel(
15+
name='CancerDiagnosisResponse',
16+
fields=[
17+
('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
18+
('created_at', models.DateTimeField(auto_now_add=True)),
19+
('updated_at', models.DateTimeField(auto_now=True)),
20+
('value', models.BooleanField()),
21+
('response_set', models.OneToOneField(on_delete=django.db.models.deletion.CASCADE, related_name='cancer_diagnosis_response', to='questions.responseset')),
22+
],
23+
options={
24+
'abstract': False,
25+
},
26+
),
27+
]

lung_cancer_screening/questions/models/__init__.py

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -9,3 +9,4 @@
99
from .respiratory_conditions_response import RespiratoryConditionsResponse # noqa: F401
1010
from .sex_at_birth_response import SexAtBirthResponse # noqa: F401
1111
from .weight_response import WeightResponse # noqa: F401
12+
from .cancer_diagnosis_response import CancerDiagnosisResponse
Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,9 @@
1+
from django.db import models
2+
3+
from .base import BaseModel
4+
from .response_set import ResponseSet
5+
6+
7+
class CancerDiagnosisResponse(BaseModel):
8+
response_set = models.OneToOneField(ResponseSet, on_delete=models.CASCADE, related_name='cancer_diagnosis_response')
9+
value = models.BooleanField()

lung_cancer_screening/questions/presenters/response_set_presenter.py

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -76,6 +76,13 @@ def asbestos_exposure(self):
7676

7777
return "Yes" if self.response_set.asbestos_exposure_response.value else "No"
7878

79+
@property
80+
def cancer_diagnosis(self):
81+
if not hasattr(self.response_set, 'cancer_diagnosis_response'):
82+
return None
83+
84+
return "Yes" if self.response_set.cancer_diagnosis_response.value else "No"
85+
7986
@property
8087
def respiratory_conditions(self):
8188
if not hasattr(self.response_set, 'respiratory_conditions_response'):
Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,12 @@
1+
import factory
2+
3+
from .response_set_factory import ResponseSetFactory
4+
from ...models.cancer_diagnosis_response import CancerDiagnosisResponse
5+
6+
7+
class CancerDiagnosisResponseFactory(factory.django.DjangoModelFactory):
8+
class Meta:
9+
model = CancerDiagnosisResponse
10+
11+
response_set = factory.SubFactory(ResponseSetFactory)
12+
value = factory.Faker('boolean')
Lines changed: 54 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,54 @@
1+
from django.test import TestCase, tag
2+
3+
from ...factories.response_set_factory import ResponseSetFactory
4+
from ....models.cancer_diagnosis_response import CancerDiagnosisResponse
5+
from ....forms.cancer_diagnosis_form import CancerDiagnosisForm
6+
7+
@tag("CancerDiagnosis")
8+
class TestCancerDiagnosisForm(TestCase):
9+
def setUp(self):
10+
self.response_set = ResponseSetFactory()
11+
self.response = CancerDiagnosisResponse.objects.create(
12+
response_set=self.response_set,
13+
value=False
14+
)
15+
16+
17+
def test_is_valid_with_a_valid_value(self):
18+
form = CancerDiagnosisForm(
19+
instance=self.response,
20+
data={
21+
"value": False
22+
}
23+
)
24+
self.assertTrue(form.is_valid())
25+
self.assertEqual(
26+
form.cleaned_data["value"],
27+
False
28+
)
29+
30+
def test_is_invalid_with_an_invalid_value(self):
31+
form = CancerDiagnosisForm(
32+
instance=self.response,
33+
data={
34+
"value": "invalid"
35+
}
36+
)
37+
self.assertFalse(form.is_valid())
38+
self.assertEqual(
39+
form.errors["value"],
40+
["Select a valid choice. invalid is not one of the available choices."]
41+
)
42+
43+
def test_is_invalid_when_no_option_is_selected(self):
44+
form = CancerDiagnosisForm(
45+
instance=self.response,
46+
data={
47+
"value": None
48+
}
49+
)
50+
self.assertFalse(form.is_valid())
51+
self.assertEqual(
52+
form.errors["value"],
53+
["Select if you have been diagnosed with cancer"]
54+
)

0 commit comments

Comments
 (0)