Skip to content

Commit 53d05c7

Browse files
committed
test: refactor getBlock test
1 parent d23a8a5 commit 53d05c7

File tree

2 files changed

+42
-53
lines changed

2 files changed

+42
-53
lines changed

src/library-authoring/collections/CollectionDetails.test.tsx

Lines changed: 21 additions & 52 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,7 @@
11
import type MockAdapter from 'axios-mock-adapter';
22
import fetchMock from 'fetch-mock-jest';
3-
import { cloneDeep } from 'lodash';
43

5-
import { SearchContextProvider } from '../../search-manager';
6-
import { mockContentSearchConfig, mockSearchResult } from '../../search-manager/data/api.mock';
4+
import { mockContentSearchConfig, mockGetBlockTypes } from '../../search-manager/data/api.mock';
75
import { type CollectionHit, formatSearchHit } from '../../search-manager/data/api';
86
import {
97
initializeMocks,
@@ -18,13 +16,12 @@ import * as api from '../data/api';
1816
import { mockContentLibrary } from '../data/api.mocks';
1917
import CollectionDetails from './CollectionDetails';
2018

21-
const searchEndpoint = 'http://mock.meilisearch.local/multi-search';
22-
2319
let axiosMock: MockAdapter;
2420
let mockShowToast: (message: string) => void;
2521

2622
mockContentSearchConfig.applyMock();
2723
const library = mockContentLibrary.libraryData;
24+
const collectionHit = formatSearchHit(mockResult.results[2].hits[0]) as CollectionHit;
2825

2926
describe('<CollectionDetails />', () => {
3027
beforeEach(() => {
@@ -39,25 +36,12 @@ describe('<CollectionDetails />', () => {
3936
fetchMock.mockReset();
4037
});
4138

42-
const renderCollectionDetails = async () => {
43-
const collectionData: CollectionHit = formatSearchHit(mockResult.results[2].hits[0]) as CollectionHit;
44-
45-
render((
46-
<SearchContextProvider>
47-
<CollectionDetails library={library} collection={collectionData} />
48-
</SearchContextProvider>
49-
));
50-
51-
await waitFor(() => { expect(fetchMock).toHaveFetchedTimes(1, searchEndpoint, 'post'); });
52-
};
53-
5439
it('should render Collection Details', async () => {
55-
mockSearchResult(mockResult);
56-
await renderCollectionDetails();
40+
render(<CollectionDetails library={library} collection={collectionHit} />);
5741

5842
// Collection Description
5943
expect(screen.getByText('Description / Card Preview Text')).toBeInTheDocument();
60-
const { description } = mockResult.results[2].hits[0];
44+
const { description } = collectionHit;
6145
expect(screen.getByText(description)).toBeInTheDocument();
6246

6347
// Collection History
@@ -69,14 +53,13 @@ describe('<CollectionDetails />', () => {
6953
});
7054

7155
it('should allow modifying the description', async () => {
72-
mockSearchResult(mockResult);
73-
await renderCollectionDetails();
56+
render(<CollectionDetails library={library} collection={collectionHit} />);
7457

7558
const {
7659
description: originalDescription,
77-
block_id: blockId,
78-
context_key: contextKey,
79-
} = mockResult.results[2].hits[0];
60+
blockId,
61+
contextKey,
62+
} = collectionHit;
8063

8164
expect(screen.getByText(originalDescription)).toBeInTheDocument();
8265

@@ -109,14 +92,13 @@ describe('<CollectionDetails />', () => {
10992
});
11093

11194
it('should show error while modifing the description', async () => {
112-
mockSearchResult(mockResult);
113-
await renderCollectionDetails();
95+
render(<CollectionDetails library={library} collection={collectionHit} />);
11496

11597
const {
11698
description: originalDescription,
117-
block_id: blockId,
118-
context_key: contextKey,
119-
} = mockResult.results[2].hits[0];
99+
blockId,
100+
contextKey,
101+
} = collectionHit;
120102

121103
expect(screen.getByText(originalDescription)).toBeInTheDocument();
122104

@@ -139,15 +121,15 @@ describe('<CollectionDetails />', () => {
139121
});
140122

141123
it('should render Collection stats', async () => {
142-
mockSearchResult(mockResult);
143-
await renderCollectionDetails();
124+
mockGetBlockTypes('someBlocks');
125+
render(<CollectionDetails library={library} collection={collectionHit} />);
144126

145127
expect(screen.getByText('Collection Stats')).toBeInTheDocument();
146128
expect(await screen.findByText('Total')).toBeInTheDocument();
147129

148130
[
149-
{ blockType: 'Total', count: 5 },
150-
{ blockType: 'Text', count: 4 },
131+
{ blockType: 'Total', count: 3 },
132+
{ blockType: 'Text', count: 2 },
151133
{ blockType: 'Problem', count: 1 },
152134
].forEach(({ blockType, count }) => {
153135
const blockCount = screen.getByText(blockType).closest('div') as HTMLDivElement;
@@ -156,32 +138,19 @@ describe('<CollectionDetails />', () => {
156138
});
157139

158140
it('should render Collection stats for empty collection', async () => {
159-
const mockResultCopy = cloneDeep(mockResult);
160-
mockResultCopy.results[1].facetDistribution.block_type = {};
161-
mockSearchResult(mockResultCopy);
162-
await renderCollectionDetails();
141+
mockGetBlockTypes('noBlocks');
142+
render(<CollectionDetails library={library} collection={collectionHit} />);
163143

164144
expect(screen.getByText('Collection Stats')).toBeInTheDocument();
165145
expect(await screen.findByText('This collection is currently empty.')).toBeInTheDocument();
166146
});
167147

168148
it('should render Collection stats for big collection', async () => {
169-
const mockResultCopy = cloneDeep(mockResult);
170-
mockResultCopy.results[1].facetDistribution.block_type = {
171-
advanced: 1,
172-
discussion: 2,
173-
library: 3,
174-
drag_and_drop_v2: 4,
175-
openassessment: 5,
176-
html: 6,
177-
problem: 7,
178-
video: 8,
179-
};
180-
mockSearchResult(mockResultCopy);
181-
await renderCollectionDetails();
149+
mockGetBlockTypes('moreBlocks');
150+
render(<CollectionDetails library={library} collection={collectionHit} />);
182151

183152
expect(screen.getByText('Collection Stats')).toBeInTheDocument();
184-
expect(await screen.findByText('78')).toBeInTheDocument();
153+
expect(await screen.findByText('36')).toBeInTheDocument();
185154

186155
[
187156
{ blockType: 'Total', count: 36 },

src/search-manager/data/api.mock.ts

Lines changed: 21 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
/* istanbul ignore file */
22
// eslint-disable-next-line import/no-extraneous-dependencies
33
import fetchMock from 'fetch-mock-jest';
4-
import type { MultiSearchResponse } from 'meilisearch';
4+
import type { MultiSearchResponse, Meilisearch, Filter } from 'meilisearch';
55
import * as api from './api';
66

77
/**
@@ -41,6 +41,26 @@ export function mockSearchResult(mockResponse: MultiSearchResponse) {
4141
}, { overwriteRoutes: true });
4242
}
4343

44+
export async function mockGetBlockTypes(
45+
mockResponse: 'noBlocks' | 'someBlocks' | 'moreBlocks',
46+
) {
47+
const mockResponseMap = {
48+
noBlocks: {},
49+
someBlocks: { problem: 1, html: 2 },
50+
moreBlocks: {
51+
advanced: 1,
52+
discussion: 2,
53+
library: 3,
54+
drag_and_drop_v2: 4,
55+
openassessment: 5,
56+
html: 6,
57+
problem: 7,
58+
video: 8,
59+
},
60+
};
61+
jest.spyOn(api, 'fetchBlockTypes').mockResolvedValue(mockResponseMap[mockResponse]);
62+
}
63+
4464
export const mockCollectionHit = {
4565
displayName: 'Collection 1',
4666
description: 'Lorem ipsum dolor sit amet, consectetur adipiscing elit. Quisque et mi ac nisi accumsan imperdiet vitae at odio. Vivamus tempor nec lorem eget lacinia. Vivamus efficitur lacus non dapibus porta. Nulla venenatis luctus nisi id posuere. Sed sollicitudin magna a sem ultrices accumsan. Praesent volutpat tortor vitae luctus rutrum. Integer.',

0 commit comments

Comments
 (0)