import { describe, test, expect } from 'vitest'; import { render, screen } from '@testing-library/react'; import Card from './Card'; const CARD_TITLE = 'Bananas'; const CARD_HREF = '#foo'; const CARD_CONTENT = 'A banana is an elongated, edible fruit—botanically a berry—produced by several kinds of large treelike herbaceous flowering plants in the genus Musa.'; const CARD_DESCRIPTION = 'New fruit added'; const CARD_MEDIA = 'JPEG image of a banana'; test('card renders correctly', () => { render( {CARD_MEDIA} New release

{CARD_CONTENT}

); const card = screen.getByTestId('card'); const title = screen.getByRole('heading'); const link = screen.getByRole('link'); const content = card.querySelector('p'); const media = card.firstChild; const aspectbox = media?.firstChild; const metadata = card.querySelector('.ds_metadata'); expect(media).toHaveClass('ds_card__media', 'ds_card__media--cover', 'ds_card__media--wide'); expect(aspectbox).toHaveClass('ds_aspect-box', 'ds_aspect-box--43'); expect(card).toHaveClass('ds_card', 'ds_card--navigation'); expect(card.tagName).toEqual('DIV'); expect(title).toHaveClass('ds_card__title'); expect(title.tagName).toEqual('H2'); expect(title.textContent).toEqual(CARD_TITLE); expect(title.parentElement).toHaveClass('ds_card__content-header'); expect(link).toHaveClass('ds_card__link', 'ds_card__link--cover'); expect(link).toHaveAttribute('href', CARD_HREF); expect(link.textContent).toEqual(CARD_TITLE); expect(link.parentElement).toEqual(title); expect(content?.parentElement).toHaveClass('ds_card__content-main'); expect(content?.textContent).toEqual(CARD_CONTENT); expect(metadata).toHaveClass('ds_metadata', 'ds_metadata--inline'); expect(metadata?.parentElement).toHaveClass('ds_card__content-footer'); }); test('container added for adaptive card', () => { render( ); const card = screen.getByTestId('card'); const container = card.parentElement expect(container).toHaveClass('ds_card-container'); }); test('description added', () => { render( ); const description = screen.getByText(', '+CARD_DESCRIPTION); expect(description).toHaveClass('visually-hidden'); expect(description.tagName).toEqual('SPAN'); expect(description.parentElement).toHaveClass('ds_card__title'); }); test('display variant classes added', () => { render( ); const card = screen.getByTestId('card'); expect(card).toHaveClass('ds_card', 'ds_card--background-secondary', 'ds_card--horizontal', 'ds_card--horizontal-small'); }); test('custom heading level', () => { render( ); const title = screen.getByRole('heading'); expect(title.tagName).toEqual('H3'); }); test('custom element', () => { render( ); const card = screen.getByTestId('card'); expect(card.tagName).toEqual('ARTICLE'); }); test('custom link component', () => { render( ( )}> ); const link = screen.getByRole('link'); expect(link.tagName).toEqual('SPAN'); expect(link.textContent).toEqual(CARD_TITLE); }); describe('card status tag', () => { const TAG_TEXT = 'Foo'; test('card status tag', () => { render( {TAG_TEXT} ); const statusTag = screen.getByTestId('status-tag'); expect(statusTag).toHaveClass('ds_tag'); expect(statusTag.tagName).toEqual('SPAN'); expect(statusTag.textContent).toEqual(TAG_TEXT); expect(statusTag.getAttribute('aria-hidden')).not.toEqual('true'); }); test('card status tag: hidden', () => { render( {TAG_TEXT} ); const statusTag = screen.getByTestId('status-tag'); expect(statusTag).toHaveClass('ds_tag'); expect(statusTag.getAttribute('aria-hidden')).toEqual('true'); }); }); describe('card media', () => { test('card media', () => { render( {CARD_MEDIA} ); const cardMedia = screen.getByTestId('card-media'); expect(cardMedia).toHaveClass('ds_card__media'); expect(cardMedia.tagName).toEqual('DIV'); expect(cardMedia.innerHTML).toEqual(CARD_MEDIA); }); test('card media with isCover and ratio', () => { render( {CARD_MEDIA} ); const cardMedia = screen.getByTestId('card-media'); const cardMediaInner = cardMedia.querySelector('*'); expect(cardMedia).toHaveClass('ds_card__media--cover'); expect(cardMediaInner).toHaveClass('ds_aspect-box', 'ds_aspect-box--43'); }); test('card media with only isCover', () => { render( {CARD_MEDIA} ); const cardMedia = screen.getByTestId('card-media'); const cardMediaInner = cardMedia.querySelector('*'); expect(cardMedia).not.toHaveClass('ds_card__media--cover'); expect(cardMediaInner).not.toBeInTheDocument(); }); test('card media with only ratio', () => { render( {CARD_MEDIA} ); const cardMedia = screen.getByTestId('card-media'); const cardMediaInner = cardMedia.querySelector('*'); expect(cardMedia).not.toHaveClass('ds_card__media--cover'); expect(cardMediaInner).toHaveClass('ds_aspect-box', 'ds_aspect-box--43'); }); test('card media with mediaWidth', () => { render( {CARD_MEDIA} ); const cardMedia = screen.getByTestId('card-media'); expect(cardMedia).toHaveClass('ds_card__media--narrow'); }); }); test('passing additional props', () => { render( ); const card = screen.getByTestId('card'); expect(card.dataset.test).toEqual('foo'); }); test('passing additional CSS classes', () => { render( ); const card = screen.getByTestId('card'); expect(card).toHaveClass('foo'); });