import React from 'react'; import { render, screen } from '@testing-library/react'; import '@testing-library/jest-dom'; import { Card, CardContext } from '../Card'; describe('Card', () => { test('renders with PatternFly Core styles', () => { const { asFragment } = render(); expect(asFragment()).toMatchSnapshot(); }); test('className is added to the root element', () => { render(card); expect(screen.getByText('card')).toHaveClass('extra-class'); }); test('extra props are spread to the root element', () => { const testId = 'card'; render(); expect(screen.getByTestId(testId)).toBeInTheDocument(); }); test('allows passing in a string as the component', () => { const component = 'section'; render(section content); expect(screen.getByText('section content')).toBeInTheDocument(); }); test('allows passing in a React Component as the component', () => { const Component = () =>
im a div
; render(); expect(screen.getByText('im a div')).toBeInTheDocument(); }); test('card with isCompact applied ', () => { const { asFragment } = render(); expect(asFragment()).toMatchSnapshot(); }); test('card with isSelectable applied ', () => { render(selectable card); const card = screen.getByText('selectable card'); expect(card).toHaveClass('pf-m-selectable'); }); test('card with isSelectable and isSelected applied ', () => { render( selected and selectable card ); const card = screen.getByText('selected and selectable card'); expect(card).toHaveClass('pf-m-selectable'); expect(card).toHaveClass('pf-m-selected'); }); test('card with only isSelected applied - not change', () => { render(selected card); const card = screen.getByText('selected card'); expect(card).not.toHaveClass('pf-m-selected'); expect(card.getAttribute('tabindex')).toBeNull(); }); test('card with isDisabledRaised applied', () => { render(disabled raised card); expect(screen.getByText('disabled raised card')).toHaveClass('pf-m-non-selectable-raised'); }); test('card with isSelectableRaised applied - not change', () => { render(raised selectable card); const card = screen.getByText('raised selectable card'); expect(card).toHaveClass('pf-m-selectable-raised'); expect(card).toHaveAttribute('tabindex', '0'); }); test('card with isSelectableRaised and isSelected applied ', () => { render( raised selected card ); const card = screen.getByText('raised selected card'); expect(card).toHaveClass('pf-m-selectable-raised'); expect(card).toHaveClass('pf-m-selected-raised'); expect(card).toHaveAttribute('tabindex', '0'); }); test('card with isFlat applied', () => { render(flat card); expect(screen.getByText('flat card')).toHaveClass('pf-m-flat'); }); test('card with isExpanded applied', () => { render(expanded card); expect(screen.getByText('expanded card')).toHaveClass('pf-m-expanded'); }); test('card with isRounded applied', () => { render(rounded card); expect(screen.getByText('rounded card')).toHaveClass('pf-m-rounded'); }); test('card with isLarge applied', () => { render(large card); expect(screen.getByText('large card')).toHaveClass('pf-m-display-lg'); }); test('card warns when isLarge and isCompact', () => { const consoleWarnMock = jest.fn(); global.console = { warn: consoleWarnMock } as any; render(); expect(consoleWarnMock).toHaveBeenCalled(); }); test('card renders with a hidden input to improve a11y when hasSelectableInput is passed', () => { render(); const selectableInput = screen.getByRole('checkbox', { hidden: true }); expect(selectableInput).toBeInTheDocument(); }); test('card does not render the hidden input when hasSelectableInput is not passed', () => { render(); const selectableInput = screen.queryByRole('checkbox', { hidden: true }); expect(selectableInput).not.toBeInTheDocument(); }); test('card warns when hasSelectableInput is passed without selectableInputAriaLabel or a card title', () => { const consoleWarnMock = jest.fn(); global.console = { warn: consoleWarnMock } as any; render(); const selectableInput = screen.getByRole('checkbox', { hidden: true }); expect(consoleWarnMock).toBeCalled(); expect(selectableInput).toHaveAccessibleName(''); }); test('card applies selectableInputAriaLabel to the hidden input', () => { render(); const selectableInput = screen.getByRole('checkbox', { hidden: true }); expect(selectableInput).toHaveAccessibleName('Input label test'); }); test('card applies the supplied card title as the aria label of the hidden input', () => { // this component is used to mock the CardTitle's title registry behavior to keep this a pure unit test const MockCardTitle = ({ children }) => { const { registerTitleId } = React.useContext(CardContext); const id = 'card-title-id'; React.useEffect(() => { registerTitleId(id); }); return
{children}
; }; render( Card title from title component ); const selectableInput = screen.getByRole('checkbox', { hidden: true }); expect(selectableInput).toHaveAccessibleName('Card title from title component'); }); test('card prioritizes selectableInputAriaLabel over card title labelling via card title', () => { // this component is used to mock the CardTitle's title registry behavior to keep this a pure unit test const MockCardTitle = ({ children }) => { const { registerTitleId } = React.useContext(CardContext); const id = 'card-title-id'; React.useEffect(() => { registerTitleId(id); }); return
{children}
; }; render( Card title from title component ); const selectableInput = screen.getByRole('checkbox', { hidden: true }); expect(selectableInput).toHaveAccessibleName('Input label test'); }); });