From 8a745f3f32b8bac0f94de77eda5d6df38657cd01 Mon Sep 17 00:00:00 2001 From: Tilman Vatteroth Date: Thu, 7 Sep 2023 20:56:04 +0200 Subject: [PATCH] fix: improve deep partial type used in tests The deep partial type from redux had the problem that it could only be applied to records. This caused problems with primitive types and arrays. Signed-off-by: Tilman Vatteroth --- commons/src/utils/deep-partial.ts | 13 +++++++++++++ commons/src/utils/index.ts | 1 + frontend/src/test-utils/mock-app-state.ts | 5 ++--- frontend/src/test-utils/mock-note-permissions.ts | 8 +++----- 4 files changed, 19 insertions(+), 8 deletions(-) create mode 100644 commons/src/utils/deep-partial.ts diff --git a/commons/src/utils/deep-partial.ts b/commons/src/utils/deep-partial.ts new file mode 100644 index 000000000..e076087a7 --- /dev/null +++ b/commons/src/utils/deep-partial.ts @@ -0,0 +1,13 @@ +/* + * SPDX-FileCopyrightText: 2023 The HedgeDoc developers (see AUTHORS file) + * + * SPDX-License-Identifier: AGPL-3.0-only + */ + +export type DeepPartial = T extends null | undefined + ? T + : T extends Array + ? Array> + : T extends Record + ? { [P in keyof T]?: DeepPartial } + : T diff --git a/commons/src/utils/index.ts b/commons/src/utils/index.ts index 8c5efc05d..de8f49526 100644 --- a/commons/src/utils/index.ts +++ b/commons/src/utils/index.ts @@ -5,3 +5,4 @@ */ export * from './wait-for-other-promises-to-finish.js' +export type { DeepPartial } from './deep-partial.js' diff --git a/frontend/src/test-utils/mock-app-state.ts b/frontend/src/test-utils/mock-app-state.ts index 38df25b51..729c7afb8 100644 --- a/frontend/src/test-utils/mock-app-state.ts +++ b/frontend/src/test-utils/mock-app-state.ts @@ -5,7 +5,6 @@ */ import * as useApplicationStateModule from '../hooks/common/use-application-state' import type { ApplicationState } from '../redux/application-state' -import type { DeepPartial } from 'redux' import { initialState as initialStateDarkMode } from '../redux/dark-mode/reducers' import { initialState as initialStateEditorConfig } from '../redux/editor/reducers' import { initialState as initialStateNoteDetails } from '../redux/note-details/initial-state' @@ -13,7 +12,7 @@ import { initialState as initialStateRealtimeStatus } from '../redux/realtime/re import { initialState as initialStateRendererStatus } from '../redux/renderer-status/reducers' import type { NoteDetails } from '../redux/note-details/types/note-details' import type { RealtimeStatus } from '../redux/realtime/types' -import type { HistoryEntryWithOrigin } from '../api/history/types' +import type { DeepPartial } from '@hedgedoc/commons' jest.mock('../redux/editor/methods', () => ({ loadFromLocalStorage: jest.fn().mockReturnValue(undefined) @@ -37,7 +36,7 @@ export const mockAppState = (state?: DeepPartial) => { ...initialStateEditorConfig, ...state?.editorConfig }, - history: (state?.history ?? []) as HistoryEntryWithOrigin[], + history: state?.history ?? [], noteDetails: { ...initialStateNoteDetails, ...state?.noteDetails diff --git a/frontend/src/test-utils/mock-note-permissions.ts b/frontend/src/test-utils/mock-note-permissions.ts index df9be71de..4ca09453b 100644 --- a/frontend/src/test-utils/mock-note-permissions.ts +++ b/frontend/src/test-utils/mock-note-permissions.ts @@ -4,10 +4,8 @@ * SPDX-License-Identifier: AGPL-3.0-only */ import type { ApplicationState } from '../redux/application-state' -import type { DeepPartial } from 'redux' import { mockAppState } from './mock-app-state' -import type { LoginUserInfo } from '../api/me/types' -import type { NotePermissions } from '@hedgedoc/commons' +import type { DeepPartial, NotePermissions } from '@hedgedoc/commons' /** * Mocks the {@link NotePermissions} field of a note in the {@link ApplicationState }for a test. @@ -38,6 +36,6 @@ export const mockNotePermissions = ( user: { ...additionalState?.user, username: ownUsername - } as LoginUserInfo - }) + } + } as DeepPartial) }