- 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)
105 lines
3.4 KiB
TypeScript
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();
|
|
});
|
|
});
|