Files
Netcatty/components/AppLockGate.test.ts
T
bincxz 2433fbae47 fix(app-lock): mount terminal popup children before lock init
System Manager terminal popups receive config immediately after loadURL.
AppLockGate used to withhold children until async lock state resolved,
so onTerminalPopupConfig could miss the one-shot IPC. Force-render the
popup route and keep the last preload config for late remounts.
2026-08-06 00:49:56 +08:00

147 lines
3.4 KiB
TypeScript

import assert from "node:assert/strict";
import test from "node:test";
import {
shouldDeferExternalActionWhileAppLocked,
shouldNotifyAppLockGateRendererReady,
shouldRenderAppLockGateChildren,
} from "./AppLockGate.tsx";
test("shouldRenderAppLockGateChildren withholds startup-locked route children until unlock", () => {
assert.equal(
shouldRenderAppLockGateChildren({
initialized: true,
locked: true,
lockReason: "startup",
hasRenderedChildren: false,
}),
false,
);
assert.equal(
shouldRenderAppLockGateChildren({
initialized: true,
locked: false,
lockReason: null,
hasRenderedChildren: false,
}),
true,
);
});
test("shouldRenderAppLockGateChildren force-renders terminal popup children before init", () => {
assert.equal(
shouldRenderAppLockGateChildren({
initialized: false,
locked: true,
lockReason: "startup",
hasRenderedChildren: false,
forceRenderChildren: true,
}),
true,
);
});
test("shouldRenderAppLockGateChildren withholds first mount for idle and background locks", () => {
assert.equal(
shouldRenderAppLockGateChildren({
initialized: true,
locked: true,
lockReason: "idle",
hasRenderedChildren: false,
}),
false,
);
assert.equal(
shouldRenderAppLockGateChildren({
initialized: true,
locked: true,
lockReason: "background",
hasRenderedChildren: false,
}),
false,
);
assert.equal(
shouldRenderAppLockGateChildren({
initialized: true,
locked: true,
lockReason: "manual",
hasRenderedChildren: false,
}),
false,
);
});
test("shouldRenderAppLockGateChildren withholds children before runtime initialization", () => {
assert.equal(
shouldRenderAppLockGateChildren({
initialized: false,
locked: false,
lockReason: null,
hasRenderedChildren: false,
}),
false,
);
});
test("shouldRenderAppLockGateChildren keeps mounted children for manual and idle locks", () => {
assert.equal(
shouldRenderAppLockGateChildren({
initialized: true,
locked: true,
lockReason: "manual",
hasRenderedChildren: true,
}),
true,
);
assert.equal(
shouldRenderAppLockGateChildren({
initialized: true,
locked: true,
lockReason: "idle",
hasRenderedChildren: true,
}),
true,
);
});
test("shouldRenderAppLockGateChildren keeps existing children mounted for reopen locks", () => {
assert.equal(
shouldRenderAppLockGateChildren({
initialized: true,
locked: true,
lockReason: "startup",
hasRenderedChildren: true,
}),
true,
);
});
test("shouldNotifyAppLockGateRendererReady waits until locked children can mount", () => {
assert.equal(
shouldNotifyAppLockGateRendererReady({
notifyRendererReady: true,
renderChildren: false,
}),
false,
);
assert.equal(
shouldNotifyAppLockGateRendererReady({
notifyRendererReady: true,
renderChildren: true,
}),
true,
);
assert.equal(
shouldNotifyAppLockGateRendererReady({
notifyRendererReady: false,
renderChildren: true,
}),
false,
);
});
test("shouldDeferExternalActionWhileAppLocked queues actions only while locked", () => {
assert.equal(shouldDeferExternalActionWhileAppLocked({ locked: true }), true);
assert.equal(shouldDeferExternalActionWhileAppLocked({ locked: false }), false);
});