diff --git a/web/app/components/snippets/components/__tests__/snippet-create-card.spec.tsx b/web/app/components/snippets/components/__tests__/snippet-create-card.spec.tsx
index f727bf7666..d7d1b2991a 100644
--- a/web/app/components/snippets/components/__tests__/snippet-create-card.spec.tsx
+++ b/web/app/components/snippets/components/__tests__/snippet-create-card.spec.tsx
@@ -1,10 +1,11 @@
import { fireEvent, render, screen, waitFor } from '@testing-library/react'
import SnippetCreateCard from '../snippet-create-card'
-const { mockPush, mockMutate, mockToastSuccess } = vi.hoisted(() => ({
+const { mockPush, mockCreateMutate, mockToastSuccess, mockToastError } = vi.hoisted(() => ({
mockPush: vi.fn(),
- mockMutate: vi.fn(),
+ mockCreateMutate: vi.fn(),
mockToastSuccess: vi.fn(),
+ mockToastError: vi.fn(),
}))
vi.mock('@/next/navigation', () => ({
@@ -16,17 +17,31 @@ vi.mock('@/next/navigation', () => ({
vi.mock('@/app/components/base/ui/toast', () => ({
toast: {
success: mockToastSuccess,
- error: vi.fn(),
+ error: mockToastError,
},
}))
vi.mock('@/service/use-snippets', () => ({
useCreateSnippetMutation: () => ({
- mutate: mockMutate,
+ mutate: mockCreateMutate,
isPending: false,
}),
}))
+vi.mock('../snippet-import-dsl-dialog', () => ({
+ default: ({ show, onClose, onSuccess }: { show: boolean, onClose: () => void, onSuccess?: (snippetId: string) => void }) => {
+ if (!show)
+ return null
+
+ return (
+
+
+
+
+ )
+ },
+}))
+
describe('SnippetCreateCard', () => {
beforeEach(() => {
vi.clearAllMocks()
@@ -34,7 +49,7 @@ describe('SnippetCreateCard', () => {
describe('Create From Blank', () => {
it('should open the create dialog and create a snippet from the modal', async () => {
- mockMutate.mockImplementation((_payload, options?: { onSuccess?: (snippet: { id: string }) => void }) => {
+ mockCreateMutate.mockImplementation((_payload, options?: { onSuccess?: (snippet: { id: string }) => void }) => {
options?.onSuccess?.({ id: 'snippet-123' })
})
@@ -51,7 +66,7 @@ describe('SnippetCreateCard', () => {
})
fireEvent.click(screen.getByRole('button', { name: /workflow\.snippet\.confirm/i }))
- expect(mockMutate).toHaveBeenCalledWith({
+ expect(mockCreateMutate).toHaveBeenCalledWith({
body: {
name: 'My Snippet',
description: 'Useful snippet description',
@@ -71,7 +86,22 @@ describe('SnippetCreateCard', () => {
expect(mockPush).toHaveBeenCalledWith('/snippets/snippet-123/orchestrate')
})
- expect(mockToastSuccess).toHaveBeenCalledWith('workflow.createSuccess')
+ expect(mockToastSuccess).toHaveBeenCalledWith('workflow.snippet.createSuccess')
+ })
+ })
+
+ describe('Import DSL', () => {
+ it('should open the import dialog and navigate when the import succeeds', async () => {
+ render()
+
+ fireEvent.click(screen.getByRole('button', { name: 'app.importDSL' }))
+ expect(screen.getByTestId('snippet-import-dsl-dialog')).toBeInTheDocument()
+
+ fireEvent.click(screen.getByRole('button', { name: 'Complete Import' }))
+
+ await waitFor(() => {
+ expect(mockPush).toHaveBeenCalledWith('/snippets/snippet-imported/orchestrate')
+ })
})
})
})
diff --git a/web/app/components/snippets/components/snippet-create-card.tsx b/web/app/components/snippets/components/snippet-create-card.tsx
index 75b1f37f78..4ed5b32a35 100644
--- a/web/app/components/snippets/components/snippet-create-card.tsx
+++ b/web/app/components/snippets/components/snippet-create-card.tsx
@@ -6,18 +6,26 @@ import { useTranslation } from 'react-i18next'
import { toast } from '@/app/components/base/ui/toast'
import CreateSnippetDialog from '@/app/components/workflow/create-snippet-dialog'
import { useRouter } from '@/next/navigation'
-import { useCreateSnippetMutation } from '@/service/use-snippets'
+import {
+ useCreateSnippetMutation,
+} from '@/service/use-snippets'
+import SnippetImportDSLDialog from './snippet-import-dsl-dialog'
const SnippetCreateCard = () => {
const { t } = useTranslation('snippet')
const { push } = useRouter()
const createSnippetMutation = useCreateSnippetMutation()
const [isCreateDialogOpen, setIsCreateDialogOpen] = useState(false)
+ const [isImportDSLDialogOpen, setIsImportDSLDialogOpen] = useState(false)
const handleCreateFromBlank = () => {
setIsCreateDialogOpen(true)
}
+ const handleImportDSL = () => {
+ setIsImportDSLDialogOpen(true)
+ }
+
const handleCreateSnippet = ({
name,
description,
@@ -64,7 +72,11 @@ const SnippetCreateCard = () => {
{t('createFromBlank')}
-