Skip to content

Commit 7a979d6

Browse files
authored
Tests for server side rendering useBrowseResults (#40)
* Add server side rendering tests for useCioClient * Test server side rendering for useSearchResults * Tests for server side rendering useBrowseResults * Resolve eslint with jsx * change file extension from js to jsx for tests with jsx * update apiResponse mocks to apiSearchResponse and apiBrowseRespons * remove wrongly created file * check filterName and filterValue are defined for handleSubmit event
1 parent d73b070 commit 7a979d6

File tree

2 files changed

+97
-9
lines changed

2 files changed

+97
-9
lines changed
Lines changed: 79 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,79 @@
1+
import useBrowseResults from '../src/hooks/useBrowseResults';
2+
import { renderHookServerSide } from './test-utils.server';
3+
4+
import mockBrowseResponse from './local_examples/apiBrowseResponse.json';
5+
import { transformBrowseResponse } from '../src/utils/transformers';
6+
7+
describe('Testing Hook on the server: useBrowseResults with initial browse results', () => {
8+
it('Should throw error if no filterValue or filterName required', async () => {
9+
expect(() =>
10+
renderHookServerSide(() => useBrowseResults('', '', { cioClient: null }), {}),
11+
).toThrow('filterName and filterValue are required');
12+
13+
expect(() =>
14+
renderHookServerSide(() => useBrowseResults('filter_name', '', { cioClient: null }), {}),
15+
).toThrow('filterName and filterValue are required');
16+
17+
expect(() =>
18+
renderHookServerSide(() => useBrowseResults('', 'filter_value', { cioClient: null }), {}),
19+
).toThrow('filterName and filterValue are required');
20+
});
21+
22+
it('Should not break if cioClient is null', async () => {
23+
const initialBrowseResults = transformBrowseResponse(mockBrowseResponse);
24+
25+
expect(() =>
26+
renderHookServerSide(
27+
() =>
28+
useBrowseResults(
29+
'filter_value',
30+
'filter_name',
31+
{ cioClient: null },
32+
initialBrowseResults,
33+
),
34+
{},
35+
),
36+
).not.toThrow();
37+
});
38+
39+
it('Should return a PlpBrowseResponse Object when provided initialBrowseResults', async () => {
40+
const initialBrowseResults = transformBrowseResponse(mockBrowseResponse);
41+
42+
const { result } = renderHookServerSide(
43+
() =>
44+
useBrowseResults('filter_value', 'filter_name', { cioClient: null }, initialBrowseResults),
45+
{},
46+
);
47+
48+
const response = result.browseResults;
49+
expect(response?.resultId).not.toBeUndefined();
50+
expect(response?.totalNumResults).not.toBeUndefined();
51+
expect(response?.refinedContent).not.toBeUndefined();
52+
expect(response?.groups).not.toBeUndefined();
53+
expect(response?.results?.length).not.toBeUndefined();
54+
expect(response?.facets?.length).not.toBeUndefined();
55+
expect(response?.sortOptions?.length).not.toBeUndefined();
56+
expect(response?.rawResponse).not.toBeUndefined();
57+
});
58+
});
59+
60+
describe('Testing Hook on the server: useBrowseResults with no initialBrowseResults', () => {
61+
it('Should not break if cioClient is null', async () => {
62+
expect(() =>
63+
renderHookServerSide(
64+
() => useBrowseResults('filter_value', 'filter_name', { cioClient: null }),
65+
{},
66+
),
67+
).not.toThrow();
68+
});
69+
70+
it('Should return null when called with no initialBrowseResults', async () => {
71+
const { result } = renderHookServerSide(
72+
() => useBrowseResults('filter_value', 'filter_name', { cioClient: null }),
73+
{},
74+
);
75+
76+
const response = result.browseResults;
77+
expect(response).toBeNull();
78+
});
79+
});

src/hooks/useBrowseResults.ts

Lines changed: 18 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -32,33 +32,42 @@ export default function useBrowseResults(
3232
filterName: string,
3333
filterValue: string,
3434
configs: UseBrowseResultsConfig = {},
35+
initialBrowseResponse?: PlpBrowseResponse,
3536
): UseBrowseResultsReturn {
3637
const { cioClient, browseParams } = configs;
3738
const state = useCioPlpContext();
3839
const client = cioClient || state?.cioClient;
3940

40-
if (!client) {
41+
if (!filterName || !filterValue) {
42+
throw new Error('filterName and filterValue are required');
43+
}
44+
// Throw error if client is not provided and window is defined (i.e. not SSR)
45+
if (!client && typeof window !== 'undefined') {
4146
throw new Error('CioClient required');
4247
}
4348

44-
const [browseResponse, setBrowseResponse] = useState<PlpBrowseResponse | null>(null);
49+
const [browseResponse, setBrowseResponse] = useState<PlpBrowseResponse | null>(
50+
initialBrowseResponse || null,
51+
);
4552
const pagination = usePagination({
4653
initialPage: browseResponse?.rawResponse.request?.page,
4754
totalNumResults: browseResponse?.totalNumResults,
4855
resultsPerPage: browseResponse?.numResultsPerPage,
4956
});
5057

5158
const handleSubmit = () => {
52-
client.browse
53-
.getBrowseResults(filterName, filterValue, {
54-
...browseParams,
55-
page: pagination.currentPage || browseParams?.page,
56-
})
57-
.then((res) => setBrowseResponse(transformBrowseResponse(res)));
59+
if (client && filterName && filterValue) {
60+
client.browse
61+
.getBrowseResults(filterName, filterValue, {
62+
...browseParams,
63+
page: pagination.currentPage || browseParams?.page,
64+
})
65+
.then((res) => setBrowseResponse(transformBrowseResponse(res)));
66+
}
5867
};
5968

6069
useEffect(() => {
61-
if (filterName && filterValue) {
70+
if (client && filterName && filterValue) {
6271
client.browse
6372
.getBrowseResults(filterName, filterValue, {
6473
...browseParams,

0 commit comments

Comments
 (0)