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 ea1ab6d8..38fef7a6 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 5d949fe7..1954c0b7 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 9ae3e731..3e5f3c3c 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 48ec7b75..e0e693d3 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 2b9eff39..33f19bb2 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 d0a745b7..e1c25c0f 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 aded223d..b18c5ac9 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 cde76d95..b6408d68 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 68984f92..e04102a5 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 5affe7b0..9d71474b 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 22efaae7..8c1d6d42 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 d815efb1..f3b1d8a1 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 bfd70093..9a06f4fa 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 d7f54f9a..b8d197a5 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 3adfe8f4..dd839337 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"