"""Unit coverage for ENV-21 (tools + reasoning_effort, found live on ggg).""" import unittest from unittest.mock import AsyncMock, Mock, patch from fjerkroa_bot.openai_responder import OpenAIResponder from .test_bdd_envelope import envelope def ok_result(): message = Mock(content=envelope(answer="x", answer_needed=True), role="assistant", tool_calls=None, refusal=None) return Mock(choices=[Mock(message=message)], usage="usage") class TestToolsReasoningEffort(unittest.IsolatedAsyncioTestCase): async def chat_kwargs(self, with_tools): config = {"openai-token": "t", "model": "gpt-5.6-luna", "system": "s", "history-limit": 5, "enable-game-info": with_tools} responder = OpenAIResponder(config, "chat") if with_tools: responder.igdb = Mock() responder.igdb.get_openai_functions = Mock(return_value=[{"name": "search_games", "parameters": {}}]) with patch("fjerkroa_bot.openai_responder.openai_chat", new_callable=AsyncMock) as chat_mock: chat_mock.return_value = ok_result() await responder.chat([{"role": "user", "content": "hi"}], 10) return chat_mock.await_args.kwargs async def test_tools_carry_reasoning_effort_none(self): """ENV-21: tools attached -> reasoning_effort 'none' rides along.""" kwargs = await self.chat_kwargs(with_tools=True) self.assertIn("tools", kwargs) self.assertEqual(kwargs["reasoning_effort"], "none") async def test_toolless_calls_untouched(self): """ENV-21: without tools no reasoning_effort is sent.""" kwargs = await self.chat_kwargs(with_tools=False) self.assertNotIn("tools", kwargs) self.assertNotIn("reasoning_effort", kwargs)