Skip to content

Commit 4a2811c

Browse files
intial testing to be used as guide.
1 parent a415711 commit 4a2811c

1 file changed

Lines changed: 194 additions & 0 deletions

File tree

tests/unit/services/calculators/test_eligibility_calculator.py

Lines changed: 194 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -51,6 +51,200 @@
5151
is_condition,
5252
is_eligibility_status,
5353
)
54+
from eligibility_signposting_api.model.eligibility_status import StatusText
55+
from eligibility_signposting_api.services.processors.token_processor import TokenProcessor
56+
from eligibility_signposting_api.model.eligibility_status import MatchedActionDetail
57+
from unittest.mock import MagicMock
58+
59+
def test_get_eligibility_status_uses_status_text_override_when_present(faker: Faker):
60+
"""
61+
Test: override present → statusText replaced
62+
If an override status text is provided, it replaces the original status text
63+
produced by the iteration.
64+
"""
65+
nhs_number = NHSNumber(faker.nhs_number())
66+
67+
person_rows = person_rows_builder(
68+
nhs_number,
69+
cohorts=["cohort1"],
70+
icb="QE1",
71+
)
72+
73+
campaign_configs = [
74+
rule_builder.CampaignConfigFactory.build(
75+
target="RSV",
76+
iterations=[
77+
rule_builder.IterationFactory.build(
78+
iteration_cohorts=[
79+
rule_builder.IterationCohortFactory.build(cohort_label="cohort1")
80+
],
81+
iteration_rules=[],
82+
status_text=campaign_config.StatusText(
83+
NotEligible="You are not eligible for RSV.",
84+
NotActionable="You are not currently able to book RSV.",
85+
Actionable="Original actionable text",
86+
),
87+
)
88+
],
89+
)
90+
]
91+
92+
calculator = EligibilityCalculator(person_rows, campaign_configs)
93+
calculator.action_rule_handler.get_actions = MagicMock(
94+
return_value=MatchedActionDetail(status_text_override=StatusText("Override actionable text"))
95+
)
96+
97+
actual = calculator.get_eligibility_status("Y", ["ALL"], "ALL")
98+
99+
assert len(actual.conditions) == 1
100+
assert actual.conditions[0].condition_name == ConditionName("RSV")
101+
assert actual.conditions[0].status == Status.actionable
102+
assert actual.conditions[0].status_text == StatusText("Override actionable text")
103+
assert g.audit_log.response.condition[0].status_text == "Override actionable text"
104+
105+
106+
def test_get_eligibility_status_keeps_original_status_text_when_override_absent(faker: Faker):
107+
"""
108+
Override absent → statusText unchanged
109+
If no override is provided, the calculator should keep the original
110+
status text from the iteration.
111+
"""
112+
nhs_number = NHSNumber(faker.nhs_number())
113+
114+
person_rows = person_rows_builder(
115+
nhs_number,
116+
cohorts=["cohort1"],
117+
icb="QE1",
118+
)
119+
120+
campaign_configs = [
121+
rule_builder.CampaignConfigFactory.build(
122+
target="RSV",
123+
iterations=[
124+
rule_builder.IterationFactory.build(
125+
iteration_cohorts=[
126+
rule_builder.IterationCohortFactory.build(cohort_label="cohort1")
127+
],
128+
iteration_rules=[],
129+
status_text=campaign_config.StatusText(
130+
NotEligible="You are not eligible for RSV.",
131+
NotActionable="You are not currently able to book RSV.",
132+
Actionable="Original actionable text",
133+
),
134+
)
135+
],
136+
)
137+
]
138+
139+
calculator = EligibilityCalculator(person_rows, campaign_configs)
140+
calculator.action_rule_handler.get_actions = MagicMock(
141+
return_value=MatchedActionDetail(status_text_override=None)
142+
)
143+
144+
actual = calculator.get_eligibility_status("Y", ["ALL"], "ALL")
145+
146+
assert len(actual.conditions) == 1
147+
assert actual.conditions[0].condition_name == ConditionName("RSV")
148+
assert actual.conditions[0].status == Status.actionable
149+
assert actual.conditions[0].status_text == StatusText("Original actionable text")
150+
assert g.audit_log.response.condition[0].status_text == "Original actionable text"
151+
152+
153+
def test_get_eligibility_status_resolves_tokens_in_status_text_override(faker: Faker):
154+
"""
155+
Test: override with token → resolved
156+
check that a token inside the override status text gets replaced with actual person data.
157+
"""
158+
nhs_number = NHSNumber(faker.nhs_number())
159+
160+
person_rows = person_rows_builder(
161+
nhs_number,
162+
cohorts=["cohort1"],
163+
icb="ICB123",
164+
)
165+
166+
campaign_configs = [
167+
rule_builder.CampaignConfigFactory.build(
168+
target="RSV",
169+
iterations=[
170+
rule_builder.IterationFactory.build(
171+
iteration_cohorts=[
172+
rule_builder.IterationCohortFactory.build(cohort_label="cohort1")
173+
],
174+
iteration_rules=[],
175+
status_text=campaign_config.StatusText(
176+
NotEligible="You are not eligible for RSV.",
177+
NotActionable="You are not currently able to book RSV.",
178+
Actionable="Original actionable text",
179+
),
180+
)
181+
],
182+
)
183+
]
184+
185+
calculator = EligibilityCalculator(person_rows, campaign_configs)
186+
calculator.action_rule_handler.get_actions = MagicMock(
187+
return_value=MatchedActionDetail(
188+
status_text_override=StatusText("You can book via [[PERSON.ICB]].")
189+
)
190+
)
191+
192+
actual = calculator.get_eligibility_status("Y", ["ALL"], "ALL")
193+
194+
assert len(actual.conditions) == 1
195+
assert actual.conditions[0].condition_name == ConditionName("RSV")
196+
assert actual.conditions[0].status == Status.actionable
197+
assert actual.conditions[0].status_text == StatusText("You can book via ICB123.")
198+
assert g.audit_log.response.condition[0].status_text == "You can book via ICB123."
199+
200+
201+
def test_get_eligibility_status_applies_override_before_token_processing(faker: Faker):
202+
"""
203+
Test: override applied before token processing (order verification)
204+
Check if apply the override first, and only then replace tokens
205+
"""
206+
nhs_number = NHSNumber(faker.nhs_number())
207+
208+
person_rows = person_rows_builder(
209+
nhs_number,
210+
cohorts=["cohort1"],
211+
icb="ICB999",
212+
)
213+
214+
campaign_configs = [
215+
rule_builder.CampaignConfigFactory.build(
216+
target="RSV",
217+
iterations=[
218+
rule_builder.IterationFactory.build(
219+
iteration_cohorts=[
220+
rule_builder.IterationCohortFactory.build(cohort_label="cohort1")
221+
],
222+
iteration_rules=[],
223+
status_text=campaign_config.StatusText(
224+
NotEligible="You are not eligible for RSV.",
225+
NotActionable="You are not currently able to book RSV.",
226+
Actionable="ORIGINAL [[PERSON.ICB]]",
227+
),
228+
)
229+
],
230+
)
231+
]
232+
233+
calculator = EligibilityCalculator(person_rows, campaign_configs)
234+
calculator.action_rule_handler.get_actions = MagicMock(
235+
return_value=MatchedActionDetail(
236+
status_text_override=StatusText("OVERRIDE [[PERSON.ICB]]")
237+
)
238+
)
239+
240+
actual = calculator.get_eligibility_status("Y", ["ALL"], "ALL")
241+
242+
assert len(actual.conditions) == 1
243+
assert actual.conditions[0].condition_name == ConditionName("RSV")
244+
assert actual.conditions[0].status == Status.actionable
245+
assert actual.conditions[0].status_text == StatusText("OVERRIDE ICB999")
246+
assert actual.conditions[0].status_text != StatusText("ORIGINAL ICB999")
247+
assert g.audit_log.response.condition[0].status_text == "OVERRIDE ICB999"
54248

55249

56250
@pytest.fixture

0 commit comments

Comments
 (0)