feat: add session-level publish and comment flow

This commit is contained in:
theshy
2026-04-14 16:00:17 +08:00
parent 862db502b0
commit d5d9693581
42 changed files with 2478 additions and 181 deletions

View File

@ -65,6 +65,69 @@ class TaskEngineTests(unittest.TestCase):
self.assertTrue(waiting_payload["waiting_for_retry"])
self.assertEqual(waiting_payload["step"], "publish")
def test_next_runnable_step_blocks_non_anchor_session_publish_until_anchor_runs(self) -> None:
task = SimpleNamespace(id="task-2", status="split_done")
steps = {
"publish": TaskStep(None, "task-2", "publish", "pending", None, None, 0, None, None),
}
class _Repo:
def get_task_context(self, task_id): # noqa: ANN001
return SimpleNamespace(task_id=task_id, session_key="session-1")
def list_task_contexts_by_session_key(self, session_key): # noqa: ANN001
return [
SimpleNamespace(task_id="task-1", segment_started_at="2026-04-04T09:23:00+08:00", source_title="part-1"),
SimpleNamespace(task_id="task-2", segment_started_at="2026-04-04T09:25:00+08:00", source_title="part-2"),
]
def get_task(self, task_id): # noqa: ANN001
status = "split_done"
return SimpleNamespace(id=task_id, status=status)
state = {
"repo": _Repo(),
"settings": {
"comment": {"enabled": True},
"collection": {"enabled": True},
"paths": {},
"publish": {},
},
}
self.assertEqual(next_runnable_step(task, steps, state), (None, None))
def test_next_runnable_step_allows_anchor_session_publish_when_all_parts_split_done(self) -> None:
task = SimpleNamespace(id="task-1", status="split_done")
steps = {
"publish": TaskStep(None, "task-1", "publish", "pending", None, None, 0, None, None),
}
class _Repo:
def get_task_context(self, task_id): # noqa: ANN001
return SimpleNamespace(task_id=task_id, session_key="session-1")
def list_task_contexts_by_session_key(self, session_key): # noqa: ANN001
return [
SimpleNamespace(task_id="task-1", segment_started_at="2026-04-04T09:23:00+08:00", source_title="part-1"),
SimpleNamespace(task_id="task-2", segment_started_at="2026-04-04T09:25:00+08:00", source_title="part-2"),
]
def get_task(self, task_id): # noqa: ANN001
return SimpleNamespace(id=task_id, status="split_done")
state = {
"repo": _Repo(),
"settings": {
"comment": {"enabled": True},
"collection": {"enabled": True},
"paths": {},
"publish": {},
},
}
self.assertEqual(next_runnable_step(task, steps, state), ("publish", None))
if __name__ == "__main__":
unittest.main()