From 0d7f6c09e5370cdc6ef54ccd4177b5a4891db691 Mon Sep 17 00:00:00 2001 From: OmriShukrun_ Date: Sat, 18 Apr 2026 17:45:26 +0300 Subject: [PATCH] Added test checking error is not happening anymore --- .../guardrail_hooks/test_noma_v2.py | 38 +++++++++++++++++++ 1 file changed, 38 insertions(+) diff --git a/tests/test_litellm/proxy/guardrails/guardrail_hooks/test_noma_v2.py b/tests/test_litellm/proxy/guardrails/guardrail_hooks/test_noma_v2.py index 7a3566fecbd..b6445a7c90d 100644 --- a/tests/test_litellm/proxy/guardrails/guardrail_hooks/test_noma_v2.py +++ b/tests/test_litellm/proxy/guardrails/guardrail_hooks/test_noma_v2.py @@ -160,6 +160,44 @@ class TestNomaV2Configuration: ) assert request_data["messages"][0]["content"] == "hello" + def test_build_scan_payload_survives_unpicklable_request_data( + self, noma_v2_guardrail + ): + """Regression test for NOM-8044: post_call / during_call / during_mcp_call + used to 500 because request_data contained uvloop.Loop and similar + C-extension objects whose __reduce__ raises, which crashed deepcopy.""" + + class _FakeUvloopObject: + def __reduce__(self): + raise TypeError("no default __reduce__ due to non-trivial __cinit__") + + def __repr__(self) -> str: + return "" + + unpicklable = _FakeUvloopObject() + request_data = { + "metadata": {"headers": {"x-noma-application-id": "header-app"}}, + "messages": [{"role": "user", "content": "hello"}], + "event_loop": unpicklable, + } + + payload = noma_v2_guardrail._build_scan_payload( + inputs={"texts": ["hello"]}, + request_data=request_data, + input_type="response", + logging_obj=None, + application_id="dynamic-app", + ) + + assert isinstance(payload["request_data"], dict) + assert payload["request_data"]["event_loop"] == "" + assert payload["request_data"]["messages"] == [ + {"role": "user", "content": "hello"} + ] + + # Original request_data must not have been mutated by the copy. + assert request_data["event_loop"] is unpicklable + def test_build_scan_payload_passes_model_call_details_as_is( self, noma_v2_guardrail ):