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(
{accessibleName}
); expect(screen.getByRole('link')).toHaveAccessibleName(accessibleName); }); });