Files
awoooi/apps/api/tests/integration/conftest.py
OG T 485b8cb003
Some checks failed
CD Pipeline / build-and-deploy (push) Failing after 1m55s
fix(ci): B5 整合測試加 ssl=disable — asyncpg 預設嘗試 SSL 被 container 拒絕
錯誤: ConnectionRefusedError Connect call failed ('127.0.0.1', 15432)
根因: asyncpg 走 _create_ssl_connection,臨時 postgres container 無 SSL
修正: TEST_DATABASE_URL + conftest 預設 URL 均加 ?ssl=disable

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-04-10 11:40:40 +08:00

62 lines
1.9 KiB
Python
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
"""
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",
"postgresql+asyncpg://awoooi:awoooi_prod_2026@192.168.0.188:5432/awoooi_dev?ssl=disable",
)
# 確保不會誤打 prod
assert "prod" not in DEV_DB_URL or "awoooi_prod_2026" in DEV_DB_URL, (
"TEST_DATABASE_URL 不可指向 prod DB"
)
# =============================================================================
# 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()