fix(data-process): 修正任务详情数据契约
This commit is contained in:
@@ -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",
|
||||
|
||||
Reference in New Issue
Block a user