2026-09-01 13:22:35 -07:00
|
|
|
import { describe, it, expect, afterEach, vi } from "vitest";
|
2026-09-01 13:15:13 -07:00
|
|
|
import {
|
|
|
|
|
clampDockWidth,
|
|
|
|
|
NOTES_DOCK_MIN_WIDTH,
|
|
|
|
|
NOTES_DOCK_MAX_WIDTH,
|
|
|
|
|
NOTES_DOCK_DEFAULT_WIDTH,
|
|
|
|
|
} from "./appState";
|
|
|
|
|
|
|
|
|
|
describe("clampDockWidth", () => {
|
|
|
|
|
it("keeps a sensible width", () => {
|
|
|
|
|
expect(clampDockWidth(400)).toBe(400);
|
|
|
|
|
});
|
|
|
|
|
|
|
|
|
|
it("refuses to squeeze the dock into uselessness", () => {
|
|
|
|
|
expect(clampDockWidth(10)).toBe(NOTES_DOCK_MIN_WIDTH);
|
|
|
|
|
});
|
|
|
|
|
|
|
|
|
|
it("refuses to squeeze the terminal into uselessness", () => {
|
|
|
|
|
expect(clampDockWidth(5000)).toBe(NOTES_DOCK_MAX_WIDTH);
|
|
|
|
|
});
|
|
|
|
|
|
|
|
|
|
it("falls back for a stored value that is not a number", () => {
|
|
|
|
|
// localStorage holds strings and can carry anything a previous version,
|
|
|
|
|
// a hand edit, or a different screen left behind.
|
|
|
|
|
expect(clampDockWidth(Number("banana"))).toBe(NOTES_DOCK_DEFAULT_WIDTH);
|
|
|
|
|
});
|
|
|
|
|
|
|
|
|
|
it("rounds, because a fractional px width blurs the border", () => {
|
|
|
|
|
expect(clampDockWidth(400.6)).toBe(401);
|
|
|
|
|
});
|
|
|
|
|
});
|
2026-09-01 13:22:35 -07:00
|
|
|
|
|
|
|
|
// The pure function above is only half the contract: the brief calls out that
|
|
|
|
|
// the clamp must guard the *read* path too, because localStorage can carry
|
|
|
|
|
// anything a previous version, a hand edit, or a different screen left
|
|
|
|
|
// behind. These tests exercise the real store initialization — seeding
|
|
|
|
|
// localStorage, then re-importing the module fresh so its top-level
|
|
|
|
|
// `loadNotesDockWidth()` call runs against the seeded value — rather than a
|
|
|
|
|
// function pulled out just to make this testable. A future refactor that
|
|
|
|
|
// dropped the clamp from the load path while keeping it on the write path
|
|
|
|
|
// would fail these.
|
|
|
|
|
describe("notesDockWidth store initialization", () => {
|
|
|
|
|
const WIDTH_KEY = "triple-c.notes.dock.width";
|
|
|
|
|
|
|
|
|
|
afterEach(() => {
|
|
|
|
|
localStorage.removeItem(WIDTH_KEY);
|
|
|
|
|
});
|
|
|
|
|
|
|
|
|
|
it("clamps an out-of-range stored value on load", async () => {
|
|
|
|
|
localStorage.setItem(WIDTH_KEY, "99999");
|
|
|
|
|
vi.resetModules();
|
|
|
|
|
const { useAppState } = await import("./appState");
|
|
|
|
|
expect(useAppState.getState().notesDockWidth).toBe(NOTES_DOCK_MAX_WIDTH);
|
|
|
|
|
});
|
|
|
|
|
|
|
|
|
|
it("falls back to the default for a non-numeric stored value on load", async () => {
|
|
|
|
|
localStorage.setItem(WIDTH_KEY, "banana");
|
|
|
|
|
vi.resetModules();
|
|
|
|
|
const { useAppState } = await import("./appState");
|
|
|
|
|
expect(useAppState.getState().notesDockWidth).toBe(NOTES_DOCK_DEFAULT_WIDTH);
|
|
|
|
|
});
|
|
|
|
|
});
|