Files
MajoorWaldi-ComfyUI-Majoor-…/ui/tests/grid_controller_similar_fallback.vitest.ts
T
Ewald ALOEBOETOE d0ab7d594e Resolve remaining ComfyUI integration conflicts
- Move the read-only OpenAPI compat surface from /api/v2/assets to
  /mjr/am/compat/assets so it never squats ComfyUI core's /api namespace;
  the legacy alias is opt-in via MJR_AM_LEGACY_API_V2_ASSETS=1.
- Allow Python 3.14 (requires-python <3.15) and add 3.14 to CI and tox.
- Stop wrapping api.queuePrompt: progress tracking now resolves the
  running prompt from the core Jobs API (getJobDetail), then /queue and
  /history, driven by websocket events. Remove wrapHostQueuePrompt.
- Add opt-in Majoor.Integration.HideNativeAssetsTab setting that hides
  ComfyUI's native Assets sidebar tab through the official
  getSidebarTabs/unregisterSidebarTab API and restores it when disabled.
- Fix all 913 type errors in tsconfig.test.json and type-check tests in
  CI; drop a duplicated `stubs` key in asset_card_inner test; make
  addToastHistory's type argument optional for the object form.
- Update audit report, changelog, API reference and env var docs.
2026-11-03 21:16:34 +00:00

128 lines
3.7 KiB
TypeScript

import { beforeEach, describe, expect, it, vi } from "vitest";
const bridgeState = vi.hoisted(() => ({
values: {
viewScope: "similar",
similarResults: [],
similarSourceAssetId: "",
similarTitle: "",
},
}));
vi.mock("../stores/panelStateBridge.js", () => ({
createPanelStateBridge: () => ({
read: (key, fallback = "") =>
Object.prototype.hasOwnProperty.call(bridgeState.values, key)
? bridgeState.values[key]
: fallback,
write: vi.fn(),
}),
}));
vi.mock("../api/client.js", () => ({
vectorSearch: vi.fn(),
hybridSearch: vi.fn(),
vectorStats: vi.fn(),
}));
vi.mock("../app/toast.js", () => ({
comfyToast: vi.fn(),
}));
vi.mock("../app/i18n.js", () => ({
t: (_key, fallback) => fallback,
}));
vi.mock("../app/settings.js", () => ({
loadMajoorSettings: () => ({ ai: { vectorSearchEnabled: true } }),
}));
function createGridContainer() {
return {
dataset: {},
dispatchEvent: vi.fn(),
};
}
describe("gridController similar fallback", () => {
beforeEach(() => {
vi.clearAllMocks();
bridgeState.values = {
viewScope: "similar",
similarResults: [],
similarSourceAssetId: "",
similarTitle: "",
};
globalThis.window = {} as any;
globalThis.CustomEvent = class {
constructor(type, init = {}) {
(this as any).type = type;
(this as any).detail = (init as any).detail;
}
} as any;
});
it("uses state similar results when bridge results are empty", async () => {
const { createGridController } =
await import("../features/panel/controllers/gridController.js");
const listFromState = [
{ id: 194, filename: "ComfyUI_00004_.png" },
{ id: 193, filename: "AnimateDiff_00008.mp4" },
];
const loadAssetsFromList = vi.fn(async (_grid, assets) => ({
ok: true,
count: assets.length,
total: assets.length,
}));
const loadAssets = vi.fn(async () => ({ ok: true, count: 0, total: 0 }));
const controller = createGridController({
gridContainer: createGridContainer(),
loadAssets,
loadAssetsFromList,
getCollectionAssets: vi.fn(),
disposeGrid: vi.fn(),
getQuery: () => "*",
searchInputEl: { dataset: { mjrSemanticMode: "0" } },
state: {
scope: "output",
customRootId: "",
currentFolderRelativePath: "",
kindFilter: "",
workflowOnly: false,
minRating: 0,
minSizeMB: 0,
maxSizeMB: 0,
resolutionCompare: "gte",
minWidth: 0,
minHeight: 0,
maxWidth: 0,
maxHeight: 0,
workflowType: "",
dateRangeFilter: "",
dateExactFilter: "",
sort: "mtime_desc",
selectedAssetIds: [],
activeAssetId: "",
collectionId: "",
collectionName: "",
viewScope: "similar",
similarResults: listFromState,
similarSourceAssetId: "194",
similarTitle: "Generation group (2 assets)",
},
});
await controller.reloadGrid();
expect(loadAssetsFromList).toHaveBeenCalledWith(
expect.any(Object),
listFromState,
expect.objectContaining({ reset: true }),
);
expect(loadAssets).not.toHaveBeenCalled();
});
});