import { render, screen } from '@testing-library/react';
import userEvent from '@testing-library/user-event';
import '@testing-library/jest-dom';
import { Label, LabelColor } from '../Label';
const labelColors = Object.values(LabelColor);
describe('Label', () => {
test('renders', () => {
const { asFragment } = render();
expect(asFragment()).toMatchSnapshot();
});
test('renders with outline variant', () => {
const { asFragment } = render();
expect(asFragment()).toMatchSnapshot();
});
test('renders with isCompact', () => {
const { asFragment } = render();
expect(asFragment()).toMatchSnapshot();
});
test('label with href', () => {
const { asFragment } = render();
expect(asFragment()).toMatchSnapshot();
});
test('label with href with outline variant', () => {
const { asFragment } = render(
);
expect(asFragment()).toMatchSnapshot();
});
test('label with close button', () => {
const { asFragment } = render();
expect(asFragment()).toMatchSnapshot();
});
test('label with close button and outline variant', () => {
const { asFragment } = render(
);
expect(asFragment()).toMatchSnapshot();
});
labelColors.forEach((color) =>
test(`label with ${color} color`, () => {
const { asFragment } = render();
expect(asFragment()).toMatchSnapshot();
})
);
labelColors.forEach((color) =>
test(`label with ${color} color with outline variant`, () => {
const { asFragment } = render(
);
expect(asFragment()).toMatchSnapshot();
})
);
test('label with additional class name', () => {
const { asFragment } = render();
expect(asFragment()).toMatchSnapshot();
});
test('label with additional class name and props', () => {
const { asFragment } = render(
);
expect(asFragment()).toMatchSnapshot();
});
test('label with truncation', () => {
const { asFragment } = render(
);
expect(asFragment()).toMatchSnapshot();
});
test('editable label', async () => {
const user = userEvent.setup();
const { asFragment } = render(
);
const button = screen.getByRole('button', { name: 'Something' });
expect(button).toBeInTheDocument();
expect(asFragment()).toMatchSnapshot();
await user.click(button);
expect(screen.queryByRole('button', { name: 'Something' })).toBeNull();
expect(asFragment()).toMatchSnapshot();
});
test('renders with variant overflow and type is set to button ', () => {
const { asFragment } = render();
expect(screen.getByRole('button')).toHaveAttribute('type', 'button');
expect(asFragment()).toMatchSnapshot();
});
test('a button is not rendered when onClick is not passed', () => {
render();
expect(screen.queryByRole(`button`)).not.toBeInTheDocument();
});
test('a button is rendered when onClick is passed', () => {
const fn = jest.fn();
render();
expect(screen.getByRole(`button`)).toBeVisible();
});
test('clickable label does not call the passed callback when it is not clicked', async () => {
const mockCallback = jest.fn();
render();
expect(mockCallback).not.toHaveBeenCalled();
});
test('clickable label calls passed callback on click', async () => {
const mockCallback = jest.fn();
const user = userEvent.setup();
render();
const label = screen.getByRole('button');
await user.click(label);
expect(mockCallback).toHaveBeenCalledTimes(1);
});
test('disabled clickable label does not call passed callback on click', async () => {
const mockCallback = jest.fn();
const user = userEvent.setup();
render(
);
const label = screen.getByText('Click me');
await user.click(label);
expect(mockCallback).not.toHaveBeenCalled();
});
test('disabled clickable label is a disabled button', async () => {
const mockCallback = jest.fn();
render(
);
const labelButton = screen.getByRole('button');
expect(labelButton).toHaveAttribute('disabled');
});
test('link label is an anchor', () => {
const href = '#example';
render();
const anchor = screen.getByRole('link', { name: 'Click me' });
expect(anchor).toBeInTheDocument();
expect(anchor).toHaveAttribute('href', href);
});
test('disabled link label is an anchor with aria-disabled attribute', () => {
const href = '#example';
render(
);
const anchor = screen.getByRole('link', { name: 'Click me' });
expect(anchor).toBeInTheDocument();
expect(anchor).toHaveAttribute('href', href);
expect(anchor).toHaveAttribute('tabIndex', '-1');
expect(anchor).toHaveAttribute('aria-disabled', 'true');
});
test('disabled removable clickable label has a disabled close button', async () => {
const mockCallback = jest.fn();
render(
);
const closeButton = screen.getByLabelText('Close Click me');
expect(closeButton).toBeDisabled();
});
test('disabled removable link label has a disabled close button', async () => {
const mockCallback = jest.fn();
render(
);
const closeButton = screen.getByLabelText('Close Click me');
expect(closeButton).toBeDisabled();
});
});