import { render, screen } from '@testing-library/react';
import styles from '@patternfly/react-styles/css/components/Card/card';
import '@testing-library/jest-dom';
import userEvent from '@testing-library/user-event';
import { CardHeader } from '../CardHeader';
import { CardContext } from '../Card';
describe('CardHeader', () => {
test('onExpand adds the toggle button', () => {
const { asFragment } = render();
expect(asFragment()).toMatchSnapshot();
});
test('actions are rendered', () => {
const { asFragment } = render();
expect(asFragment()).toMatchSnapshot();
});
test(`Should render CardHeader without ${styles.modifiers.wrap} by default`, () => {
render();
expect(screen.getByTestId('card-header')).not.toHaveClass(styles.modifiers.wrap);
});
test(`Should render CardHeader with ${styles.modifiers.wrap} class when hasWrap is true`, () => {
render();
expect(screen.getByTestId('card-header-will-wrap')).toHaveClass(styles.modifiers.wrap);
});
});
// TODO: check if hasNoOffset for actions/selectableActions and className for selectableActions render
describe('Card with actions and selectableActions', () => {
test('Does not render selectable or clickable actions by default', () => {
render(Test);
expect(screen.queryByRole('checkbox')).not.toBeInTheDocument();
expect(screen.queryByRole('button')).not.toBeInTheDocument();
expect(screen.queryByRole('link')).not.toBeInTheDocument();
});
test('Renders checkbox input when Card has isSelectable and selectableActions.variant = "multiple"', () => {
render(
Test
);
expect(screen.getByRole('checkbox')).toBeInTheDocument();
});
test('Renders checkbox input by default when Card has isSelectable and selectableActions is passed with any props', () => {
render(
Test
);
expect(screen.getByRole('checkbox')).toBeInTheDocument();
});
test('Renders radio input when Card has isSelectable and selectableActions.variant = "single"', () => {
render(
Test
);
expect(screen.getByRole('radio')).toBeInTheDocument();
});
test('Renders default ID for selectable card input when selectableActions.selectableActionId is not passed', () => {
render(
Test
);
expect(screen.getByRole('checkbox').getAttribute('id')).toMatch(/^card-selectable/);
});
test('Renders custom ID for selectable card input when selectableActions.selectableActionId is passed', () => {
render(
Test
);
expect(screen.getByRole('checkbox')).toHaveAttribute('id', 'custom-id');
});
test('Renders name on a selectable card input', () => {
render(
Test
);
expect(screen.getByRole('radio')).toHaveAttribute('name', 'test');
});
test('Renders a selectable card input as not checked by default', () => {
render(
Test
);
expect(screen.getByRole('checkbox')).not.toBeChecked();
});
test('Renders a selectable card input as checked when Card has isSelected = true', () => {
render(
Test
);
expect(screen.getByRole('checkbox')).toBeChecked();
});
test('Renders a selectable card input as checked when deprecated selectableActions.isChecked is true', () => {
render(
Test
);
expect(screen.getByRole('checkbox')).toBeChecked();
});
test('Renders additional props on selectable card input when selectableActions.selectableActionProps is passed', () => {
render(
Test
);
expect(screen.getByRole('checkbox')).toHaveAttribute('style');
});
test('Does not call onChange for selectable card when card is not clicked', async () => {
const user = userEvent.setup();
const onChangeMock = jest.fn();
render(
<>
Test
>
);
await user.click(screen.getByRole('button', { name: 'Test click' }));
expect(onChangeMock).not.toHaveBeenCalled();
});
test('Calls onChange for selectable card when card is clicked', async () => {
const user = userEvent.setup();
const onChangeMock = jest.fn();
render(
Test
);
const labelElement = document.querySelector('label');
await user.click(labelElement as HTMLElement);
expect(onChangeMock).toHaveBeenCalled();
});
test('Renders button element when Card has isClickable and selectableActions.onClickAction is passed"', () => {
render(
{} }}>Test
);
expect(screen.getByRole('button')).toBeInTheDocument();
});
test('Renders anchor element when Card has isClickable and selectableActions.to is passed"', () => {
render(
Test
);
expect(screen.getByRole('link')).toBeInTheDocument();
});
test('Renders href when Card has isClickable and selectableActions.to is passed"', () => {
render(
Test
);
expect(screen.getByRole('link')).toHaveAttribute('href', '#some-id');
});
test('Does not render ID on clickable element when selectableActions.selectableActionId is not passed"', () => {
render(
Test
);
expect(screen.getByRole('link')).not.toHaveAttribute('id');
});
test('Renders ID on clickable element when selectableActions.selectableActionId is passed"', () => {
render(
Test
);
expect(screen.getByRole('link')).toHaveAttribute('id', 'custom-id');
});
test('Renders additional props on clickable element when selectableActions.selectableActionProps is passed', () => {
render(
Test
);
expect(screen.getByRole('link')).toHaveAttribute('style');
});
test('Does not render target="_blank" on clickable card anchor element by default"', () => {
render(
Test
);
expect(screen.getByRole('link')).not.toHaveAttribute('target');
});
test('Renders target="_blank" on clickable card anchor element when selectableActions.isExternalLink is true"', () => {
render(
Test
);
expect(screen.getByRole('link')).toHaveAttribute('target', '_blank');
});
test('Calls onClickAction for clickable card when card is clicked', async () => {
const user = userEvent.setup();
const onClickMock = jest.fn();
render(
Test
);
await user.click(screen.getByRole('button'));
expect(onClickMock).toHaveBeenCalled();
});
test('Throws error when Card is either clickable or selectable only and has actions prop passed"', () => {
const errorMock = jest.fn() as any;
global.console = { error: errorMock } as any;
render(
Toggle }}
selectableActions={{ to: '#', selectableActionAriaLabel: 'Link' }}
>
Test
);
expect(errorMock).toHaveBeenCalled();
});
test('Does not throw error when Card is both clickable and selectable and has actions prop passed"', () => {
const errorMock = jest.fn() as any;
global.console = { error: errorMock } as any;
render(
Toggle }}
selectableActions={{ to: '#', selectableActionAriaLabel: 'Link' }}
>
Test
);
expect(errorMock).not.toHaveBeenCalled();
});
test('Throws error when Card has isClickable and selectableActions.selectableActionAriaLabel or selectableActions.selectableActionAriaLabelledby is not passed"', () => {
const errorMock = jest.fn() as any;
global.console = { error: errorMock } as any;
render(
Test
);
expect(errorMock).toHaveBeenCalled();
});
test('Throws error when Card has isSelectable and selectableActions.selectableActionAriaLabel or selectableActions.selectableActionAriaLabelledby is not passed"', () => {
const errorMock = jest.fn() as any;
global.console = { error: errorMock } as any;
render(
Test
);
expect(errorMock).toHaveBeenCalled();
});
test('Renders accessible name on selectable card input when selectableActions.selectableActionAriaLabel is passed', () => {
const accessibleName = 'Accessible name';
render(
Test
);
expect(screen.getByRole('checkbox')).toHaveAccessibleName(accessibleName);
});
test('Renders accessible name on selectable card input when selectableActions.selectableActionAriaLabelledby is passed', () => {
const labelingId = 'labelling-id';
const accessibleName = 'Accessible name';
render(
{accessibleName}
);
expect(screen.getByRole('checkbox')).toHaveAccessibleName(accessibleName);
});
test('Renders accessible name on clickable card clickable element when selectableActions.selectableActionAriaLabel is passed', () => {
const accessibleName = 'Accessible name';
render(
Test
);
expect(screen.getByRole('link')).toHaveAccessibleName(accessibleName);
});
test('Renders accessible name on clickable card clickable element when selectableActions.selectableActionAriaLabelledby is passed', () => {
const labelingId = 'labelling-id';
const accessibleName = 'Accessible name';
render(