import { render, screen, fireEvent } from '@testing-library/react';
import { describe, it, expect, vi } from 'vitest';
import { Checkbox } from './checkbox';
describe('Checkbox Component', () => {
it('renders checkbox', () => {
render();
const checkbox = screen.getByRole('checkbox');
expect(checkbox).toBeInTheDocument();
expect(checkbox).not.toBeChecked();
});
it('renders with label', () => {
render();
const label = screen.getByText('Accept terms');
expect(label).toBeInTheDocument();
const checkbox = screen.getByRole('checkbox');
expect(checkbox).toBeInTheDocument();
});
it('handles onCheckedChange callback', () => {
const handleCheckedChange = vi.fn();
render();
const checkbox = screen.getByRole('checkbox');
fireEvent.click(checkbox);
expect(handleCheckedChange).toHaveBeenCalledWith(true);
expect(checkbox).toBeChecked();
});
it('handles onChange event', () => {
const handleChange = vi.fn();
render();
const checkbox = screen.getByRole('checkbox');
fireEvent.click(checkbox);
expect(handleChange).toHaveBeenCalledTimes(1);
});
it('handles checked state', () => {
render();
const checkbox = screen.getByRole('checkbox');
expect(checkbox).toBeChecked();
});
it('handles disabled state', () => {
render();
const checkbox = screen.getByRole('checkbox');
expect(checkbox).toBeDisabled();
// The opacity-50 is on the wrapping label element, not the text span
const label = screen.getByText('Disabled checkbox').closest('label');
expect(label).toHaveClass('opacity-50');
});
it('toggles checked state on click', () => {
render();
const checkbox = screen.getByRole('checkbox');
expect(checkbox).not.toBeChecked();
fireEvent.click(checkbox);
expect(checkbox).toBeChecked();
fireEvent.click(checkbox);
expect(checkbox).not.toBeChecked();
});
it('applies custom className', () => {
render();
const label = screen.getByRole('checkbox').closest('label');
expect(label).toHaveClass('custom-checkbox');
});
// === Bug #11 Regression: no hardcoded "Checkbox" aria-label ===
it('[Bug #11] should not have hardcoded "Checkbox" aria-label when no label provided', () => {
render();
const checkbox = screen.getByRole('checkbox');
const ariaLabel = checkbox.getAttribute('aria-label');
// Should NOT be the hardcoded string "Checkbox"
expect(ariaLabel).not.toBe('Checkbox');
});
it('[Bug #11] should use explicit aria-label when provided', () => {
render();
const checkbox = screen.getByRole('checkbox');
expect(checkbox).toHaveAttribute('aria-label', 'Enable notifications');
});
it('[Bug #11] should get accessible name from associated label via htmlFor', () => {
render(
<>
>,
);
const checkbox = screen.getByRole('checkbox', { name: /email notifications/i });
expect(checkbox).toBeInTheDocument();
});
});