Files
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

93 lines
2.8 KiB
TypeScript

import { describe, expect, it, vi } from "vitest";
import { createPinia, setActivePinia } from "pinia";
import { createSortController } from "../features/panel/controllers/sortController.js";
import { usePanelStore } from "../stores/usePanelStore.js";
vi.mock("../app/i18n.js", () => ({
t: (key, fallback) =>
({
"sort.newest": "Newest",
"sort.oldest": "Oldest",
"sort.nameAZ": "A-Z",
"sort.nameZA": "Z-A",
"sort.ratingHigh": "Rating",
"sort.sizeDesc": "Size desc",
"sort.sizeAsc": "Size asc",
})[key] ||
fallback ||
"",
}));
function createElementStub() {
const listeners = new Map();
return {
style: {},
children: [],
className: "",
textContent: "",
type: "",
querySelector(selector) {
if (selector === "i") return this._icon || null;
return null;
},
appendChild(child) {
this.children.push(child);
return child;
},
replaceChildren(...nodes) {
this.children = nodes;
},
addEventListener(type, handler) {
const list = listeners.get(type) || [];
list.push(handler);
listeners.set(type, list);
},
dispatchEvent(event) {
for (const handler of listeners.get(event.type) || []) {
handler(event);
}
},
};
}
describe("sortController", () => {
it("syncs sort choice to Pinia and reloads the grid", async () => {
globalThis.document = {
createElement: () => createElementStub(),
};
setActivePinia(createPinia());
const panelStore = usePanelStore();
const sortBtn = createElementStub();
sortBtn._icon = { className: "" };
const sortMenu = createElementStub();
const sortPopover = { style: { display: "" } };
const popovers = { close: vi.fn(), toggle: vi.fn() };
const reloadGrid = vi.fn(async () => ({}));
const state = { sort: "mtime_desc" };
const controller = createSortController({
state,
sortBtn,
sortMenu,
sortPopover,
popovers,
reloadGrid,
});
controller.bind();
expect(sortBtn._icon.className).toBe("pi pi-sort-amount-down");
const nameAscButton = sortMenu.children.find(
(child) => child.children?.[0]?.textContent === "A-Z",
);
await nameAscButton.dispatchEvent({ type: "click" });
expect(panelStore.sort).toBe("name_asc");
expect(sortBtn._icon.className).toBe("pi pi-sort-alpha-down");
expect(popovers.close).toHaveBeenCalledWith(sortPopover);
expect(reloadGrid).toHaveBeenCalledTimes(1);
});
});