Files
SnapOtter/tests/unit/web/pipeline-store.test.ts
T

82 lines
3.2 KiB
TypeScript
Raw Normal View History

import { afterEach, describe, expect, it } from "vitest";
import { usePipelineStore } from "../../../apps/web/src/stores/pipeline-store";
describe("usePipelineStore", () => {
afterEach(() => {
usePipelineStore.getState().reset();
});
it("starts with empty steps", () => {
expect(usePipelineStore.getState().steps).toEqual([]);
});
it("addStep appends a step with generated id", () => {
usePipelineStore.getState().addStep("resize");
const steps = usePipelineStore.getState().steps;
expect(steps).toHaveLength(1);
expect(steps[0].toolId).toBe("resize");
expect(steps[0].settings).toEqual({});
expect(steps[0].id).toBeTruthy();
});
it("addStep auto-expands the new step", () => {
usePipelineStore.getState().addStep("resize");
const { steps, expandedStepId } = usePipelineStore.getState();
expect(expandedStepId).toBe(steps[0].id);
});
it("removeStep removes by id", () => {
usePipelineStore.getState().addStep("resize");
usePipelineStore.getState().addStep("compress");
const id = usePipelineStore.getState().steps[0].id;
usePipelineStore.getState().removeStep(id);
expect(usePipelineStore.getState().steps).toHaveLength(1);
expect(usePipelineStore.getState().steps[0].toolId).toBe("compress");
});
it("removeStep clears expandedStepId if removing expanded step", () => {
usePipelineStore.getState().addStep("resize");
const id = usePipelineStore.getState().steps[0].id;
expect(usePipelineStore.getState().expandedStepId).toBe(id);
usePipelineStore.getState().removeStep(id);
expect(usePipelineStore.getState().expandedStepId).toBeNull();
});
it("reorderSteps swaps two step positions", () => {
usePipelineStore.getState().addStep("resize");
usePipelineStore.getState().addStep("compress");
usePipelineStore.getState().addStep("convert");
const steps = usePipelineStore.getState().steps;
usePipelineStore.getState().reorderSteps(steps[0].id, steps[2].id);
const reordered = usePipelineStore.getState().steps;
expect(reordered.map((s) => s.toolId)).toEqual(["compress", "convert", "resize"]);
});
it("updateStepSettings merges settings for the target step", () => {
usePipelineStore.getState().addStep("resize");
const id = usePipelineStore.getState().steps[0].id;
usePipelineStore.getState().updateStepSettings(id, { width: 800, height: 600 });
expect(usePipelineStore.getState().steps[0].settings).toEqual({ width: 800, height: 600 });
});
it("loadSteps replaces all steps and generates new ids", () => {
usePipelineStore.getState().addStep("resize");
usePipelineStore.getState().loadSteps([
{ toolId: "compress", settings: { quality: 80 } },
{ toolId: "convert", settings: { format: "webp" } },
]);
const steps = usePipelineStore.getState().steps;
expect(steps).toHaveLength(2);
expect(steps[0].toolId).toBe("compress");
expect(steps[0].settings).toEqual({ quality: 80 });
expect(steps[1].toolId).toBe("convert");
});
it("reset clears all state", () => {
usePipelineStore.getState().addStep("resize");
usePipelineStore.getState().reset();
expect(usePipelineStore.getState().steps).toEqual([]);
expect(usePipelineStore.getState().expandedStepId).toBeNull();
});
});