feat: 安全移除本地任务记录 (#108)
This commit is contained in:
+47
-4
@@ -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
|
||||
from src.db_schema import MIGRATION_1, MIGRATION_2, MIGRATION_3
|
||||
|
||||
|
||||
EXPECTED_TABLES = {
|
||||
@@ -22,6 +22,7 @@ EXPECTED_INDEXES = {
|
||||
"idx_pdd_tasks_goods_id",
|
||||
"idx_task_runs_task",
|
||||
"idx_outbox_pending",
|
||||
"idx_pdd_tasks_visible_list",
|
||||
}
|
||||
|
||||
|
||||
@@ -63,7 +64,7 @@ class DatabaseInitializationTests(unittest.TestCase):
|
||||
|
||||
self.assertTrue(EXPECTED_TABLES.issubset(tables))
|
||||
self.assertTrue(EXPECTED_INDEXES.issubset(indexes))
|
||||
self.assertEqual(version, 3)
|
||||
self.assertEqual(version, 4)
|
||||
|
||||
def test_v1_database_is_upgraded_without_losing_task_runs(self) -> None:
|
||||
connection = open_database(self.db_path)
|
||||
@@ -106,7 +107,7 @@ class DatabaseInitializationTests(unittest.TestCase):
|
||||
connection.close()
|
||||
self.assertIn("result_data", columns)
|
||||
self.assertEqual(attempt_id, "ATTEMPT-OLD")
|
||||
self.assertEqual(version, 3)
|
||||
self.assertEqual(version, 4)
|
||||
|
||||
def test_initialize_can_run_twice_without_losing_data(self) -> None:
|
||||
initialize_database(self.db_path)
|
||||
@@ -169,7 +170,49 @@ class DatabaseInitializationTests(unittest.TestCase):
|
||||
finally:
|
||||
connection.close()
|
||||
self.assertEqual(row[0], "dry_run")
|
||||
self.assertEqual(version, 3)
|
||||
self.assertEqual(version, 4)
|
||||
|
||||
def test_v3_database_adds_soft_remove_column_without_losing_tasks(self) -> None:
|
||||
connection = open_database(self.db_path)
|
||||
try:
|
||||
with connection:
|
||||
for statement in MIGRATION_1 + MIGRATION_2 + MIGRATION_3:
|
||||
connection.execute(statement)
|
||||
connection.execute("PRAGMA user_version = 3")
|
||||
connection.execute(
|
||||
"INSERT INTO pdd_tasks"
|
||||
" (remote_task_id, task_type, goods_url, status, received_at,"
|
||||
" created_at, updated_at) VALUES (?, ?, ?, ?, ?, ?, ?)",
|
||||
(
|
||||
"COL-V3",
|
||||
"collect",
|
||||
"https://example.test/goods",
|
||||
"succeeded",
|
||||
"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:
|
||||
columns = {
|
||||
row[1] for row in connection.execute("PRAGMA table_info(pdd_tasks)")
|
||||
}
|
||||
row = connection.execute(
|
||||
"SELECT remote_task_id, removed_at FROM pdd_tasks"
|
||||
" WHERE remote_task_id = 'COL-V3'"
|
||||
).fetchone()
|
||||
version = connection.execute("PRAGMA user_version").fetchone()[0]
|
||||
finally:
|
||||
connection.close()
|
||||
self.assertIn("removed_at", columns)
|
||||
self.assertEqual(tuple(row), ("COL-V3", None))
|
||||
self.assertEqual(version, 4)
|
||||
|
||||
def test_new_connection_uses_required_pragmas(self) -> None:
|
||||
initialize_database(self.db_path)
|
||||
|
||||
Reference in New Issue
Block a user