From 246c924788a5322cb954a97b3c97f26585ac0db6 Mon Sep 17 00:00:00 2001 From: wrt95 Date: Mon, 27 Jan 2025 08:29:29 +0100 Subject: [PATCH 1/3] feat: create frontend mock endpoint for get codelists --- frontend/packages/shared/src/api/queries.ts | 37 +++++++++++++++++++ .../queries/useOrgLevelCodeListsQuery.ts | 12 ++++++ .../packages/shared/src/mocks/queriesMock.ts | 1 + .../packages/shared/src/types/QueryKey.ts | 1 + 4 files changed, 51 insertions(+) create mode 100644 frontend/packages/shared/src/hooks/queries/useOrgLevelCodeListsQuery.ts diff --git a/frontend/packages/shared/src/api/queries.ts b/frontend/packages/shared/src/api/queries.ts index 2911677abc3..7a0739d8981 100644 --- a/frontend/packages/shared/src/api/queries.ts +++ b/frontend/packages/shared/src/api/queries.ts @@ -98,6 +98,7 @@ import type { OptionListReferences } from 'app-shared/types/OptionListReferences import type { LayoutSetsModel } from '../types/api/dto/LayoutSetsModel'; import type { AccessPackageResource, PolicyAccessPackageAreaGroup } from 'app-shared/types/PolicyAccessPackages'; import type { DataType } from '../types/DataType'; +import type { CodeList } from '@studio/components'; export const getIsLoggedInWithAnsattporten = () => get<{ isLoggedIn: boolean }>(authStatusAnsattporten()); export const getMaskinportenScopes = (org: string, app: string) => get(availableMaskinportenScopesPath(org, app)); @@ -174,3 +175,39 @@ export const getProcessTaskType = (org: string, app: string, taskId: string) => // Contact Page export const fetchBelongsToGiteaOrg = () => get(belongsToOrg()); + +// Org level code lists + +const orgLevelCodeListsMock: CodeList[] = [ + [ + { + description: 'description1', + helpText: 'helpText1', + label: 'label1', + value: 'value1', + }, + { + description: 'description2', + helpText: 'helpText2', + label: 'label2', + value: true, + }, + ], + [ + { + description: 'description3', + helpText: 'helpText3', + label: 'label3', + value: 3, + }, + ], +]; +export const getOrgLevelCodeLists = async (): Promise => + // TODO: Replace with endpoint when it is ready in backend. + new Promise((resolve) => { + setTimeout(() => { + // Replace the two resolves to test with empty list + // resolve([]); + resolve(orgLevelCodeListsMock); + }, 1000); + }); diff --git a/frontend/packages/shared/src/hooks/queries/useOrgLevelCodeListsQuery.ts b/frontend/packages/shared/src/hooks/queries/useOrgLevelCodeListsQuery.ts new file mode 100644 index 00000000000..676eb2aaf88 --- /dev/null +++ b/frontend/packages/shared/src/hooks/queries/useOrgLevelCodeListsQuery.ts @@ -0,0 +1,12 @@ +import { useQuery } from '@tanstack/react-query'; +import { QueryKey } from 'app-shared/types/QueryKey'; +import { useServicesContext } from 'app-shared/contexts/ServicesContext'; +import type { CodeList } from '@studio/components'; + +export const useOrgLevelCodeListsQuery = () => { + const { getOrgLevelCodeLists } = useServicesContext(); + return useQuery({ + queryKey: [QueryKey.OrgLevelCodeLists], + queryFn: () => getOrgLevelCodeLists(), + }); +}; diff --git a/frontend/packages/shared/src/mocks/queriesMock.ts b/frontend/packages/shared/src/mocks/queriesMock.ts index 946c52133cc..ca7986d7481 100644 --- a/frontend/packages/shared/src/mocks/queriesMock.ts +++ b/frontend/packages/shared/src/mocks/queriesMock.ts @@ -77,6 +77,7 @@ import type { OptionListsResponse } from 'app-shared/types/api/OptionListsRespon export const queriesMock: ServicesContextProps = { // Queries + getOrgLevelCodeLists: jest.fn().mockImplementation(() => Promise.resolve([])), getAppMetadataModelIds: jest.fn().mockImplementation(() => Promise.resolve([])), getAppReleases: jest .fn() diff --git a/frontend/packages/shared/src/types/QueryKey.ts b/frontend/packages/shared/src/types/QueryKey.ts index c5562fc0bc5..3ab40e1b907 100644 --- a/frontend/packages/shared/src/types/QueryKey.ts +++ b/frontend/packages/shared/src/types/QueryKey.ts @@ -49,6 +49,7 @@ export enum QueryKey { AppScopes = 'AppScopes', SelectedAppScopes = 'SelectedAppScopes', DataType = 'DataType', + OrgLevelCodeLists = 'OrgLevelCodeLists', // Resourceadm ResourceList = 'ResourceList', From a064d1ef91ffef967f13ec9507b36a62f4f2d5f4 Mon Sep 17 00:00:00 2001 From: wrt95 Date: Mon, 27 Jan 2025 14:08:42 +0100 Subject: [PATCH 2/3] adding test --- .../queries/useOrgLevelCodeListsQuery.test.ts | 18 ++++++++++++++++++ 1 file changed, 18 insertions(+) create mode 100644 frontend/packages/shared/src/hooks/queries/useOrgLevelCodeListsQuery.test.ts diff --git a/frontend/packages/shared/src/hooks/queries/useOrgLevelCodeListsQuery.test.ts b/frontend/packages/shared/src/hooks/queries/useOrgLevelCodeListsQuery.test.ts new file mode 100644 index 00000000000..e33ae44ff1d --- /dev/null +++ b/frontend/packages/shared/src/hooks/queries/useOrgLevelCodeListsQuery.test.ts @@ -0,0 +1,18 @@ +import { queriesMock } from 'app-shared/mocks/queriesMock'; +import { renderHookWithProviders } from 'app-shared/mocks/renderHookWithProviders'; +import { waitFor } from '@testing-library/react'; +import { useOrgLevelCodeListsQuery } from './useOrgLevelCodeListsQuery'; + +describe('useOrgLevelCodeListsQuery', () => { + it('calls getOptionListsReferences with the correct parameters', () => { + render(); + expect(queriesMock.getOrgLevelCodeLists).toHaveBeenCalledWith(); + expect(queriesMock.getOrgLevelCodeLists).toHaveBeenCalledTimes(1); + }); +}); + +const render = async () => { + const { result } = renderHookWithProviders(() => useOrgLevelCodeListsQuery()); + await waitFor(() => expect(result.current.isSuccess).toBe(true)); + return result; +}; From 6b89cc1fae0ce601f99a22b0a5b82fabd7b3755c Mon Sep 17 00:00:00 2001 From: wrt95 Date: Mon, 27 Jan 2025 16:09:41 +0100 Subject: [PATCH 3/3] refactor --- frontend/packages/shared/src/api/queries.ts | 36 +++++++++---------- .../queries/useOrgLevelCodeListsQuery.test.ts | 2 +- .../queries/useOrgLevelCodeListsQuery.ts | 4 +-- 3 files changed, 19 insertions(+), 23 deletions(-) diff --git a/frontend/packages/shared/src/api/queries.ts b/frontend/packages/shared/src/api/queries.ts index 7a0739d8981..93af10afec8 100644 --- a/frontend/packages/shared/src/api/queries.ts +++ b/frontend/packages/shared/src/api/queries.ts @@ -98,7 +98,6 @@ import type { OptionListReferences } from 'app-shared/types/OptionListReferences import type { LayoutSetsModel } from '../types/api/dto/LayoutSetsModel'; import type { AccessPackageResource, PolicyAccessPackageAreaGroup } from 'app-shared/types/PolicyAccessPackages'; import type { DataType } from '../types/DataType'; -import type { CodeList } from '@studio/components'; export const getIsLoggedInWithAnsattporten = () => get<{ isLoggedIn: boolean }>(authStatusAnsattporten()); export const getMaskinportenScopes = (org: string, app: string) => get(availableMaskinportenScopesPath(org, app)); @@ -177,37 +176,34 @@ export const getProcessTaskType = (org: string, app: string, taskId: string) => export const fetchBelongsToGiteaOrg = () => get(belongsToOrg()); // Org level code lists - -const orgLevelCodeListsMock: CodeList[] = [ +const orgLevelCodeListsMock: OptionListsResponse[] = [ [ { - description: 'description1', - helpText: 'helpText1', - label: 'label1', - value: 'value1', + title: 'title1', + data: [ + { label: 'label1', value: 'value1' }, + { label: 'label2', value: 'value2' }, + ], + hasError: false, }, { - description: 'description2', - helpText: 'helpText2', - label: 'label2', - value: true, + title: 'title2', + data: [], + hasError: false, }, ], [ { - description: 'description3', - helpText: 'helpText3', - label: 'label3', - value: 3, + title: 'title3', + data: [], + hasError: false, }, ], ]; -export const getOrgLevelCodeLists = async (): Promise => - // TODO: Replace with endpoint when it is ready in backend. +export const getOrgLevelCodeLists = async (org: string): Promise => + // TODO: Replace with endpoint when it is ready in backend. https://github.com/Altinn/altinn-studio/issues/14482 new Promise((resolve) => { setTimeout(() => { - // Replace the two resolves to test with empty list - // resolve([]); resolve(orgLevelCodeListsMock); - }, 1000); + }, 200); }); diff --git a/frontend/packages/shared/src/hooks/queries/useOrgLevelCodeListsQuery.test.ts b/frontend/packages/shared/src/hooks/queries/useOrgLevelCodeListsQuery.test.ts index e33ae44ff1d..2420631dc0f 100644 --- a/frontend/packages/shared/src/hooks/queries/useOrgLevelCodeListsQuery.test.ts +++ b/frontend/packages/shared/src/hooks/queries/useOrgLevelCodeListsQuery.test.ts @@ -4,7 +4,7 @@ import { waitFor } from '@testing-library/react'; import { useOrgLevelCodeListsQuery } from './useOrgLevelCodeListsQuery'; describe('useOrgLevelCodeListsQuery', () => { - it('calls getOptionListsReferences with the correct parameters', () => { + it('calls getOrgLevelCodeLists with the correct parameters', () => { render(); expect(queriesMock.getOrgLevelCodeLists).toHaveBeenCalledWith(); expect(queriesMock.getOrgLevelCodeLists).toHaveBeenCalledTimes(1); diff --git a/frontend/packages/shared/src/hooks/queries/useOrgLevelCodeListsQuery.ts b/frontend/packages/shared/src/hooks/queries/useOrgLevelCodeListsQuery.ts index 676eb2aaf88..0273639932e 100644 --- a/frontend/packages/shared/src/hooks/queries/useOrgLevelCodeListsQuery.ts +++ b/frontend/packages/shared/src/hooks/queries/useOrgLevelCodeListsQuery.ts @@ -1,11 +1,11 @@ import { useQuery } from '@tanstack/react-query'; import { QueryKey } from 'app-shared/types/QueryKey'; import { useServicesContext } from 'app-shared/contexts/ServicesContext'; -import type { CodeList } from '@studio/components'; +import type { OptionListsResponse } from 'app-shared/types/api/OptionListsResponse'; export const useOrgLevelCodeListsQuery = () => { const { getOrgLevelCodeLists } = useServicesContext(); - return useQuery({ + return useQuery({ queryKey: [QueryKey.OrgLevelCodeLists], queryFn: () => getOrgLevelCodeLists(), });