feat(HEL-566): 去掉主站行情管理入口并修好模型列表收起
主站行情管理并入数据中枢
- 数据中枢数据源配置页新增「主站行情任务」卡:交易时段后台刷新开关、
手动后台刷新、历史区间回补(任务提交 + 轮询主站 job 记录亮灯),
数据与调度仍归主站,控制台只经桥接代操作
- 新增桥接端点 /api/hub-admin/market/{refresh,backfill};回补改为
market.backfill 后台任务(jobs.config.json 注册,锁独立,超时 30 分钟),
桥接调用秒回,不再阻塞
- 主站桌面端删除顶栏「行情管理」按钮与整个行情管理对话框,清理随之
失效的 CSS;移动端删除 system/admin 页与入口,管理员专区只留数据中枢
- Tushare Token / iFinD 凭证编辑沿用数据源页既有凭证区,无功能缺失
模型池收起修复
- 拉出模型清单后按钮切换为「收起列表」,收起只留一行摘要;再次点击
重新拉取并展开;勾选添加完成后清单自动收起(原逻辑保留)
- 交互全部沿用 HEL-558 已确认样式的既有按钮与提示组件,未新增视觉
自测
- verify_baseline 通过;pytest 492 项通过;数据中枢 240 项通过
- verify_datahub_console 新增 [11b] 行情任务桥接端到端段;UI 自测新增
行情任务卡开关往返、模型清单展开/收起/再展开/添加自动收起,日夜主题
与 1030 窄屏复验通过
- Playwright e2e 102/103:唯一失败项在基线提交上同样失败(本机字体度量
导致的头部溢出,与本卡无关)
Co-authored-by: multica-agent <github@multica.ai>
This commit is contained in:
@@ -122,6 +122,60 @@ class MemberAndQuotaTests(unittest.TestCase):
|
||||
self.assertEqual([], self.bridge.paths())
|
||||
|
||||
|
||||
class MarketTaskTests(unittest.TestCase):
|
||||
"""HEL-566: 主站行情管理并入中枢后的桥接映射。"""
|
||||
|
||||
def setUp(self) -> None:
|
||||
self.bridge = RecordingBridge(
|
||||
{
|
||||
"/api/hub-admin/status": {
|
||||
"data": {
|
||||
"background_refresh_enabled": True,
|
||||
"configured": True,
|
||||
"snapshot_dates": 12,
|
||||
"jobs": [{"idempotency_key": "manual:20260916:1", "status": "success"}],
|
||||
}
|
||||
},
|
||||
"/api/hub-admin/settings/save": {},
|
||||
"/api/hub-admin/market/refresh": {"started": True, "job_key": "manual:20260916:1", "message": "后台刷新已开始"},
|
||||
"/api/hub-admin/market/backfill": {"started": True, "job_key": "backfill:20260901:20260908:1", "message": "历史回补任务已开始"},
|
||||
}
|
||||
)
|
||||
self.console = SiteConsole(self.bridge)
|
||||
|
||||
def test_market_status_projects_only_what_the_card_needs(self) -> None:
|
||||
payload = self.console.market_status()
|
||||
self.assertTrue(payload["background_refresh_enabled"])
|
||||
self.assertEqual(1, len(payload["jobs"]))
|
||||
self.assertNotIn("llm", payload)
|
||||
self.assertNotIn("users", payload)
|
||||
|
||||
def test_toggling_background_refresh_saves_then_reads_back(self) -> None:
|
||||
payload = self.console.save_market_settings({"background_refresh_enabled": False})
|
||||
self.assertEqual(
|
||||
["/api/hub-admin/settings/save", "/api/hub-admin/status"],
|
||||
self.bridge.paths(),
|
||||
)
|
||||
self.assertEqual({"background_refresh_enabled": False}, self.bridge.calls[0][1])
|
||||
self.assertTrue(payload["background_refresh_enabled"]) # 读回的是主站真实状态
|
||||
|
||||
def test_saving_without_the_toggle_is_refused(self) -> None:
|
||||
with self.assertRaises(ApiError):
|
||||
self.console.save_market_settings({})
|
||||
self.assertEqual([], self.bridge.paths())
|
||||
|
||||
def test_refresh_and_backfill_forward_their_payloads(self) -> None:
|
||||
refresh = self.console.market_refresh({"trade_date": "2026-09-16"})
|
||||
self.assertTrue(refresh["started"])
|
||||
self.assertEqual({"trade_date": "2026-09-16"}, self.bridge.calls[0][1])
|
||||
backfill = self.console.market_backfill({"start_date": "2026-09-01", "end_date": "2026-09-08"})
|
||||
self.assertEqual("backfill:20260901:20260908:1", backfill["job_key"])
|
||||
self.assertEqual(
|
||||
{"start_date": "2026-09-01", "end_date": "2026-09-08"},
|
||||
self.bridge.calls[1][1],
|
||||
)
|
||||
|
||||
|
||||
class InviteTests(unittest.TestCase):
|
||||
def setUp(self) -> None:
|
||||
self.bridge = RecordingBridge(
|
||||
|
||||
Reference in New Issue
Block a user