55import pytest
66from fastapi import HTTPException , status
77from semantic_kernel .exceptions .agent_exceptions import AgentException as RealAgentException
8+ from azure .ai .agents .models import MessageRole
89
910
1011
@@ -171,51 +172,85 @@ def test_init(self, mock_config_class, mock_request):
171172 assert service .agent == mock_request .app .state .agent
172173 assert ChatService .thread_cache is not None
173174
174- @patch ('helpers.azure_openai_helper.openai.AzureOpenAI' )
175- def test_process_rag_response_success (self , mock_openai_class , chat_service ):
176- """Test successful RAG response processing."""
177- # Setup mock OpenAI client
175+
176+ @pytest .mark .asyncio
177+ @patch ("services.chat_service.ChartAgentFactory.get_agent" , new_callable = AsyncMock )
178+ async def test_process_rag_response_success (self , mock_get_agent ):
179+ # Create mock request and ChatService instance
180+ mock_request = MagicMock ()
181+ mock_request .app .state .agent = MagicMock ()
182+ service = ChatService (mock_request )
183+
184+ # Setup mocks
185+ mock_agent = MagicMock ()
178186 mock_client = MagicMock ()
179- mock_openai_class .return_value = mock_client
180-
181- mock_completion = MagicMock ()
182- mock_completion .choices [0 ].message .content = '{"type": "bar", "data": {"labels": ["A", "B"], "datasets": [{"data": [1, 2]}]}}'
183- mock_client .chat .completions .create .return_value = mock_completion
184-
185- result = chat_service .process_rag_response ("Sample RAG response with numbers 10, 20" , "Query about data" )
186-
187+ mock_thread = MagicMock ()
188+ mock_thread .id = "mock-thread-id"
189+
190+ # Return from ChartAgentFactory
191+ mock_get_agent .return_value = {
192+ "agent" : mock_agent ,
193+ "client" : mock_client
194+ }
195+
196+ # Set up valid chart JSON
197+ mock_text_msg = MagicMock ()
198+ mock_text_msg .text .value = """
199+ ```json
200+ {
201+ "type": "bar",
202+ "data": {
203+ "labels": ["A", "B"],
204+ "datasets": [{"data": [1, 2]}]
205+ }
206+ }
207+ ```
208+ """
209+
210+ mock_msg = MagicMock ()
211+ mock_msg .role = MessageRole .AGENT # ✅ Correct Enum type
212+ mock_msg .text_messages = [mock_text_msg ]
213+
214+ # Setup all methods
215+ mock_client .agents .threads .create .return_value = mock_thread
216+ mock_client .agents .messages .create .return_value = None
217+ mock_client .agents .runs .create_and_process .return_value .status = "completed"
218+ mock_client .agents .messages .list .return_value = [mock_msg ]
219+ mock_client .agents .threads .delete .return_value = None
220+
221+ # ACT
222+ result = await service .process_rag_response ("RAG content" , "Query" )
223+
224+ print ("RESULT:" , result ) # 🔍 debug
225+
226+ # ASSERT
227+ assert isinstance (result , dict )
187228 assert result ["type" ] == "bar"
188- assert "data" in result
189229 assert result ["data" ]["labels" ] == ["A" , "B" ]
190- mock_client .chat .completions .create .assert_called_once ()
191230
231+ @pytest .mark .asyncio
192232 @patch ('helpers.azure_openai_helper.openai.AzureOpenAI' )
193- def test_process_rag_response_invalid_json (self , mock_openai_class , chat_service ):
194- """Test RAG response processing with invalid JSON."""
195- # Setup mock OpenAI client
233+ async def test_process_rag_response_invalid_json (self , mock_openai_class , chat_service ):
196234 mock_client = MagicMock ()
197235 mock_openai_class .return_value = mock_client
198-
236+
199237 mock_completion = MagicMock ()
200238 mock_completion .choices [0 ].message .content = 'Invalid JSON response'
201239 mock_client .chat .completions .create .return_value = mock_completion
202-
203- result = chat_service .process_rag_response ("Sample RAG response" , "Query" )
204-
240+
241+ result = await chat_service .process_rag_response ("Sample RAG response" , "Query" )
242+
205243 assert "error" in result
206- assert result [ "error" ] == "Chart could not be generated from this data. Please ask a different question."
207-
244+
245+ @ pytest . mark . asyncio
208246 @patch ('helpers.azure_openai_helper.openai.AzureOpenAI' )
209- def test_process_rag_response_exception (self , mock_openai_class , chat_service ):
210- """Test RAG response processing with exception."""
211- # Setup mock to raise exception
247+ async def test_process_rag_response_exception (self , mock_openai_class , chat_service ):
212248 mock_openai_class .side_effect = Exception ("OpenAI API error" )
213-
214- result = chat_service .process_rag_response ("Sample RAG response" , "Query" )
215-
249+
250+ result = await chat_service .process_rag_response ("Sample RAG response" , "Query" )
251+
216252 assert "error" in result
217- assert result ["error" ] == "Chart could not be generated from this data. Please ask a different question."
218-
253+
219254 @pytest .mark .asyncio
220255 @patch ('services.chat_service.AzureAIAgentThread' )
221256 @patch ('services.chat_service.TruncationObject' )
@@ -423,26 +458,21 @@ async def mock_stream_openai_text_generic_error(conversation_id, query):
423458 assert "An error occurred while processing the request." == error_data ["error" ]
424459
425460 @pytest .mark .asyncio
426- @patch ('services.chat_service.uuid.uuid4' )
427- @patch ('services.chat_service.time.time' )
428- async def test_complete_chat_request_success (self , mock_time , mock_uuid , chat_service ):
429- """Test successful complete chat request."""
430- mock_uuid .return_value = "test-uuid"
431- mock_time .return_value = 1234567890
432-
433- # Mock process_rag_response to return valid chart data
434- def mock_process_rag_response (rag_response , query ):
435- return {"type" : "bar" , "data" : {"labels" : ["A" ], "datasets" : [{"data" : [1 ]}]}}
436-
437- chat_service .process_rag_response = mock_process_rag_response
438-
461+ async def test_complete_chat_request_success (self , chat_service ):
462+ mock_chart_data = {
463+ "type" : "bar" ,
464+ "data" : {
465+ "labels" : ["A" ],
466+ "datasets" : [{"data" : [1 ]}]
467+ }
468+ }
469+
470+ chat_service .process_rag_response = AsyncMock (return_value = mock_chart_data )
471+
439472 result = await chat_service .complete_chat_request ("Query" , last_rag_response = "RAG response" )
440-
441- assert result ["id" ] == "test-uuid"
442- assert result ["model" ] == "azure-openai"
443- assert result ["created" ] == 1234567890
444- assert "object" in result
473+
445474 assert result ["object" ]["type" ] == "bar"
475+
446476
447477 @pytest .mark .asyncio
448478 async def test_complete_chat_request_no_rag_response (self , chat_service ):
@@ -454,29 +484,18 @@ async def test_complete_chat_request_no_rag_response(self, chat_service):
454484
455485 @pytest .mark .asyncio
456486 async def test_complete_chat_request_chart_error (self , chat_service ):
457- """Test complete chat request when chart generation fails."""
458- # Mock process_rag_response to return error
459- def mock_process_rag_response (rag_response , query ):
460- return {"error" : "Chart generation failed" }
461-
462- chat_service .process_rag_response = mock_process_rag_response
463-
487+ chat_service .process_rag_response = AsyncMock (return_value = {"error" : "Chart generation failed" })
488+
464489 result = await chat_service .complete_chat_request ("Query" , last_rag_response = "RAG response" )
465-
490+
466491 assert "error" in result
467- assert "Chart could not be generated from this data" in result ["error" ]
468- assert "error_desc" in result
492+
469493
470494 @pytest .mark .asyncio
471495 async def test_complete_chat_request_empty_chart_data (self , chat_service ):
472- """Test complete chat request when chart data is empty."""
473- # Mock process_rag_response to return empty data
474- def mock_process_rag_response (rag_response , query ):
475- return None
476-
477- chat_service .process_rag_response = mock_process_rag_response
478-
496+ chat_service .process_rag_response = AsyncMock (return_value = None )
497+
479498 result = await chat_service .complete_chat_request ("Query" , last_rag_response = "RAG response" )
480-
499+
481500 assert "error" in result
482- assert "Chart could not be generated from this data" in result [ "error" ]
501+
0 commit comments