fix(migration): normalize legacy screener archives

This commit is contained in:
leefer
2026-07-30 19:49:24 +08:00
parent 198806c1bd
commit e5f7d836ac
8 changed files with 151 additions and 21 deletions
+8
View File
@@ -76,6 +76,14 @@ test("mobile information architecture, touch targets and responsive tables", asy
await expect(page.locator(".data-table tbody td").filter({ hasText: "移动样本1" })).toHaveAttribute("data-label", "股票");
expect(await page.locator(".data-table tbody tr").first().evaluate((row) => row.scrollWidth <= row.clientWidth)).toBe(true);
await page.evaluate(() => window.scrollTo(0, document.documentElement.scrollHeight));
expect(await page.evaluate(() => window.scrollY)).toBeGreaterThan(0);
await page.getByRole("navigation", { name: "移动端主导航" }).getByRole("link", { name: "选股" }).click();
await expect(page).toHaveURL(/\/workspace\/screener$/);
await expect.poll(() => page.evaluate(() => window.scrollY)).toBe(0);
await page.getByRole("navigation", { name: "移动端主导航" }).getByRole("link", { name: "行情" }).click();
await page.getByLabel("切换行情页面").selectOption("pool");
for (const viewport of [[320, 568], [375, 667], [390, 844], [430, 932], [768, 1024], [844, 390]]) {
await assertViewport(page, viewport[0], viewport[1]);
}
+42 -2
View File
@@ -10,6 +10,7 @@ import sqlite3
from cryptography.fernet import Fernet
from backend.features.market.events import apply_event_revisions
from backend.features.screener.catalog import strategy_by_id
from backend.security.passwords import PasswordHasher
from tools.legacy_migration import LegacyMigrator
@@ -181,6 +182,20 @@ def _legacy_database(path, key: str) -> None:
"INSERT INTO screener_runs VALUES (1,'20260729','','策略','{}',?, ?,8,'curated')",
(result, now),
)
connection.execute(
"INSERT INTO screener_runs VALUES (2,'20260729','','退潮防守观察','{}',?, ?,8,'smart')",
(result, now),
)
connection.execute(
"INSERT INTO screener_runs VALUES (3,'20260729','','退潮防守观察','{}',?, ?,NULL,'smart')",
(result, now),
)
multi_factor = strategy_by_id("curated-25")
assert multi_factor is not None
connection.execute(
"INSERT INTO screener_runs VALUES (4,'20260729','','多因子综合打分(IC动态加权)',?, ?, ?,NULL,'curated')",
(json.dumps(multi_factor["formula"]), result, now),
)
connection.execute(
"INSERT INTO screener_strategies VALUES (1,'自定义','','[]','{}',0,?,?,8)",
(now, now),
@@ -193,6 +208,10 @@ def _legacy_database(path, key: str) -> None:
"INSERT INTO strategy_tracks VALUES (1,8,1,'20260729','策略','000001.SZ','000001','平安银行','银行',10.5,?,?)",
(now, now),
)
connection.execute(
"INSERT INTO strategy_tracks VALUES (2,8,2,'20260729','退潮防守观察','000001.SZ','000001','平安银行','银行',10.5,?,?)",
(now, now),
)
connection.execute(
"INSERT INTO data_snapshots VALUES ('popularity_v1','20260729','legacy','{}',?)", (now,)
)
@@ -386,8 +405,29 @@ def test_legacy_migration_is_idempotent_and_preserves_login(tmp_path) -> None:
"birth_time": "08:30",
"gender": "male",
}
assert connection.execute("SELECT count(*) FROM screener_runs").fetchone()[0] == 1
assert connection.execute("SELECT count(*) FROM strategy_tracks").fetchone()[0] == 1
assert connection.execute("SELECT count(*) FROM screener_runs").fetchone()[0] == 3
stage_run = connection.execute(
"""SELECT id,owner_user_id,strategy_id,strategy_version FROM screener_runs
WHERE mode='stage'"""
).fetchone()
assert dict(stage_run) == {
"id": 3,
"owner_user_id": None,
"strategy_id": "stage-06",
"strategy_version": 1,
}
renamed = connection.execute(
"""SELECT strategy_id,strategy_name FROM screener_runs
WHERE strategy_id='curated-25'"""
).fetchone()
assert dict(renamed) == {
"strategy_id": "curated-25",
"strategy_name": "动态多因子(基础版)",
}
assert connection.execute("SELECT count(*) FROM strategy_tracks").fetchone()[0] == 2
assert connection.execute(
"SELECT run_id FROM strategy_tracks WHERE id=2"
).fetchone()[0] == 3
assert connection.execute("SELECT daily_llm_limit FROM memberships").fetchone()[0] == 61
assert connection.execute("SELECT count(*) FROM seat_aliases").fetchone()[0] == 1
assert connection.execute(