Files
2026-06-09 10:28:25 +02:00

148 lines
5.4 KiB
TypeScript

import { describe, expect, it, vi } from "vitest";
import { createPinia, setActivePinia } from "pinia";
import { createScopeController } from "../features/panel/controllers/scopeController.js";
import { usePanelStore } from "../stores/usePanelStore.js";
function makeButton(scope) {
const classes = new Set();
return {
dataset: { scope },
style: { display: "" },
classList: {
toggle(name, active) {
if (active) classes.add(name);
else classes.delete(name);
},
has(name) {
return classes.has(name);
},
},
};
}
describe("scopeController similar scope", () => {
it("activates a temporary similar scope and clears it cleanly", async () => {
setActivePinia(createPinia());
const panelStore = usePanelStore();
panelStore.scope = "output";
panelStore.viewScope = "";
panelStore.similarResults = [{ asset_id: 7 }];
panelStore.similarTitle = "Similar to asset #42 (1 results)";
panelStore.similarSourceAssetId = "42";
panelStore.collectionId = "";
panelStore.collectionName = "";
panelStore.currentFolderRelativePath = "";
panelStore.customRootId = "";
const tabButtons = {
tabAll: makeButton("all"),
tabInputs: makeButton("input"),
tabOutputs: makeButton("output"),
tabCustom: makeButton("custom"),
tabWorkflow: makeButton("workflow"),
tabSimilar: makeButton("similar"),
};
const state = {
scope: "output",
viewScope: "",
similarResults: [{ asset_id: 7 }],
similarTitle: "Similar to asset #42 (1 results)",
similarSourceAssetId: "42",
collectionId: "",
collectionName: "",
currentFolderRelativePath: "",
customRootId: "",
};
const reloadGrid = vi.fn(async () => {});
const reconcileSelection = vi.fn();
const onChanged = vi.fn();
const onScopeChanged = vi.fn();
const onBeforeReload = vi.fn();
const popovers = { close: vi.fn() };
const customMenuBtn = { style: { display: "" } };
const customPopover = { style: { display: "" } };
const controller = createScopeController({
state,
tabButtons,
customMenuBtn,
customPopover,
popovers,
reloadGrid,
reconcileSelection,
onChanged,
onScopeChanged,
onBeforeReload,
});
controller.setActiveTabStyles();
expect(tabButtons.tabSimilar.style.display).toBe("");
expect(tabButtons.tabOutputs.classList.has("is-active")).toBe(true);
await controller.setScope("similar");
expect(panelStore.viewScope).toBe("similar");
expect(tabButtons.tabSimilar.classList.has("is-active")).toBe(true);
expect(onScopeChanged).not.toHaveBeenCalled();
expect(onBeforeReload).toHaveBeenCalledTimes(1);
expect(reloadGrid).toHaveBeenCalledTimes(1);
await controller.clearSimilarScope({ reload: false });
expect(panelStore.viewScope).toBe("");
expect(panelStore.similarResults).toEqual([]);
expect(panelStore.similarTitle).toBe("");
expect(panelStore.similarSourceAssetId).toBe("");
expect(tabButtons.tabSimilar.style.display).toBe("none");
await controller.setScope("output");
expect(panelStore.scope).toBe("output");
expect(panelStore.collectionId).toBe("");
expect(panelStore.collectionName).toBe("");
expect(panelStore.currentFolderRelativePath).toBe("");
expect(panelStore.similarResults).toEqual([]);
expect(panelStore.similarTitle).toBe("");
expect(panelStore.similarSourceAssetId).toBe("");
expect(reconcileSelection).toHaveBeenCalledTimes(1);
});
it("switches to workflow scope and clears stale custom root context", async () => {
setActivePinia(createPinia());
const panelStore = usePanelStore();
panelStore.scope = "custom";
panelStore.customRootId = "legacy-root";
panelStore.currentFolderRelativePath = "old/folder";
const tabButtons = {
tabAll: makeButton("all"),
tabInputs: makeButton("input"),
tabOutputs: makeButton("output"),
tabCustom: makeButton("custom"),
tabWorkflow: makeButton("workflow"),
tabSimilar: makeButton("similar"),
};
const controller = createScopeController({
state: {
scope: "custom",
customRootId: "legacy-root",
currentFolderRelativePath: "old/folder",
},
tabButtons,
customMenuBtn: { style: { display: "" } },
customPopover: { style: { display: "" } },
popovers: { close: vi.fn() },
reloadGrid: vi.fn(async () => {}),
reconcileSelection: vi.fn(),
onChanged: vi.fn(),
onScopeChanged: vi.fn(),
onBeforeReload: vi.fn(),
});
await controller.setScope("workflow");
expect(panelStore.scope).toBe("workflow");
expect(panelStore.customRootId).toBe("");
expect(panelStore.currentFolderRelativePath).toBe("");
expect(tabButtons.tabWorkflow.classList.has("is-active")).toBe(true);
});
});