From 661d4d29b22b9f9befcf9c01d81141d933c75c2c Mon Sep 17 00:00:00 2001 From: Greyson LaLonde Date: Thu, 22 Jan 2026 23:16:08 -0500 Subject: [PATCH] test: add Gemini video and audio integration tests --- .../tests/fixtures/sample_audio.wav | Bin 0 -> 16044 bytes ...alIntegration.test_analyze_audio_file.yaml | 66 +++++++++++++++++ ...alIntegration.test_analyze_video_file.yaml | 67 ++++++++++++++++++ .../tests/llms/test_multimodal_integration.py | 64 ++++++++++++++++- 4 files changed, 196 insertions(+), 1 deletion(-) create mode 100644 lib/crewai-files/tests/fixtures/sample_audio.wav create mode 100644 lib/crewai/tests/cassettes/llms/TestGeminiMultimodalIntegration.test_analyze_audio_file.yaml create mode 100644 lib/crewai/tests/cassettes/llms/TestGeminiMultimodalIntegration.test_analyze_video_file.yaml diff --git a/lib/crewai-files/tests/fixtures/sample_audio.wav b/lib/crewai-files/tests/fixtures/sample_audio.wav new file mode 100644 index 0000000000000000000000000000000000000000..745d30e86d643cd447797ab20b562136fdeb071e GIT binary patch literal 16044 zcmeI3%S$R@9EN8!x?)Y)#j?`5u9Kogka&U<7_@P5q*h50lvo>sgrE}y2DPcM;84`! zP_$_i;yZ6}qRADQqCwr{Q=Y>X+i;z7jm! zPR^$`^QX&qOcuUL*kS}@2eqj6zPPWFDlM;zyJ2l?=Ck`H}XYFihS8mZ|2XZwv)lLeI+jXr9gBz&OSAeOkq#u3Z3ACypHx6NF70>AN&`O z5xb<9IwK3`k^6%$rC_4MZT9g7p^>py*^2r!ZO?<3Ry8E;i7kp0TfOW4oXQK7QKl&8 z5SrPPaiI7pYx&i4y>>hzFNy8p`qQyQ`rVQ bytes: return TEST_TEXT_PATH.read_bytes() +@pytest.fixture +def test_video_bytes() -> bytes: + """Load test video bytes.""" + if not TEST_VIDEO_PATH.exists(): + pytest.skip("sample_video.mp4 fixture not found") + return TEST_VIDEO_PATH.read_bytes() + + +@pytest.fixture +def test_audio_bytes() -> bytes: + """Load test audio bytes.""" + if not TEST_AUDIO_PATH.exists(): + pytest.skip("sample_audio.wav fixture not found") + return TEST_AUDIO_PATH.read_bytes() + + # Minimal PDF for testing (real PDF structure) MINIMAL_PDF = b"""%PDF-1.4 1 0 obj << /Type /Catalog /Pages 2 0 R >> endobj @@ -226,6 +252,42 @@ class TestGeminiMultimodalIntegration: assert isinstance(response, str) assert len(response) > 0 + @pytest.mark.vcr() + def test_analyze_video_file(self, test_video_bytes: bytes) -> None: + """Test Gemini can analyze a video file.""" + llm = LLM(model="gemini/gemini-2.0-flash") + files = {"video": VideoFile(source=test_video_bytes)} + + messages = _build_multimodal_message( + llm, + "Describe what you see in this video in one sentence. Be brief.", + files, + ) + + response = llm.call(messages) + + assert response + assert isinstance(response, str) + assert len(response) > 0 + + @pytest.mark.vcr() + def test_analyze_audio_file(self, test_audio_bytes: bytes) -> None: + """Test Gemini can analyze an audio file.""" + llm = LLM(model="gemini/gemini-2.0-flash") + files = {"audio": AudioFile(source=test_audio_bytes)} + + messages = _build_multimodal_message( + llm, + "Describe what you hear in this audio in one sentence. Be brief.", + files, + ) + + response = llm.call(messages) + + assert response + assert isinstance(response, str) + assert len(response) > 0 + class TestLiteLLMMultimodalIntegration: """Integration tests for LiteLLM wrapper multimodal with real API calls."""