import React from 'react'; import { render, screen, fireEvent } from '@testing-library/react'; import { describe, it, expect, vi } from 'vitest'; import { DeleteConfirmModal } from '../../../src/components/common/DeleteConfirmModal'; describe('DeleteConfirmModal', () => { const defaultProps = { itemName: 'Test Item', onConfirm: vi.fn(), onCancel: vi.fn(), type: 'task' as const, }; beforeEach(() => { vi.clearAllMocks(); }); it('renders with correct title and message for task type', () => { render(); expect(screen.getByText('Delete Task')).toBeInTheDocument(); expect(screen.getByText(/Are you sure you want to delete the "Test Item" task/)).toBeInTheDocument(); }); it('renders with correct title and message for project type', () => { render(); expect(screen.getByText('Delete Project')).toBeInTheDocument(); expect(screen.getByText(/Are you sure you want to delete the "Test Item" project/)).toBeInTheDocument(); }); it('renders with correct title and message for client type', () => { render(); expect(screen.getByText('Delete MCP Client')).toBeInTheDocument(); expect(screen.getByText(/Are you sure you want to delete the "Test Item" client/)).toBeInTheDocument(); }); it('calls onConfirm when Delete button is clicked', () => { render(); fireEvent.click(screen.getByText('Delete')); expect(defaultProps.onConfirm).toHaveBeenCalledTimes(1); }); it('calls onCancel when Cancel button is clicked', () => { render(); fireEvent.click(screen.getByText('Cancel')); expect(defaultProps.onCancel).toHaveBeenCalledTimes(1); }); it('calls onCancel when Escape key is pressed', () => { render(); fireEvent.keyDown(screen.getByRole('dialog'), { key: 'Escape' }); expect(defaultProps.onCancel).toHaveBeenCalledTimes(1); }); it('calls onCancel when backdrop is clicked', () => { render(); // Click the backdrop const backdrop = screen.getByTestId('modal-backdrop'); fireEvent.click(backdrop); expect(defaultProps.onCancel).toHaveBeenCalledTimes(1); }); it('does not call onCancel when modal content is clicked', () => { render(); // Click the modal dialog itself fireEvent.click(screen.getByRole('dialog')); expect(defaultProps.onCancel).not.toHaveBeenCalled(); }); it('has proper accessibility attributes', () => { render(); const dialog = screen.getByRole('dialog'); expect(dialog).toHaveAttribute('aria-modal', 'true'); expect(dialog).toHaveAttribute('aria-labelledby'); expect(dialog).toHaveAttribute('aria-describedby'); }); it('focuses Cancel button by default', () => { render(); const cancelButton = screen.getByText('Cancel'); expect(cancelButton).toHaveFocus(); }); it('has proper button types', () => { render(); const cancelButton = screen.getByText('Cancel'); const deleteButton = screen.getByText('Delete'); expect(cancelButton).toHaveAttribute('type', 'button'); expect(deleteButton).toHaveAttribute('type', 'button'); }); });