11import uuid
2- import pytest
3- from datetime import datetime
2+ from dataclasses import asdict
3+ from datetime import UTC , datetime
4+ from unittest .mock import Mock
45
5- from flask import g , request , Flask
6+ import pytest
7+ from flask import Flask , g , request
68
79from eligibility_signposting_api .audit_context import AuditContext
810from eligibility_signposting_api .audit_models import AuditEvent
9- from eligibility_signposting_api .model .eligibility import SuggestedActions , ConditionName , IterationResult , \
10- CohortGroupResult , SuggestedAction , ActionCode , ActionType , ActionDescription , UrlLink , UrlLabel , Reason , RuleName , \
11- RuleDescription , RulePriority , Status
12- from eligibility_signposting_api .model .rules import Iteration , CampaignID , CampaignVersion , \
13- RuleType
14- from fixtures .builders .model .rule import IterationFactory
15- from fixtures .builders .views .response_model .eligibility import EligibilityResponseFactory
11+ from eligibility_signposting_api .model .eligibility import (
12+ ActionCode ,
13+ ActionDescription ,
14+ ActionType ,
15+ CohortGroupResult ,
16+ ConditionName ,
17+ IterationResult ,
18+ Reason ,
19+ RuleDescription ,
20+ RuleName ,
21+ RulePriority ,
22+ Status ,
23+ SuggestedAction ,
24+ SuggestedActions ,
25+ UrlLabel ,
26+ UrlLink ,
27+ )
28+ from eligibility_signposting_api .model .rules import CampaignID , CampaignVersion , Iteration , RuleType
29+ from eligibility_signposting_api .services .audit_service import AuditService
30+ from tests .fixtures .builders .model .rule import IterationFactory
31+ from tests .fixtures .builders .views .response_model .eligibility import EligibilityResponseFactory
1632
1733
1834@pytest .fixture
@@ -33,7 +49,7 @@ def test_add_request_details_sets_audit_log_on_g(app):
3349 url = "/patient-check?includeActions=Y"
3450
3551 with app .test_request_context (url , headers = headers , method = "GET" ):
36- request .view_args = {' nhs_number' : nhs_number }
52+ request .view_args = {" nhs_number" : nhs_number }
3753 AuditContext .add_request_details (request )
3854
3955 assert hasattr (g , "audit_log" )
@@ -52,7 +68,7 @@ def test_add_request_details_when_headers_are_empty_sets_audit_log_on_g(app):
5268 url = "/patient-check?includeActions=Y"
5369
5470 with app .test_request_context (url , method = "GET" ):
55- request .view_args = {' nhs_number' : nhs_number }
71+ request .view_args = {" nhs_number" : nhs_number }
5672 AuditContext .add_request_details (request )
5773
5874 assert hasattr (g , "audit_log" )
@@ -66,44 +82,56 @@ def test_add_request_details_when_headers_are_empty_sets_audit_log_on_g(app):
6682 assert isinstance (audit_req .request_timestamp , datetime )
6783
6884
69- def test_append_audit_condition_adds_condition_to_audit_log (app ):
85+ def test_append_audit_condition_adds_condition_to_audit_log_on_g (app ):
7086 suggested_actions : SuggestedActions | None
7187 condition_name : ConditionName
7288 best_results : tuple [Iteration , IterationResult , dict [str , CohortGroupResult ]]
7389 campaign_details : tuple [CampaignID | None , CampaignVersion | None ]
7490 redirect_rule_details : tuple [RulePriority | None , RuleName | None ]
7591
76- suggested_actions = SuggestedActions (actions = [SuggestedAction (
77- action_code = ActionCode ("ActionCode1" ),
78- action_type = ActionType ("ActionType1" ),
79- action_description = ActionDescription ("ActionDescription1" ),
80- url_link = UrlLink ("https://www.example.com" ),
81- url_label = UrlLabel ("ActionLabel1" )
82- )])
92+ suggested_actions = SuggestedActions (
93+ actions = [
94+ SuggestedAction (
95+ action_code = ActionCode ("ActionCode1" ),
96+ action_type = ActionType ("ActionType1" ),
97+ action_description = ActionDescription ("ActionDescription1" ),
98+ url_link = UrlLink ("https://www.example.com" ),
99+ url_label = UrlLabel ("ActionLabel1" ),
100+ )
101+ ]
102+ )
83103
84104 condition_name = ConditionName ("Condition1" )
85105 iteration = IterationFactory .build ()
86- audit_rules = [Reason (
87- rule_type = RuleType .filter ,
88- rule_name = RuleName ("FilterRuleName1" ),
89- rule_description = RuleDescription ("FilterRuleDescription1" ),
90- matcher_matched = True ,
91- rule_priority = RulePriority ("1" )
92- )]
93- cohort_group_result = CohortGroupResult (status = Status .actionable , cohort_code = "CohortCode1" ,
94- description = "CohortDescription1" , audit_rules = audit_rules ,
95- reasons = audit_rules )
96- iteration_result = IterationResult (status = Status .actionable , cohort_results = [cohort_group_result ],
97- actions = suggested_actions )
106+ audit_rules = [
107+ Reason (
108+ rule_type = RuleType .filter ,
109+ rule_name = RuleName ("FilterRuleName1" ),
110+ rule_description = RuleDescription ("FilterRuleDescription1" ),
111+ matcher_matched = True ,
112+ rule_priority = RulePriority ("1" ),
113+ )
114+ ]
115+ cohort_group_result = CohortGroupResult (
116+ status = Status .actionable ,
117+ cohort_code = "CohortCode1" ,
118+ description = "CohortDescription1" ,
119+ audit_rules = audit_rules ,
120+ reasons = audit_rules ,
121+ )
122+ iteration_result = IterationResult (
123+ status = Status .actionable , cohort_results = [cohort_group_result ], actions = suggested_actions
124+ )
98125 best_results = (iteration , iteration_result , {"CohortCode1" : cohort_group_result })
99126 campaign_details = (CampaignID ("CampaignID1" ), CampaignVersion ("CampaignVersion1" ))
100127 redirect_rule_details = (RulePriority ("1" ), RuleName ("RedirectRuleName1" ))
101128
102129 with app .app_context ():
103130 g .audit_log = AuditEvent ()
104131
105- AuditContext .append_audit_condition (suggested_actions , condition_name , best_results , campaign_details ,
106- redirect_rule_details )
132+ AuditContext .append_audit_condition (
133+ suggested_actions , condition_name , best_results , campaign_details , redirect_rule_details
134+ )
107135
108136 assert g .audit_log .response .condition , condition_name
109137 cond = g .audit_log .response .condition [0 ]
@@ -112,10 +140,11 @@ def test_append_audit_condition_adds_condition_to_audit_log(app):
112140 assert cond .status == best_results [1 ].status .name
113141 assert cond .status_text == best_results [1 ].status .name
114142
115- def test_add_response_details_adds_to_audit_log (app ):
116- eligibility_response = EligibilityResponseFactory .build (response_id = uuid .uuid4 (),
117- meta = {"last_updated" : datetime (2023 , 1 , 1 , 0 , 0 )},
118- processed_suggestions = [])
143+
144+ def test_add_response_details_adds_to_audit_log_on_G (app ):
145+ eligibility_response = EligibilityResponseFactory .build (
146+ response_id = uuid .uuid4 (), meta = {"last_updated" : datetime (2023 , 1 , 1 , 0 , 0 )}, processed_suggestions = []
147+ )
119148
120149 with app .app_context ():
121150 g .audit_log = AuditEvent ()
@@ -126,3 +155,20 @@ def test_add_response_details_adds_to_audit_log(app):
126155 assert g .audit_log .response .last_updated is eligibility_response .meta .last_updated
127156
128157
158+ def test_write_to_firehose_calls_audit_service_with_correct_data_from_g (app ):
159+ mock_audit_service = Mock (spec = AuditService )
160+ eligibility_response = EligibilityResponseFactory .build (
161+ response_id = (uuid .uuid4 ()),
162+ meta = {"last_updated" : (datetime (2023 , 1 , 1 , 0 , 0 , tzinfo = UTC ))},
163+ processed_suggestions = [],
164+ )
165+
166+ with app .app_context ():
167+ g .audit_log = AuditEvent ()
168+
169+ AuditContext .write_to_firehose (mock_audit_service , eligibility_response )
170+
171+ assert g .audit_log .response .response_id == eligibility_response .response_id
172+ assert g .audit_log .response .last_updated == eligibility_response .meta .last_updated
173+
174+ mock_audit_service .audit .assert_called_once_with (asdict (g .audit_log ))
0 commit comments