diff --git a/src/components/thumbnail-card/ThumbnailCard.js b/src/components/thumbnail-card/ThumbnailCard.js index 87b10d16d5..0a92a6329f 100644 --- a/src/components/thumbnail-card/ThumbnailCard.js +++ b/src/components/thumbnail-card/ThumbnailCard.js @@ -12,6 +12,7 @@ type Props = { className?: string, highlightOnHover?: boolean, icon?: React.Node, + onKeyDown?: () => void, subtitle?: React.Node, thumbnail: React.Node, title: React.Node, @@ -20,11 +21,12 @@ type Props = { const ThumbnailCard = ({ actionItem, className = '', - icon, highlightOnHover = false, + icon, + onKeyDown, subtitle, - title, thumbnail, + title, ...rest }: Props) => (
- +
); diff --git a/src/components/thumbnail-card/ThumbnailCardDetails.js b/src/components/thumbnail-card/ThumbnailCardDetails.js index c312f40203..569bc51191 100644 --- a/src/components/thumbnail-card/ThumbnailCardDetails.js +++ b/src/components/thumbnail-card/ThumbnailCardDetails.js @@ -7,34 +7,36 @@ import { useIsContentOverflowed } from '../../utils/dom'; type Props = { actionItem?: React.Element, icon?: React.Node, + onKeyDown?: () => void, subtitle?: React.Node, title: React.Node, }; type TitleProps = { + onKeyDown?: () => void, title: React.Node, }; -const Title = ({ title }: TitleProps) => { - // $FlowFixMe +const Title = ({ title, onKeyDown }: TitleProps) => { const textRef: { current: null | HTMLElement } = React.useRef(null); const isTextOverflowed = useIsContentOverflowed(textRef); return ( -
+ {/* eslint-disable-next-line jsx-a11y/no-noninteractive-tabindex, jsx-a11y/no-static-element-interactions */} +
{title}
); }; -const ThumbnailCardDetails = ({ actionItem, icon, subtitle, title }: Props) => ( +const ThumbnailCardDetails = ({ actionItem, icon, subtitle, title, onKeyDown }: Props) => (
{icon}
- + <Title title={title} onKeyDown={onKeyDown} /> {subtitle && <div className="thumbnail-card-subtitle">{subtitle}</div>} </div> {actionItem} diff --git a/src/components/thumbnail-card/__tests__/ThumbnailCardDetails.test.js b/src/components/thumbnail-card/__tests__/ThumbnailCardDetails.test.js index c3935b4628..6858e2d141 100644 --- a/src/components/thumbnail-card/__tests__/ThumbnailCardDetails.test.js +++ b/src/components/thumbnail-card/__tests__/ThumbnailCardDetails.test.js @@ -1,13 +1,13 @@ // @flow import * as React from 'react'; +import userEvent from '@testing-library/user-event'; -import { mount, shallow } from 'enzyme'; +import { render, screen } from '../../../test-utils/testing-library'; import * as libDom from '../../../utils/dom'; - import ThumbnailCardDetails from '../ThumbnailCardDetails'; -const getWrapper = (props = {}) => shallow(<ThumbnailCardDetails title={<div>Foo Bar!</div>} {...props} />); +const renderComponent = (props = {}) => render(<ThumbnailCardDetails title={<div>Foo Bar!</div>} {...props} />); jest.mock('../../../utils/dom', () => ({ useIsContentOverflowed: jest.fn() })); @@ -17,37 +17,49 @@ describe('components/thumbnail-card/ThumbnailCardDetails', () => { }); test('should render', () => { - const wrapper = getWrapper(); + const { container } = renderComponent(); - expect(wrapper).toMatchSnapshot(); + expect(container.querySelector('.thumbnail-card-details')).toBeInTheDocument(); }); test('should render icon', () => { const icon = <img alt="icon" />; - const wrapper = getWrapper({ icon }); + renderComponent({ icon }); - expect(wrapper).toMatchSnapshot(); + expect(screen.queryByAltText('icon')).toBeInTheDocument(); }); test('should render subtitle', () => { const subtitle = <div>Subtitle!</div>; - const wrapper = getWrapper({ subtitle }); + const { container } = renderComponent({ subtitle }); - expect(wrapper).toMatchSnapshot(); + expect(container.querySelector('.thumbnail-card-subtitle')).toBeInTheDocument(); }); test('should render actionItem', () => { - const actionItem = <button type="button">Click Me</button>; - const wrapper = getWrapper({ actionItem }); + const actionText = 'Click Me'; + const actionItem = <button type="button">{actionText}</button>; + renderComponent({ actionItem }); - expect(wrapper).toMatchSnapshot(); + expect(screen.getByText(actionText)).toBeInTheDocument(); }); - test('should render a Tooltip if text is overflowed', () => { + test('should render a Tooltip if text is overflowed', async () => { libDom.useIsContentOverflowed.mockReturnValue(true); + renderComponent(); + + await userEvent.tab(); + + expect(screen.getByRole('tooltip')).toBeInTheDocument(); + }); + + test('should accept a keydown callback', async () => { + const someFunction = jest.fn(); + const { container } = renderComponent({ onKeyDown: someFunction }); + const title = container.querySelector('.thumbnail-card-title'); - const wrapper = mount(<ThumbnailCardDetails title={<div>Foo Bar!</div>} />); + await userEvent.type(title, '{enter}'); - expect(wrapper.find('Tooltip').length).toBe(1); + expect(someFunction).toHaveBeenCalled(); }); }); diff --git a/src/components/thumbnail-card/__tests__/__snapshots__/ThumbnailCardDetails.test.js.snap b/src/components/thumbnail-card/__tests__/__snapshots__/ThumbnailCardDetails.test.js.snap deleted file mode 100644 index a9703c3f3b..0000000000 --- a/src/components/thumbnail-card/__tests__/__snapshots__/ThumbnailCardDetails.test.js.snap +++ /dev/null @@ -1,104 +0,0 @@ -// Jest Snapshot v1, https://goo.gl/fbAQLP - -exports[`components/thumbnail-card/ThumbnailCardDetails should render 1`] = ` -<div - className="thumbnail-card-details" -> - <div - className="thumbnail-card-details-content" - > - <div - className="ThumbnailCardDetails-bodyText" - > - <Title - title={ - <div> - Foo Bar! - </div> - } - /> - </div> - </div> -</div> -`; - -exports[`components/thumbnail-card/ThumbnailCardDetails should render actionItem 1`] = ` -<div - className="thumbnail-card-details" -> - <div - className="thumbnail-card-details-content" - > - <div - className="ThumbnailCardDetails-bodyText" - > - <Title - title={ - <div> - Foo Bar! - </div> - } - /> - </div> - <button - type="button" - > - Click Me - </button> - </div> -</div> -`; - -exports[`components/thumbnail-card/ThumbnailCardDetails should render icon 1`] = ` -<div - className="thumbnail-card-details" -> - <img - alt="icon" - /> - <div - className="thumbnail-card-details-content" - > - <div - className="ThumbnailCardDetails-bodyText" - > - <Title - title={ - <div> - Foo Bar! - </div> - } - /> - </div> - </div> -</div> -`; - -exports[`components/thumbnail-card/ThumbnailCardDetails should render subtitle 1`] = ` -<div - className="thumbnail-card-details" -> - <div - className="thumbnail-card-details-content" - > - <div - className="ThumbnailCardDetails-bodyText" - > - <Title - title={ - <div> - Foo Bar! - </div> - } - /> - <div - className="thumbnail-card-subtitle" - > - <div> - Subtitle! - </div> - </div> - </div> - </div> -</div> -`;