feat: 任务列表显示店铺名和执行用时 (#136)
This commit is contained in:
+38
-5
@@ -6,7 +6,7 @@ import unittest
|
||||
from pathlib import Path
|
||||
|
||||
from src.db import DatabaseVersionError, initialize_database, open_database
|
||||
from src.db_schema import MIGRATION_1, MIGRATION_2, MIGRATION_3
|
||||
from src.db_schema import MIGRATION_1, MIGRATION_2, MIGRATION_3, MIGRATION_4
|
||||
|
||||
|
||||
EXPECTED_TABLES = {
|
||||
@@ -64,7 +64,7 @@ class DatabaseInitializationTests(unittest.TestCase):
|
||||
|
||||
self.assertTrue(EXPECTED_TABLES.issubset(tables))
|
||||
self.assertTrue(EXPECTED_INDEXES.issubset(indexes))
|
||||
self.assertEqual(version, 4)
|
||||
self.assertEqual(version, 5)
|
||||
|
||||
def test_v1_database_is_upgraded_without_losing_task_runs(self) -> None:
|
||||
connection = open_database(self.db_path)
|
||||
@@ -107,7 +107,7 @@ class DatabaseInitializationTests(unittest.TestCase):
|
||||
connection.close()
|
||||
self.assertIn("result_data", columns)
|
||||
self.assertEqual(attempt_id, "ATTEMPT-OLD")
|
||||
self.assertEqual(version, 4)
|
||||
self.assertEqual(version, 5)
|
||||
|
||||
def test_initialize_can_run_twice_without_losing_data(self) -> None:
|
||||
initialize_database(self.db_path)
|
||||
@@ -170,7 +170,7 @@ class DatabaseInitializationTests(unittest.TestCase):
|
||||
finally:
|
||||
connection.close()
|
||||
self.assertEqual(row[0], "dry_run")
|
||||
self.assertEqual(version, 4)
|
||||
self.assertEqual(version, 5)
|
||||
|
||||
def test_v3_database_adds_soft_remove_column_without_losing_tasks(self) -> None:
|
||||
connection = open_database(self.db_path)
|
||||
@@ -212,7 +212,40 @@ class DatabaseInitializationTests(unittest.TestCase):
|
||||
connection.close()
|
||||
self.assertIn("removed_at", columns)
|
||||
self.assertEqual(tuple(row), ("COL-V3", None))
|
||||
self.assertEqual(version, 4)
|
||||
self.assertEqual(version, 5)
|
||||
|
||||
def test_v4_database_backfills_shop_name_from_valid_pdd_data(self) -> None:
|
||||
connection = open_database(self.db_path)
|
||||
try:
|
||||
with connection:
|
||||
for statement in MIGRATION_1 + MIGRATION_2 + MIGRATION_3 + MIGRATION_4:
|
||||
connection.execute(statement)
|
||||
connection.execute("PRAGMA user_version = 4")
|
||||
connection.execute(
|
||||
"INSERT INTO pdd_tasks"
|
||||
" (remote_task_id, task_type, goods_url, status, pdd_data,"
|
||||
" received_at, created_at, updated_at) VALUES (?, ?, ?, ?, ?, ?, ?, ?)",
|
||||
(
|
||||
"COL-V4", "collect", "https://example.test/goods",
|
||||
"succeeded", '{"shop_name":" 测试店铺 "}',
|
||||
"2026-08-10T00:00:00Z", "2026-08-10T00:00:00Z",
|
||||
"2026-08-10T00:00:00Z",
|
||||
),
|
||||
)
|
||||
finally:
|
||||
connection.close()
|
||||
|
||||
initialize_database(self.db_path)
|
||||
connection = open_database(self.db_path)
|
||||
try:
|
||||
row = connection.execute(
|
||||
"SELECT shop_name FROM pdd_tasks WHERE remote_task_id = 'COL-V4'"
|
||||
).fetchone()
|
||||
version = connection.execute("PRAGMA user_version").fetchone()[0]
|
||||
finally:
|
||||
connection.close()
|
||||
self.assertEqual(row[0], "测试店铺")
|
||||
self.assertEqual(version, 5)
|
||||
|
||||
def test_new_connection_uses_required_pragmas(self) -> None:
|
||||
initialize_database(self.db_path)
|
||||
|
||||
@@ -166,7 +166,7 @@ class TaskTableModelCheckTests(unittest.TestCase):
|
||||
page.detailRequested.connect(received.append)
|
||||
|
||||
self.assertNotIn("操作", page.taskModel.HEADERS)
|
||||
self.assertEqual(page.taskModel.columnCount(), 9)
|
||||
self.assertEqual(page.taskModel.columnCount(), 11)
|
||||
page._on_table_activated(page.taskModel.index(0, CHECK_COLUMN))
|
||||
page._on_table_activated(page.taskModel.index(0, 2))
|
||||
|
||||
|
||||
@@ -258,6 +258,7 @@ class TaskRepositoryTests(unittest.TestCase):
|
||||
{
|
||||
"goods_id": "10001",
|
||||
"title": "测试商品",
|
||||
"shop_name": "测试店铺",
|
||||
"price_granularity": "color",
|
||||
"dimensions": [],
|
||||
"skus": [{"price_cent": 990}],
|
||||
@@ -269,12 +270,38 @@ class TaskRepositoryTests(unittest.TestCase):
|
||||
TaskStatus.RESULT_PENDING,
|
||||
)
|
||||
self.assertEqual(event.status, OutboxStatus.PENDING)
|
||||
summary = self.repository.list_tasks()[0]
|
||||
self.assertEqual(summary.shop_name, "测试店铺")
|
||||
self.assertEqual(summary.latest_run_status, RunStatus.SUCCEEDED)
|
||||
self.repository.mark_outbox_sent(event.id)
|
||||
self.assertEqual(
|
||||
self.repository.get_task("TASK-RUN").status,
|
||||
TaskStatus.SUCCEEDED,
|
||||
)
|
||||
|
||||
def test_list_uses_latest_run_duration_and_clamps_negative_value(self):
|
||||
self.repository.add_claimed_task(self._task("TASK-DURATION"))
|
||||
started = self.repository.start_collect_run("TASK-DURATION", "USB-001")
|
||||
connection = open_database(self.db_path)
|
||||
try:
|
||||
with connection:
|
||||
connection.execute(
|
||||
"UPDATE task_runs SET run_status = 'failed',"
|
||||
" started_at = ?, finished_at = ? WHERE attempt_id = ?",
|
||||
(
|
||||
"2026-08-11T08:00:10Z",
|
||||
"2026-08-11T08:00:05Z",
|
||||
started.attempt_id,
|
||||
),
|
||||
)
|
||||
finally:
|
||||
connection.close()
|
||||
|
||||
summary = self.repository.list_tasks()[0]
|
||||
|
||||
self.assertEqual(summary.latest_run_status, RunStatus.FAILED)
|
||||
self.assertEqual(summary.duration_seconds, 0)
|
||||
|
||||
def test_latest_result_outbox_excludes_newer_failure_event(self):
|
||||
self.repository.add_claimed_task(self._task("TASK-REPORT"))
|
||||
first = self.repository.start_collect_run("TASK-REPORT", "USB-001")
|
||||
|
||||
Reference in New Issue
Block a user