import { describe, it, expect, vi } from 'vitest' import { render, screen, fireEvent } from '@testing-library/react' import { GroupRectModal, type GroupRectFormData } from '../GroupRectModal' describe('GroupRectModal', () => { it('renders nothing when closed', () => { const { container } = render( ) expect(container.querySelector('[role="dialog"]')).toBeNull() }) it('renders form fields when open', () => { render() expect(screen.getByPlaceholderText('Zone name…')).toBeDefined() expect(screen.getByText('Add Rectangle')).toBeDefined() expect(screen.getByText('Text Position')).toBeDefined() expect(screen.getByText('Z-Order (1 = furthest back)')).toBeDefined() }) it('renders Edit Rectangle title when provided', () => { render() expect(screen.getByText('Edit Rectangle')).toBeDefined() }) it('calls onSubmit with form data on submit', () => { const onSubmit = vi.fn() render() const input = screen.getByPlaceholderText('Zone name…') fireEvent.change(input, { target: { value: 'DMZ' } }) fireEvent.click(screen.getByText('Add')) expect(onSubmit).toHaveBeenCalledOnce() const submitted = onSubmit.mock.calls[0][0] as GroupRectFormData expect(submitted.label).toBe('DMZ') expect(submitted.font).toBe('inter') expect(submitted.z_order).toBe(1) }) it('calls onClose when Cancel is clicked', () => { const onClose = vi.fn() render() fireEvent.click(screen.getByText('Cancel')) expect(onClose).toHaveBeenCalledOnce() }) it('shows Delete button when onDelete is provided', () => { const onDelete = vi.fn() render() expect(screen.getByText('Delete')).toBeDefined() }) it('calls onDelete and onClose when Delete is clicked', () => { const onDelete = vi.fn() const onClose = vi.fn() render() fireEvent.click(screen.getByText('Delete')) expect(onDelete).toHaveBeenCalledOnce() expect(onClose).toHaveBeenCalledOnce() }) it('pre-fills form from initial prop', () => { render( ) const input = screen.getByPlaceholderText('Zone name…') as HTMLInputElement expect(input.value).toBe('Pre-filled') }) it('selects text position button', () => { const onSubmit = vi.fn() render() // Click bottom-right (↘) fireEvent.click(screen.getByTitle('bottom-right')) fireEvent.click(screen.getByText('Add')) const submitted = onSubmit.mock.calls[0][0] as GroupRectFormData expect(submitted.text_position).toBe('bottom-right') }) it('renders Border Style section', () => { render() expect(screen.getByText('Border Style')).toBeDefined() expect(screen.getByTitle('Solid')).toBeDefined() expect(screen.getByTitle('Dashed')).toBeDefined() expect(screen.getByTitle('Dotted')).toBeDefined() expect(screen.getByTitle('Double')).toBeDefined() expect(screen.getByTitle('None')).toBeDefined() }) it('defaults border_style to solid', () => { const onSubmit = vi.fn() render() fireEvent.click(screen.getByText('Add')) const submitted = onSubmit.mock.calls[0][0] as GroupRectFormData expect(submitted.border_style).toBe('solid') }) it('selects border style on click', () => { const onSubmit = vi.fn() render() fireEvent.click(screen.getByTitle('Dashed')) fireEvent.click(screen.getByText('Add')) const submitted = onSubmit.mock.calls[0][0] as GroupRectFormData expect(submitted.border_style).toBe('dashed') }) it('pre-fills border_style from initial prop', () => { const onSubmit = vi.fn() render( ) fireEvent.click(screen.getByText('Add')) const submitted = onSubmit.mock.calls[0][0] as GroupRectFormData expect(submitted.border_style).toBe('dotted') }) it('toggles border style — clicking selected style deselects back to solid', () => { const onSubmit = vi.fn() render() fireEvent.click(screen.getByTitle('Dotted')) fireEvent.click(screen.getByTitle('Solid')) fireEvent.click(screen.getByText('Add')) const submitted = onSubmit.mock.calls[0][0] as GroupRectFormData expect(submitted.border_style).toBe('solid') }) })