Separate shell subscriptions from Home session data and cover effect convergence, transition cleanup, current callbacks and signed-out fallback with real React lifecycle tests. Record baseline-equivalent local failures and outstanding browser/build verification. Co-Authored-By: Claude Code <noreply@anthropic.com>
50 lines
2.6 KiB
TypeScript
50 lines
2.6 KiB
TypeScript
import assert from "node:assert/strict";
|
|
import { readFileSync } from "node:fs";
|
|
import test from "node:test";
|
|
|
|
const provider = readFileSync(new URL("../src/lib/session-list-context.tsx", import.meta.url), "utf8");
|
|
const layout = readFileSync(new URL("../src/app/(app)/layout.tsx", import.meta.url), "utf8");
|
|
const page = readFileSync(new URL("../src/app/(app)/page.tsx", import.meta.url), "utf8");
|
|
const sessionHook = readFileSync(new URL("../src/hooks/use-session-management.ts", import.meta.url), "utf8");
|
|
|
|
test("the app layout owns one SessionListProvider and one SidebarProvider", () => {
|
|
assert.match(layout, /<SessionListProvider>/);
|
|
assert.equal(layout.match(/<SessionListProvider>/g)?.length, 1);
|
|
assert.match(layout, /<SidebarProvider escapeBlocked=\{registration\?\.escapeBlocked \?\? false\}>/);
|
|
assert.equal(layout.match(/<SidebarProvider/g)?.length, 1);
|
|
assert.match(layout, /<AppSidebar/);
|
|
assert.doesNotMatch(page, /<SidebarProvider/);
|
|
assert.doesNotMatch(page, /<AppSidebar/);
|
|
});
|
|
|
|
test("the provider fetches the session list once and home does not fetch it again", () => {
|
|
assert.match(provider, /fetch\(`\/api\/sessions\?limit=\$\{SESSION_PAGE_SIZE\}`/);
|
|
assert.match(provider, /fetch\("\/api\/account"/);
|
|
assert.match(page, /await sessionListReady;/);
|
|
assert.doesNotMatch(page, /fetchSessions\(/);
|
|
assert.doesNotMatch(page, /fetchAccount\(/);
|
|
assert.match(page, /useHomeShellRegistration\(/);
|
|
});
|
|
|
|
test("a 401 clears the list and marks signedOut", () => {
|
|
assert.match(provider, /sessionResponse\.status === 401 \|\| accountResponse\.status === 401/);
|
|
assert.match(provider, /signedOut: true/);
|
|
assert.doesNotMatch(provider, /localStorage|sessionStorage|document\.cookie|indexedDB/i);
|
|
});
|
|
|
|
test("session writes no longer invalidate a second cache", () => {
|
|
assert.doesNotMatch(sessionHook, /invalidateSidebarCache/);
|
|
});
|
|
|
|
test("only the shell consumes registration and it passes Home children through unchanged", () => {
|
|
assert.match(layout, /const registration = useShellRegistration\(\)/);
|
|
assert.match(layout, /sessionListSidebarModel\(list, registration\)/);
|
|
assert.doesNotMatch(layout, /list\.registration|cloneElement/);
|
|
assert.match(layout, /<SidebarInset[\s\S]*>\s*\{children\}\s*<\/SidebarInset>/);
|
|
assert.doesNotMatch(page, /useShellRegistration/);
|
|
const dataValue = provider.slice(provider.indexOf("const value = useMemo"), provider.indexOf("return (", provider.indexOf("const value = useMemo")));
|
|
assert.doesNotMatch(dataValue, /\bregistration\b/);
|
|
assert.match(dataValue, /registerShellControls/);
|
|
assert.match(provider, /<ShellRegistrationContext\.Provider value=\{registration\}>\s*\{children\}/);
|
|
});
|