Files
awoooi/apps/api/tests/integration/conftest.py
Your Name 479f8d8971
Some checks failed
CD Pipeline / build-and-deploy (push) Failing after 35s
refactor(tests): 技術債清零 — 移除 FakeRepo/FakeSession Mock DB 違規
## ai_router.py
- 抽取 _aggregate_feedback_stats() 純函數,feedback_from_aider_events 呼叫它

## aider_event_processor.py
- _process_one 加 _session_factory=None DI 參數(預設 get_session_factory())
- 可注入測試 factory,不改既有生產邏輯

## test_ai_router_feedback.py(完全重寫)
- 移除 FakeRepo/FakeSession,改為直接測試 _aggregate_feedback_stats 純函數
- 新增 test_feedback_skips_missing_model 邊界條件
- DB 失敗降級行為 test 保留(只 patch get_session_factory,無 FakeRepo)

## test_aider_event_processor.py(完全重寫)
- 移除 FakeRepo/FakeSession,改用真實 PostgreSQL(real_factory fixture)
- Redis xack + IncidentEngine 保留 mock(外部 broker/AI 服務,符合例外)
- 每個測試後 rollback,不污染 dev DB

## setup_test_schema.sql
- 補入 aider_events_payload_gin GIN index(與 adr091 生產 migration 一致)

## integration/conftest.py
- 補注解說明密碼名稱 awoooi_prod_2026 的歷史混淆
- 修正 assert 邏輯:檢查 DB 名稱而非 URL 字串,避免密碼含 prod 觸發誤判

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-04-22 01:33:30 +08:00

64 lines
2.1 KiB
Python
Raw Permalink 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",
# 注意:密碼 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 DBawoooi_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()