mirror of
https://github.com/Comfy-Org/ComfyUI_frontend.git
synced 2026-04-19 22:09:37 +00:00
## Summary Adds an additional dialog after setting the default view of the workflow to let users pick their next step ## Screenshots (if applicable) <img width="479" height="332" alt="image" src="https://github.com/user-attachments/assets/1ea40b10-d7d3-49ff-9ea2-27b9e907c923" /> <img width="478" height="343" alt="image" src="https://github.com/user-attachments/assets/21674998-5ce2-496d-97e6-ef8f2f2d7dd7" /> ┆Issue is synchronized with this [Notion page](https://www.notion.so/PR-9374-feat-App-builder-confirmation-dialog-after-setting-default-view-mode-3196d73d36508192a45ee8ba0a7f74a6) by [Unito](https://www.unito.io) --------- Co-authored-by: coderabbitai[bot] <136622811+coderabbitai[bot]@users.noreply.github.com>
223 lines
6.6 KiB
TypeScript
223 lines
6.6 KiB
TypeScript
import { beforeEach, describe, expect, it, vi } from 'vitest'
|
|
|
|
const mockDialogService = vi.hoisted(() => ({
|
|
showLayoutDialog: vi.fn()
|
|
}))
|
|
|
|
const mockDialogStore = vi.hoisted(() => ({
|
|
closeDialog: vi.fn(),
|
|
isDialogOpen: vi.fn<(key: string) => boolean>().mockReturnValue(false)
|
|
}))
|
|
|
|
const mockWorkflowStore = vi.hoisted(() => ({
|
|
activeWorkflow: null as {
|
|
initialMode?: string | null
|
|
changeTracker?: { checkState: () => void }
|
|
} | null
|
|
}))
|
|
|
|
const mockApp = vi.hoisted(() => ({
|
|
rootGraph: { extra: {} as Record<string, unknown> }
|
|
}))
|
|
|
|
const mockSetMode = vi.hoisted(() => vi.fn())
|
|
|
|
vi.mock('@/services/dialogService', () => ({
|
|
useDialogService: () => mockDialogService
|
|
}))
|
|
|
|
vi.mock('@/stores/dialogStore', () => ({
|
|
useDialogStore: () => mockDialogStore
|
|
}))
|
|
|
|
vi.mock('@/platform/workflow/management/stores/workflowStore', () => ({
|
|
useWorkflowStore: () => mockWorkflowStore
|
|
}))
|
|
|
|
vi.mock('@/scripts/app', () => ({
|
|
app: mockApp
|
|
}))
|
|
|
|
vi.mock('@/composables/useAppMode', () => ({
|
|
useAppMode: () => ({ setMode: mockSetMode })
|
|
}))
|
|
|
|
vi.mock('./DefaultViewDialogContent.vue', () => ({
|
|
default: { name: 'MockDefaultViewDialogContent' }
|
|
}))
|
|
|
|
vi.mock('./BuilderDefaultModeAppliedDialogContent.vue', () => ({
|
|
default: { name: 'MockBuilderDefaultModeAppliedDialogContent' }
|
|
}))
|
|
|
|
import { useAppSetDefaultView } from './useAppSetDefaultView'
|
|
|
|
describe('useAppSetDefaultView', () => {
|
|
beforeEach(() => {
|
|
vi.clearAllMocks()
|
|
mockWorkflowStore.activeWorkflow = null
|
|
mockApp.rootGraph.extra = {}
|
|
})
|
|
|
|
describe('settingView', () => {
|
|
it('reflects dialogStore.isDialogOpen', () => {
|
|
mockDialogStore.isDialogOpen.mockReturnValue(true)
|
|
const { settingView } = useAppSetDefaultView()
|
|
expect(settingView.value).toBe(true)
|
|
})
|
|
})
|
|
|
|
describe('showDialog', () => {
|
|
it('opens dialog via dialogService', () => {
|
|
const { showDialog } = useAppSetDefaultView()
|
|
showDialog()
|
|
|
|
expect(mockDialogService.showLayoutDialog).toHaveBeenCalledOnce()
|
|
})
|
|
|
|
it('passes initialOpenAsApp true when initialMode is not graph', () => {
|
|
mockWorkflowStore.activeWorkflow = { initialMode: 'app' }
|
|
const { showDialog } = useAppSetDefaultView()
|
|
showDialog()
|
|
|
|
const call = mockDialogService.showLayoutDialog.mock.calls[0][0]
|
|
expect(call.props.initialOpenAsApp).toBe(true)
|
|
})
|
|
|
|
it('passes initialOpenAsApp false when initialMode is graph', () => {
|
|
mockWorkflowStore.activeWorkflow = { initialMode: 'graph' }
|
|
const { showDialog } = useAppSetDefaultView()
|
|
showDialog()
|
|
|
|
const call = mockDialogService.showLayoutDialog.mock.calls[0][0]
|
|
expect(call.props.initialOpenAsApp).toBe(false)
|
|
})
|
|
|
|
it('passes initialOpenAsApp true when no active workflow', () => {
|
|
mockWorkflowStore.activeWorkflow = null
|
|
const { showDialog } = useAppSetDefaultView()
|
|
showDialog()
|
|
|
|
const call = mockDialogService.showLayoutDialog.mock.calls[0][0]
|
|
expect(call.props.initialOpenAsApp).toBe(true)
|
|
})
|
|
})
|
|
|
|
describe('handleApply', () => {
|
|
it('sets initialMode to app when openAsApp is true', () => {
|
|
const workflow = { initialMode: null as string | null }
|
|
mockWorkflowStore.activeWorkflow = workflow
|
|
|
|
const { showDialog } = useAppSetDefaultView()
|
|
showDialog()
|
|
|
|
const call = mockDialogService.showLayoutDialog.mock.calls[0][0]
|
|
call.props.onApply(true)
|
|
|
|
expect(workflow.initialMode).toBe('app')
|
|
})
|
|
|
|
it('sets initialMode to graph when openAsApp is false', () => {
|
|
const workflow = { initialMode: null as string | null }
|
|
mockWorkflowStore.activeWorkflow = workflow
|
|
|
|
const { showDialog } = useAppSetDefaultView()
|
|
showDialog()
|
|
|
|
const call = mockDialogService.showLayoutDialog.mock.calls[0][0]
|
|
call.props.onApply(false)
|
|
|
|
expect(workflow.initialMode).toBe('graph')
|
|
})
|
|
|
|
it('sets linearMode on rootGraph.extra', () => {
|
|
mockWorkflowStore.activeWorkflow = { initialMode: null }
|
|
|
|
const { showDialog } = useAppSetDefaultView()
|
|
showDialog()
|
|
|
|
const call = mockDialogService.showLayoutDialog.mock.calls[0][0]
|
|
call.props.onApply(true)
|
|
|
|
expect(mockApp.rootGraph.extra.linearMode).toBe(true)
|
|
})
|
|
|
|
it('closes dialog after applying', () => {
|
|
mockWorkflowStore.activeWorkflow = { initialMode: null }
|
|
|
|
const { showDialog } = useAppSetDefaultView()
|
|
showDialog()
|
|
|
|
const call = mockDialogService.showLayoutDialog.mock.calls[0][0]
|
|
call.props.onApply(true)
|
|
|
|
expect(mockDialogStore.closeDialog).toHaveBeenCalledWith({
|
|
key: 'builder-default-view'
|
|
})
|
|
})
|
|
|
|
it('shows confirmation dialog after applying', () => {
|
|
mockWorkflowStore.activeWorkflow = { initialMode: null }
|
|
|
|
const { showDialog } = useAppSetDefaultView()
|
|
showDialog()
|
|
|
|
const call = mockDialogService.showLayoutDialog.mock.calls[0][0]
|
|
call.props.onApply(true)
|
|
|
|
expect(mockDialogService.showLayoutDialog).toHaveBeenCalledTimes(2)
|
|
const confirmCall = mockDialogService.showLayoutDialog.mock.calls[1][0]
|
|
expect(confirmCall.key).toBe('builder-default-view-applied')
|
|
expect(confirmCall.props.appliedAsApp).toBe(true)
|
|
})
|
|
|
|
it('passes appliedAsApp false to confirmation dialog when graph', () => {
|
|
mockWorkflowStore.activeWorkflow = { initialMode: null }
|
|
|
|
const { showDialog } = useAppSetDefaultView()
|
|
showDialog()
|
|
|
|
const call = mockDialogService.showLayoutDialog.mock.calls[0][0]
|
|
call.props.onApply(false)
|
|
|
|
const confirmCall = mockDialogService.showLayoutDialog.mock.calls[1][0]
|
|
expect(confirmCall.props.appliedAsApp).toBe(false)
|
|
})
|
|
})
|
|
|
|
describe('applied dialog', () => {
|
|
function applyAndGetConfirmDialog(openAsApp: boolean) {
|
|
mockWorkflowStore.activeWorkflow = { initialMode: null }
|
|
|
|
const { showDialog } = useAppSetDefaultView()
|
|
showDialog()
|
|
|
|
const applyCall = mockDialogService.showLayoutDialog.mock.calls[0][0]
|
|
applyCall.props.onApply(openAsApp)
|
|
|
|
return mockDialogService.showLayoutDialog.mock.calls[1][0]
|
|
}
|
|
|
|
it('onViewApp sets mode to app and closes dialog', () => {
|
|
const confirmCall = applyAndGetConfirmDialog(true)
|
|
confirmCall.props.onViewApp()
|
|
|
|
expect(mockDialogStore.closeDialog).toHaveBeenCalledWith({
|
|
key: 'builder-default-view-applied'
|
|
})
|
|
expect(mockSetMode).toHaveBeenCalledWith('app')
|
|
})
|
|
|
|
it('onClose closes confirmation dialog', () => {
|
|
const confirmCall = applyAndGetConfirmDialog(true)
|
|
|
|
mockDialogStore.closeDialog.mockClear()
|
|
confirmCall.props.onClose()
|
|
|
|
expect(mockDialogStore.closeDialog).toHaveBeenCalledWith({
|
|
key: 'builder-default-view-applied'
|
|
})
|
|
})
|
|
})
|
|
})
|