""" Integration Test Configuration ================================ 連接真實 awoooi_dev PostgreSQL 資料庫 建立時間: 2026-04-04 (台北時區) 建立者: Claude Code (整合測試 Phase 1) 規則: - 使用 awoooi_dev DB (非 prod) - 每個測試後 rollback,保持 DB 乾淨 - 禁止 Mock — 必須使用真實 DB 連線 """ import os import pytest_asyncio from sqlalchemy.ext.asyncio import AsyncSession, async_sessionmaker, create_async_engine # ============================================================================= # 強制使用 dev DB (絕對禁止打 prod) # ============================================================================= DEV_DB_URL = os.environ.get( "TEST_DATABASE_URL", # 注意:密碼 awoooi_prod_2026 是 PostgreSQL 帳號的實際密碼(歷史命名), # 並非指向 prod DB — 連線目標為 awoooi_dev(開發資料庫)。 "postgresql+asyncpg://awoooi:awoooi_prod_2026@192.168.0.188:5432/awoooi_dev?ssl=disable", ) # 確保不會誤打 prod(允許密碼含 "prod" 字串,檢查 DB 名稱) assert "awoooi_prod" not in DEV_DB_URL.split("/")[-1], ( "TEST_DATABASE_URL 不可指向 prod DB(awoooi_prod)" ) # ============================================================================= # DB Session Fixture (每個 test 獨立事務,結束後 rollback) # ============================================================================= @pytest_asyncio.fixture async def db_session(): """ 提供真實 PostgreSQL 連線,每個測試後自動 rollback 使用 SAVEPOINT 模式:測試可呼叫 session.flush() 取得 ID, 但不會真正 commit — 測試結束後外層事務 rollback。 """ engine = create_async_engine(DEV_DB_URL, echo=False) factory = async_sessionmaker( bind=engine, class_=AsyncSession, expire_on_commit=False, autoflush=False, ) async with engine.connect() as conn: await conn.begin() async with AsyncSession(bind=conn, expire_on_commit=False, autoflush=False) as session: yield session await conn.rollback() await engine.dispose()