Files
life-echo/api/tests/test_chapter_cover_enqueue_redis.py
Sully 53e0065e3e refactor(api): TOML 配置 SSOT、统一错误契约、Auth/事务加固与可观测性 (#33)
配置 SSOT(TOML + .env)
统一错误契约
Auth 与事务边界
Redis / Celery 可靠性:业务 Redis(DB/0)与 Celery broker/backend(DB/1)显式拆分;连接池、sync client
可观测性(OpenTelemetry + LGTM)
2026-05-22 13:44:50 +08:00

77 lines
2.0 KiB
Python

import pytest
from app.tasks import chapter_cover_enqueue as enqueue_mod
def test_chapter_cover_enqueue_reuses_sync_redis_client(
monkeypatch: pytest.MonkeyPatch,
) -> None:
class FakeRedis:
def __init__(self) -> None:
self.set_calls = 0
def set(self, *args, **kwargs):
self.set_calls += 1
return True
def delete(self, key: str) -> None:
return None
shared_client = FakeRedis()
def fake_get_sync_redis(*, decode_responses: bool):
assert decode_responses is True
return shared_client
class Chapter:
category = "childhood"
cover_asset_id = None
story_links = [object()]
images = []
class FakeCoverTask:
def delay(self, chapter_id: str) -> None:
return None
monkeypatch.setattr(enqueue_mod, "get_sync_redis", fake_get_sync_redis)
monkeypatch.setattr(
enqueue_mod,
"_load_chapter_for_enqueue_sync",
lambda chapter_id: Chapter(),
)
monkeypatch.setattr(
enqueue_mod,
"chapter_has_story_links",
lambda chapter: True,
)
monkeypatch.setattr(
enqueue_mod,
"effective_chapter_markdown_for_cover_gates",
lambda chapter: "body",
)
monkeypatch.setattr(
enqueue_mod,
"strip_image_placeholders",
lambda text: text,
)
monkeypatch.setattr(
enqueue_mod,
"chapter_eligible_for_cover_by_inline_body_image_count",
lambda chapter, markdown: True,
)
monkeypatch.setattr(
enqueue_mod,
"primary_chapter_memoir_image",
lambda chapter: None,
)
import app.tasks.chapter_cover_tasks as cover_tasks
monkeypatch.setattr(cover_tasks, "generate_chapter_cover", FakeCoverTask())
ok = enqueue_mod.try_enqueue_generate_chapter_cover("chapter-1", source="http")
assert ok is True
assert shared_client.set_calls == 1
enqueue_mod.try_enqueue_generate_chapter_cover("chapter-2", source="http")
assert shared_client.set_calls == 2