import { cleanup, render, screen } from '@testing-library/react' import { afterEach, describe, expect, it, vi } from 'vitest' import FlowAppPreview from './flow-app-preview' const mockUseGetTryAppFlowPreview = vi.fn() vi.mock('@/service/use-try-app', () => ({ useGetTryAppFlowPreview: (...args: unknown[]) => mockUseGetTryAppFlowPreview(...args), })) vi.mock('@/app/components/workflow/workflow-preview', () => ({ default: ({ className, miniMapToRight, nodes, edges, }: { className?: string, miniMapToRight?: boolean, nodes?: unknown[], edges?: unknown[] }) => (
WorkflowPreview
), })) describe('FlowAppPreview', () => { afterEach(() => { cleanup() vi.clearAllMocks() }) describe('loading state', () => { it('renders Loading component when isLoading is true', () => { mockUseGetTryAppFlowPreview.mockReturnValue({ data: null, isLoading: true, }) render() expect(screen.getByRole('status')).toBeInTheDocument() expect(screen.queryByTestId('workflow-preview')).not.toBeInTheDocument() }) }) describe('no data state', () => { it('returns null when data is null', () => { mockUseGetTryAppFlowPreview.mockReturnValue({ data: null, isLoading: false, }) const { container } = render() expect(container.firstChild).toBeNull() }) it('returns null when data is undefined', () => { mockUseGetTryAppFlowPreview.mockReturnValue({ data: undefined, isLoading: false, }) const { container } = render() expect(container.firstChild).toBeNull() }) }) describe('data loaded state', () => { it('renders WorkflowPreview when data is loaded', () => { mockUseGetTryAppFlowPreview.mockReturnValue({ data: { graph: { nodes: [{ id: 'node1' }], edges: [{ id: 'edge1' }], }, }, isLoading: false, }) render() expect(screen.getByTestId('workflow-preview')).toBeInTheDocument() expect(screen.queryByRole('status')).not.toBeInTheDocument() }) it('passes graph data to WorkflowPreview', () => { const mockNodes = [{ id: 'node1' }, { id: 'node2' }, { id: 'node3' }] const mockEdges = [{ id: 'edge1' }, { id: 'edge2' }] mockUseGetTryAppFlowPreview.mockReturnValue({ data: { graph: { nodes: mockNodes, edges: mockEdges, }, }, isLoading: false, }) render() const workflowPreview = screen.getByTestId('workflow-preview') expect(workflowPreview).toHaveAttribute('data-nodes-count', '3') expect(workflowPreview).toHaveAttribute('data-edges-count', '2') }) it('passes miniMapToRight=true to WorkflowPreview', () => { mockUseGetTryAppFlowPreview.mockReturnValue({ data: { graph: { nodes: [], edges: [], }, }, isLoading: false, }) render() const workflowPreview = screen.getByTestId('workflow-preview') expect(workflowPreview).toHaveAttribute('data-mini-map-to-right', 'true') }) it('passes className to WorkflowPreview', () => { mockUseGetTryAppFlowPreview.mockReturnValue({ data: { graph: { nodes: [], edges: [], }, }, isLoading: false, }) render() const workflowPreview = screen.getByTestId('workflow-preview') expect(workflowPreview).toHaveClass('custom-class') }) }) describe('hook calls', () => { it('calls useGetTryAppFlowPreview with correct appId', () => { mockUseGetTryAppFlowPreview.mockReturnValue({ data: null, isLoading: true, }) render() expect(mockUseGetTryAppFlowPreview).toHaveBeenCalledWith('my-specific-app-id') }) }) describe('wrapper styling', () => { it('renders with correct wrapper classes when data is loaded', () => { mockUseGetTryAppFlowPreview.mockReturnValue({ data: { graph: { nodes: [], edges: [], }, }, isLoading: false, }) const { container } = render() const wrapper = container.firstChild as HTMLElement expect(wrapper).toHaveClass('h-full', 'w-full') }) }) })