From cb9a0f327caa8b2bc3a5e7e40f737c22a77a1823 Mon Sep 17 00:00:00 2001 From: Anish Sarkar <104695310+AnishSarkar22@users.noreply.github.com> Date: Sat, 16 May 2026 21:26:40 +0530 Subject: [PATCH] test: refactor Gmail indexer tests to utilize ComposioService and hybrid chunking --- .../tests/integration/conftest.py | 4 ++ .../test_gmail_indexer_credentials.py | 62 ++++++++++++------- .../adapters/test_file_upload_adapter.py | 2 +- 3 files changed, 44 insertions(+), 24 deletions(-) diff --git a/surfsense_backend/tests/integration/conftest.py b/surfsense_backend/tests/integration/conftest.py index 2f4b3fe9a..e03101e63 100644 --- a/surfsense_backend/tests/integration/conftest.py +++ b/surfsense_backend/tests/integration/conftest.py @@ -160,6 +160,10 @@ def patched_chunk_text(monkeypatch) -> MagicMock: "app.indexing_pipeline.indexing_pipeline_service.chunk_text", mock, ) + monkeypatch.setattr( + "app.indexing_pipeline.indexing_pipeline_service.chunk_text_hybrid", + mock, + ) return mock diff --git a/surfsense_backend/tests/integration/google_unification/test_gmail_indexer_credentials.py b/surfsense_backend/tests/integration/google_unification/test_gmail_indexer_credentials.py index afb3e64c3..b869f5607 100644 --- a/surfsense_backend/tests/integration/google_unification/test_gmail_indexer_credentials.py +++ b/surfsense_backend/tests/integration/google_unification/test_gmail_indexer_credentials.py @@ -7,7 +7,7 @@ mocked at their system boundaries. from __future__ import annotations -from unittest.mock import AsyncMock, MagicMock, patch +from unittest.mock import ANY, AsyncMock, MagicMock, patch import pytest import pytest_asyncio @@ -25,6 +25,7 @@ pytestmark = pytest.mark.integration _COMPOSIO_ACCOUNT_ID = "composio-gmail-test-456" _INDEXER_MODULE = "app.tasks.connector_indexers.google_gmail_indexer" +_GET_ACCESS_TOKEN = "app.services.composio_service.ComposioService.get_access_token" @pytest_asyncio.fixture @@ -69,30 +70,32 @@ async def native_gmail(async_engine): await cleanup_space(async_engine, data["search_space_id"]) +@patch(_GET_ACCESS_TOKEN) @patch(f"{_INDEXER_MODULE}.TaskLoggingService") @patch(f"{_INDEXER_MODULE}.GoogleGmailConnector") -@patch(f"{_INDEXER_MODULE}.build_composio_credentials") -async def test_composio_gmail_uses_composio_credentials( - mock_build_creds, +@patch(f"{_INDEXER_MODULE}.ComposioService") +async def test_composio_gmail_uses_composio_service( + mock_composio_service_cls, mock_gmail_cls, mock_tl_cls, + mock_get_access_token, async_engine, composio_gmail, ): - """Gmail indexer calls build_composio_credentials for a Composio connector.""" + """Gmail indexer uses Composio tools directly for a Composio connector.""" from app.tasks.connector_indexers.google_gmail_indexer import ( index_google_gmail_messages, ) data = composio_gmail - mock_creds = MagicMock(name="composio-creds") - mock_build_creds.return_value = mock_creds + mock_composio_service = MagicMock() + mock_composio_service.get_gmail_messages = AsyncMock( + return_value=([], None, None, None) + ) + mock_composio_service.get_gmail_message_detail = AsyncMock(return_value=({}, None)) + mock_composio_service_cls.return_value = mock_composio_service mock_tl_cls.return_value = mock_task_logger() - mock_gmail_instance = MagicMock() - mock_gmail_instance.get_recent_messages = AsyncMock(return_value=([], None)) - mock_gmail_cls.return_value = mock_gmail_instance - maker = make_session_factory(async_engine) async with maker() as session: await index_google_gmail_messages( @@ -102,17 +105,25 @@ async def test_composio_gmail_uses_composio_credentials( user_id=data["user_id"], ) - mock_build_creds.assert_called_once_with(_COMPOSIO_ACCOUNT_ID) - mock_gmail_cls.assert_called_once() - args, _ = mock_gmail_cls.call_args - assert args[0] is mock_creds + mock_composio_service_cls.assert_called_once() + mock_composio_service.get_gmail_messages.assert_called_once_with( + connected_account_id=_COMPOSIO_ACCOUNT_ID, + entity_id=f"surfsense_{data['user_id']}", + query=ANY, + max_results=ANY, + page_token=None, + ) + mock_gmail_cls.assert_not_called() + mock_get_access_token.assert_not_called() +@patch(_GET_ACCESS_TOKEN) @patch(f"{_INDEXER_MODULE}.TaskLoggingService") -@patch(f"{_INDEXER_MODULE}.build_composio_credentials") +@patch(f"{_INDEXER_MODULE}.ComposioService") async def test_composio_gmail_without_account_id_returns_error( - mock_build_creds, + mock_composio_service_cls, mock_tl_cls, + mock_get_access_token, async_engine, composio_gmail_no_id, ): @@ -136,20 +147,23 @@ async def test_composio_gmail_without_account_id_returns_error( assert count == 0 assert error is not None assert "composio" in error.lower() - mock_build_creds.assert_not_called() + mock_composio_service_cls.assert_not_called() + mock_get_access_token.assert_not_called() +@patch(_GET_ACCESS_TOKEN) @patch(f"{_INDEXER_MODULE}.TaskLoggingService") +@patch(f"{_INDEXER_MODULE}.ComposioService") @patch(f"{_INDEXER_MODULE}.GoogleGmailConnector") -@patch(f"{_INDEXER_MODULE}.build_composio_credentials") -async def test_native_gmail_does_not_use_composio_credentials( - mock_build_creds, +async def test_native_gmail_uses_google_gmail_connector( mock_gmail_cls, + mock_composio_service_cls, mock_tl_cls, + mock_get_access_token, async_engine, native_gmail, ): - """Gmail indexer does NOT call build_composio_credentials for a native connector.""" + """Native Gmail connector uses GoogleGmailConnector with no Composio path.""" from app.tasks.connector_indexers.google_gmail_indexer import ( index_google_gmail_messages, ) @@ -170,4 +184,6 @@ async def test_native_gmail_does_not_use_composio_credentials( user_id=data["user_id"], ) - mock_build_creds.assert_not_called() + mock_gmail_cls.assert_called_once() + mock_composio_service_cls.assert_not_called() + mock_get_access_token.assert_not_called() diff --git a/surfsense_backend/tests/integration/indexing_pipeline/adapters/test_file_upload_adapter.py b/surfsense_backend/tests/integration/indexing_pipeline/adapters/test_file_upload_adapter.py index 9fc802aa6..6bb1d2094 100644 --- a/surfsense_backend/tests/integration/indexing_pipeline/adapters/test_file_upload_adapter.py +++ b/surfsense_backend/tests/integration/indexing_pipeline/adapters/test_file_upload_adapter.py @@ -200,7 +200,7 @@ async def test_reindex_sets_status_ready(db_session, db_search_space, db_user, m async def test_reindex_replaces_chunks(db_session, db_search_space, db_user, mocker): """Reindexing replaces old chunks with new content rather than appending.""" mocker.patch( - "app.indexing_pipeline.indexing_pipeline_service.chunk_text", + "app.indexing_pipeline.indexing_pipeline_service.chunk_text_hybrid", side_effect=[["Original chunk."], ["Updated chunk."]], )