13 changed files with 377 additions and 62 deletions
@ -0,0 +1,104 @@ |
|||
import { describe, expect, it, beforeEach } from "vitest"; |
|||
import { useGenerationPreferenceStore, createInitialGenerationPreferences } from "@/store/generationPreferenceStore"; |
|||
import { buildDefaultGenerationNodeCreation, buildDefaultGenerationNodeData } from "@/utils/defaultGenerationNodeModel"; |
|||
import type { SelectedModel } from "@/types"; |
|||
|
|||
const selectedModel: SelectedModel = { |
|||
provider: "popiserver", |
|||
modelId: "image-model", |
|||
displayName: "Image Model", |
|||
capabilities: ["text-to-image"], |
|||
}; |
|||
|
|||
type GenerationPreferenceState = ReturnType<typeof useGenerationPreferenceStore.getState>; |
|||
type ImagePreferencePatch = Parameters<GenerationPreferenceState["updateImagePreference"]>[0]; |
|||
|
|||
describe("generationPreferenceStore", () => { |
|||
beforeEach(() => { |
|||
useGenerationPreferenceStore.setState(createInitialGenerationPreferences()); |
|||
}); |
|||
|
|||
it("keeps only model configuration fields when remembering image preferences", async () => { |
|||
useGenerationPreferenceStore.getState().updateImagePreference({ |
|||
selectedModel, |
|||
batchSize: 3, |
|||
aspectRatio: "16:9", |
|||
resolution: "2K", |
|||
parameters: { |
|||
ratio: "16:9", |
|||
images: ["parameter-image-should-stay-if-schema-owns-it"], |
|||
type: 1, |
|||
}, |
|||
extraTaskParams: { generate_audio: false }, |
|||
subType: 101, |
|||
nodeSize: { width: 512, height: 288 }, |
|||
prompt: "do not remember prompts", |
|||
inputImages: ["https://example.com/reference.png"], |
|||
inputVideos: ["https://example.com/reference.mp4"], |
|||
voices: ["https://example.com/reference.wav"], |
|||
referenceSubjectList: [{ id: "1", type: "image", name: "Reference" }], |
|||
} as ImagePreferencePatch); |
|||
|
|||
const imagePreference = useGenerationPreferenceStore.getState().image as unknown as Record<string, unknown>; |
|||
expect(imagePreference.model).toEqual(selectedModel); |
|||
expect(imagePreference.batchSize).toBe(3); |
|||
expect(imagePreference.aspectRatio).toBe("16:9"); |
|||
expect(imagePreference.resolution).toBe("2K"); |
|||
expect(imagePreference.parameters).toEqual({ |
|||
ratio: "16:9", |
|||
images: ["parameter-image-should-stay-if-schema-owns-it"], |
|||
type: 1, |
|||
}); |
|||
expect(imagePreference.extraTaskParams).toEqual({ generate_audio: false }); |
|||
expect(imagePreference.subType).toBe(101); |
|||
expect(imagePreference.nodeSize).toEqual({ width: 512, height: 288 }); |
|||
|
|||
expect(imagePreference).not.toHaveProperty("prompt"); |
|||
expect(imagePreference).not.toHaveProperty("inputImages"); |
|||
expect(imagePreference).not.toHaveProperty("inputVideos"); |
|||
expect(imagePreference).not.toHaveProperty("voices"); |
|||
expect(imagePreference).not.toHaveProperty("referenceSubjectList"); |
|||
|
|||
const newNodeData = await buildDefaultGenerationNodeData("nanoBanana"); |
|||
expect(newNodeData).toMatchObject({ |
|||
selectedModel, |
|||
batchSize: 3, |
|||
aspectRatio: "16:9", |
|||
resolution: "2K", |
|||
parameters: { |
|||
ratio: "16:9", |
|||
images: ["parameter-image-should-stay-if-schema-owns-it"], |
|||
}, |
|||
extraTaskParams: { generate_audio: false }, |
|||
subType: 101, |
|||
}); |
|||
expect(newNodeData).not.toHaveProperty("prompt"); |
|||
expect(newNodeData).not.toHaveProperty("inputImages"); |
|||
expect(newNodeData).not.toHaveProperty("inputVideos"); |
|||
expect(newNodeData).not.toHaveProperty("voices"); |
|||
expect(newNodeData).not.toHaveProperty("referenceSubjectList"); |
|||
|
|||
await expect(buildDefaultGenerationNodeCreation("nanoBanana")).resolves.toEqual({ |
|||
data: expect.any(Object), |
|||
size: undefined, |
|||
}); |
|||
}); |
|||
|
|||
it("uses remembered node size only when no aspect ratio can drive creation size", async () => { |
|||
useGenerationPreferenceStore.getState().updateVideoPreference({ |
|||
selectedModel: { |
|||
provider: "popiserver", |
|||
modelId: "video-model", |
|||
displayName: "Video Model", |
|||
capabilities: ["text-to-video"], |
|||
}, |
|||
parameters: { duration: 5 }, |
|||
nodeSize: { width: 640, height: 360 }, |
|||
}); |
|||
|
|||
await expect(buildDefaultGenerationNodeCreation("generateVideo")).resolves.toEqual({ |
|||
data: expect.any(Object), |
|||
size: { width: 640, height: 360 }, |
|||
}); |
|||
}); |
|||
}); |
|||
Loading…
Reference in new issue