dify/web/app/components/snippets/hooks/__tests__/use-snippet-refresh-draft.spec.ts
Stephen Zhou a84c2d36a3
style: format with vp fmt (#38803)
Co-authored-by: autofix-ci[bot] <114827586+autofix-ci[bot]@users.noreply.github.com>
2026-07-12 15:57:46 +00:00

103 lines
3.3 KiB
TypeScript

import type { SnippetWorkflow } from '@/types/snippet'
import { renderHook, waitFor } from '@testing-library/react'
import { useSnippetRefreshDraft } from '../use-snippet-refresh-draft'
const mockFetchSnippetDraftWorkflow = vi.fn()
const mockHandleUpdateWorkflowCanvas = vi.fn()
const mockSnippetSetState = vi.fn()
const mockSetDraftUpdatedAt = vi.fn()
const mockSetIsSyncingWorkflowDraft = vi.fn()
const mockSetSyncWorkflowDraftHash = vi.fn()
const workflowStoreState = {
setDraftUpdatedAt: mockSetDraftUpdatedAt,
setIsSyncingWorkflowDraft: mockSetIsSyncingWorkflowDraft,
setSyncWorkflowDraftHash: mockSetSyncWorkflowDraftHash,
}
vi.mock('@/service/use-snippet-workflows', () => ({
fetchSnippetDraftWorkflow: (...args: unknown[]) => mockFetchSnippetDraftWorkflow(...args),
}))
vi.mock('@/app/components/workflow/hooks', () => ({
useWorkflowUpdate: () => ({
handleUpdateWorkflowCanvas: mockHandleUpdateWorkflowCanvas,
}),
}))
vi.mock('@/app/components/workflow/store', () => ({
useWorkflowStore: () => ({
getState: () => workflowStoreState,
}),
}))
vi.mock('../../draft-store', () => ({
useSnippetDraftStore: {
setState: (...args: unknown[]) => mockSnippetSetState(...args),
},
}))
const createDraftWorkflow = (overrides: Partial<SnippetWorkflow> = {}): SnippetWorkflow =>
({
id: 'draft-1',
graph: {
nodes: [{ id: 'node-1' }],
edges: [],
viewport: { x: 10, y: 20, zoom: 1.2 },
},
features: {},
input_fields: [],
hash: 'draft-hash',
created_at: 1_712_300_000,
updated_at: 1_712_345_678,
...overrides,
}) as SnippetWorkflow
describe('useSnippetRefreshDraft', () => {
beforeEach(() => {
vi.clearAllMocks()
})
it('should refresh the draft workflow through the silent draft fetcher', async () => {
const draftWorkflow = createDraftWorkflow()
const onSuccess = vi.fn()
mockFetchSnippetDraftWorkflow.mockResolvedValueOnce(draftWorkflow)
const { result } = renderHook(() => useSnippetRefreshDraft('snippet-1'))
result.current.handleRefreshWorkflowDraft(onSuccess)
await waitFor(() => {
expect(mockHandleUpdateWorkflowCanvas).toHaveBeenCalledWith({
nodes: [{ id: 'node-1' }],
edges: [],
viewport: { x: 10, y: 20, zoom: 1.2 },
})
})
expect(mockFetchSnippetDraftWorkflow).toHaveBeenCalledWith('snippet-1')
expect(mockSnippetSetState).toHaveBeenCalledWith({
inputFields: [],
})
expect(mockSetSyncWorkflowDraftHash).toHaveBeenCalledWith('draft-hash')
expect(mockSetDraftUpdatedAt).toHaveBeenCalledWith(1_712_345_678)
expect(onSuccess).toHaveBeenCalledWith(draftWorkflow)
expect(mockSetIsSyncingWorkflowDraft).toHaveBeenNthCalledWith(1, true)
expect(mockSetIsSyncingWorkflowDraft).toHaveBeenLastCalledWith(false)
})
it('should silently finish when the draft workflow does not exist yet', async () => {
mockFetchSnippetDraftWorkflow.mockResolvedValueOnce(undefined)
const { result } = renderHook(() => useSnippetRefreshDraft('snippet-1'))
result.current.handleRefreshWorkflowDraft()
await waitFor(() => {
expect(mockSetIsSyncingWorkflowDraft).toHaveBeenLastCalledWith(false)
})
expect(mockFetchSnippetDraftWorkflow).toHaveBeenCalledWith('snippet-1')
expect(mockHandleUpdateWorkflowCanvas).not.toHaveBeenCalled()
expect(mockSnippetSetState).not.toHaveBeenCalled()
})
})