feat: 安全应用采购规格解析结果 (#257)

This commit is contained in:
chengma
2026-08-17 17:43:25 +08:00
parent 484ce4e8ec
commit afc1cdf719
19 changed files with 1669 additions and 24 deletions
+47 -6
View File
@@ -6,7 +6,13 @@ 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, MIGRATION_4
from src.db_schema import (
MIGRATION_1,
MIGRATION_2,
MIGRATION_3,
MIGRATION_4,
MIGRATION_5,
)
EXPECTED_TABLES = {
@@ -14,6 +20,7 @@ EXPECTED_TABLES = {
"task_runs",
"outbox_events",
"app_settings",
"purchase_spec_resolutions",
}
EXPECTED_INDEXES = {
@@ -23,6 +30,7 @@ EXPECTED_INDEXES = {
"idx_task_runs_task",
"idx_outbox_pending",
"idx_pdd_tasks_visible_list",
"idx_purchase_spec_resolutions_attempt",
}
@@ -64,7 +72,7 @@ class DatabaseInitializationTests(unittest.TestCase):
self.assertTrue(EXPECTED_TABLES.issubset(tables))
self.assertTrue(EXPECTED_INDEXES.issubset(indexes))
self.assertEqual(version, 5)
self.assertEqual(version, 6)
def test_v1_database_is_upgraded_without_losing_task_runs(self) -> None:
connection = open_database(self.db_path)
@@ -107,7 +115,7 @@ class DatabaseInitializationTests(unittest.TestCase):
connection.close()
self.assertIn("result_data", columns)
self.assertEqual(attempt_id, "ATTEMPT-OLD")
self.assertEqual(version, 5)
self.assertEqual(version, 6)
def test_initialize_can_run_twice_without_losing_data(self) -> None:
initialize_database(self.db_path)
@@ -170,7 +178,7 @@ class DatabaseInitializationTests(unittest.TestCase):
finally:
connection.close()
self.assertEqual(row[0], "dry_run")
self.assertEqual(version, 5)
self.assertEqual(version, 6)
def test_v3_database_adds_soft_remove_column_without_losing_tasks(self) -> None:
connection = open_database(self.db_path)
@@ -212,7 +220,7 @@ class DatabaseInitializationTests(unittest.TestCase):
connection.close()
self.assertIn("removed_at", columns)
self.assertEqual(tuple(row), ("COL-V3", None))
self.assertEqual(version, 5)
self.assertEqual(version, 6)
def test_v4_database_backfills_shop_name_from_valid_pdd_data(self) -> None:
connection = open_database(self.db_path)
@@ -245,7 +253,40 @@ class DatabaseInitializationTests(unittest.TestCase):
finally:
connection.close()
self.assertEqual(row[0], "测试店铺")
self.assertEqual(version, 5)
self.assertEqual(version, 6)
def test_v5_database_adds_purchase_spec_resolution_audit_table(self):
connection = open_database(self.db_path)
try:
with connection:
for statement in (
MIGRATION_1
+ MIGRATION_2
+ MIGRATION_3
+ MIGRATION_4
+ MIGRATION_5
):
connection.execute(statement)
connection.execute("PRAGMA user_version = 5")
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(purchase_spec_resolutions)"
)
}
version = connection.execute("PRAGMA user_version").fetchone()[0]
finally:
connection.close()
self.assertIn("candidate_snapshot_hash", columns)
self.assertIn("idempotency_key", columns)
self.assertEqual(version, 6)
def test_new_connection_uses_required_pragmas(self) -> None:
initialize_database(self.db_path)