From c4b1214fc0a1039d015e141b9b349316cafcd65d Mon Sep 17 00:00:00 2001 From: JulienChampagnol Date: Fri, 19 Dec 2025 11:56:40 +0100 Subject: [PATCH 01/22] wip [skip ci] --- .../Viewer/Options/VisibilitySwitch.vue | 16 ++++++++-------- package.json | 8 ++++++-- .../Viewer/Options/VisibilitySwitch.test.js | 17 +++++++++++++++++ tests/utils.js | 6 ++++++ tests/vitest.config.js | 17 +++++++++++++++++ 5 files changed, 54 insertions(+), 10 deletions(-) create mode 100644 tests/browser/Viewer/Options/VisibilitySwitch.test.js create mode 100644 tests/utils.js diff --git a/app/components/Viewer/Options/VisibilitySwitch.vue b/app/components/Viewer/Options/VisibilitySwitch.vue index 3dd8e9d6..efedc424 100644 --- a/app/components/Viewer/Options/VisibilitySwitch.vue +++ b/app/components/Viewer/Options/VisibilitySwitch.vue @@ -1,12 +1,12 @@ + + diff --git a/tests/e2e/app/plugins/microservices.client.js b/tests/e2e/app/plugins/microservices.client.js new file mode 100644 index 00000000..018e2d63 --- /dev/null +++ b/tests/e2e/app/plugins/microservices.client.js @@ -0,0 +1,12 @@ +import { useGeodeStore } from "@ogw_front/stores/geode"; +import { useInfraStore } from "@ogw_front/stores/infra"; +import { useViewerStore } from "@ogw_front/stores/viewer"; + +export default defineNuxtPlugin(() => { + const geodeStore = useGeodeStore(); + const infraStore = useInfraStore(); + const viewerStore = useViewerStore(); + + infraStore.register_microservice(geodeStore); + infraStore.register_microservice(viewerStore); +}); diff --git a/tests/e2e/cells.nuxt.test.js b/tests/e2e/cells.nuxt.test.js new file mode 100644 index 00000000..df2d49d9 --- /dev/null +++ b/tests/e2e/cells.nuxt.test.js @@ -0,0 +1,38 @@ +import { beforeAll, describe, expect, test } from "vitest"; + +// import { page } from "@vitest/browser/context"; + +import { importFile } from "@ogw_front/utils/file_import_workflow"; + +import { setup } from '@nuxt/test-utils/e2e' + +const timeout = 5000; + +const file_name = "test.og_rgd2d"; +const geode_object = "RegularGrid2D"; +beforeAll(async () => { + + await setup({ + rootDir: import.meta.dirname, + server: true, + dev: true, + dotenv: { env: { MODE: "BROWSER" } }, + setupTimeout: 10_000, + +}); +// console.log("Navigating to", process.env.NUXT_TEST_URL); +// await page.goto(process.env.NUXT_TEST_URL); +// await importFile(file_name, geode_object); +}); + +describe("Dashboard E2E – Real Nitro Backend + Playwright Browser", () => { + test( + "should display the dashboard and interact with it", + () => { + console.log("Running E2E test: should display the dashboard and interact with it"); + const one = 1; + expect(one).toBe(one); + }, + timeout, + ); +}); diff --git a/tests/e2e/global_setup.js b/tests/e2e/global_setup.js new file mode 100644 index 00000000..6271513e --- /dev/null +++ b/tests/e2e/global_setup.js @@ -0,0 +1,23 @@ +import { buildNuxt, loadNuxt } from "@nuxt/kit"; +import path from "node:path"; +import { setupActivePinia } from "@ogw_tests/utils"; + +let nuxt = undefined; + +export default async function setup() { + console.log("FROM SETUP.JS - Current Directory:", import.meta.dirname); + await setupActivePinia(); + nuxt = await loadNuxt({ + rootDir: path.resolve(import.meta.dirname), + server: true, + dev: true, + dotenv: { env: { MODE: "BROWSER" } }, + }); + console.log("FROM SETUP.JS - buildNuxt", import.meta.dirname); + await buildNuxt(nuxt); + + await nuxt.server?.listen(); + + process.env.NUXT_TEST_URL = `http://localhost:${nuxt.options.devServer.port}`; + console.log("✓ Nuxt ready at", process.env.NUXT_TEST_URL); +} diff --git a/tests/e2e/nuxt.config.js b/tests/e2e/nuxt.config.js new file mode 100644 index 00000000..87d91e55 --- /dev/null +++ b/tests/e2e/nuxt.config.js @@ -0,0 +1,18 @@ +import path from "node:path"; + +const rootNuxtConfigPath = path.resolve(import.meta.dirname, "../..", "nuxt.config.js"); +const workspaceNodeModules = path.resolve(import.meta.dirname, "../../../../node_modules"); +console.log("Nuxt Config Root Path:", rootNuxtConfigPath); + +export default defineNuxtConfig({ + devtools: false, + extends: [rootNuxtConfigPath], + compatibilityDate: "2026-04-10", + vite: { + server: { + fs: { + allow: [".", workspaceNodeModules], + }, + }, + }, +}); diff --git a/tests/e2e/package.json b/tests/e2e/package.json new file mode 100644 index 00000000..c670be6e --- /dev/null +++ b/tests/e2e/package.json @@ -0,0 +1,8 @@ +{ + "name": "@geode/opengeodeweb-front/tests/e2e", + "version": "0.0.0", + "scripts": { + "build:browser": "cross-env MODE=BROWSER nuxi build", + "dev": "cross-env MODE=BROWSER nuxt dev" + } +} diff --git a/tests/integration/stores/viewer.nuxt.test.js b/tests/integration/stores/viewer.nuxt.test.js index 4eb1fc0d..04e20705 100644 --- a/tests/integration/stores/viewer.nuxt.test.js +++ b/tests/integration/stores/viewer.nuxt.test.js @@ -7,7 +7,7 @@ import opengeodeweb_viewer_schemas from "@geode/opengeodeweb-viewer/opengeodeweb // Local imports import { Status } from "@ogw_front/utils/status"; import { cleanupBackend } from "@ogw_front/utils/local/cleanup"; -import { runMicroservices } from "@ogw_tests/integration/setup"; +// import { runMicroservices } from "@ogw_tests/integration/setup"; import { setupActivePinia } from "@ogw_tests/utils"; import { useViewerStore } from "@ogw_front/stores/viewer"; @@ -17,7 +17,7 @@ let projectFolderPath = ""; beforeAll(async () => { setupActivePinia(); - ({ projectFolderPath } = await runMicroservices()); + // ({ projectFolderPath } = await runMicroservices()); }); afterAll(async () => { diff --git a/tests/vitest.config.js b/tests/vitest.config.js index 3fc04c2f..f65d1fde 100644 --- a/tests/vitest.config.js +++ b/tests/vitest.config.js @@ -2,7 +2,9 @@ import path from "node:path"; import { defineConfig } from "vitest/config"; import { defineVitestProject } from "@nuxt/test-utils/config"; -import { nodePolyfills } from "vite-plugin-node-polyfills"; +// import { nodePolyfills } from "vite-plugin-node-polyfills"; +// import { playwright } from "@vitest/browser-playwright"; +import vue from "@vitejs/plugin-vue"; const __dirname = import.meta.dirname; @@ -10,16 +12,14 @@ const RETRIES = 3; const DEFAULT_RETRY = 0; const TIMEOUTS = { unit: 5000, - browser: 15_000, integration: 15_000, + e2e: 15_000, }; const globalRetry = process.env.CI ? RETRIES : DEFAULT_RETRY; - const setupIndexedDB = path.resolve(__dirname, "./setup_indexeddb.js"); -const openGeodeFrontPath = path.resolve(__dirname, "../app"); - +const repoRoot = path.resolve(__dirname, ".."); const commonTestConfig = { setupFiles: [setupIndexedDB], retry: globalRetry, @@ -31,57 +31,72 @@ const commonTestConfig = { }; const sharedAlias = { - "@ogw_tests": path.resolve(__dirname, "."), - "@ogw_front": openGeodeFrontPath, + "@ogw_tests": __dirname, + "@ogw_front": path.resolve(repoRoot, "app"), + "@ogw_internal": path.resolve(repoRoot, "internal"), + "@ogw_server": path.resolve(repoRoot, "server"), }; +const e2eAppPath = path.resolve(__dirname, "e2e"); +const e2eGlobalSetupPath = path.resolve(e2eAppPath, "global_setup.js"); +console.log("E2E Test App Path:", e2eAppPath); + // oxlint-disable-next-line import/no-default-export export default defineConfig({ - plugins: [ - nodePolyfills({ - globals: { - Buffer: true, - }, - protocolImports: true, - }), - ], resolve: { alias: sharedAlias, }, test: { ...commonTestConfig, projects: [ + await defineVitestProject({ + environments: { + client: { + noExternal: false, + external: ["@nuxt/test-utils", "bun:test"], + }, + }, + resolve: { + alias: sharedAlias, + }, + plugins: [vue()], + test: { + name: "e2e", + extends: true, + include: ["tests/e2e/cells.nuxt.test.js"], + testTimeout: TIMEOUTS.e2e, + environment: "nuxt", + globalSetup: [e2eGlobalSetupPath], + setupFiles: [ setupIndexedDB], + // browser: { + // enabled: true, + // provider: playwright(), + // instances: [{ browser: "chromium" }], + // headless: false, + // }, + }, + }), + await defineVitestProject({ + test: { + name: "unit", + extends: true, + include: ["tests/unit/**/*.test.js"], + environment: "nuxt", + testTimeout: TIMEOUTS.unit, + setupFiles: [setupIndexedDB], + }, + }), await defineVitestProject({ test: { - name: "browser", + name: "integration", extends: true, - include: ["tests/browser/cells.nuxt.test.js"], + include: ["tests/integration/stores/data_style/mesh/cells.nuxt.test.js"], environment: "nuxt", - testTimeout: TIMEOUTS.browser, + fileParallelism: false, + testTimeout: TIMEOUTS.integration, setupFiles: [setupIndexedDB], }, }), - // await defineVitestProject({ - // test: { - // name: "unit", - // extends: true, - // include: ["tests/unit/**/*.test.js"], - // environment: "nuxt", - // testTimeout: TIMEOUTS.unit, - // setupFiles: [setupIndexedDB], - // }, - // }), - // await defineVitestProject({ - // test: { - // name: "integration", - // extends: true, - // include: ["tests/integration/stores/data_style/mesh/cells.nuxt.test.js"], - // environment: "nuxt", - // fileParallelism: false, - // testTimeout: TIMEOUTS.integration, - // setupFiles: [setupIndexedDB], - // }, - // }), ], }, }); From 5af3f96d7b0df5c383c79a4e456610dff66ecfe3 Mon Sep 17 00:00:00 2001 From: JulienChampagnol Date: Wed, 15 Apr 2026 18:00:36 +0200 Subject: [PATCH 19/22] wip [skip ci] --- nuxt.config.js | 2 +- package.json | 4 +-- tests/browser/cells.nuxt.test.js | 59 -------------------------------- tests/browser/commands.js | 17 --------- tests/browser/setup.js | 47 ------------------------- tests/e2e/cells.nuxt.test.js | 58 +++++++++++++++++-------------- tests/e2e/nuxt.config.js | 12 ++++--- tests/vitest.config.js | 35 ++++++++++++++----- 8 files changed, 69 insertions(+), 165 deletions(-) delete mode 100644 tests/browser/cells.nuxt.test.js delete mode 100644 tests/browser/commands.js delete mode 100644 tests/browser/setup.js diff --git a/nuxt.config.js b/nuxt.config.js index fce6a7ea..21153fd3 100644 --- a/nuxt.config.js +++ b/nuxt.config.js @@ -3,9 +3,9 @@ import path from "node:path"; // Local imports import package_json from "./package.json"; -import { SourceMap } from "node:module"; const __dirname = import.meta.dirname; +console.log(`Loading Nuxt config: ${import.meta.url}`); const sharedAlias = { "@ogw_front": path.resolve(__dirname, "app"), diff --git a/package.json b/package.json index 8e421896..cf7ffaf2 100644 --- a/package.json +++ b/package.json @@ -71,7 +71,7 @@ "wslink": "1.12.4" }, "devDependencies": { - "@nuxt/test-utils": "3.17.2", + "@nuxt/test-utils": "3.19.2", "@pinia/testing": "1.0.3", "@vitejs/plugin-vue": "6.0.4", "@vitest/browser": "4.1.4", @@ -89,7 +89,7 @@ "vite-plugin-vuetify": "2.1.3", "vitest": "4.1.4", "vitest-browser-vue": "2.1.0", - "vitest-indexeddb": "0.0.1" + "vitest-indexeddb": "0.0.2" }, "overrides": { "vue": "latest" diff --git a/tests/browser/cells.nuxt.test.js b/tests/browser/cells.nuxt.test.js deleted file mode 100644 index 24d3bf90..00000000 --- a/tests/browser/cells.nuxt.test.js +++ /dev/null @@ -1,59 +0,0 @@ -// Third party imports -import { afterAll, beforeAll, describe, expect, test, vi } from "vitest"; -import viewer_schemas from "@geode/opengeodeweb-viewer/opengeodeweb_viewer_schemas.json" with { type: "json" }; - -// Local imports -import { serverCleanup, serverSetup } from "./commands.js"; -import { useDataStyleStore } from "@ogw_front/stores/data_style"; -import { useViewerStore } from "@ogw_front/stores/viewer"; - -import HybridRenderingView from "@ogw_front/components/HybridRenderingView.vue"; - -// Local constants -const INTERVAL_TIMEOUT = 60_000; -const mesh_cells_schemas = viewer_schemas.opengeodeweb_viewer.mesh.cells; -const file_name = "test.og_rgd2d"; -const geode_object = "RegularGrid2D"; -const vertex_attribute = { name: "points" }; -const cell_attribute = { name: "RGB_data" }; - -let id = "", - projectFolderPath = ""; - -beforeAll(async () => { - ({ id, projectFolderPath } = await serverSetup(file_name, geode_object)); -}, INTERVAL_TIMEOUT); - -afterAll(async () => { - console.log("afterAll mesh cells kill", projectFolderPath); - await serverCleanup(projectFolderPath); -}); - -describe("Mesh cells", () => { - describe("Cells visibility", () => { - test("Visibility true", async () => { - const dataStyleStore = useDataStyleStore(); - const viewerStore = useViewerStore(); - const visibility = true; - const spy = vi.spyOn(viewerStore, "request"); - const result = dataStyleStore.setMeshCellsVisibility(id, visibility); - expect(result).toBeInstanceOf(Promise); - await result; - expect(spy).toHaveBeenCalledWith( - mesh_cells_schemas.visibility, - { id, visibility }, - { - response_function: expect.any(Function), - }, - ); - expect(dataStyleStore.meshCellsVisibility(id)).toBe(visibility); - - const hybridRenderingView = await render(HybridRenderingView, { - global: { - plugins: [vuetify], - }, - }); - await expect(hybridRenderingView.container).toMatchScreenshot(); - }); - }); -}); diff --git a/tests/browser/commands.js b/tests/browser/commands.js deleted file mode 100644 index f1d6f86e..00000000 --- a/tests/browser/commands.js +++ /dev/null @@ -1,17 +0,0 @@ -import { cleanupBackend } from "@ogw_front/utils/local/cleanup.js"; -import { setupIntegrationTests } from "./setup.js"; - -async function serverSetup(file_name, geode_object) { - console.log(`[Server] Setting up integration test for ${file_name}`); - const result = await setupIntegrationTests(file_name, geode_object); - console.log(`[Server] Setup done → id: ${result.id}, folder: ${result.projectFolderPath}`); - return result; -} - -async function serverCleanup(projectFolderPath) { - console.log(`[Server] Cleaning up backend: ${projectFolderPath}`); - await cleanupBackend(projectFolderPath); - console.log(`[Server] Cleanup completed`); -} - -export { serverSetup, serverCleanup }; diff --git a/tests/browser/setup.js b/tests/browser/setup.js deleted file mode 100644 index 3b217b80..00000000 --- a/tests/browser/setup.js +++ /dev/null @@ -1,47 +0,0 @@ -// Node.js imports -import { WebSocket } from "ws"; - -// Third party imports -import { afterAll, beforeAll, expect, vi } from "vitest"; - -// Local imports -import { Status } from "@ogw_front/utils/status"; -import { appMode } from "@ogw_front/utils/local/app_mode"; -import { importFile } from "@ogw_front/utils/file_import_workflow"; -import { setupActivePinia } from "@ogw_tests/utils"; -import { useAppStore } from "@ogw_front/stores/app"; -import { useInfraStore } from "@ogw_front/stores/infra"; -import { useViewerStore } from "@ogw_front/stores/viewer"; - -async function setupIntegrationTests(file_name, geode_object) { - setupActivePinia(); - const appStore = useAppStore(); - const infraStore = useInfraStore(); - const viewerStore = useViewerStore(); - infraStore.app_mode = appMode.BROWSER; - await infraStore.create_backend("", "", false); - const id = await importFile(file_name, geode_object); - expect(viewerStore.status).toBe(Status.CONNECTED); - const { projectFolderPath } = appStore; - console.log("end of setupIntegrationTests", { id, projectFolderPath }); - return { id, projectFolderPath }; -} - -const mockLockRequest = vi.fn().mockImplementation(async (name, task) => await task({ name })); - -vi.stubGlobal("navigator", { - ...navigator, - locks: { - request: mockLockRequest, - }, -}); - -beforeAll(() => { - globalThis.WebSocket = WebSocket; -}); - -afterAll(() => { - delete globalThis.WebSocket; -}); - -export { setupIntegrationTests }; diff --git a/tests/e2e/cells.nuxt.test.js b/tests/e2e/cells.nuxt.test.js index df2d49d9..0fbd4391 100644 --- a/tests/e2e/cells.nuxt.test.js +++ b/tests/e2e/cells.nuxt.test.js @@ -1,38 +1,44 @@ +// Node imports +import path from "node:path"; + +// Third party imports import { beforeAll, describe, expect, test } from "vitest"; +import { createPage, setup, url } from '@nuxt/test-utils/e2e'; + +import { setupIntegrationTests } from "@ogw_tests/integration/setup"; -// import { page } from "@vitest/browser/context"; +// Local imports -import { importFile } from "@ogw_front/utils/file_import_workflow"; -import { setup } from '@nuxt/test-utils/e2e' +const timeout = 180_000; // increased +const INTERVAL_TIMEOUT = 180_000; // for beforeAll -const timeout = 5000; +await setup({ + rootDir: path.resolve(import.meta.dirname), + server: true, + browser: true, + setupTimeout: 80_000 +}); const file_name = "test.og_rgd2d"; const geode_object = "RegularGrid2D"; -beforeAll(async () => { +let id = "", + projectFolderPath = ""; - await setup({ - rootDir: import.meta.dirname, - server: true, - dev: true, - dotenv: { env: { MODE: "BROWSER" } }, - setupTimeout: 10_000, - -}); -// console.log("Navigating to", process.env.NUXT_TEST_URL); -// await page.goto(process.env.NUXT_TEST_URL); -// await importFile(file_name, geode_object); -}); + +beforeAll(async () => { + id = ""; + projectFolderPath = ""; + await setupIntegrationTests(file_name, geode_object); +}, INTERVAL_TIMEOUT); describe("Dashboard E2E – Real Nitro Backend + Playwright Browser", () => { - test( - "should display the dashboard and interact with it", - () => { - console.log("Running E2E test: should display the dashboard and interact with it"); - const one = 1; - expect(one).toBe(one); - }, - timeout, - ); + test("HybridRenderingView component renders", async () => { + const page = await createPage(url("/")); + console.log("→ Page opened. Waiting for full load and rendering..."); + await page.waitForLoadState("networkidle", { timeout: 90_000 }); + page.waitForTimeout(5000); + console.log("→ Taking screenshot..."); + await expect(page).toMatchScreenshot("hybrid-rendering-view"); + }, timeout); }); diff --git a/tests/e2e/nuxt.config.js b/tests/e2e/nuxt.config.js index 87d91e55..43e833e4 100644 --- a/tests/e2e/nuxt.config.js +++ b/tests/e2e/nuxt.config.js @@ -1,14 +1,18 @@ import path from "node:path"; -const rootNuxtConfigPath = path.resolve(import.meta.dirname, "../..", "nuxt.config.js"); -const workspaceNodeModules = path.resolve(import.meta.dirname, "../../../../node_modules"); -console.log("Nuxt Config Root Path:", rootNuxtConfigPath); +const __dirname = import.meta.dirname; +console.log(`Loading Nuxt config: ${import.meta.url}`); +const rootNuxtConfigPath = path.resolve(__dirname, "../..", "nuxt.config.js"); +const workspaceNodeModules = path.resolve(__dirname, "../../../../node_modules"); export default defineNuxtConfig({ devtools: false, extends: [rootNuxtConfigPath], - compatibilityDate: "2026-04-10", + compatibilityDate: "2026-04-15", vite: { + define: { + name: 'true', + }, server: { fs: { allow: [".", workspaceNodeModules], diff --git a/tests/vitest.config.js b/tests/vitest.config.js index f65d1fde..b004f274 100644 --- a/tests/vitest.config.js +++ b/tests/vitest.config.js @@ -2,9 +2,7 @@ import path from "node:path"; import { defineConfig } from "vitest/config"; import { defineVitestProject } from "@nuxt/test-utils/config"; -// import { nodePolyfills } from "vite-plugin-node-polyfills"; -// import { playwright } from "@vitest/browser-playwright"; -import vue from "@vitejs/plugin-vue"; +import { playwright } from '@vitest/browser-playwright' const __dirname = import.meta.dirname; @@ -13,7 +11,7 @@ const DEFAULT_RETRY = 0; const TIMEOUTS = { unit: 5000, integration: 15_000, - e2e: 15_000, + e2e: 120_000, }; const globalRetry = process.env.CI ? RETRIES : DEFAULT_RETRY; @@ -50,6 +48,17 @@ export default defineConfig({ ...commonTestConfig, projects: [ await defineVitestProject({ + plugins: [ + { + name: 'ignore-bun-test', + enforce: 'pre', + resolveId(id) { + if (id === 'bun:test') { + return { id: 'bun:test', external: true } + } + } + } + ], environments: { client: { noExternal: false, @@ -59,20 +68,28 @@ export default defineConfig({ resolve: { alias: sharedAlias, }, - plugins: [vue()], test: { name: "e2e", extends: true, include: ["tests/e2e/cells.nuxt.test.js"], testTimeout: TIMEOUTS.e2e, - environment: "nuxt", - globalSetup: [e2eGlobalSetupPath], - setupFiles: [ setupIndexedDB], + environment: "node", + server: { + deps: { + external: ['bun:test', '@nuxt/test-utils'], + }, + }, + setupFiles: [setupIndexedDB], // browser: { // enabled: true, // provider: playwright(), // instances: [{ browser: "chromium" }], - // headless: false, + // expect: { + // toMatchScreenshot: { + // threshold: 0.02, + // }, + // }, + // connectTimeout: 120_000, // }, }, }), From be9e3c7e9bac5a58974bc838cee9b7cb0a9c2ecf Mon Sep 17 00:00:00 2001 From: JulienChampagnol <91873154+JulienChampagnol@users.noreply.github.com> Date: Wed, 15 Apr 2026 16:04:46 +0000 Subject: [PATCH 20/22] Apply prepare changes --- tests/e2e/cells.nuxt.test.js | 30 ++++++++++++++++-------------- tests/e2e/nuxt.config.js | 2 +- tests/vitest.config.js | 16 ++++++++-------- 3 files changed, 25 insertions(+), 23 deletions(-) diff --git a/tests/e2e/cells.nuxt.test.js b/tests/e2e/cells.nuxt.test.js index 0fbd4391..bad04271 100644 --- a/tests/e2e/cells.nuxt.test.js +++ b/tests/e2e/cells.nuxt.test.js @@ -3,21 +3,20 @@ import path from "node:path"; // Third party imports import { beforeAll, describe, expect, test } from "vitest"; -import { createPage, setup, url } from '@nuxt/test-utils/e2e'; +import { createPage, setup, url } from "@nuxt/test-utils/e2e"; import { setupIntegrationTests } from "@ogw_tests/integration/setup"; // Local imports - -const timeout = 180_000; // increased -const INTERVAL_TIMEOUT = 180_000; // for beforeAll +const timeout = 180_000; // increased +const INTERVAL_TIMEOUT = 180_000; // for beforeAll await setup({ rootDir: path.resolve(import.meta.dirname), server: true, browser: true, - setupTimeout: 80_000 + setupTimeout: 80_000, }); const file_name = "test.og_rgd2d"; @@ -25,7 +24,6 @@ const geode_object = "RegularGrid2D"; let id = "", projectFolderPath = ""; - beforeAll(async () => { id = ""; projectFolderPath = ""; @@ -33,12 +31,16 @@ beforeAll(async () => { }, INTERVAL_TIMEOUT); describe("Dashboard E2E – Real Nitro Backend + Playwright Browser", () => { - test("HybridRenderingView component renders", async () => { - const page = await createPage(url("/")); - console.log("→ Page opened. Waiting for full load and rendering..."); - await page.waitForLoadState("networkidle", { timeout: 90_000 }); - page.waitForTimeout(5000); - console.log("→ Taking screenshot..."); - await expect(page).toMatchScreenshot("hybrid-rendering-view"); - }, timeout); + test( + "HybridRenderingView component renders", + async () => { + const page = await createPage(url("/")); + console.log("→ Page opened. Waiting for full load and rendering..."); + await page.waitForLoadState("networkidle", { timeout: 90_000 }); + page.waitForTimeout(5000); + console.log("→ Taking screenshot..."); + await expect(page).toMatchScreenshot("hybrid-rendering-view"); + }, + timeout, + ); }); diff --git a/tests/e2e/nuxt.config.js b/tests/e2e/nuxt.config.js index 43e833e4..9dc247c9 100644 --- a/tests/e2e/nuxt.config.js +++ b/tests/e2e/nuxt.config.js @@ -11,7 +11,7 @@ export default defineNuxtConfig({ compatibilityDate: "2026-04-15", vite: { define: { - name: 'true', + name: "true", }, server: { fs: { diff --git a/tests/vitest.config.js b/tests/vitest.config.js index b004f274..15bfd329 100644 --- a/tests/vitest.config.js +++ b/tests/vitest.config.js @@ -2,7 +2,7 @@ import path from "node:path"; import { defineConfig } from "vitest/config"; import { defineVitestProject } from "@nuxt/test-utils/config"; -import { playwright } from '@vitest/browser-playwright' +import { playwright } from "@vitest/browser-playwright"; const __dirname = import.meta.dirname; @@ -50,14 +50,14 @@ export default defineConfig({ await defineVitestProject({ plugins: [ { - name: 'ignore-bun-test', - enforce: 'pre', + name: "ignore-bun-test", + enforce: "pre", resolveId(id) { - if (id === 'bun:test') { - return { id: 'bun:test', external: true } + if (id === "bun:test") { + return { id: "bun:test", external: true }; } - } - } + }, + }, ], environments: { client: { @@ -76,7 +76,7 @@ export default defineConfig({ environment: "node", server: { deps: { - external: ['bun:test', '@nuxt/test-utils'], + external: ["bun:test", "@nuxt/test-utils"], }, }, setupFiles: [setupIndexedDB], From 63407427a6bcc1fd38b63e4ab3bf2c784226cd54 Mon Sep 17 00:00:00 2001 From: JulienChampagnol Date: Thu, 16 Apr 2026 13:45:53 +0200 Subject: [PATCH 21/22] wip [skip ci] --- package.json | 4 ++-- tests/e2e/nuxt.config.js | 5 +++++ tests/e2e/test.test.js | 8 ++++++++ tests/vitest.config.js | 15 ++------------- 4 files changed, 17 insertions(+), 15 deletions(-) create mode 100644 tests/e2e/test.test.js diff --git a/package.json b/package.json index cf7ffaf2..60c24c16 100644 --- a/package.json +++ b/package.json @@ -71,7 +71,7 @@ "wslink": "1.12.4" }, "devDependencies": { - "@nuxt/test-utils": "3.19.2", + "@nuxt/test-utils": "4.0.2", "@pinia/testing": "1.0.3", "@vitejs/plugin-vue": "6.0.4", "@vitest/browser": "4.1.4", @@ -84,7 +84,7 @@ "playwright-core": "1.59.1", "resize-observer-polyfill": "1.5.1", "unplugin-auto-import": "20.0.0", - "vite": "8.0.8", + "vite": "7.3.1", "vite-plugin-node-polyfills": "0.26.0", "vite-plugin-vuetify": "2.1.3", "vitest": "4.1.4", diff --git a/tests/e2e/nuxt.config.js b/tests/e2e/nuxt.config.js index 43e833e4..9e423d4d 100644 --- a/tests/e2e/nuxt.config.js +++ b/tests/e2e/nuxt.config.js @@ -9,6 +9,11 @@ export default defineNuxtConfig({ devtools: false, extends: [rootNuxtConfigPath], compatibilityDate: "2026-04-15", + + modules: [ + ["@pinia/nuxt", { autoImports: ["defineStore", "storeToRefs"] }], + "@vueuse/nuxt", + ], vite: { define: { name: 'true', diff --git a/tests/e2e/test.test.js b/tests/e2e/test.test.js new file mode 100644 index 00000000..1702b49c --- /dev/null +++ b/tests/e2e/test.test.js @@ -0,0 +1,8 @@ +import { createPage, setup } from '@nuxt/test-utils/e2e' +import { test } from 'vitest' + +await setup() + +test('should run without error', async () => { + await createPage('/') +}, 5000) \ No newline at end of file diff --git a/tests/vitest.config.js b/tests/vitest.config.js index b004f274..83e055b3 100644 --- a/tests/vitest.config.js +++ b/tests/vitest.config.js @@ -71,26 +71,15 @@ export default defineConfig({ test: { name: "e2e", extends: true, - include: ["tests/e2e/cells.nuxt.test.js"], + include: ["tests/e2e/test.test.js"], testTimeout: TIMEOUTS.e2e, - environment: "node", + environment: "nuxt", server: { deps: { external: ['bun:test', '@nuxt/test-utils'], }, }, setupFiles: [setupIndexedDB], - // browser: { - // enabled: true, - // provider: playwright(), - // instances: [{ browser: "chromium" }], - // expect: { - // toMatchScreenshot: { - // threshold: 0.02, - // }, - // }, - // connectTimeout: 120_000, - // }, }, }), await defineVitestProject({ From c86e7119e0d86f3bbac867ee93e5e52c29cd345c Mon Sep 17 00:00:00 2001 From: JulienChampagnol <91873154+JulienChampagnol@users.noreply.github.com> Date: Thu, 16 Apr 2026 11:46:38 +0000 Subject: [PATCH 22/22] Apply prepare changes --- tests/e2e/nuxt.config.js | 5 +---- tests/e2e/test.test.js | 12 ++++++------ 2 files changed, 7 insertions(+), 10 deletions(-) diff --git a/tests/e2e/nuxt.config.js b/tests/e2e/nuxt.config.js index d39c1f63..df6588ce 100644 --- a/tests/e2e/nuxt.config.js +++ b/tests/e2e/nuxt.config.js @@ -10,10 +10,7 @@ export default defineNuxtConfig({ extends: [rootNuxtConfigPath], compatibilityDate: "2026-04-15", - modules: [ - ["@pinia/nuxt", { autoImports: ["defineStore", "storeToRefs"] }], - "@vueuse/nuxt", - ], + modules: [["@pinia/nuxt", { autoImports: ["defineStore", "storeToRefs"] }], "@vueuse/nuxt"], vite: { define: { name: "true", diff --git a/tests/e2e/test.test.js b/tests/e2e/test.test.js index 1702b49c..e4206f81 100644 --- a/tests/e2e/test.test.js +++ b/tests/e2e/test.test.js @@ -1,8 +1,8 @@ -import { createPage, setup } from '@nuxt/test-utils/e2e' -import { test } from 'vitest' +import { createPage, setup } from "@nuxt/test-utils/e2e"; +import { test } from "vitest"; -await setup() +await setup(); -test('should run without error', async () => { - await createPage('/') -}, 5000) \ No newline at end of file +test("should run without error", async () => { + await createPage("/"); +}, 5000);