from unittest.mock import patch, MagicMock from app.ai_services import chat_completion, analyze_image, translate_text, transcribe_audio @patch("app.ai_services.openai_client") def test_chat_completion(mock_client): mock = MagicMock() mock.chat.completions.create.return_value = MagicMock(choices=[MagicMock(message=MagicMock(content="ok"))]) mock_client.return_value = mock out = chat_completion([{"role": "user", "content": "hello"}], "en") assert out == "ok" @patch("app.ai_services.openai_client") def test_analyze_image(mock_client): mock = MagicMock() mock.chat.completions.create.return_value = MagicMock(choices=[MagicMock(message=MagicMock(content="image ok"))]) mock_client.return_value = mock out = analyze_image("./image-test2.jpg", None) assert "image ok" in out @patch("app.ai_services.openai_client") def test_translate_text_fallback_openai(mock_client): mock = MagicMock() mock.chat.completions.create.return_value = MagicMock(choices=[MagicMock(message=MagicMock(content="bonjour"))]) mock_client.return_value = mock out = translate_text("hello", "fr") assert out == "bonjour" @patch("app.ai_services.openai_client") @patch("httpx.Client.get") def test_transcribe_audio(mock_get, mock_client): # Mock audio download mock_response = MagicMock() mock_response.content = b"fake-bytes" mock_response.raise_for_status.return_value = None mock_get.return_value = mock_response # Mock whisper mock_openai = MagicMock() mock_openai.audio.transcriptions.create.return_value = MagicMock(text="bonjour") mock_client.return_value = mock_openai out = transcribe_audio("./test-audio1.wav", language="fr") assert out == "bonjour" from app.ai_services import build_system_prompt def test_system_prompt_contains_context(): p = build_system_prompt("fr") assert "Context" in p or "Contex" in p or len(p) > 0