import { render, screen } from '@testing-library/react';
import userEvent from '@testing-library/user-event';
import { ClipboardCopyButton } from '../ClipboardCopyButton';
import buttonStyles from '@patternfly/react-styles/css/components/Button/button';
import '@testing-library/jest-dom';
jest.mock('../../Tooltip', () => ({
Tooltip: ({ content, children, exitDelay, entryDelay, maxWidth, position, onTooltipHidden }) => (
{content}
{`exitDelay: ${exitDelay}`}
{`entryDelay: ${entryDelay}`}
{`maxWidth: ${maxWidth}`}
{`position: ${position}`}
onTooltipHidden clicker
{children}
)
}));
const requiredProps = {
onClick: jest.fn(),
children: 'Button content',
id: 'button-id'
};
// Must be kept as first test to avoid Button's ouiaId updating in snapshots
test('Matches snapshot', () => {
const { asFragment } = render();
expect(asFragment()).toMatchSnapshot();
});
test('Renders with passed id prop', () => {
render();
expect(screen.getByRole('button')).toHaveAttribute('id', 'button-id');
});
test('Renders with aria-label', () => {
render(
<>
Copyable text
>
);
expect(screen.getByRole('button')).toHaveAccessibleName('Copy');
});
test('Passes className to Button', () => {
render();
expect(screen.getByRole('button')).toHaveClass('test-class');
});
test('Passes variant to Button by default', () => {
render();
expect(screen.getByRole('button')).toHaveClass(buttonStyles.modifiers.control);
});
test('Passes variant to Button when variant is passed', () => {
render();
expect(screen.getByRole('button')).toHaveClass(buttonStyles.modifiers.plain);
});
test('Removes padding when hasNoPadding prop passed', () => {
render();
expect(screen.getByRole('button')).toHaveClass(buttonStyles.modifiers.plain);
expect(screen.getByRole('button')).toHaveClass(buttonStyles.modifiers.noPadding);
});
test('Calls onClick when ClipboardCopyButton is clicked', async () => {
const user = userEvent.setup();
render();
await user.click(screen.getByRole('button'));
expect(requiredProps.onClick).toHaveBeenCalledTimes(1);
});
test('Does not call onClick when ClipboardCopyButton is not clicked', async () => {
const user = userEvent.setup();
render(
<>
>
);
await user.click(screen.getByRole('button', { name: 'Test clicker' }));
expect(requiredProps.onClick).not.toHaveBeenCalled();
});
test('Passes children to Tooltip content', () => {
render();
expect(screen.getByText('Button content')).toBeVisible();
});
test('Passes exitDelay to Tooltip', () => {
render();
expect(screen.getByText('exitDelay: 200')).toBeVisible();
});
test('Passes entryDelay to Tooltip', () => {
render();
expect(screen.getByText('entryDelay: 200')).toBeVisible();
});
test('Passes maxWidth to Tooltip', () => {
render();
expect(screen.getByText('maxWidth: 200px')).toBeVisible();
});
test('Passes position to Tooltip', () => {
render();
expect(screen.getByText('position: bottom')).toBeVisible();
});
test('Passes onTooltipHidden to Tooltip', async () => {
const user = userEvent.setup();
const onTooltipHiddenMock = jest.fn();
render();
await user.click(screen.getByText('onTooltipHidden clicker'));
expect(onTooltipHiddenMock).toHaveBeenCalled();
});