import { describe, it, expect, vi, beforeEach } from 'vitest' import { render, screen, fireEvent } from '@testing-library/react' import { CreateNoteDialog } from './CreateNoteDialog' describe('CreateNoteDialog', () => { const onCreate = vi.fn() const onClose = vi.fn() beforeEach(() => { vi.clearAllMocks() }) it('renders nothing when not open', () => { const { container } = render( ) expect(container.querySelector('form')).toBeNull() }) it('shows title input and type buttons when open', () => { render() expect(screen.getByPlaceholderText('Enter note title...')).toBeInTheDocument() expect(screen.getByText('Note')).toBeInTheDocument() expect(screen.getByText('Project')).toBeInTheDocument() expect(screen.getByText('Topic')).toBeInTheDocument() }) it('disables Create button when title is empty', () => { render() expect(screen.getByText('Create')).toBeDisabled() }) it('enables Create button when title is entered', () => { render() const input = screen.getByPlaceholderText('Enter note title...') fireEvent.change(input, { target: { value: 'My Note' } }) expect(screen.getByText('Create')).not.toBeDisabled() }) it('calls onCreate with trimmed title and selected type', () => { render() const input = screen.getByPlaceholderText('Enter note title...') fireEvent.change(input, { target: { value: ' My Project ' } }) // Select Project type fireEvent.click(screen.getByText('Project')) // Submit fireEvent.click(screen.getByText('Create')) expect(onCreate).toHaveBeenCalledWith('My Project', 'Project') expect(onClose).toHaveBeenCalled() }) it('calls onCreate on form submit (Enter key)', () => { render() const input = screen.getByPlaceholderText('Enter note title...') fireEvent.change(input, { target: { value: 'Test' } }) fireEvent.submit(input.closest('form')!) expect(onCreate).toHaveBeenCalledWith('Test', 'Note') }) it('does not submit when title is whitespace', () => { render() const input = screen.getByPlaceholderText('Enter note title...') fireEvent.change(input, { target: { value: ' ' } }) fireEvent.submit(input.closest('form')!) expect(onCreate).not.toHaveBeenCalled() }) it('calls onClose on Cancel button', () => { render() fireEvent.click(screen.getByText('Cancel')) expect(onClose).toHaveBeenCalled() }) it('uses defaultType when provided', () => { render() const input = screen.getByPlaceholderText('Enter note title...') fireEvent.change(input, { target: { value: 'New Project' } }) fireEvent.submit(input.closest('form')!) expect(onCreate).toHaveBeenCalledWith('New Project', 'Project') }) it('renders custom types', () => { render( ) expect(screen.getByText('Recipe')).toBeInTheDocument() expect(screen.getByText('Book')).toBeInTheDocument() }) it('allows selecting a custom type', () => { render( ) const input = screen.getByPlaceholderText('Enter note title...') fireEvent.change(input, { target: { value: 'Pasta Recipe' } }) fireEvent.click(screen.getByText('Recipe')) fireEvent.submit(input.closest('form')!) expect(onCreate).toHaveBeenCalledWith('Pasta Recipe', 'Recipe') }) })