fix(data-process): 修正任务详情数据契约

This commit is contained in:
caoxiaozhu
2026-07-27 10:03:46 +08:00
parent 42c0e4f5c2
commit b14b2ecf22
4 changed files with 247 additions and 11 deletions

View File

@@ -274,6 +274,10 @@ class _TaskDetailConnection:
assert "dataset.source_task_id=task.id" in normalized
assert "dataset.source_task_id IS NULL AND dataset.task_id=task.id" in normalized
assert "dataset.deleted_at IS NULL" in normalized
assert "dataset.metadata::jsonb" not in normalized
assert "WHEN 'train' THEN 'train'" in normalized
assert "WHEN 'val' THEN 'validation'" in normalized
assert "WHEN 'test' THEN 'test'" in normalized
task_id = params[0]
visible = [
dataset
@@ -364,6 +368,61 @@ class _TaskListStore(DataProcessStore):
yield self._conn
class _StartGenerationConnection:
def __init__(self) -> None:
self.task = {
**_regeneration_task(
status="pending",
output_dataset_id=None,
output_count=28,
),
"generation_run_id": None,
}
self.results = [{"id": "old-result"}]
def execute(self, sql: str, params: Any = None) -> _Result:
normalized = " ".join(sql.split())
if normalized.startswith("SELECT COUNT(*) AS count FROM data_process_preview_items"):
return _Result(row={"count": 1})
if normalized.startswith("DELETE FROM data_process_results"):
self.results.clear()
return _Result()
assert normalized.startswith("UPDATE data_process_tasks SET status='running'")
assert "output_count=0" in normalized
self.task.update(
{
"status": "running",
"progress": 30,
"output_count": 0,
"failure_reason": None,
"started_at": params[0],
"completed_at": None,
"filtered_count": 0,
"duplicate_count": 0,
"error_count": 0,
"generation_run_id": params[1],
"updated_at": params[2],
}
)
return _Result(row=dict(self.task))
class _StartGenerationStore(DataProcessStore):
def __init__(self, conn: _StartGenerationConnection) -> None:
self._conn = conn
@contextmanager
def connect(self) -> Iterator[_StartGenerationConnection]:
yield self._conn
def _task_in_connection(
self, conn: Any, task_id: str, *, for_update: bool = False
) -> dict[str, Any]:
assert task_id == "task-1"
assert for_update is True
return dict(self._conn.task)
def test_decode_row_serializes_postgres_numeric_values_as_json_numbers() -> None:
decoded = _decode_row(
{
@@ -522,6 +581,16 @@ def test_list_tasks_exposes_source_and_generation_counts() -> None:
assert item["output_dataset_id"] is None
def test_start_generation_clears_previous_output_count() -> None:
conn = _StartGenerationConnection()
task = _StartGenerationStore(conn).start_generation("task-1")
assert task["status"] == "running"
assert task["output_count"] == 0
assert conn.results == []
def _legacy_published_datasets(task_id: str = "task-1") -> list[dict[str, Any]]:
specs = (
("dataset_train", "制度问答-训练集", "train", "train", 22),
@@ -585,6 +654,8 @@ def test_prepare_regeneration_preserves_outputs_sources_and_generation_only_prev
def test_prepare_regeneration_backfills_and_keeps_legacy_task_datasets_visible() -> None:
legacy_datasets = _legacy_published_datasets()
# 历史 metadata 可能不是合法 JSON详情查询不能再依赖 metadata::jsonb。
legacy_datasets[0]["metadata"] = "{legacy-invalid-json"
deleted_dataset = {
**legacy_datasets[0],
"id": "dataset_deleted",