Files
T

108 lines
2.8 KiB
TypeScript

// SimpleSyrup - workflow-focused ComfyUI extensions for image generation
// Copyright (C) 2026 Artificial Sweetener and contributors
// SPDX-License-Identifier: AGPL-3.0-or-later
import type {
ComfyApp,
ComfyExtension,
ComfySetting,
ComfySettingDefinition,
SettingValue
} from "../src/types";
import { vi } from "vitest";
export interface FakeComfySettingsApi {
definitions: Array<ComfySettingDefinition<SettingValue>>;
settings: Array<ComfySetting<SettingValue>>;
addSetting<TValue extends SettingValue>(
definition: ComfySettingDefinition<TValue>
): ComfySetting<TValue>;
}
export interface FakeComfyApp extends ComfyApp {
extensions: ComfyExtension[];
ui: {
settings: FakeComfySettingsApi;
};
}
export function createFakeComfyApp(): FakeComfyApp {
const settingsApi: FakeComfySettingsApi = {
definitions: [],
settings: [],
addSetting<TValue extends SettingValue>(
definition: ComfySettingDefinition<TValue>
): ComfySetting<TValue> {
const setting: ComfySetting<TValue> = {
value: definition.defaultValue
};
this.definitions.push(
definition as unknown as ComfySettingDefinition<SettingValue>
);
this.settings.push(setting);
return setting;
}
};
return {
extensions: [],
ui: {
settings: settingsApi
},
refreshComboInNodes: async (): Promise<void> => {},
registerExtension(extension: ComfyExtension): void {
this.extensions.push(extension);
}
};
}
export function createJsonResponse(
payload: unknown,
init: ResponseInit = {}
): Response {
return new Response(JSON.stringify(payload), {
headers: { "Content-Type": "application/json" },
...init
});
}
/** Install a deterministic 2D canvas surface for DOM inspector tests. */
export function installCanvasMock(maskValue = 255): void {
const context = {
globalAlpha: 1,
shadowColor: "",
shadowBlur: 0,
clearRect: vi.fn(),
drawImage: vi.fn(),
fillRect: vi.fn(),
getImageData: vi.fn((x: number, y: number, width: number, height: number) => {
void x;
void y;
const data = new Uint8ClampedArray(width * height * 4);
for (let offset = 0; offset < data.length; offset += 4) {
data[offset] = maskValue;
data[offset + 1] = maskValue;
data[offset + 2] = maskValue;
data[offset + 3] = 255;
}
return { data, width, height, colorSpace: "srgb" };
}),
putImageData: vi.fn(),
restore: vi.fn(),
save: vi.fn()
} as unknown as CanvasRenderingContext2D;
vi.spyOn(HTMLCanvasElement.prototype, "getContext").mockReturnValue(context);
vi.stubGlobal(
"ImageData",
class {
readonly colorSpace = "srgb";
constructor(
readonly data: Uint8ClampedArray,
readonly width: number,
readonly height: number
) {}
}
);
}