From eef19b412bfdd234f0583cba5cc845e1200441bf Mon Sep 17 00:00:00 2001 From: Marcel Savegnago Date: Thu, 27 Aug 2026 15:31:52 -0300 Subject: [PATCH] [FIX] ai_oca_bridge: honor timeout from _execute_kwargs Hardcoding timeout=30 and unpacking _execute_kwargs that may also contain timeout raises TypeError. Downstream modules cannot set a per-bridge HTTP timeout without replicating _execute. --- ai_oca_bridge/models/ai_bridge_execution.py | 6 ++++-- ai_oca_bridge/tests/test_bridge.py | 21 +++++++++++++++++++++ 2 files changed, 25 insertions(+), 2 deletions(-) diff --git a/ai_oca_bridge/models/ai_bridge_execution.py b/ai_oca_bridge/models/ai_bridge_execution.py index 6453b010..72248ea9 100644 --- a/ai_oca_bridge/models/ai_bridge_execution.py +++ b/ai_oca_bridge/models/ai_bridge_execution.py @@ -122,14 +122,16 @@ def _execute(self, **kwargs): **kwargs, ) payload = self._add_extra_payload_fields(payload) + request_kwargs = self._execute_kwargs(**kwargs) + timeout = request_kwargs.pop("timeout", 30) try: response = requests.post( self.ai_bridge_id.url, json=payload, auth=self._get_auth(), headers=self._get_headers(), - timeout=30, # Default timeout, can be overridden by _execute_kwargs - **self._execute_kwargs(**kwargs), + timeout=timeout, + **request_kwargs, ) self.result = response.content response.raise_for_status() diff --git a/ai_oca_bridge/tests/test_bridge.py b/ai_oca_bridge/tests/test_bridge.py index 0e2797e5..584aaed8 100644 --- a/ai_oca_bridge/tests/test_bridge.py +++ b/ai_oca_bridge/tests/test_bridge.py @@ -328,3 +328,24 @@ def test_bridge_execute_computed_fields(self): self.assertEqual( execution.payload["_id"], json.loads(execution.payload_txt)["_id"] ) + + def test_execute_timeout_from_kwargs(self): + """timeout via _execute_kwargs must not raise TypeError.""" + execution = self.env["ai.bridge.execution"].create( + { + "ai_bridge_id": self.bridge.id, + "model_id": self.env["ir.model"]._get_id("res.partner"), + "res_id": self.partner.id, + } + ) + response = mock.Mock() + response.status_code = 200 + response.content = b'{"ok": true}' + response.json.return_value = {"ok": True} + response.raise_for_status = mock.Mock() + with mock.patch("requests.post", return_value=response) as mock_post: + execution._execute() + self.assertEqual(mock_post.call_args.kwargs["timeout"], 30) + execution._execute(timeout=90) + self.assertEqual(mock_post.call_args.kwargs["timeout"], 90) + self.assertEqual(execution.state, "done")