Skip to content

Commit

Permalink
removes fetchProcessState from AppQueriesProvider and mocks with jest
Browse files Browse the repository at this point in the history
  • Loading branch information
cammiida committed Oct 17, 2024
1 parent 530b0f3 commit 85c68ba
Show file tree
Hide file tree
Showing 11 changed files with 79 additions and 71 deletions.
7 changes: 5 additions & 2 deletions src/features/expressions/shared-functions.test.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -12,7 +12,7 @@ import { getSharedTests } from 'src/features/expressions/shared';
import { ExprVal } from 'src/features/expressions/types';
import { ExprValidation } from 'src/features/expressions/validation';
import { useExternalApis } from 'src/features/externalApi/useExternalApi';
import { fetchApplicationMetadata } from 'src/queries/queries';
import { fetchApplicationMetadata, fetchProcessState } from 'src/queries/queries';
import { renderWithNode } from 'src/test/renderWithProviders';
import { useEvalExpression } from 'src/utils/layout/generator/useEvalExpression';
import type { SharedTestFunctionContext } from 'src/features/expressions/shared';
Expand Down Expand Up @@ -214,6 +214,10 @@ describe('Expressions shared function tests', () => {
(fetchApplicationMetadata as jest.Mock<typeof fetchApplicationMetadata>).mockResolvedValue(applicationMetadata);
(useExternalApis as jest.Mock<typeof useExternalApis>).mockReturnValue(externalApis as ExternalApisResult);

(fetchProcessState as jest.Mock<typeof fetchProcessState>).mockImplementation(() =>
Promise.resolve(process ?? getProcessDataMock()),
);

const nodeId = nodeIdFromContext(context);
await renderWithNode({
nodeId,
Expand All @@ -231,7 +235,6 @@ describe('Expressions shared function tests', () => {
fetchLayouts: async () => layouts ?? getDefaultLayouts(),
fetchFormData,
fetchInstanceData,
...(process ? { fetchProcessState: async () => process } : {}),
...(frontendSettings ? { fetchApplicationSettings: async () => frontendSettings } : {}),
fetchUserProfile: async () => profile,
fetchTextResources: async () => ({
Expand Down
7 changes: 3 additions & 4 deletions src/features/instance/ProcessContext.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,6 @@ import { skipToken, useQuery, useQueryClient } from '@tanstack/react-query';
import { createStore } from 'zustand';
import type { QueryClient } from '@tanstack/react-query';

import { useAppQueries } from 'src/core/contexts/AppQueriesProvider';
import { ContextNotProvided } from 'src/core/contexts/context';
import { createZustandContext } from 'src/core/contexts/zustandContext';
import { DisplayError } from 'src/core/errorHandling/DisplayError';
Expand All @@ -14,6 +13,7 @@ import { useApplicationMetadata } from 'src/features/applicationMetadata/Applica
import { useLayoutSets } from 'src/features/form/layoutSets/LayoutSetsProvider';
import { useNavigationParam } from 'src/features/routing/AppRoutingContext';
import { TaskKeys, useNavigatePage } from 'src/hooks/useNavigatePage';
import { fetchProcessState } from 'src/queries/queries';
import { ProcessTaskType } from 'src/types';
import { behavesLikeDataTask } from 'src/utils/formLayout';
import type { QueryDefinition } from 'src/core/queries/usePrefetchQuery';
Expand Down Expand Up @@ -52,8 +52,7 @@ const { Provider, useSelector, useLaxSelector, useHasProvider } = createZustandC
export const useHasProcessProvider = () => useHasProvider();

// Also used for prefetching @see appPrefetcher.ts
export function useProcessQueryDef(instanceId?: string): QueryDefinition<IProcess> {
const { fetchProcessState } = useAppQueries();
export function getProcessQueryDef(instanceId?: string): QueryDefinition<IProcess> {
return {
queryKey: ['fetchProcessState', instanceId],
queryFn: instanceId ? () => fetchProcessState(instanceId) : skipToken,
Expand All @@ -62,7 +61,7 @@ export function useProcessQueryDef(instanceId?: string): QueryDefinition<IProces
}

function useProcessQuery(instanceId: string) {
const utils = useQuery<IProcess, HttpClientError>(useProcessQueryDef(instanceId));
const utils = useQuery<IProcess, HttpClientError>(getProcessQueryDef(instanceId));

useEffect(() => {
utils.error && window.logError('Fetching process state failed:\n', utils.error);
Expand Down
20 changes: 12 additions & 8 deletions src/features/processEnd/confirm/containers/ConfirmPage.test.tsx
Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@
import React from 'react';

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

Expand All @@ -8,6 +9,7 @@ import { getInstanceDataMock } from 'src/__mocks__/getInstanceDataMock';
import { getPartyMock, getPartyWithSubunitMock } from 'src/__mocks__/getPartyMock';
import { getProcessDataMock } from 'src/__mocks__/getProcessDataMock';
import { ConfirmPage, type IConfirmPageProps } from 'src/features/processEnd/confirm/containers/ConfirmPage';
import { fetchProcessState } from 'src/queries/queries';
import { renderWithInstanceAndLayout } from 'src/test/renderWithProviders';

jest.mock('react-helmet-async');
Expand Down Expand Up @@ -69,16 +71,18 @@ describe('ConfirmPage', () => {
});

it('should show loading when clicking submit', async () => {
(fetchProcessState as jest.Mock<typeof fetchProcessState>).mockImplementation(() =>
Promise.resolve(
getProcessDataMock((p) => {
p.currentTask!.actions = {
confirm: true,
};
}),
),
);

const { mutations } = await renderWithInstanceAndLayout({
renderer: () => <ConfirmPage {...props} />,
queries: {
fetchProcessState: async () =>
getProcessDataMock((p) => {
p.currentTask!.actions = {
confirm: true,
};
}),
},
});

const submitBtnText = /send inn/i;
Expand Down
16 changes: 10 additions & 6 deletions src/features/receipt/ReceiptContainer.test.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -10,7 +10,7 @@ import { InstanceProvider } from 'src/features/instance/InstanceContext';
import { staticUseLanguageForTests } from 'src/features/language/useLanguage';
import { getSummaryDataObject, ReceiptContainer } from 'src/features/receipt/ReceiptContainer';
import { TaskKeys } from 'src/hooks/useNavigatePage';
import { fetchApplicationMetadata } from 'src/queries/queries';
import { fetchApplicationMetadata, fetchProcessState } from 'src/queries/queries';
import { InstanceRouter, renderWithoutInstanceAndLayout } from 'src/test/renderWithProviders';
import { PartyType } from 'src/types/shared';
import type { SummaryDataObject } from 'src/components/table/AltinnSummaryTable';
Expand Down Expand Up @@ -86,6 +86,15 @@ const render = async ({ autoDeleteOnProcessEnd = false, hasPdf = true }: IRender
}),
),
);
(fetchProcessState as jest.Mock<typeof fetchProcessState>).mockImplementation(() =>
Promise.resolve(
getProcessDataMock((p) => {
p.currentTask = undefined;
p.ended = '2022-02-05T09:19:32.8858042Z';
}),
),
);

return await renderWithoutInstanceAndLayout({
renderer: () => (
<InstanceProvider>
Expand Down Expand Up @@ -118,11 +127,6 @@ const render = async ({ autoDeleteOnProcessEnd = false, hasPdf = true }: IRender
},
}),
fetchInstanceData: async () => buildInstance(hasPdf),
fetchProcessState: async () =>
getProcessDataMock((p) => {
p.currentTask = undefined;
p.ended = '2022-02-05T09:19:32.8858042Z';
}),
fetchFormData: async () => ({}),
},
});
Expand Down
79 changes: 41 additions & 38 deletions src/layout/CustomButton/CustomButtonComponent.test.tsx
Original file line number Diff line number Diff line change
@@ -1,8 +1,10 @@
import React from 'react';

import { screen } from '@testing-library/react';
import type { jest } from '@jest/globals';

import { CustomButtonComponent } from 'src/layout/CustomButton/CustomButtonComponent';
import { fetchProcessState } from 'src/queries/queries';
import { renderGenericComponentTest } from 'src/test/renderWithProviders';
import type { CustomAction } from 'src/layout/CustomButton/config.generated';
import type { IUserAction } from 'src/types/shared';
Expand Down Expand Up @@ -123,6 +125,45 @@ type RenderProps = {
};

async function render({ actions, actionAuthorization }: RenderProps = { actionAuthorization: [] }) {
(fetchProcessState as jest.Mock<typeof fetchProcessState>).mockImplementation(() =>
Promise.resolve({
started: '2024-01-03T06:52:49.716640678Z',
ended: null,
endEvent: null,
startEvent: '2024-01-03T06:52:49.716640678Z',
currentTask: {
userActions: [
{
id: 'read',
authorized: true,
type: 'ProcessAction',
},
{
id: 'write',
authorized: true,
type: 'ProcessAction',
},
{
id: 'complete',
authorized: false,
type: 'ProcessAction',
},
...(actionAuthorization ?? []),
],
read: true,
write: true,
flow: 2,
started: '2024-01-03T06:37:22.7573522Z',
elementId: 'Task_1',
name: 'Utfylling',
altinnTaskType: 'data',
ended: null,
validated: null,
flowType: 'CompleteCurrentMoveToNext',
},
}),
);

await renderGenericComponentTest({
type: 'CustomButton',
renderer: (props) => <CustomButtonComponent {...props} />,
Expand All @@ -132,43 +173,5 @@ async function render({ actions, actionAuthorization }: RenderProps = { actionAu
},
actions,
},
queries: {
fetchProcessState: async () => ({
started: '2024-01-03T06:52:49.716640678Z',
ended: null,
endEvent: null,
startEvent: '2024-01-03T06:52:49.716640678Z',
currentTask: {
userActions: [
{
id: 'read',
authorized: true,
type: 'ProcessAction',
},
{
id: 'write',
authorized: true,
type: 'ProcessAction',
},
{
id: 'complete',
authorized: false,
type: 'ProcessAction',
},
...(actionAuthorization ?? []),
],
read: true,
write: true,
flow: 2,
started: '2024-01-03T06:37:22.7573522Z',
elementId: 'Task_1',
name: 'Utfylling',
altinnTaskType: 'data',
ended: null,
validated: null,
flowType: 'CompleteCurrentMoveToNext',
},
}),
},
});
}
4 changes: 2 additions & 2 deletions src/queries/appPrefetcher.ts
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,7 @@ import { getApplicationMetadataQueryDef } from 'src/features/applicationMetadata
import { useApplicationSettingsQueryDef } from 'src/features/applicationSettings/ApplicationSettingsProvider';
import { useLayoutSetsQueryDef } from 'src/features/form/layoutSets/LayoutSetsProvider';
import { useInstanceDataQueryDef } from 'src/features/instance/InstanceContext';
import { useProcessQueryDef } from 'src/features/instance/ProcessContext';
import { getProcessQueryDef } from 'src/features/instance/ProcessContext';
import { useOrgsQueryDef } from 'src/features/orgs/OrgsProvider';
import { useCurrentPartyQueryDef, usePartiesQueryDef } from 'src/features/party/PartiesProvider';
import { useProfileQueryDef } from 'src/features/profile/ProfileProvider';
Expand All @@ -29,7 +29,7 @@ export function AppPrefetcher() {
usePrefetchQuery(useCurrentPartyQueryDef(true), Boolean(partyId));

usePrefetchQuery(useInstanceDataQueryDef(false, partyId, instanceGuid));
usePrefetchQuery(useProcessQueryDef(instanceId));
usePrefetchQuery(getProcessQueryDef(instanceId));

return null;
}
2 changes: 1 addition & 1 deletion src/queries/types.ts
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
import type * as queries from 'src/queries/queries';

type IgnoredQueries = 'fetchApplicationMetadata' | 'fetchExternalApi';
type IgnoredQueries = 'fetchApplicationMetadata' | 'fetchExternalApi' | 'fetchProcessState';

export type AppQueriesContext = Omit<typeof queries, IgnoredQueries>;

Expand Down
4 changes: 3 additions & 1 deletion src/setupTests.ts
Original file line number Diff line number Diff line change
Expand Up @@ -10,7 +10,8 @@ import { jestPreviewConfigure } from 'jest-preview';
import { TextDecoder, TextEncoder } from 'util';

import { getIncomingApplicationMetadataMock } from 'src/__mocks__/getApplicationMetadataMock';
import type { fetchApplicationMetadata } from 'src/queries/queries';
import { getProcessDataMock } from 'src/__mocks__/getProcessDataMock';
import type { fetchApplicationMetadata, fetchProcessState } from 'src/queries/queries';
import type { AppQueries } from 'src/queries/types';

// Importing CSS for jest-preview to look nicer
Expand Down Expand Up @@ -92,4 +93,5 @@ jest.mock('src/queries/queries', () => ({
fetchApplicationMetadata: jest
.fn<typeof fetchApplicationMetadata>()
.mockImplementation(() => Promise.resolve(getIncomingApplicationMetadataMock())),
fetchProcessState: jest.fn<typeof fetchProcessState>(() => Promise.resolve(getProcessDataMock())),
}));
7 changes: 1 addition & 6 deletions src/test/allApps.ts
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,6 @@ import { v4 as uuidv4 } from 'uuid';
import type { JSONSchema7 } from 'json-schema';

import { getInstanceDataMock } from 'src/__mocks__/getInstanceDataMock';
import { getProcessDataMock } from 'src/__mocks__/getProcessDataMock';
import { MINIMUM_APPLICATION_VERSION } from 'src/features/applicationMetadata/minVersion';
import { cleanLayout } from 'src/features/form/layout/cleanLayout';
import { layoutSetIsDefault } from 'src/features/form/layoutSets/TypeGuards';
Expand All @@ -16,7 +15,7 @@ import type { IFormDynamics } from 'src/features/form/dynamics';
import type { ITextResourceResult } from 'src/features/language/textResources';
import type { ILayoutFile, ILayoutSet, ILayoutSets, ILayoutSettings } from 'src/layout/common.generated';
import type { ILayoutCollection } from 'src/layout/layout';
import type { IInstance, IProcess } from 'src/types/shared';
import type { IInstance } from 'src/types/shared';

export class ExternalApp {
private compat = false;
Expand Down Expand Up @@ -319,10 +318,6 @@ export class ExternalAppLayoutSet {
});
}

simulateProcess(): IProcess {
return getProcessDataMock();
}

simulateValidUrlHash(): string {
const instance = getInstanceDataMock();
const firstPage = this.getSettings().pages.order[0];
Expand Down
2 changes: 0 additions & 2 deletions src/test/renderWithProviders.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -20,7 +20,6 @@ import { orderDetailsResponsePayload } from 'src/__mocks__/getOrderDetailsPayloa
import { getOrgsMock } from 'src/__mocks__/getOrgsMock';
import { getPartyMock } from 'src/__mocks__/getPartyMock';
import { paymentResponsePayload } from 'src/__mocks__/getPaymentPayloadMock';
import { getProcessDataMock } from 'src/__mocks__/getProcessDataMock';
import { getProfileMock } from 'src/__mocks__/getProfileMock';
import { getTextResourcesMock } from 'src/__mocks__/getTextResourcesMock';
import { AppQueriesProvider } from 'src/core/contexts/AppQueriesProvider';
Expand Down Expand Up @@ -160,7 +159,6 @@ const defaultQueryMocks: AppQueries = {
fetchPostPlace: async () => ({ valid: true, result: 'OSLO' }),
fetchLayoutSettings: async () => ({ pages: { order: [] } }),
fetchLayouts: () => Promise.reject(new Error('fetchLayouts not mocked')),
fetchProcessState: async () => getProcessDataMock(),
fetchInstanceData: async () => getInstanceDataMock(),
fetchBackendValidations: async () => [],
fetchBackendValidationsForDataElement: async () => [],
Expand Down
2 changes: 1 addition & 1 deletion src/utils/layout/all.test.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -132,6 +132,7 @@ describe('All known layout sets should evaluate as a hierarchy', () => {
(fetchApplicationMetadata as jest.Mock<typeof fetchApplicationMetadata>).mockImplementation(() =>
Promise.resolve(set.app.getAppMetadata()),
);

await renderWithInstanceAndLayout({
renderer: () =>
env.parsed?.ALTINN_ALL_APPS_RENDER_COMPONENTS === 'true' ? <RenderAllComponents /> : <TestApp />,
Expand All @@ -142,7 +143,6 @@ describe('All known layout sets should evaluate as a hierarchy', () => {
fetchFormData: async () => set.getModel().simulateDataModel(),
fetchDataModelSchema: async () => set.getModel().getSchema(),
fetchInstanceData: async () => set.simulateInstance(),
fetchProcessState: async () => set.simulateProcess(),
fetchLayoutSchema: async () => layoutSchema as unknown as JSONSchema7,
fetchRuleHandler: async () => set.getRuleHandler(),
fetchDynamics: async () => set.getRuleConfiguration(),
Expand Down

0 comments on commit 85c68ba

Please sign in to comment.