Skip to content

Commit ddaa565

Browse files
committed
fixes jest tests through mocking doProcessNext with jest
1 parent cf6afbe commit ddaa565

File tree

5 files changed

+52
-45
lines changed

5 files changed

+52
-45
lines changed

src/components/message/ErrorReport.test.tsx

Lines changed: 24 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -2,12 +2,12 @@ import React from 'react';
22

33
import { screen } from '@testing-library/react';
44
import { userEvent } from '@testing-library/user-event';
5-
import type { AxiosError } from 'axios';
65

76
import { defaultMockDataElementId } from 'src/__mocks__/getInstanceDataMock';
87
import { defaultDataTypeMock } from 'src/__mocks__/getLayoutSetsMock';
98
import { Form } from 'src/components/form/Form';
109
import { type BackendValidationIssue, BackendValidationSeverity } from 'src/features/validation';
10+
import { doProcessNext } from 'src/queries/queries';
1111
import { renderWithInstanceAndLayout } from 'src/test/renderWithProviders';
1212

1313
describe('ErrorReport', () => {
@@ -69,14 +69,11 @@ describe('ErrorReport', () => {
6969
});
7070

7171
it('should list task errors as unclickable', async () => {
72-
const { mutations } = await render();
73-
74-
await userEvent.click(screen.getByRole('button', { name: 'Submit' }));
75-
76-
mutations.doProcessNext.reject({
77-
name: 'AxiosError',
78-
message: 'Request failed with status code 409',
79-
response: {
72+
jest.mocked(doProcessNext).mockImplementationOnce(async () => {
73+
// eslint-disable-next-line @typescript-eslint/no-explicit-any
74+
const error = new Error('Request failed with status code 409') as any;
75+
error.name = 'AxiosError';
76+
error.response = {
8077
status: 409,
8178
data: {
8279
validationIssues: [
@@ -87,8 +84,13 @@ describe('ErrorReport', () => {
8784
} as BackendValidationIssue,
8885
],
8986
},
90-
},
91-
} as AxiosError);
87+
};
88+
throw error;
89+
});
90+
const user = userEvent.setup();
91+
await render();
92+
93+
await user.click(screen.getByRole('button', { name: 'Submit' }));
9294

9395
await screen.findByTestId('ErrorReport');
9496

@@ -99,14 +101,11 @@ describe('ErrorReport', () => {
99101
});
100102

101103
it('should list unbound mapped error as unclickable', async () => {
102-
const { mutations } = await render();
103-
104-
await userEvent.click(screen.getByRole('button', { name: 'Submit' }));
105-
106-
mutations.doProcessNext.reject({
107-
name: 'AxiosError',
108-
message: 'Request failed with status code 409',
109-
response: {
104+
jest.mocked(doProcessNext).mockImplementationOnce(async () => {
105+
// eslint-disable-next-line @typescript-eslint/no-explicit-any
106+
const error = new Error('Request failed with status code 409') as any;
107+
error.name = 'AxiosError';
108+
error.response = {
110109
status: 409,
111110
data: {
112111
validationIssues: [
@@ -119,8 +118,12 @@ describe('ErrorReport', () => {
119118
} as BackendValidationIssue,
120119
],
121120
},
122-
},
123-
} as AxiosError);
121+
};
122+
throw error;
123+
});
124+
await render();
125+
126+
await userEvent.click(screen.getByRole('button', { name: 'Submit' }));
124127

125128
await screen.findByTestId('ErrorReport');
126129

src/features/instance/useProcessNext.tsx

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,6 @@ import { toast } from 'react-toastify';
33

44
import { useMutation, useQueryClient } from '@tanstack/react-query';
55

6-
import { useAppMutations } from 'src/core/contexts/AppQueriesProvider';
76
import { ContextNotProvided } from 'src/core/contexts/context';
87
import { useDisplayError } from 'src/core/errorHandling/DisplayErrorProvider';
98
import { useApplicationMetadata } from 'src/features/applicationMetadata/ApplicationMetadataProvider';
@@ -18,6 +17,7 @@ import { appSupportsIncrementalValidationFeatures } from 'src/features/validatio
1817
import { useOnFormSubmitValidation } from 'src/features/validation/callbacks/onFormSubmitValidation';
1918
import { Validation } from 'src/features/validation/validationContext';
2019
import { TaskKeys, useNavigateToTask } from 'src/hooks/useNavigatePage';
20+
import { doProcessNext } from 'src/queries/queries';
2121
import { isAtLeastVersion } from 'src/utils/versionCompare';
2222
import type { ApplicationMetadata } from 'src/features/applicationMetadata/types';
2323
import type { BackendValidationIssue } from 'src/features/validation';
@@ -29,7 +29,6 @@ interface ProcessNextProps {
2929
}
3030

3131
export function useProcessNext() {
32-
const { doProcessNext } = useAppMutations();
3332
const reFetchInstanceData = useStrictInstanceRefetch();
3433
const language = useCurrentLanguage();
3534
const { refetch: refetchProcessData } = useProcessQuery();

src/features/processEnd/confirm/containers/ConfirmPage.test.tsx

Lines changed: 17 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -2,15 +2,22 @@ import React from 'react';
22

33
import { jest } from '@jest/globals';
44
import { screen, waitFor } from '@testing-library/react';
5-
import { userEvent } from '@testing-library/user-event';
5+
import userEvent from '@testing-library/user-event';
66

77
import { getApplicationMetadataMock } from 'src/__mocks__/getApplicationMetadataMock';
88
import { getInstanceDataMock } from 'src/__mocks__/getInstanceDataMock';
99
import { getPartyMock, getPartyWithSubunitMock } from 'src/__mocks__/getPartyMock';
10-
import { getProcessDataMock } from 'src/__mocks__/getProcessDataMock';
1110
import { ConfirmPage, type IConfirmPageProps } from 'src/features/processEnd/confirm/containers/ConfirmPage';
12-
import { fetchProcessState } from 'src/queries/queries';
11+
import { doProcessNext } from 'src/queries/queries';
1312
import { renderWithInstanceAndLayout } from 'src/test/renderWithProviders';
13+
import { IProcess } from 'src/types/shared';
14+
15+
jest.mock('src/features/instance/useProcessQuery', () => ({
16+
...jest.requireActual<typeof import('src/features/instance/useProcessQuery')>(
17+
'src/features/instance/useProcessQuery',
18+
),
19+
useIsAuthorized: jest.fn().mockReturnValue(() => true),
20+
}));
1421

1522
describe('ConfirmPage', () => {
1623
const personParty = getPartyMock();
@@ -73,30 +80,24 @@ describe('ConfirmPage', () => {
7380
expect(contentLoader).not.toBeInTheDocument();
7481
});
7582

76-
it('should show loading when clicking submit', async () => {
77-
jest.mocked(fetchProcessState).mockImplementation(async () =>
78-
getProcessDataMock((p) => {
79-
p.currentTask!.actions = {
80-
confirm: true,
81-
};
82-
}),
83-
);
83+
it('should show loading when clicking submit and process/next has not resolved', async () => {
84+
const user = userEvent.setup();
85+
jest.mocked(doProcessNext).mockImplementation(() => new Promise(() => {}) as Promise<IProcess>);
8486

85-
const { mutations } = await renderWithInstanceAndLayout({
87+
await renderWithInstanceAndLayout({
8688
renderer: () => <ConfirmPage {...props} />,
8789
});
88-
8990
const submitBtnText = /send inn/i;
9091
const loadingText = /laster innhold/i;
9192

9293
const submitBtn = screen.getByRole('button', { name: submitBtnText });
9394

94-
expect(mutations.doProcessNext.mock).toHaveBeenCalledTimes(0);
95+
expect(doProcessNext).toHaveBeenCalledTimes(0);
9596
expect(screen.queryByText(loadingText)).not.toBeInTheDocument();
9697
expect(submitBtn).toBeInTheDocument();
97-
await userEvent.click(submitBtn);
98+
await user.click(submitBtn);
9899

99-
expect(mutations.doProcessNext.mock).toHaveBeenCalledTimes(1);
100+
expect(doProcessNext).toHaveBeenCalledTimes(1);
100101
expect(screen.getByRole('button', { name: submitBtnText })).toBeInTheDocument();
101102

102103
await waitFor(() => {

src/queries/types.ts

Lines changed: 8 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,12 +1,15 @@
11
import type * as queries from 'src/queries/queries';
22

3-
type IgnoredQueries = keyof Pick<typeof queries, 'fetchApplicationMetadata' | 'fetchExternalApi' | 'fetchProcessState'>;
4-
5-
export type AppQueriesContext = Omit<typeof queries, IgnoredQueries>;
3+
type IgnoredQueriesAndMutations = keyof Pick<
4+
typeof queries,
5+
'fetchApplicationMetadata' | 'fetchExternalApi' | 'fetchProcessState' | 'doProcessNext'
6+
>;
67

78
type KeysStartingWith<T, U extends string> = {
89
[K in keyof T as K extends `${U}${string}` ? K : never]: T[K];
910
};
1011

11-
export type AppQueries = Omit<KeysStartingWith<AppQueriesContext, 'fetch'>, IgnoredQueries>;
12-
export type AppMutations = KeysStartingWith<AppQueriesContext, 'do'>;
12+
export type AppQueries = Omit<KeysStartingWith<typeof queries, 'fetch'>, IgnoredQueriesAndMutations>;
13+
export type AppMutations = Omit<KeysStartingWith<typeof queries, 'do'>, IgnoredQueriesAndMutations>;
14+
15+
export type AppQueriesContext = AppQueries & AppMutations;

src/setupTests.ts

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,7 @@ import { TextDecoder, TextEncoder } from 'util';
1616

1717
import { getIncomingApplicationMetadataMock } from 'src/__mocks__/getApplicationMetadataMock';
1818
import { getProcessDataMock } from 'src/__mocks__/getProcessDataMock';
19-
import type { fetchApplicationMetadata, fetchProcessState } from 'src/queries/queries';
19+
import type { doProcessNext, fetchApplicationMetadata, fetchProcessState } from 'src/queries/queries';
2020
import type { AppQueries } from 'src/queries/types';
2121

2222
// Importing CSS for jest-preview to look nicer
@@ -110,6 +110,7 @@ jest.mock('src/queries/queries', () => ({
110110
.fn<typeof fetchApplicationMetadata>()
111111
.mockImplementation(async () => getIncomingApplicationMetadataMock()),
112112
fetchProcessState: jest.fn<typeof fetchProcessState>(async () => getProcessDataMock()),
113+
doProcessNext: jest.fn<typeof doProcessNext>(async () => getProcessDataMock()),
113114
}));
114115

115116
jest.mock('react-helmet-async', () => ({

0 commit comments

Comments
 (0)