fix(tests): improve composio module hijack in integration tests

This commit is contained in:
Anish Sarkar 2026-05-13 00:44:20 +05:30
parent 9b926b3133
commit bd452b3df4
2 changed files with 32 additions and 23 deletions

View file

@ -1,13 +1,11 @@
"""Composio route integration fixtures. """Composio route integration fixtures.
The sys.modules hijack happens at module import time, before importing The `composio` sys.modules hijack lives in the parent integration conftest
app.app, so production `from composio import Composio` bindings resolve to so it runs before any sibling suite imports `app.routes`.
the strict E2E fake in this pytest process too.
""" """
from __future__ import annotations from __future__ import annotations
import sys
from collections.abc import AsyncGenerator from collections.abc import AsyncGenerator
import httpx import httpx
@ -16,19 +14,15 @@ import pytest_asyncio
from httpx import ASGITransport from httpx import ASGITransport
from sqlalchemy.ext.asyncio import AsyncSession from sqlalchemy.ext.asyncio import AsyncSession
from tests.e2e.fakes import composio_module as _fake_composio from app.app import app, limiter
from app.config import config
sys.modules["composio"] = _fake_composio from app.db import (
from app.app import app, limiter # noqa: E402
from app.config import config # noqa: E402
from app.db import ( # noqa: E402
SearchSourceConnector, SearchSourceConnector,
SearchSourceConnectorType, SearchSourceConnectorType,
User, User,
get_async_session, get_async_session,
) )
from app.users import current_active_user # noqa: E402 from app.users import current_active_user
pytestmark = pytest.mark.integration pytestmark = pytest.mark.integration

View file

@ -1,3 +1,5 @@
import importlib
import sys
import uuid import uuid
from unittest.mock import AsyncMock, MagicMock from unittest.mock import AsyncMock, MagicMock
@ -7,17 +9,27 @@ from sqlalchemy import text
from sqlalchemy.ext.asyncio import AsyncSession, create_async_engine from sqlalchemy.ext.asyncio import AsyncSession, create_async_engine
from sqlalchemy.pool import NullPool from sqlalchemy.pool import NullPool
from app.config import config as app_config # Hijack `composio` before any `from app.*` import; the `from composio import
from app.db import ( # Composio` in app.services.composio_service binds once at first import.
Base, from tests.e2e.fakes import composio_module as _fake_composio
DocumentType,
SearchSourceConnector, sys.modules["composio"] = _fake_composio
SearchSourceConnectorType,
SearchSpace, app_config = importlib.import_module("app.config").config
User, app_db = importlib.import_module("app.db")
) Base = app_db.Base
from app.indexing_pipeline.connector_document import ConnectorDocument DocumentType = app_db.DocumentType
from tests.conftest import TEST_DATABASE_URL SearchSourceConnector = app_db.SearchSourceConnector
SearchSourceConnectorType = app_db.SearchSourceConnectorType
SearchSpace = app_db.SearchSpace
User = app_db.User
ConnectorDocument = importlib.import_module(
"app.indexing_pipeline.connector_document"
).ConnectorDocument
create_default_roles_and_membership = importlib.import_module(
"app.routes.search_spaces_routes"
).create_default_roles_and_membership
TEST_DATABASE_URL = importlib.import_module("tests.conftest").TEST_DATABASE_URL
_EMBEDDING_DIM = app_config.embedding_model_instance.dimension _EMBEDDING_DIM = app_config.embedding_model_instance.dimension
@ -105,6 +117,9 @@ async def db_search_space(db_session: AsyncSession, db_user: User) -> SearchSpac
) )
db_session.add(space) db_session.add(space)
await db_session.flush() await db_session.flush()
# Mirror POST /searchspaces so routes guarded by check_permission find a membership.
await create_default_roles_and_membership(db_session, space.id, db_user.id)
await db_session.flush()
return space return space