1
0
Fork 0
docsearch/packages/docsearch-react/src/__tests__/api.test.tsx
2022-02-22 10:53:16 +01:00

287 lines
7.8 KiB
TypeScript

import {
render,
fireEvent,
waitFor,
screen,
act,
} from '@testing-library/react';
import React from 'react';
import '@testing-library/jest-dom';
import { DocSearch as DocSearchComponent } from '../DocSearch';
import type { DocSearchProps } from '../DocSearch';
function DocSearch(props: Partial<DocSearchProps>) {
return (
<DocSearchComponent appId="woo" apiKey="foo" indexName="bar" {...props} />
);
}
// mock empty response
function noResultSearch(_queries: any, _requestOptions?: any): Promise<any> {
return new Promise((resolve) => {
resolve({
results: [
{
hits: [],
hitsPerPage: 0,
nbHits: 0,
nbPages: 0,
page: 0,
processingTimeMS: 0,
exhaustiveNbHits: true,
params: '',
query: '',
},
],
});
});
}
describe('api', () => {
beforeEach(() => {
document.body.innerHTML = '';
});
it('renders with minimal parameters', () => {
render(<DocSearch />);
expect(document.querySelector('.DocSearch')).toBeInTheDocument();
});
describe('translations', () => {
it('overrides the default DocSearchButton text', () => {
render(
<DocSearch
translations={{
button: {
buttonText: 'Recherche',
buttonAriaLabel: 'Recherche',
},
}}
/>
);
expect(
document.querySelector('.DocSearch-Button-Placeholder').innerHTML
).toBe('Recherche');
expect(
document.querySelector('.DocSearch-Button').getAttribute('aria-label')
).toBe('Recherche');
});
it('overrides the default DocSearchModal startScreen text', async () => {
render(
<DocSearch
translations={{
modal: {
startScreen: {
noRecentSearchesText: 'Pas de recherche récentes',
},
},
}}
/>
);
await waitFor(() => {
fireEvent.click(document.querySelector('.DocSearch-Button'));
});
expect(screen.getByText('Pas de recherche récentes')).toBeInTheDocument();
});
it('overrides the default DocSearchModal noResultsScreen text', async () => {
render(
<DocSearch
transformSearchClient={(searchClient) => {
return {
...searchClient,
search: noResultSearch,
};
}}
translations={{
modal: {
noResultsScreen: {
noResultsText: 'Pas de résultats pour',
reportMissingResultsText:
'Ouvrez une issue sur docsearch-configs',
reportMissingResultsLinkText: 'Lien du repo',
},
},
}}
getMissingResultsUrl={() => 'algolia.com'}
/>
);
await act(async () => {
await waitFor(() => {
fireEvent.click(document.querySelector('.DocSearch-Button'));
});
fireEvent.input(document.querySelector('.DocSearch-Input'), {
target: { value: 'q' },
});
});
expect(screen.getByText(/Pas de résultats pour/)).toBeInTheDocument();
expect(
screen.getByText(/Ouvrez une issue sur docsearch-configs/)
).toBeInTheDocument();
expect(
screen.getByRole('link', {
name: 'Lien du repo',
})
).toBeInTheDocument();
});
it('overrides the default DocSearchModal searchbox text', async () => {
render(
<DocSearch
translations={{
modal: {
searchBox: {
resetButtonTitle: 'Effacer',
resetButtonAriaLabel: 'Effacer',
cancelButtonText: 'Annuler',
cancelButtonAriaLabel: 'Annuler',
},
},
}}
/>
);
await waitFor(() => {
fireEvent.click(document.querySelector('.DocSearch-Button'));
});
expect(document.querySelector('.DocSearch-Cancel').innerHTML).toBe(
'Annuler'
);
expect(
document.querySelector('.DocSearch-Cancel').getAttribute('aria-label')
).toBe('Annuler');
expect(
document.querySelector('.DocSearch-Reset').getAttribute('title')
).toBe('Effacer');
expect(
document.querySelector('.DocSearch-Reset').getAttribute('aria-label')
).toBe('Effacer');
});
it('overrides the default DocSearchModal footer text', async () => {
render(
<DocSearch
translations={{
modal: {
footer: {
closeText: 'Pour fermer',
closeKeyAriaLabel: "Touche d'échappement",
navigateText: 'Pour naviguer',
navigateUpKeyAriaLabel: 'Flèche vers le haut',
navigateDownKeyAriaLabel: 'Flèche le bas',
searchByText: 'Recherche par',
selectText: 'Pour selectionner',
selectKeyAriaLabel: "Touche d'entrée",
},
},
}}
/>
);
await waitFor(() => {
fireEvent.click(document.querySelector('.DocSearch-Button'));
});
expect(screen.getByText('Recherche par')).toBeInTheDocument();
expect(screen.getByText('Pour fermer')).toBeInTheDocument();
expect(screen.getByText('Pour naviguer')).toBeInTheDocument();
expect(screen.getByText('Pour selectionner')).toBeInTheDocument();
expect(
document.querySelector(
'.DocSearch-Commands-Key > svg[aria-label="Touche d\'échappement"]'
)
).toBeInTheDocument();
expect(
document.querySelector(
'.DocSearch-Commands-Key > svg[aria-label="Flèche vers le haut"]'
)
).toBeInTheDocument();
expect(
document.querySelector(
'.DocSearch-Commands-Key > svg[aria-label="Flèche le bas"]'
)
).toBeInTheDocument();
expect(
document.querySelector(
'.DocSearch-Commands-Key > svg[aria-label="Touche d\'entrée"]'
)
).toBeInTheDocument();
});
});
describe('getMissingResultsUrl', () => {
it('does not render the link to the repository by default', async () => {
render(
<DocSearch
transformSearchClient={(searchClient) => {
return {
...searchClient,
search: noResultSearch,
};
}}
/>
);
await act(async () => {
await waitFor(() => {
fireEvent.click(document.querySelector('.DocSearch-Button'));
});
fireEvent.input(document.querySelector('.DocSearch-Input'), {
target: { value: 'q' },
});
});
expect(screen.getByText(/No results for/)).toBeInTheDocument();
expect(
document.querySelector('.DocSearch-Help a')
).not.toBeInTheDocument();
});
it('render the link to the repository', async () => {
render(
<DocSearch
transformSearchClient={(searchClient) => {
return {
...searchClient,
search: noResultSearch,
};
}}
getMissingResultsUrl={({ query }) =>
`https://github.com/algolia/docsearch/issues/new?title=${query}`
}
/>
);
await act(async () => {
await waitFor(() => {
fireEvent.click(document.querySelector('.DocSearch-Button'));
});
fireEvent.input(document.querySelector('.DocSearch-Input'), {
target: { value: 'q' },
});
});
expect(screen.getByText(/No results for/)).toBeInTheDocument();
const link = document.querySelector('.DocSearch-Help a');
expect(link).toBeInTheDocument();
expect(link.getAttribute('href')).toBe(
'https://github.com/algolia/docsearch/issues/new?title=q'
);
});
});
});