import { render, screen, fireEvent } from '@testing-library/react'; import { NodePalette } from '../NodePalette'; import type { NodeTypeDef } from '../types'; const nodeTypes: NodeTypeDef[] = [ { slug: 'trigger.event', name: 'Event trigger', category: 'trigger' }, { slug: 'action.email', name: 'Send email', category: 'action' }, { slug: 'action.http', name: 'HTTP request', category: 'action' }, { slug: 'condition.if', name: 'If', category: 'condition' }, ]; describe('NodePalette', () => { it('lists all node types grouped by category', () => { render(); expect(screen.getByText('Event trigger')).toBeInTheDocument(); expect(screen.getByText('Send email')).toBeInTheDocument(); expect(screen.getByText('HTTP request')).toBeInTheDocument(); expect(screen.getByText('If')).toBeInTheDocument(); // group headings (category labels) expect(screen.getByText('Trigger')).toBeInTheDocument(); expect(screen.getByText('Action')).toBeInTheDocument(); }); it('filters node types by search query', () => { render(); const search = screen.getByRole('searchbox'); fireEvent.change(search, { target: { value: 'email' } }); expect(screen.getByText('Send email')).toBeInTheDocument(); expect(screen.queryByText('HTTP request')).not.toBeInTheDocument(); expect(screen.queryByText('If')).not.toBeInTheDocument(); }); it('sets the node type slug on dataTransfer when dragging', () => { render(); const item = screen.getByText('Send email').closest('[draggable="true"]'); expect(item).not.toBeNull(); const setData = jest.fn(); fireEvent.dragStart(item as Element, { dataTransfer: { setData, effectAllowed: '' }, }); expect(setData).toHaveBeenCalledWith( 'application/x-workflow-node', 'action.email' ); }); });