From 03fd1fe50eddc5324311d655dcee1b96c6d9abdd Mon Sep 17 00:00:00 2001 From: Anthony LC Date: Tue, 24 Mar 2026 16:48:40 +0100 Subject: [PATCH] =?UTF-8?q?=E2=9C=85(frontend)=20fix=20vitest=20tests?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit We upgraded vitest recently, we need to adapt some of our tests to the new version. We brought some modules improvments as well, problemes that was highlighted by the new version of vitest. --- src/frontend/apps/impress/package.json | 1 - .../docs/doc-editor/hook/useSaveDoc.tsx | 2 +- .../doc-export/__tests__/ExportMIT.test.tsx | 9 +++++-- .../__tests__/DocToolBoxLicence.spec.tsx | 14 +++------- .../docs/doc-header/components/DocToolBox.tsx | 15 +---------- .../hooks/useCopyCurrentEditorToClipboard.tsx | 6 ++--- .../docs/doc-management/api/useUpdateDoc.tsx | 2 +- .../__tests__/useDocTitleUpdate.test.tsx | 5 ++++ .../components/DocVersionEditor.tsx | 7 +++-- .../src/features/docs/doc-versioning/types.ts | 2 +- .../__tests__/DocsGridItemDate.test.tsx | 10 ++++--- .../service-worker/__tests__/DocsDB.test.tsx | 22 ++++++--------- src/frontend/apps/impress/vitest.config.ts | 12 +++------ src/frontend/package.json | 2 +- src/frontend/yarn.lock | 27 +++---------------- 15 files changed, 51 insertions(+), 85 deletions(-) diff --git a/src/frontend/apps/impress/package.json b/src/frontend/apps/impress/package.json index ea1ab6d84..38fef7a6e 100644 --- a/src/frontend/apps/impress/package.json +++ b/src/frontend/apps/impress/package.json @@ -106,7 +106,6 @@ "stylelint-config-standard": "39.0.1", "stylelint-prettier": "5.0.3", "typescript": "*", - "vite-tsconfig-paths": "6.1.1", "vitest": "4.1.0", "webpack": "5.105.4", "workbox-webpack-plugin": "7.1.0" diff --git a/src/frontend/apps/impress/src/features/docs/doc-editor/hook/useSaveDoc.tsx b/src/frontend/apps/impress/src/features/docs/doc-editor/hook/useSaveDoc.tsx index 5d949fe71..1954c0b7a 100644 --- a/src/frontend/apps/impress/src/features/docs/doc-editor/hook/useSaveDoc.tsx +++ b/src/frontend/apps/impress/src/features/docs/doc-editor/hook/useSaveDoc.tsx @@ -3,7 +3,7 @@ import { useCallback, useEffect, useState } from 'react'; import * as Y from 'yjs'; import { useUpdateDoc } from '@/docs/doc-management/'; -import { KEY_LIST_DOC_VERSIONS } from '@/docs/doc-versioning'; +import { KEY_LIST_DOC_VERSIONS } from '@/docs/doc-versioning/api/useDocVersions'; import { toBase64 } from '@/utils/string'; import { isFirefox } from '@/utils/userAgent'; diff --git a/src/frontend/apps/impress/src/features/docs/doc-export/__tests__/ExportMIT.test.tsx b/src/frontend/apps/impress/src/features/docs/doc-export/__tests__/ExportMIT.test.tsx index 9ae3e7312..3e5f3c3c0 100644 --- a/src/frontend/apps/impress/src/features/docs/doc-export/__tests__/ExportMIT.test.tsx +++ b/src/frontend/apps/impress/src/features/docs/doc-export/__tests__/ExportMIT.test.tsx @@ -1,4 +1,9 @@ import { afterAll, afterEach, describe, expect, it, vi } from 'vitest'; + +vi.mock('@/docs/doc-export/components/ModalExport', () => ({ + ModalExport: vi.fn(), +})); + const originalEnv = process.env.NEXT_PUBLIC_PUBLISH_AS_MIT; describe('useModuleExport', () => { @@ -16,12 +21,12 @@ describe('useModuleExport', () => { const Export = await import('@/features/docs/doc-export/'); expect(Export.default).toBeUndefined(); - }, 15000); + }); it('should load modules when NEXT_PUBLIC_PUBLISH_AS_MIT is false', async () => { process.env.NEXT_PUBLIC_PUBLISH_AS_MIT = 'false'; const Export = await import('@/features/docs/doc-export/'); expect(Export.default).toHaveProperty('ModalExport'); - }, 15000); + }); }); diff --git a/src/frontend/apps/impress/src/features/docs/doc-header/__tests__/DocToolBoxLicence.spec.tsx b/src/frontend/apps/impress/src/features/docs/doc-header/__tests__/DocToolBoxLicence.spec.tsx index 48ec7b753..e0e693d31 100644 --- a/src/frontend/apps/impress/src/features/docs/doc-header/__tests__/DocToolBoxLicence.spec.tsx +++ b/src/frontend/apps/impress/src/features/docs/doc-header/__tests__/DocToolBoxLicence.spec.tsx @@ -1,6 +1,4 @@ import { render, screen } from '@testing-library/react'; -import userEvent from '@testing-library/user-event'; -import React from 'react'; import { afterAll, beforeEach, describe, expect, vi } from 'vitest'; import { AppWrapper } from '@/tests/utils'; @@ -40,17 +38,11 @@ describe('DocToolBox - Licence', () => { render(, { wrapper: AppWrapper, }); - const optionsButton = await screen.findByLabelText('Export the document'); - await userEvent.click(optionsButton); - // Wait for the export modal to be visible, then assert on its content text. - await screen.findByTestId('modal-export-title'); expect( - screen.getByText( - 'Export your document to print or download in .docx, .odt, .pdf or .html(zip) format.', - ), + await screen.findByLabelText('Export the document'), ).toBeInTheDocument(); - }, 10000); + }, 15000); test('The export button is not rendered when MIT version is activated', async () => { process.env.NEXT_PUBLIC_PUBLISH_AS_MIT = 'true'; @@ -68,5 +60,5 @@ describe('DocToolBox - Licence', () => { expect( screen.queryByLabelText('Export the document'), ).not.toBeInTheDocument(); - }); + }, 15000); }); diff --git a/src/frontend/apps/impress/src/features/docs/doc-header/components/DocToolBox.tsx b/src/frontend/apps/impress/src/features/docs/doc-header/components/DocToolBox.tsx index 2b9eff396..33f19bb2c 100644 --- a/src/frontend/apps/impress/src/features/docs/doc-header/components/DocToolBox.tsx +++ b/src/frontend/apps/impress/src/features/docs/doc-header/components/DocToolBox.tsx @@ -1,9 +1,8 @@ import { Button, useModal } from '@gouvfr-lasuite/cunningham-react'; import { useTreeContext } from '@gouvfr-lasuite/ui-kit'; -import { useQueryClient } from '@tanstack/react-query'; import dynamic from 'next/dynamic'; import { useRouter } from 'next/router'; -import { useEffect, useState } from 'react'; +import { useState } from 'react'; import { useTranslation } from 'react-i18next'; import { css } from 'styled-components'; @@ -39,7 +38,6 @@ import { useDocUtils, useDuplicateDoc, } from '@/docs/doc-management'; -import { KEY_LIST_DOC_VERSIONS } from '@/docs/doc-versioning'; import { useFocusStore, useResponsiveStore } from '@/stores'; import { useCopyCurrentEditorToClipboard } from '../hooks/useCopyCurrentEditorToClipboard'; @@ -88,7 +86,6 @@ interface DocToolBoxProps { export const DocToolBox = ({ doc }: DocToolBoxProps) => { const { t } = useTranslation(); const treeContext = useTreeContext(); - const queryClient = useQueryClient(); const router = useRouter(); const { isChild, isTopRoot } = useDocUtils(doc); @@ -114,16 +111,6 @@ export const DocToolBox = ({ doc }: DocToolBoxProps) => { listInvalidQueries: [KEY_LIST_DOC, KEY_DOC, KEY_LIST_FAVORITE_DOC], }); - useEffect(() => { - if (selectHistoryModal.isOpen) { - return; - } - - void queryClient.resetQueries({ - queryKey: [KEY_LIST_DOC_VERSIONS], - }); - }, [selectHistoryModal.isOpen, queryClient]); - // Emoji Management const { emoji } = getEmojiAndTitle(doc.title ?? ''); const { updateDocEmoji } = useDocTitleUpdate(); diff --git a/src/frontend/apps/impress/src/features/docs/doc-header/hooks/useCopyCurrentEditorToClipboard.tsx b/src/frontend/apps/impress/src/features/docs/doc-header/hooks/useCopyCurrentEditorToClipboard.tsx index d0a745b77..e1c25c0f4 100644 --- a/src/frontend/apps/impress/src/features/docs/doc-header/hooks/useCopyCurrentEditorToClipboard.tsx +++ b/src/frontend/apps/impress/src/features/docs/doc-header/hooks/useCopyCurrentEditorToClipboard.tsx @@ -4,7 +4,7 @@ import { } from '@gouvfr-lasuite/cunningham-react'; import { useTranslation } from 'react-i18next'; -import { useEditorStore } from '../../doc-editor'; +import { useEditorStore } from '@/docs/doc-editor/stores/useEditorStore'; export const useCopyCurrentEditorToClipboard = () => { const { editor } = useEditorStore(); @@ -21,8 +21,8 @@ export const useCopyCurrentEditorToClipboard = () => { try { const editorContentFormatted = asFormat === 'html' - ? await editor.blocksToHTMLLossy() - : await editor.blocksToMarkdownLossy(); + ? editor.blocksToHTMLLossy() + : editor.blocksToMarkdownLossy(); await navigator.clipboard.writeText(editorContentFormatted); const successMessage = asFormat === 'markdown' diff --git a/src/frontend/apps/impress/src/features/docs/doc-management/api/useUpdateDoc.tsx b/src/frontend/apps/impress/src/features/docs/doc-management/api/useUpdateDoc.tsx index aded223db..b18c5ac94 100644 --- a/src/frontend/apps/impress/src/features/docs/doc-management/api/useUpdateDoc.tsx +++ b/src/frontend/apps/impress/src/features/docs/doc-management/api/useUpdateDoc.tsx @@ -44,7 +44,7 @@ export function useUpdateDoc(queryConfig?: UseUpdateDoc) { ...queryConfig, onSuccess: (data, variables, onMutateResult, context) => { queryConfig?.listInvalidQueries?.forEach((queryKey) => { - void queryClient.invalidateQueries({ + void queryClient.resetQueries({ queryKey: [queryKey], }); }); diff --git a/src/frontend/apps/impress/src/features/docs/doc-management/hooks/__tests__/useDocTitleUpdate.test.tsx b/src/frontend/apps/impress/src/features/docs/doc-management/hooks/__tests__/useDocTitleUpdate.test.tsx index cde76d95f..b6408d680 100644 --- a/src/frontend/apps/impress/src/features/docs/doc-management/hooks/__tests__/useDocTitleUpdate.test.tsx +++ b/src/frontend/apps/impress/src/features/docs/doc-management/hooks/__tests__/useDocTitleUpdate.test.tsx @@ -14,6 +14,11 @@ vi.mock('@/stores', () => ({ }), })); +vi.mock('@gouvfr-lasuite/ui-kit', async () => ({ + ...(await vi.importActual('@gouvfr-lasuite/ui-kit')), + useTreeContext: () => null, +})); + describe('useDocTitleUpdate', () => { beforeEach(() => { vi.clearAllMocks(); diff --git a/src/frontend/apps/impress/src/features/docs/doc-versioning/components/DocVersionEditor.tsx b/src/frontend/apps/impress/src/features/docs/doc-versioning/components/DocVersionEditor.tsx index 68984f922..e04102a57 100644 --- a/src/frontend/apps/impress/src/features/docs/doc-versioning/components/DocVersionEditor.tsx +++ b/src/frontend/apps/impress/src/features/docs/doc-versioning/components/DocVersionEditor.tsx @@ -4,9 +4,12 @@ import { useEffect, useState } from 'react'; import * as Y from 'yjs'; import { Box, Text, TextErrors } from '@/components'; -import { BlockNoteReader, DocEditorContainer } from '@/docs/doc-editor/'; +import { BlockNoteReader } from '@/docs/doc-editor/components/BlockNoteEditor'; +import { DocEditorContainer } from '@/docs/doc-editor/components/DocEditor'; import { Doc, base64ToBlocknoteXmlFragment } from '@/docs/doc-management'; -import { Versions, useDocVersion } from '@/docs/doc-versioning/'; + +import { useDocVersion } from '../api/useDocVersion'; +import { Versions } from '../types'; import { DocVersionHeader } from './DocVersionHeader'; diff --git a/src/frontend/apps/impress/src/features/docs/doc-versioning/types.ts b/src/frontend/apps/impress/src/features/docs/doc-versioning/types.ts index 5affe7b07..9d71474bb 100644 --- a/src/frontend/apps/impress/src/features/docs/doc-versioning/types.ts +++ b/src/frontend/apps/impress/src/features/docs/doc-versioning/types.ts @@ -1,4 +1,4 @@ -import { Doc } from '../doc-management'; +import { Doc } from '../doc-management/types'; export interface APIListVersions { count: number; diff --git a/src/frontend/apps/impress/src/features/docs/docs-grid/components/__tests__/DocsGridItemDate.test.tsx b/src/frontend/apps/impress/src/features/docs/docs-grid/components/__tests__/DocsGridItemDate.test.tsx index 22efaae72..8c1d6d42e 100644 --- a/src/frontend/apps/impress/src/features/docs/docs-grid/components/__tests__/DocsGridItemDate.test.tsx +++ b/src/frontend/apps/impress/src/features/docs/docs-grid/components/__tests__/DocsGridItemDate.test.tsx @@ -1,4 +1,4 @@ -import { render, screen, waitFor } from '@testing-library/react'; +import { act, render, screen, waitFor } from '@testing-library/react'; import fetchMock from 'fetch-mock'; import i18next from 'i18next'; import { DateTime } from 'luxon'; @@ -73,7 +73,9 @@ describe('DocsGridItemDate', () => { }); it(`should render rendered the updated_at field in the correct language`, async () => { - await i18next.changeLanguage('fr'); + await act(async () => { + await i18next.changeLanguage('fr'); + }); render( { expect(screen.getByText('il y a 5 jours')).toBeInTheDocument(); - await i18next.changeLanguage('en'); + await act(async () => { + await i18next.changeLanguage('en'); + }); }); [ diff --git a/src/frontend/apps/impress/src/features/service-worker/__tests__/DocsDB.test.tsx b/src/frontend/apps/impress/src/features/service-worker/__tests__/DocsDB.test.tsx index d815efb13..f3b1d8a1b 100644 --- a/src/frontend/apps/impress/src/features/service-worker/__tests__/DocsDB.test.tsx +++ b/src/frontend/apps/impress/src/features/service-worker/__tests__/DocsDB.test.tsx @@ -1,12 +1,7 @@ -import { afterEach, describe, expect, it, vi } from 'vitest'; - -vi.mock('@/../package.json', () => ({ - default: { version: '0.0.0' }, -})); +import { describe, expect, it, vi } from 'vitest'; describe('DocsDB', () => { - afterEach(() => { - vi.clearAllMocks(); + beforeEach(() => { vi.resetModules(); }); @@ -20,17 +15,16 @@ describe('DocsDB', () => { { version: '3.0.0', expected: 3000000 }, { version: '10.20.30', expected: 10020030 }, ].forEach(({ version, expected }) => { - it(`correctly computes version for ${version}`, () => { + it(`correctly computes version for ${version}`, async () => { vi.doMock('@/../package.json', () => ({ default: { version }, })); - return vi.importActual('../DocsDB').then((module: any) => { - const result = module.getCurrentVersion(); - expect(result).toBe(expected); - expect(result).toBeGreaterThan(previousExpected); - previousExpected = result; - }); + const module = await import('../DocsDB'); + const result = (module as any).getCurrentVersion(); + expect(result).toBe(expected); + expect(result).toBeGreaterThan(previousExpected); + previousExpected = result; }); }); }); diff --git a/src/frontend/apps/impress/vitest.config.ts b/src/frontend/apps/impress/vitest.config.ts index bfd70093e..9a06f4fa4 100644 --- a/src/frontend/apps/impress/vitest.config.ts +++ b/src/frontend/apps/impress/vitest.config.ts @@ -1,16 +1,9 @@ /// import react from '@vitejs/plugin-react'; -import tsconfigPaths from 'vite-tsconfig-paths'; import { defineConfig } from 'vitest/config'; export default defineConfig({ - plugins: [ - react(), - tsconfigPaths({ - root: '.', - projects: ['./tsconfig.json'], - }), - ], + plugins: [react()], test: { globals: true, environment: 'jsdom', @@ -22,4 +15,7 @@ export default defineConfig({ define: { 'process.env.NODE_ENV': 'test', }, + resolve: { + tsconfigPaths: true, + }, }); diff --git a/src/frontend/package.json b/src/frontend/package.json index d7f54f9a2..b8d197a5b 100644 --- a/src/frontend/package.json +++ b/src/frontend/package.json @@ -31,7 +31,7 @@ "server:test": "yarn COLLABORATION_SERVER run test" }, "resolutions": { - "@tiptap/extensions": "3.20.3", + "@tiptap/extensions": "3.19.0", "@types/node": "24.12.0", "@types/react": "19.2.14", "@types/react-dom": "19.2.3", diff --git a/src/frontend/yarn.lock b/src/frontend/yarn.lock index 3adfe8f40..dd8393371 100644 --- a/src/frontend/yarn.lock +++ b/src/frontend/yarn.lock @@ -7050,10 +7050,10 @@ resolved "https://registry.yarnpkg.com/@tiptap/extension-underline/-/extension-underline-3.14.0.tgz#7d9ac55419f353cdd3817b8f5d56a11e909b1251" integrity sha512-zmnWlsi2g/tMlThHby0Je9O+v24j4d+qcXF3nuzLUUaDsGCEtOyC9RzwITft59ViK+Nc2PD2W/J14rsB0j+qoQ== -"@tiptap/extensions@*", "@tiptap/extensions@3.20.3", "@tiptap/extensions@^3.13.0": - version "3.20.3" - resolved "https://registry.yarnpkg.com/@tiptap/extensions/-/extensions-3.20.3.tgz#d32b438d7de7fb120721ba884ebf7c39f11e4463" - integrity sha512-SqKzXnTrKK/MPyBdzEiC/UazXMCilIQXCl6fuaGkXFOfbYIs9ly9bD2ucgghhBq+khIRY6joNQndqbGi0U0OCA== +"@tiptap/extensions@*", "@tiptap/extensions@3.19.0", "@tiptap/extensions@^3.13.0": + version "3.19.0" + resolved "https://registry.yarnpkg.com/@tiptap/extensions/-/extensions-3.19.0.tgz#5747c0ebf460b9669e8b4362561872448f66abfe" + integrity sha512-ZmGUhLbMWaGqnJh2Bry+6V4M6gMpUDYo4D1xNux5Gng/E/eYtc+PMxMZ/6F7tNTAuujLBOQKj6D+4SsSm457jw== "@tiptap/pm@^3.13.0": version "3.14.0" @@ -11082,11 +11082,6 @@ globjoin@^0.1.4: resolved "https://registry.yarnpkg.com/globjoin/-/globjoin-0.1.4.tgz#2f4494ac8919e3767c5cbb691e9f463324285d43" integrity sha512-xYfnw62CKG8nLkZBfWbhWwDw02CHty86jfPcc2cr3ZfeuK9ysoVPPEUxf21bAD/rWAgk52SuBrLJlefNy8mvFg== -globrex@^0.1.2: - version "0.1.2" - resolved "https://registry.yarnpkg.com/globrex/-/globrex-0.1.2.tgz#dd5d9ec826232730cd6793a5e33a9302985e6098" - integrity sha512-uHJgbwAMwNFf5mLst7IWLNg14x1CkeqglJb/K3doi4dw6q2IvAAmM/Y81kevy83wP+Sst+nutFTYOGg3d1lsxg== - gopd@^1.0.1, gopd@^1.2.0: version "1.2.0" resolved "https://registry.yarnpkg.com/gopd/-/gopd-1.2.0.tgz#89f56b8217bdbc8802bd299df6d7f1081d7e51a1" @@ -16708,11 +16703,6 @@ tsc-alias@1.8.16: normalize-path "^3.0.0" plimit-lit "^1.2.6" -tsconfck@^3.0.3: - version "3.1.6" - resolved "https://registry.yarnpkg.com/tsconfck/-/tsconfck-3.1.6.tgz#da1f0b10d82237ac23422374b3fce1edb23c3ead" - integrity sha512-ks6Vjr/jEw0P1gmOVwutM3B7fWxoWBL2KRDb1JfqGVawBmO5UsvmWOQFGHBPl5yxYz4eERr19E6L7NMv+Fej4w== - tsconfig-paths@^3.15.0: version "3.15.0" resolved "https://registry.yarnpkg.com/tsconfig-paths/-/tsconfig-paths-3.15.0.tgz#5299ec605e55b1abb23ec939ef15edaf483070d4" @@ -17216,15 +17206,6 @@ vite-compatible-readable-stream@^3.6.1: string_decoder "^1.1.1" util-deprecate "^1.0.1" -vite-tsconfig-paths@6.1.1: - version "6.1.1" - resolved "https://registry.yarnpkg.com/vite-tsconfig-paths/-/vite-tsconfig-paths-6.1.1.tgz#d5c28cba79c89ebf76489ef1040024b21df6da3a" - integrity sha512-2cihq7zliibCCZ8P9cKJrQBkfgdvcFkOOc3Y02o3GWUDLgqjWsZudaoiuOwO/gzTzy17cS5F7ZPo4bsnS4DGkg== - dependencies: - debug "^4.1.1" - globrex "^0.1.2" - tsconfck "^3.0.3" - "vite@^6.0.0 || ^7.0.0 || ^8.0.0-0": version "8.0.2" resolved "https://registry.yarnpkg.com/vite/-/vite-8.0.2.tgz#fcee428eb0ad3d4aa9843d7f7ba981679bbe5edc"