@@ -120,6 +120,55 @@ def observer(event, facts, error):
120120 assert all (event [1 ]["batch_index" ] == 0 for event in model_events )
121121
122122
123+ @pytest .mark .parametrize (("action_name" , "audit_only" ), [("audit_only" , False ), ("evaluate" , True )])
124+ def test_audit_only_context_tags_nested_audits_and_restores (
125+ action_name : str ,
126+ audit_only : bool ,
127+ make_mocked_engine_adapter : Callable [..., EngineAdapter ],
128+ ):
129+ adapter = make_mocked_engine_adapter (EngineAdapter , query_execution_context = True )
130+ observed = []
131+
132+ def observer (event , facts , error ):
133+ if facts ["kind" ] == "model" :
134+ observed .append ((event , facts ["action" ], get_query_execution_context ()))
135+
136+ console = SimpleNamespace (get_execution_observer = lambda : observer )
137+ with console_observer_scope (console , query_execution_context = True ):
138+ with action (
139+ "model" ,
140+ action_name ,
141+ snapshot = _snapshot (),
142+ interval = _interval (1 ),
143+ batch_index = 0 ,
144+ audit_only = audit_only ,
145+ ):
146+ outer = get_query_execution_context ()
147+ assert outer is not None
148+ adapter .execute ("SELECT audited model" )
149+ model_sql = _last_sql (adapter )
150+ with action ("audit" , "audit" , audit_name = "not_null" ):
151+ adapter .execute ("SELECT audit" )
152+ audit_sql = _last_sql (adapter )
153+ assert get_query_execution_context () == outer
154+ assert get_query_execution_context () is None
155+
156+ evaluation = outer .evaluation
157+ assert evaluation is not None
158+ assert evaluation .operation_type .value == "audit"
159+ model_payload = _payload (model_sql )
160+ audit_payload = _payload (audit_sql )
161+ assert model_payload is not None
162+ assert audit_payload is not None
163+ assert model_payload ["operation" ]["id" ] == evaluation .evaluation_id
164+ assert audit_payload ["operation" ]["id" ] == evaluation .evaluation_id
165+ assert model_payload ["operation" ]["type" ] == "audit"
166+ assert model_payload ["query" ] == {"phase" : "audit" , "role" : "audit" }
167+ assert audit_payload ["query" ] == {"phase" : "audit" , "role" : "audit" }
168+ assert [event for event , _ , _ in observed ] == ["start" , "finish" ]
169+ assert all (context == outer for _ , _ , context in observed )
170+
171+
123172def test_explicit_disabled_scope_suppresses_transport_then_outer_context_resumes (
124173 make_mocked_engine_adapter : Callable [..., EngineAdapter ],
125174):
@@ -162,6 +211,61 @@ def test_explicit_disabled_scope_suppresses_transport_then_outer_context_resumes
162211 assert resumed ["operation" ]["id" ] == outer .evaluation .evaluation_id
163212
164213
214+ def test_nonmodel_and_malformed_nested_model_clear_then_restore_outer_context (
215+ make_mocked_engine_adapter : Callable [..., EngineAdapter ],
216+ ):
217+ adapter = make_mocked_engine_adapter (EngineAdapter , query_execution_context = True )
218+ console = SimpleNamespace (get_execution_observer = lambda : None )
219+ with console_observer_scope (console , query_execution_context = True ):
220+ with action (
221+ "model" ,
222+ "evaluate" ,
223+ snapshot = _snapshot (),
224+ interval = _interval (1 ),
225+ batch_index = 0 ,
226+ ):
227+ outer = get_query_execution_context ()
228+ assert outer is not None
229+
230+ with action (
231+ "model" ,
232+ "evaluate" ,
233+ snapshot = SimpleNamespace (is_model = False ),
234+ interval = _interval (2 ),
235+ batch_index = 1 ,
236+ ):
237+ assert get_query_execution_context () is None
238+ adapter .execute ("SELECT nonmodel" )
239+ nonmodel_sql = _last_sql (adapter )
240+ assert get_query_execution_context () == outer
241+
242+ with action (
243+ "model" ,
244+ "evaluate" ,
245+ snapshot = _snapshot ("analytics.malformed" ),
246+ interval = _interval (3 ),
247+ batch_index = - 1 ,
248+ ):
249+ assert get_query_execution_context () is None
250+ adapter .execute ("SELECT malformed model" )
251+ malformed_sql = _last_sql (adapter )
252+ assert get_query_execution_context () == outer
253+
254+ with action ("stage" , "unclassified" ):
255+ assert get_query_execution_context () == outer
256+ adapter .execute ("SELECT outer context" )
257+ outer_sql = _last_sql (adapter )
258+
259+ assert get_query_execution_context () is None
260+
261+ assert _payload (nonmodel_sql ) is None
262+ assert _payload (malformed_sql ) is None
263+ outer_payload = _payload (outer_sql )
264+ assert outer_payload is not None
265+ assert outer .evaluation is not None
266+ assert outer_payload ["operation" ]["id" ] == outer .evaluation .evaluation_id
267+
268+
165269@pytest .mark .parametrize ("provider_kind" , ["value" , "none" ])
166270def test_custom_provider_remains_authoritative (
167271 provider_kind : str ,
0 commit comments