import { render, screen } from '@testing-library/react';
import userEvent from '@testing-library/user-event';
import React from 'react';
import { describe, expect, it, vi } from 'vitest';
import { MdCheckbox } from '../MdCheckbox';
describe('MdCheckbox', () => {
describe('rendering', () => {
it('renders a checkbox input', () => {
render();
expect(screen.getByRole('checkbox')).toBeInTheDocument();
});
it('renders with label', () => {
render();
expect(screen.getByLabelText('Accept terms')).toBeInTheDocument();
});
it('renders label as ReactNode', () => {
render(Custom} />);
expect(screen.getByTestId('custom-label')).toBeInTheDocument();
});
});
describe('states', () => {
it('can be checked', () => {
render( {}} />);
expect(screen.getByRole('checkbox')).toBeChecked();
});
it('can be unchecked', () => {
render( {}} />);
expect(screen.getByRole('checkbox')).not.toBeChecked();
});
it('can be disabled', () => {
render();
expect(screen.getByRole('checkbox')).toBeDisabled();
});
it('applies disabled class', () => {
const { container } = render();
expect(container.querySelector('.md-checkbox--disabled')).toBeInTheDocument();
});
});
describe('interactions', () => {
it('handles change events', async () => {
const user = userEvent.setup();
const onChange = vi.fn();
render();
await user.click(screen.getByRole('checkbox'));
expect(onChange).toHaveBeenCalledTimes(1);
});
it('does not fire change when disabled', async () => {
const user = userEvent.setup();
const onChange = vi.fn();
render();
await user.click(screen.getByRole('checkbox'));
expect(onChange).not.toHaveBeenCalled();
});
it('can toggle with keyboard', async () => {
const user = userEvent.setup();
const onChange = vi.fn();
render();
screen.getByRole('checkbox').focus();
await user.keyboard(' ');
expect(onChange).toHaveBeenCalledTimes(1);
});
});
describe('accessibility', () => {
it('has aria-checked attribute', () => {
render( {}} />);
expect(screen.getByRole('checkbox')).toHaveAttribute('aria-checked', 'true');
});
it('associates label with checkbox', () => {
render();
expect(screen.getByLabelText('My checkbox')).toBeInTheDocument();
});
});
describe('props forwarding', () => {
it('forwards id', () => {
render();
expect(screen.getByRole('checkbox')).toHaveAttribute('id', 'my-checkbox');
});
it('forwards name', () => {
render();
expect(screen.getByRole('checkbox')).toHaveAttribute('name', 'terms');
});
it('merges custom className', () => {
const { container } = render();
expect(container.querySelector('.md-checkbox')).toHaveClass('custom-class');
});
});
});