Skip to content

Commit 7bbc0f2

Browse files
Eli 785/audit trail status override (#653)
* add status_text_override to audit classes * add statusTextOverride to existing tests * add new tests
1 parent f4fd038 commit 7bbc0f2

4 files changed

Lines changed: 185 additions & 0 deletions

File tree

src/eligibility_signposting_api/audit/audit_context.py

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -107,6 +107,7 @@ def append_audit_condition(
107107
suitability_rules=audit_suitability_rule,
108108
action_rule=audit_action_rule,
109109
actions=audit_actions,
110+
status_text_override=action_detail.status_text_override,
110111
)
111112

112113
g.audit_log.response.condition.append(audit_condition)

src/eligibility_signposting_api/audit/audit_models.py

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -83,6 +83,7 @@ class AuditCondition(CamelCaseBaseModel):
8383
suitability_rules: list[AuditSuitabilityRule] | None = None
8484
action_rule: AuditRedirectRule | None = None
8585
actions: list[AuditAction] | None = Field(default_factory=list)
86+
status_text_override: str | None = None
8687

8788

8889
class ResponseAuditData(CamelCaseBaseModel):

tests/integration/lambda/test_app_running_as_lambda.py

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -247,6 +247,7 @@ def test_given_nhs_number_in_path_matches_with_nhs_number_in_headers_and_check_i
247247
],
248248
"actionRule": None,
249249
"actions": [],
250+
"statusTextOverride": None,
250251
}
251252
]
252253

@@ -495,6 +496,7 @@ def test_given_person_has_unique_status_for_different_conditions_with_audit( #
495496
"suitabilityRules": None,
496497
"actionRule": None,
497498
"actions": [],
499+
"statusTextOverride": None,
498500
},
499501
{
500502
"campaignId": covid_campaign.id,
@@ -527,6 +529,7 @@ def test_given_person_has_unique_status_for_different_conditions_with_audit( #
527529
],
528530
"actionRule": None,
529531
"actions": [],
532+
"statusTextOverride": None,
530533
},
531534
{
532535
"campaignId": flu_campaign.id,
@@ -557,6 +560,7 @@ def test_given_person_has_unique_status_for_different_conditions_with_audit( #
557560
"actionUrlLabel": None,
558561
}
559562
],
563+
"statusTextOverride": None,
560564
},
561565
]
562566

tests/unit/audit/test_audit_context.py

Lines changed: 179 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -196,6 +196,185 @@ def test_append_audit_condition_adds_condition_to_audit_log_on_g_for_actionable_
196196
assert cond.eligibility_cohort_groups[0].cohort_text == "CohortDescription1"
197197

198198

199+
def test_append_audit_condition_with_status_override_text(app):
200+
suggested_actions: list[SuggestedAction] | None
201+
condition_name: ConditionName
202+
campaign_details: tuple[CampaignID | None, CampaignVersion | None]
203+
204+
# Build dummy variables sufficient to be able to call append_audit_condition.
205+
suggested_actions = [
206+
SuggestedAction(
207+
internal_action_code=InternalActionCode("InternalActionCode1"),
208+
action_code=ActionCode("ActionCode1"),
209+
action_type=ActionType("ActionType1"),
210+
action_description=ActionDescription("ActionDescription1"),
211+
url_link=UrlLink(HttpUrl("https://example.com/")),
212+
url_label=UrlLabel("ActionLabel1"),
213+
)
214+
]
215+
condition_name = ConditionName("Condition1")
216+
iteration = IterationFactory.build(version=12345)
217+
audit_rules = [
218+
Reason(
219+
rule_type=RuleType.redirect,
220+
rule_name=RuleName("RedirectRuleName1"),
221+
rule_code=RuleCode("RedirectRuleCode1"),
222+
rule_text=RuleText("RedirectRuleDescription1"),
223+
matcher_matched=True,
224+
rule_priority=RulePriority("1"),
225+
),
226+
Reason(
227+
rule_type=RuleType.filter,
228+
rule_name=RuleName("FilterRuleName1"),
229+
rule_code=RuleCode("FilterRuleCode1"),
230+
rule_text=RuleText("FilterRuleDescription1"),
231+
matcher_matched=True,
232+
rule_priority=RulePriority("1"),
233+
),
234+
Reason(
235+
rule_type=RuleType.suppression,
236+
rule_name=RuleName("SuppressionRuleName1"),
237+
rule_code=RuleCode("SuppressionRuleCode1"),
238+
rule_text=RuleText("SuppressionRuleDescription1"),
239+
matcher_matched=True,
240+
rule_priority=RulePriority("1"),
241+
),
242+
]
243+
cohort_group_result = CohortGroupResult(
244+
status=Status.actionable,
245+
cohort_code="CohortCode1",
246+
description="CohortDescription1",
247+
audit_rules=audit_rules,
248+
reasons=audit_rules,
249+
)
250+
iteration_result = IterationResult(
251+
status=Status.actionable,
252+
status_text=StatusText(
253+
"Override text you should see"
254+
), # value overwritten by get_eligibility_status prior to append_audit_condition being called.
255+
cohort_results=[cohort_group_result],
256+
actions=suggested_actions,
257+
)
258+
status_text_override = StatusText(
259+
"Override text you should see (in override field)"
260+
) # Value in real run will exactly match status_text, differentiated here for testing.
261+
campaign_details = (CampaignID("CampaignID1"), CampaignVersion(123))
262+
matched_action_detail = MatchedActionDetail(
263+
campaign_config.RuleName("RedirectRuleName1"),
264+
campaign_config.RulePriority(1),
265+
suggested_actions,
266+
status_text_override,
267+
)
268+
iteration_result_summary = IterationResultSummary(
269+
iteration_result,
270+
iteration,
271+
campaign_details[0],
272+
campaign_details[1],
273+
{CohortLabel("CohortCode1"): cohort_group_result},
274+
)
275+
276+
# Initialise test data.
277+
with app.app_context():
278+
g.audit_log = AuditEvent()
279+
280+
AuditContext.append_audit_condition(condition_name, iteration_result_summary, matched_action_detail)
281+
282+
# Get audit_condition outputs.
283+
cond = g.audit_log.response.condition[0]
284+
285+
# Assert that override status text actually comes out.
286+
assert cond.status_text == "Override text you should see"
287+
assert cond.status_text_override == "Override text you should see (in override field)"
288+
289+
290+
def test_append_audit_condition_without_override_status_text(app):
291+
# Trivial but explicit test of append_audit_condition being called where status_test_override is not provided.
292+
suggested_actions: list[SuggestedAction] | None
293+
condition_name: ConditionName
294+
campaign_details: tuple[CampaignID | None, CampaignVersion | None]
295+
296+
# Build dummy variables sufficient to be able to call append_audit_condition.
297+
suggested_actions = [
298+
SuggestedAction(
299+
internal_action_code=InternalActionCode("InternalActionCode1"),
300+
action_code=ActionCode("ActionCode1"),
301+
action_type=ActionType("ActionType1"),
302+
action_description=ActionDescription("ActionDescription1"),
303+
url_link=UrlLink(HttpUrl("https://example.com/")),
304+
url_label=UrlLabel("ActionLabel1"),
305+
)
306+
]
307+
condition_name = ConditionName("Condition1")
308+
iteration = IterationFactory.build(version=12345)
309+
audit_rules = [
310+
Reason(
311+
rule_type=RuleType.redirect,
312+
rule_name=RuleName("RedirectRuleName1"),
313+
rule_code=RuleCode("RedirectRuleCode1"),
314+
rule_text=RuleText("RedirectRuleDescription1"),
315+
matcher_matched=True,
316+
rule_priority=RulePriority("1"),
317+
),
318+
Reason(
319+
rule_type=RuleType.filter,
320+
rule_name=RuleName("FilterRuleName1"),
321+
rule_code=RuleCode("FilterRuleCode1"),
322+
rule_text=RuleText("FilterRuleDescription1"),
323+
matcher_matched=True,
324+
rule_priority=RulePriority("1"),
325+
),
326+
Reason(
327+
rule_type=RuleType.suppression,
328+
rule_name=RuleName("SuppressionRuleName1"),
329+
rule_code=RuleCode("SuppressionRuleCode1"),
330+
rule_text=RuleText("SuppressionRuleDescription1"),
331+
matcher_matched=True,
332+
rule_priority=RulePriority("1"),
333+
),
334+
]
335+
cohort_group_result = CohortGroupResult(
336+
status=Status.actionable,
337+
cohort_code="CohortCode1",
338+
description="CohortDescription1",
339+
audit_rules=audit_rules,
340+
reasons=audit_rules,
341+
)
342+
iteration_result = IterationResult(
343+
status=Status.actionable,
344+
status_text=StatusText("Default status text"),
345+
cohort_results=[cohort_group_result],
346+
actions=suggested_actions,
347+
)
348+
status_text_override = None # Will default to None when not provided, made explicit here for testing.
349+
campaign_details = (CampaignID("CampaignID1"), CampaignVersion(123))
350+
matched_action_detail = MatchedActionDetail(
351+
campaign_config.RuleName("RedirectRuleName1"),
352+
campaign_config.RulePriority(1),
353+
suggested_actions,
354+
status_text_override,
355+
)
356+
iteration_result_summary = IterationResultSummary(
357+
iteration_result,
358+
iteration,
359+
campaign_details[0],
360+
campaign_details[1],
361+
{CohortLabel("CohortCode1"): cohort_group_result},
362+
)
363+
364+
# Initialise test data.
365+
with app.app_context():
366+
g.audit_log = AuditEvent()
367+
368+
AuditContext.append_audit_condition(condition_name, iteration_result_summary, matched_action_detail)
369+
370+
# Get audit_condition outputs.
371+
cond = g.audit_log.response.condition[0]
372+
373+
# Assert that override status text actually comes out.
374+
assert cond.status_text == "Default status text"
375+
assert cond.status_text_override is None
376+
377+
199378
def test_should_append_audit_suppression_rules_for_actionable_status(app):
200379
condition_name: ConditionName
201380
campaign_details: tuple[CampaignID | None, CampaignVersion | None]

0 commit comments

Comments
 (0)