mirror of
https://github.com/Comfy-Org/ComfyUI_frontend.git
synced 2026-02-03 14:54:37 +00:00
## Summary Merges latest changes from `main` as of 10-06-2025. ┆Issue is synchronized with this [Notion page](https://www.notion.so/PR-5965-Merge-main-as-of-10-06-2025-into-rh-test-2856d73d3650812cb95fd8917278a770) by [Unito](https://www.unito.io) --------- Signed-off-by: Marcel Petrick <mail@marcelpetrick.it> Co-authored-by: filtered <176114999+webfiltered@users.noreply.github.com> Co-authored-by: Christian Byrne <cbyrne@comfy.org> Co-authored-by: github-actions <github-actions@github.com> Co-authored-by: Claude <noreply@anthropic.com> Co-authored-by: Alexander Brown <drjkl@comfy.org> Co-authored-by: Benjamin Lu <benceruleanlu@proton.me> Co-authored-by: Terry Jia <terryjia88@gmail.com> Co-authored-by: snomiao <snomiao@gmail.com> Co-authored-by: Simula_r <18093452+simula-r@users.noreply.github.com> Co-authored-by: Jake Schroeder <jake.schroeder@isophex.com> Co-authored-by: Comfy Org PR Bot <snomiao+comfy-pr@gmail.com> Co-authored-by: AustinMroz <4284322+AustinMroz@users.noreply.github.com> Co-authored-by: GitHub Action <action@github.com> Co-authored-by: Johnpaul Chiwetelu <49923152+Myestery@users.noreply.github.com> Co-authored-by: Marcel Petrick <mail@marcelpetrick.it> Co-authored-by: Alexander Brown <DrJKL0424@gmail.com> Co-authored-by: Benjamin Lu <benjaminlu1107@gmail.com> Co-authored-by: Alexander Piskun <13381981+bigcat88@users.noreply.github.com> Co-authored-by: Rizumu Ayaka <rizumu@ayaka.moe> Co-authored-by: JakeSchroeder <jake@axiom.co> Co-authored-by: AustinMroz <austin@comfy.org> Co-authored-by: DrJKL <DrJKL@users.noreply.github.com> Co-authored-by: ComfyUI Wiki <contact@comfyui-wiki.com>
130 lines
3.8 KiB
TypeScript
130 lines
3.8 KiB
TypeScript
import { createPinia, setActivePinia } from 'pinia'
|
|
import { beforeEach, describe, expect, it, vi } from 'vitest'
|
|
|
|
import type { ComfyNodeDef as ComfyNodeDefV1 } from '@/schemas/nodeDefSchema'
|
|
import { api } from '@/scripts/api'
|
|
import { app as comfyApp } from '@/scripts/app'
|
|
import { useLitegraphService } from '@/services/litegraphService'
|
|
import { useNodeDefStore } from '@/stores/nodeDefStore'
|
|
import { useSubgraphStore } from '@/stores/subgraphStore'
|
|
|
|
import {
|
|
createTestSubgraph,
|
|
createTestSubgraphNode
|
|
} from '../litegraph/subgraph/fixtures/subgraphHelpers'
|
|
|
|
// Add mock for api at the top of the file
|
|
vi.mock('@/scripts/api', () => ({
|
|
api: {
|
|
getUserData: vi.fn(),
|
|
storeUserData: vi.fn(),
|
|
listUserDataFullInfo: vi.fn(),
|
|
apiURL: vi.fn(),
|
|
addEventListener: vi.fn()
|
|
}
|
|
}))
|
|
vi.mock('@/services/dialogService', () => ({
|
|
useDialogService: vi.fn(() => ({
|
|
prompt: () => 'testname',
|
|
confirm: () => true
|
|
}))
|
|
}))
|
|
vi.mock('@/renderer/core/canvas/canvasStore', () => ({
|
|
useCanvasStore: vi.fn(() => ({
|
|
getCanvas: () => comfyApp.canvas
|
|
}))
|
|
}))
|
|
|
|
// Mock comfyApp globally for the store setup
|
|
vi.mock('@/scripts/app', () => ({
|
|
app: {
|
|
canvas: {
|
|
_deserializeItems: vi.fn((i) => i),
|
|
ds: { visible_area: [0, 0, 0, 0] },
|
|
selected_nodes: null
|
|
},
|
|
loadGraphData: vi.fn()
|
|
}
|
|
}))
|
|
|
|
const mockGraph = {
|
|
nodes: [{ type: '123' }],
|
|
definitions: { subgraphs: [{ id: '123' }] }
|
|
}
|
|
|
|
describe('useSubgraphStore', () => {
|
|
let store: ReturnType<typeof useSubgraphStore>
|
|
const mockFetch = async (filenames: Record<string, unknown>) => {
|
|
vi.mocked(api.listUserDataFullInfo).mockResolvedValue(
|
|
Object.keys(filenames).map((filename) => ({
|
|
path: filename,
|
|
modified: new Date().getTime(),
|
|
size: 1 // size !== -1 for remote workflows
|
|
}))
|
|
)
|
|
vi.mocked(api).getUserData = vi.fn(
|
|
(f) =>
|
|
({
|
|
status: 200,
|
|
text: () => JSON.stringify(filenames[f.slice(10)])
|
|
}) as any
|
|
)
|
|
return await store.fetchSubgraphs()
|
|
}
|
|
|
|
beforeEach(() => {
|
|
setActivePinia(createPinia())
|
|
store = useSubgraphStore()
|
|
vi.clearAllMocks()
|
|
})
|
|
|
|
it('should allow publishing of a subgraph', async () => {
|
|
//mock canvas to provide a minimal subgraphNode
|
|
const subgraph = createTestSubgraph()
|
|
const subgraphNode = createTestSubgraphNode(subgraph)
|
|
const graph = subgraphNode.graph
|
|
graph.add(subgraphNode)
|
|
vi.mocked(comfyApp.canvas).selectedItems = new Set([subgraphNode])
|
|
vi.mocked(comfyApp.canvas)._serializeItems = vi.fn(() => ({
|
|
nodes: [subgraphNode.serialize()],
|
|
subgraphs: [subgraph.serialize() as any]
|
|
}))
|
|
//mock saving of file
|
|
vi.mocked(api.storeUserData).mockResolvedValue({
|
|
status: 200,
|
|
json: () =>
|
|
Promise.resolve({
|
|
path: 'subgraphs/testname.json',
|
|
modified: Date.now(),
|
|
size: 2
|
|
})
|
|
} as Response)
|
|
await mockFetch({ 'testname.json': mockGraph })
|
|
//Dialogue service already mocked
|
|
await store.publishSubgraph()
|
|
expect(api.storeUserData).toHaveBeenCalled()
|
|
})
|
|
it('should display published nodes in the node library', async () => {
|
|
await mockFetch({ 'test.json': mockGraph })
|
|
expect(
|
|
useNodeDefStore().nodeDefs.filter(
|
|
(d) => d.category == 'Subgraph Blueprints'
|
|
)
|
|
).toHaveLength(1)
|
|
})
|
|
it('should allow subgraphs to be edited', async () => {
|
|
await mockFetch({ 'test.json': mockGraph })
|
|
await store.editBlueprint(store.typePrefix + 'test')
|
|
//check active graph
|
|
expect(comfyApp.loadGraphData).toHaveBeenCalled()
|
|
})
|
|
it('should allow subgraphs to be added to graph', async () => {
|
|
//mock
|
|
await mockFetch({ 'test.json': mockGraph })
|
|
const res = useLitegraphService().addNodeOnGraph({
|
|
name: 'SubgraphBlueprint.test'
|
|
} as ComfyNodeDefV1)
|
|
expect(res).toBeTruthy()
|
|
})
|
|
})
|