Merge branch 'refactor/backend-architecture' into development
This commit is contained in:
@@ -1,25 +1,34 @@
|
||||
import unittest
|
||||
from contextlib import contextmanager
|
||||
from types import SimpleNamespace
|
||||
from unittest.mock import Mock, patch
|
||||
|
||||
from api.tasks.memoir_tasks import MemoirImageSettings, process_memoir_segments
|
||||
from app.tasks.memoir_tasks import MemoirImageSettings, process_memoir_segments
|
||||
|
||||
|
||||
def _mock_get_sync_db(db):
|
||||
@contextmanager
|
||||
def _cm():
|
||||
yield db
|
||||
|
||||
return _cm() # 返回 context manager 实例,供 with 使用
|
||||
|
||||
|
||||
class ProcessMemoirSegmentsImageEnqueueTest(unittest.TestCase):
|
||||
@patch("api.tasks.memoir_tasks._update_task_status_sync")
|
||||
@patch("api.tasks.memoir_tasks._release_chapter_lock")
|
||||
@patch("api.tasks.memoir_tasks._acquire_chapter_lock", return_value=True)
|
||||
@patch("api.tasks.memoir_tasks._update_slot_sync")
|
||||
@patch("api.tasks.memoir_tasks._classify_chapter_category", return_value="childhood")
|
||||
@patch("api.tasks.memoir_tasks._get_or_create_state_sync")
|
||||
@patch("api.tasks.memoir_tasks.llm_service.get_llm")
|
||||
@patch("api.tasks.memoir_tasks.generate_chapter_images.delay")
|
||||
@patch("api.tasks.memoir_tasks.SessionLocal")
|
||||
@patch("api.tasks.memoir_tasks.MemoirImageSettings.from_env")
|
||||
@patch("app.tasks.memoir_tasks._update_task_status_sync")
|
||||
@patch("app.tasks.memoir_tasks._release_chapter_lock")
|
||||
@patch("app.tasks.memoir_tasks._acquire_chapter_lock", return_value=True)
|
||||
@patch("app.tasks.memoir_tasks._update_slot_sync")
|
||||
@patch("app.tasks.memoir_tasks._classify_chapter_category", return_value="childhood")
|
||||
@patch("app.tasks.memoir_tasks._get_or_create_state_sync")
|
||||
@patch("app.tasks.memoir_tasks._get_llm")
|
||||
@patch("app.tasks.memoir_tasks.generate_chapter_images.delay")
|
||||
@patch("app.tasks.memoir_tasks.get_sync_db")
|
||||
@patch("app.tasks.memoir_tasks.MemoirImageSettings.from_env")
|
||||
def test_process_memoir_segments_parses_markdown_wrapped_state_extraction_json(
|
||||
self,
|
||||
settings_from_env,
|
||||
session_local_cls,
|
||||
get_sync_db_mock,
|
||||
delay_mock,
|
||||
get_llm_mock,
|
||||
get_state_mock,
|
||||
@@ -67,16 +76,26 @@ class ProcessMemoirSegmentsImageEnqueueTest(unittest.TestCase):
|
||||
segments_result = Mock()
|
||||
segments_result.scalars.return_value.all.return_value = [segment]
|
||||
|
||||
unique_result = Mock()
|
||||
unique_result.scalar_one_or_none.return_value = None
|
||||
chapter_result = Mock()
|
||||
chapter_result.scalar_one_or_none.return_value = None
|
||||
chapter_result.unique.return_value = unique_result
|
||||
|
||||
book_result = Mock()
|
||||
book_result.scalar_one_or_none.return_value = None
|
||||
|
||||
empty_sections_result = Mock()
|
||||
empty_sections_result.scalars.return_value.all.return_value = []
|
||||
|
||||
db = Mock()
|
||||
db.execute.side_effect = [segments_result, chapter_result, book_result]
|
||||
db.execute.side_effect = [
|
||||
segments_result,
|
||||
chapter_result,
|
||||
empty_sections_result, # _save_narrative_to_sections 内查询 ChapterSection
|
||||
book_result,
|
||||
]
|
||||
db.get.return_value = None
|
||||
session_local_cls.return_value = db
|
||||
get_sync_db_mock.return_value = _mock_get_sync_db(db)
|
||||
|
||||
events: list[str] = []
|
||||
db.commit.side_effect = lambda: events.append("commit")
|
||||
@@ -101,19 +120,19 @@ class ProcessMemoirSegmentsImageEnqueueTest(unittest.TestCase):
|
||||
self.assertEqual(len(delay_events), 1)
|
||||
self.assertGreater(events.index(delay_events[0]), events.index("commit"))
|
||||
|
||||
@patch("api.tasks.memoir_tasks._update_task_status_sync")
|
||||
@patch("api.tasks.memoir_tasks._release_chapter_lock")
|
||||
@patch("api.tasks.memoir_tasks._acquire_chapter_lock", return_value=True)
|
||||
@patch("api.tasks.memoir_tasks._classify_chapter_category", return_value="childhood")
|
||||
@patch("api.tasks.memoir_tasks._get_or_create_state_sync")
|
||||
@patch("api.tasks.memoir_tasks.llm_service.get_llm", return_value=None)
|
||||
@patch("api.tasks.memoir_tasks.generate_chapter_images.delay")
|
||||
@patch("api.tasks.memoir_tasks.SessionLocal")
|
||||
@patch("api.tasks.memoir_tasks.MemoirImageSettings.from_env")
|
||||
@patch("app.tasks.memoir_tasks._update_task_status_sync")
|
||||
@patch("app.tasks.memoir_tasks._release_chapter_lock")
|
||||
@patch("app.tasks.memoir_tasks._acquire_chapter_lock", return_value=True)
|
||||
@patch("app.tasks.memoir_tasks._classify_chapter_category", return_value="childhood")
|
||||
@patch("app.tasks.memoir_tasks._get_or_create_state_sync")
|
||||
@patch("app.tasks.memoir_tasks._get_llm", return_value=None)
|
||||
@patch("app.tasks.memoir_tasks.generate_chapter_images.delay")
|
||||
@patch("app.tasks.memoir_tasks.get_sync_db")
|
||||
@patch("app.tasks.memoir_tasks.MemoirImageSettings.from_env")
|
||||
def test_process_memoir_segments_does_not_enqueue_image_jobs_when_feature_disabled(
|
||||
self,
|
||||
settings_from_env,
|
||||
session_local_cls,
|
||||
get_sync_db_mock,
|
||||
delay_mock,
|
||||
_get_llm,
|
||||
get_state_mock,
|
||||
@@ -143,16 +162,26 @@ class ProcessMemoirSegmentsImageEnqueueTest(unittest.TestCase):
|
||||
segments_result = Mock()
|
||||
segments_result.scalars.return_value.all.return_value = [segment]
|
||||
|
||||
unique_result = Mock()
|
||||
unique_result.scalar_one_or_none.return_value = None
|
||||
chapter_result = Mock()
|
||||
chapter_result.scalar_one_or_none.return_value = None
|
||||
chapter_result.unique.return_value = unique_result
|
||||
|
||||
book_result = Mock()
|
||||
book_result.scalar_one_or_none.return_value = None
|
||||
|
||||
empty_sections_result = Mock()
|
||||
empty_sections_result.scalars.return_value.all.return_value = []
|
||||
|
||||
db = Mock()
|
||||
db.execute.side_effect = [segments_result, chapter_result, book_result]
|
||||
db.execute.side_effect = [
|
||||
segments_result,
|
||||
chapter_result,
|
||||
empty_sections_result, # _save_narrative_to_sections 内查询 ChapterSection
|
||||
book_result,
|
||||
]
|
||||
db.get.return_value = None
|
||||
session_local_cls.return_value = db
|
||||
get_sync_db_mock.return_value = _mock_get_sync_db(db)
|
||||
|
||||
task_self = SimpleNamespace(
|
||||
request=SimpleNamespace(id="task-1"),
|
||||
|
||||
Reference in New Issue
Block a user