Files
MajoorWaldi-ComfyUI-Majoor-…/ui/tests/browser_navigation_controller.vitest.ts
Ewald 85a82f130a test: migrate ui/tests from .mjs to .ts
- Rename 132 *.vitest.mjs -> *.vitest.ts
- Rename vitest.setup.mjs -> vitest.setup.ts
- Rename helpers/vitestEnvironment.mjs -> vitestEnvironment.ts
- Delete settings_store.test.mjs (Node test runner, superseded by .vitest.ts)
- Fix .mjs imports in vitest.setup.ts and grid_loader_adaptive_paging.vitest.ts

Config updates:
- vitest.config.mjs: setupFiles, include, coverage.include -> .ts
- tsconfig.test.json: new dedicated config for test files (strict:false)
- knip.json: update project pattern for tests
- package.json: add typecheck:tests script (audit-only)
2026-05-26 13:04:05 +02:00

105 lines
3.4 KiB
TypeScript

import { describe, expect, it, vi } from "vitest";
import { createPinia, setActivePinia } from "pinia";
import { createBrowserNavigationController } from "../features/panel/controllers/browserNavigationController.js";
import { usePanelStore } from "../stores/usePanelStore.js";
vi.mock("../app/i18n.js", () => ({
t: (_key, fallback) => fallback || "",
}));
function createNode() {
const listeners = new Map();
return {
style: { display: "" },
dataset: {},
disabled: false,
children: [],
className: "",
textContent: "",
value: "",
selectedOptions: [],
addEventListener(type, handler) {
const list = listeners.get(type) || [];
list.push(handler);
listeners.set(type, list);
},
removeEventListener(type, handler) {
const list = listeners.get(type) || [];
listeners.set(
type,
list.filter((item) => item !== handler),
);
},
dispatchEvent(event) {
for (const handler of listeners.get(event.type) || []) {
handler(event);
}
},
appendChild(child) {
this.children.push(child);
return child;
},
replaceChildren(...nodes) {
this.children = nodes;
},
};
}
describe("browserNavigationController", () => {
it("syncs navigated folder path into Pinia", async () => {
globalThis.window = { addEventListener: vi.fn(), removeEventListener: vi.fn() };
globalThis.document = {
createElement: () => createNode(),
};
setActivePinia(createPinia());
const panelStore = usePanelStore();
const gridContainer = createNode();
const folderBreadcrumb = createNode();
const folderBreadcrumbController = { setFolderBreadcrumb: vi.fn() };
const customSelect = createNode();
const reloadGrid = vi.fn(async () => ({}));
const onContextChanged = vi.fn();
const state = {
scope: "output",
customRootId: "",
currentFolderRelativePath: "",
};
const controller = createBrowserNavigationController({
state,
gridContainer,
folderBreadcrumb,
folderBreadcrumbController,
customSelect,
reloadGrid,
onContextChanged,
});
const unbind = controller.bindGridFolderNavigation();
gridContainer.dispatchEvent({
type: "mjr:open-folder-asset",
detail: { asset: { kind: "folder", filepath: "animals/cats" } },
});
expect(panelStore.currentFolderRelativePath).toBe("animals/cats");
expect(gridContainer.dataset.mjrSubfolder).toBe("animals/cats");
expect(reloadGrid).toHaveBeenCalledTimes(1);
expect(onContextChanged).toHaveBeenCalledTimes(1);
expect(folderBreadcrumbController.setFolderBreadcrumb).toHaveBeenCalledWith(
expect.objectContaining({
visible: true,
items: expect.arrayContaining([
expect.objectContaining({ label: "Computer" }),
expect.objectContaining({ label: "animals" }),
expect.objectContaining({ label: "cats", current: true }),
]),
}),
);
unbind();
});
});