"""Database fixture for plugin persistence behavior tests.""" import os import pytest from sqlalchemy import text from sqlalchemy.ext.asyncio import AsyncSession, create_async_engine from langbot.pkg.entity.persistence.base import Base from langbot.pkg.entity.persistence.bstorage import BinaryStorage from langbot.pkg.entity.persistence.plugin import PluginSetting from langbot.pkg.entity.persistence.user import User from langbot.pkg.entity.persistence.workspace import Workspace from langbot_plugin.runtime.security import PLUGIN_FILE_STORAGE_DIR_ENV @pytest.fixture(autouse=True) def clean_file_transfer_env(): original = os.environ.get(PLUGIN_FILE_STORAGE_DIR_ENV) yield if original is None: os.environ.pop(PLUGIN_FILE_STORAGE_DIR_ENV, None) else: os.environ[PLUGIN_FILE_STORAGE_DIR_ENV] = original @pytest.fixture async def plugin_db(): engine = create_async_engine('sqlite+aiosqlite:///:memory:') try: async with engine.begin() as connection: await connection.execute(text('PRAGMA foreign_keys=ON')) await connection.run_sync( Base.metadata.create_all, tables=[User.__table__, Workspace.__table__, PluginSetting.__table__, BinaryStorage.__table__], ) async with AsyncSession(engine, expire_on_commit=False) as session: session.add_all( Workspace( uuid=workspace, instance_uuid='instance-a', name=workspace, slug=workspace, source='cloud_projection', ) for workspace in ('workspace-a', 'workspace-b') ) await session.flush() yield session finally: await engine.dispose()