refactor(tests): 技術債清零 — 移除 FakeRepo/FakeSession Mock DB 違規
Some checks failed
CD Pipeline / build-and-deploy (push) Failing after 35s

## 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>
This commit is contained in:
Your Name
2026-04-22 01:33:30 +08:00
parent d0591c54b0
commit 479f8d8971
6 changed files with 154 additions and 180 deletions

View File

@@ -119,8 +119,12 @@ class AiderEventProcessor:
logger.exception("aider_processor_loop_error", error=str(e))
await asyncio.sleep(1.0)
async def _process_one(self, stream_key: str, msg_id: Any, data: dict) -> None:
"""處理單筆 messageparse → (maybe) incident → DB write → ACK。"""
async def _process_one(
self, stream_key: str, msg_id: Any, data: dict, _session_factory=None
) -> None:
"""處理單筆 messageparse → (maybe) incident → DB write → ACK。
_session_factory: 可注入測試用 factory預設使用 get_session_factory()。
"""
try:
raw = data.get(b"payload") or data.get("payload")
if isinstance(raw, bytes):
@@ -147,7 +151,7 @@ class AiderEventProcessor:
# 不中斷 — 即使 incident 失敗event 仍要持久化
try:
session_factory = get_session_factory()
session_factory = _session_factory or get_session_factory()
async with session_factory() as session:
repo = AiderEventRepository(session)
await repo.insert(