| 1 | // Run: tsx src/__tests__/workspace-panel-open-migration.test.ts |
| 2 | // zk-ge C14 兼容性:项目级 dock 开合 key 缺失时回退旧全局 key,升级不翻转用户选择 |
| 3 | |
| 4 | import { JSDOM } from "jsdom"; |
| 5 | |
| 6 | let passed = 0; |
| 7 | let failed = 0; |
| 8 | |
| 9 | function ok(value: boolean, label: string) { |
| 10 | if (value) { |
| 11 | process.stdout.write(` PASS ${label}\n`); |
| 12 | passed += 1; |
| 13 | } else { |
| 14 | process.stdout.write(` FAIL ${label}\n`); |
| 15 | failed += 1; |
| 16 | } |
| 17 | } |
| 18 | |
| 19 | function installLocalStorage(seed: Record<string, string>) { |
| 20 | const dom = new JSDOM("<!doctype html><html><body></body></html>", { url: "http://localhost/" }); |
| 21 | globalThis.window = dom.window as unknown as Window & typeof globalThis; |
| 22 | globalThis.localStorage = dom.window.localStorage; |
| 23 | for (const [key, value] of Object.entries(seed)) { |
| 24 | dom.window.localStorage.setItem(key, value); |
| 25 | } |
| 26 | return dom; |
| 27 | } |
| 28 | |
| 29 | // 动态 import(依赖 window/localStorage 已就绪) |
| 30 | async function loadModule() { |
| 31 | return await import("../store/layout"); |
| 32 | } |
| 33 | |
| 34 | console.log("\nworkspace dock-open legacy key migration (CLAIM.PERSIST.014)"); |
| 35 | |
| 36 | { |
| 37 | // 场景 1:项目 key 缺失 + 旧全局 key = 关闭("0") → 首次打开项目应保持关闭 |
| 38 | installLocalStorage({ "reasonix.workspacePanel.open": "0" }); |
| 39 | const { loadWorkspacePanelOpen } = await loadModule(); |
| 40 | ok(loadWorkspacePanelOpen("project-a") === false, "project key missing + legacy global closed => stays closed"); |
| 41 | } |
| 42 | |
| 43 | { |
| 44 | // 场景 2:项目 key 缺失 + 旧全局 key = 打开("1") → 首次打开项目应打开 |
| 45 | installLocalStorage({ "reasonix.workspacePanel.open": "1" }); |
| 46 | const { loadWorkspacePanelOpen } = await loadModule(); |
| 47 | ok(loadWorkspacePanelOpen("project-b") === true, "project key missing + legacy global open => stays open"); |
| 48 | } |
| 49 | |
| 50 | { |
| 51 | // 场景 3:项目 key 存在(优先于旧全局 key) |
| 52 | installLocalStorage({ "reasonix.workspacePanel.open": "0", "reasonix.workspacePanel.open.project-c": "1" }); |
| 53 | const { loadWorkspacePanelOpen } = await loadModule(); |
| 54 | ok(loadWorkspacePanelOpen("project-c") === true, "project key present wins over legacy global"); |
| 55 | } |
| 56 | |
| 57 | { |
| 58 | // 场景 4:项目 key 和旧全局 key 都缺失 → 默认打开 |
| 59 | installLocalStorage({}); |
| 60 | const { loadWorkspacePanelOpen } = await loadModule(); |
| 61 | ok(loadWorkspacePanelOpen("project-d") === true, "neither key present => default open"); |
| 62 | } |
| 63 | |
| 64 | console.log(`\nworkspace dock-open migration: ${passed} passed, ${failed} failed`); |
| 65 | if (failed > 0) process.exit(1); |
| 66 |