import { test, expect } from 'vitest';
import { render, screen, within } from '@testing-library/react';
import SearchResult from './SearchResult';
import Metadata from '../PageMetadata';
const RESULT_TITLE = 'My title';
const RESULT_HREF = '#foo';
const RESULT_CONTENT = 'My content';
const META_KEY = 'My meta key';
const META_VALUE = 'My meta value';
const CONTEXT_VALUE = 'My context value';
test('search result renders correctly', () => {
render(
{RESULT_CONTENT}
{META_VALUE}
{CONTEXT_VALUE}
);
const searchResult = screen.getByTestId('searchresult');
expect(searchResult).toHaveClass('ds_search-result');
expect(searchResult).not.toHaveClass('ds_search-result--promoted');
expect(searchResult.tagName).toEqual('LI');
const title = screen.getByRole('heading');
expect(title).toHaveClass('ds_search-result__title');
expect(title).toHaveTextContent(RESULT_TITLE);
expect(title?.parentElement).toEqual(searchResult);
const link = within(title).getByRole('link');
expect(link).toHaveClass('ds_search-result__link');
expect(link).toHaveAttribute('href', RESULT_HREF);
expect(link.tagName).toBe('A');
const content = screen.getByText(RESULT_CONTENT);
expect(content).toBeInTheDocument();
expect(content).toHaveClass('ds_search-result__summary');
expect(content?.previousElementSibling).toEqual(title);
const meta = searchResult.querySelector('.ds_metadata');
expect(meta).toBeInTheDocument();
expect(meta).toHaveClass('ds_metadata--inline', 'ds_search-result__metadata');
expect(meta?.previousElementSibling).toEqual(content);
expect(meta?.tagName).toBe('DL');
const metaItem = meta.querySelector('.ds_metadata__item');
expect(metaItem).toBeInTheDocument();
expect(metaItem).toHaveClass('ds_metadata__item');
expect(metaItem?.parentElement).toEqual(meta);
const metaTerm = meta.querySelector('dt');
expect(metaTerm).toBeInTheDocument();
expect(metaTerm).toHaveClass('ds_metadata__key');
expect(metaTerm?.textContent).toBe(META_KEY);
expect(metaTerm?.parentElement).toEqual(metaItem);
const metaDesc = meta.querySelector('dd');
expect(metaDesc).toBeInTheDocument();
expect(metaDesc).toHaveClass('ds_metadata__value');
expect(metaDesc?.textContent.trim()).toBe(META_VALUE);
expect(metaDesc?.parentElement).toEqual(metaItem);
expect(metaDesc?.previousElementSibling).toEqual(metaTerm);
const context = searchResult.querySelector('.ds_search-result__context');
expect(context).toBeInTheDocument();
expect(context).toHaveClass('ds_search-result__context');
expect(context?.tagName).toBe('DL');
expect(context?.previousElementSibling).toEqual(meta);
const contextTitle = context?.querySelector('dt');
expect(contextTitle).toBeInTheDocument();
expect(contextTitle).toHaveClass('ds_search-result__context-key');
expect(contextTitle?.textContent).toBe('Part of:');
expect(contextTitle?.parentElement).toEqual(context);
const contextValue = context?.querySelector('dd');
expect(contextValue).toBeInTheDocument();
expect(contextValue).toHaveClass('ds_search-result__context-value');
expect(contextValue?.textContent).toBe(CONTEXT_VALUE);
expect(contextValue?.previousElementSibling).toEqual(contextTitle);
expect(contextValue?.parentElement).toEqual(context);
});
test('promoted search result renders correctly', () => {
render(
{RESULT_CONTENT}
);
const searchResult = screen.getByTestId('searchresult');
expect(searchResult).toHaveClass('ds_search-result', 'ds_search-result--promoted');
const promotedContent = searchResult.querySelector('.ds_search-result--promoted-content');
expect(promotedContent).toBeInTheDocument();
expect(promotedContent?.parentElement).toEqual(searchResult);
expect(promotedContent?.tagName).toBe('DIV');
const promotedTitle = promotedContent?.querySelector('.ds_search-result--promoted-title');
expect(promotedTitle).toBeInTheDocument();
expect(promotedTitle?.textContent).toBe('Recommended');
expect(promotedTitle?.parentElement).toEqual(promotedContent);
const title = screen.getByRole('heading');
expect(title).toHaveClass('ds_search-result__title');
expect(title).toHaveTextContent(RESULT_TITLE);
expect(title?.parentElement).toEqual(promotedContent);
const content = screen.getByText(RESULT_CONTENT);
expect(content).toBeInTheDocument();
expect(content?.previousElementSibling).toEqual(title);
expect(content?.parentElement).toEqual(promotedContent);
});
test('search result with media renders correctly', () => {
const IMAGE =
;
render(
{IMAGE}
{RESULT_CONTENT}
);
const searchResult = screen.getByTestId('searchresult');
const title = screen.getByRole('heading');
const summary = searchResult.querySelector('.ds_search-result__has-media');
expect(summary).toBeInTheDocument();
expect(summary?.tagName).toBe('DIV');
expect(summary?.parentElement).toEqual(searchResult);
expect(summary?.previousElementSibling).toEqual(title);
const mediaWrapper = summary?.querySelector('.ds_search-result__media-wrapper');
expect(mediaWrapper).toBeInTheDocument();
expect(mediaWrapper?.parentElement).toEqual(summary);
const mediaLink = mediaWrapper?.querySelector('.ds_search-result__media-link');
expect(mediaLink).toBeInTheDocument();
expect(mediaLink).toHaveAttribute('aria-hidden', 'true');
expect(mediaLink).toHaveAttribute('href', RESULT_HREF);
expect(mediaLink).toHaveAttribute('tabindex', '-1');
expect(mediaLink?.parentElement).toEqual(mediaWrapper);
expect(mediaLink?.tagName).toBe('A');
const media = summary?.querySelector('.ds_search-result__media');
expect(media).toBeInTheDocument();
expect(media).toHaveClass('ds_aspect-box', 'ds_aspect-box--square');
expect(media?.parentElement).toEqual(mediaLink);
expect(media?.tagName).toBe('DIV');
const img = media?.querySelector('img');
expect(img).toBeInTheDocument();
expect(img?.parentElement).toEqual(media);
const content = screen.getByText(RESULT_CONTENT);
expect(content).toBeInTheDocument();
expect(content).toHaveClass('ds_search-result__summary');
expect(content?.parentElement).toEqual(summary);
expect(content?.previousElementSibling).toEqual(mediaWrapper);
});
test('linkComponent is used for title link', () => {
render(
(
)}>
{RESULT_CONTENT}
);
const title = screen.getByRole('heading');
const link = within(title).getByRole('link');
expect(link).toHaveClass('ds_search-result__link');
expect(link).toHaveAttribute('href', RESULT_HREF);
expect(link.tagName).toBe('SPAN');
expect(link?.parentElement).toEqual(title);
expect(link?.previousElementSibling).toBeNull();
});
test('search result with DIV as tagName', () => {
render(
{RESULT_CONTENT}
);
const searchResult = screen.getByTestId('searchresult');
expect(searchResult.tagName).toEqual('DIV');
});
test('passing additional props', () => {
render(
);
const searchResult = screen.getByTestId('searchresult');
expect(searchResult?.dataset.test).toEqual('foo');
});
test('passing additional CSS classes', () => {
render(
);
const searchResult = screen.getByTestId('searchresult');
expect(searchResult).toHaveClass('foo');
});