fix(subscription): isolate statistic report failures

This commit is contained in:
jxxghp
2026-08-26 07:01:41 +08:00
parent 5493732d9f
commit df6f86ec3d
9 changed files with 234 additions and 82 deletions
+51
View File
@@ -4,6 +4,7 @@ import asyncio
from unittest.mock import AsyncMock, Mock
import pytest
from sqlalchemy import select
from app.application.subscription.write import (
AsyncCreateSubscriptionCommand,
@@ -11,6 +12,7 @@ from app.application.subscription.write import (
add_subscribe,
async_add_subscribe,
)
from app.db.models.outbox import OutboxMessage
from app.db.models.subscribe import Subscribe
from app.db.oper.subscribe import SubscribeOper, SubscribeStageResult
from app.domain.context import MediaInfo
@@ -190,6 +192,55 @@ def test_default_sync_writer_persists_once_and_reuses_duplicate(db) -> None:
]
def test_default_sync_writer_keeps_failed_report_pending_without_raising(db) -> None:
"""新增统计未确认时接口仍成功,事件 intent 收口而统计 intent 等待重试。"""
db.watermark(Subscribe, OutboxMessage)
media = _media("arch-221-report-pending")
subscribe_id, message = add_subscribe(
mediainfo=media,
after_commit=lambda _subscribe_id: False,
)
assert subscribe_id > 0
assert message == "新增订阅成功"
intents = db.session.execute(
select(OutboxMessage)
.where(OutboxMessage.event_key.contains(media.media_id))
.order_by(OutboxMessage.id)
).scalars().all()
assert [(intent.topic, intent.status) for intent in intents] == [
("subscribe.added", "completed"),
("subscribe.added.report", "pending"),
]
def test_default_async_writer_keeps_failed_report_pending_without_raising(db) -> None:
"""异步新增入口同样返回成功,并只留下统计 intent 等待重试。"""
db.watermark(Subscribe, OutboxMessage)
media = _media("arch-221-async-report-pending")
async def report_failed(_subscribe_id: int) -> bool:
"""模拟异步统计接口未确认。"""
return False
subscribe_id, message = asyncio.run(
async_add_subscribe(mediainfo=media, after_commit=report_failed)
)
assert subscribe_id > 0
assert message == "新增订阅成功"
intents = db.session.execute(
select(OutboxMessage)
.where(OutboxMessage.event_key.contains(media.media_id))
.order_by(OutboxMessage.id)
).scalars().all()
assert [(intent.topic, intent.status) for intent in intents] == [
("subscribe.added", "completed"),
("subscribe.added.report", "pending"),
]
def test_stage_add_reuses_explicit_session_without_commit(db, monkeypatch) -> None:
"""Oper 将调用方 Session 传给 Model 查询原语,暂存期间不自行提交。"""
db.watermark(Subscribe)