import { describe, it, expect, vi, beforeEach } from 'vitest';
import { render, screen, fireEvent } from '@testing-library/react';
import { ConfirmModal } from '../../components/ConfirmModal';
describe('ConfirmModal', () => {
const defaultProps = {
title: 'Confirm Action',
message: 'Are you sure you want to proceed?',
confirmLabel: 'Yes',
cancelLabel: 'No',
onConfirm: vi.fn(),
onCancel: vi.fn()
};
beforeEach(() => {
vi.clearAllMocks();
});
it('renders title', () => {
render();
expect(screen.getByText('Confirm Action')).toBeInTheDocument();
});
it('renders message as string', () => {
render();
expect(screen.getByText('Are you sure you want to proceed?')).toBeInTheDocument();
});
it('renders message as ReactNode', () => {
render(
Custom message}
/>
);
expect(screen.getByTestId('custom-message')).toBeInTheDocument();
});
it('renders confirm and cancel buttons', () => {
render();
expect(screen.getByText('Yes')).toBeInTheDocument();
expect(screen.getByText('No')).toBeInTheDocument();
});
it('calls onConfirm when confirm button is clicked', () => {
render();
fireEvent.click(screen.getByText('Yes'));
expect(defaultProps.onConfirm).toHaveBeenCalled();
});
it('calls onCancel when cancel button is clicked', () => {
render();
fireEvent.click(screen.getByText('No'));
expect(defaultProps.onCancel).toHaveBeenCalled();
});
it('calls onCancel when close button is clicked', () => {
render();
fireEvent.click(screen.getByText('×'));
expect(defaultProps.onCancel).toHaveBeenCalled();
});
it('calls onCancel when overlay is clicked', () => {
const { container } = render();
const overlay = container.querySelector('.modal-overlay');
fireEvent.click(overlay!);
expect(defaultProps.onCancel).toHaveBeenCalled();
});
it('does not call onCancel when modal content is clicked', () => {
const { container } = render();
const content = container.querySelector('.modal-content');
fireEvent.click(content!);
expect(defaultProps.onCancel).not.toHaveBeenCalled();
});
it('disables buttons when loading', () => {
render();
expect(screen.getByText('Yes')).toBeDisabled();
expect(screen.getByText('No')).toBeDisabled();
});
it('applies primary variant by default', () => {
render();
const confirmBtn = screen.getByText('Yes');
expect(confirmBtn.className).toContain('primary');
});
it('applies danger variant when specified', () => {
render();
const confirmBtn = screen.getByText('Yes');
expect(confirmBtn.className).toContain('danger');
});
it('applies success variant when specified', () => {
render();
const confirmBtn = screen.getByText('Yes');
expect(confirmBtn.className).toContain('success');
});
});