diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 031764d3..1867923d 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -162,6 +162,7 @@ jobs: path: | ${{ env.yarn_cache }} admin-js/node_modules + admin-js/yarn.lock - name: Yarn install run: yarn install working-directory: admin-js/ diff --git a/admin-js/jest.config.js b/admin-js/jest.config.js deleted file mode 100644 index 742e271f..00000000 --- a/admin-js/jest.config.js +++ /dev/null @@ -1,12 +0,0 @@ -module.exports = { - clearMocks: true, - collectCoverageFrom: ["src/**", "tests/**"], - errorOnDeprecated: true, - maxWorkers: 1, - resetMocks: true, - restoreMocks: true, - setupFilesAfterEnv: ["/tests/setupTests.js"], - testEnvironment: "jsdom", - testEnvironmentOptions: {"url": "http://localhost:8080", "pretendToBeVisual": true}, - verbose: true, -}; diff --git a/admin-js/package.json b/admin-js/package.json index 75bfbf0b..415b47cd 100644 --- a/admin-js/package.json +++ b/admin-js/package.json @@ -3,6 +3,7 @@ "version": "0.1.0", "private": true, "dependencies": { + "@vitejs/plugin-react": "4.5.1", "react": "18.2.0", "react-admin": "4.16.7", "react-dom": "18.2.0", @@ -34,15 +35,18 @@ "@testing-library/react": "16.3.0", "@testing-library/user-event": "14.6.1", "@ungap/structured-clone": "1.3.0", - "jest": "30.0.0", - "jest-environment-jsdom": "30.0.0", + "@vitest/coverage-v8": "3.2.2", + "extend-expect": "3.0.0", "jest-fail-on-console": "3.3.1", + "jsdom": "20.0.3", + "vitest": "3.2.2", + "vitest-location-mock": "1.0.1", "whatwg-fetch": "3.6.20" }, "scripts": { "dev": "vite", "build": "vite build", - "test": "jest" + "test": "vitest" }, "eslintConfig": { "extends": [ diff --git a/admin-js/tests/permissions.test.js b/admin-js/tests/permissions.test.jsx similarity index 97% rename from admin-js/tests/permissions.test.js rename to admin-js/tests/permissions.test.jsx index cb2d9a41..4ddd85f4 100644 --- a/admin-js/tests/permissions.test.js +++ b/admin-js/tests/permissions.test.jsx @@ -1,3 +1,4 @@ +import {beforeAll, describe, expect, test} from "vitest"; import {within} from "@testing-library/dom"; import {screen, waitFor} from "@testing-library/react"; import userEvent from "@testing-library/user-event"; diff --git a/admin-js/tests/relationships.test.js b/admin-js/tests/relationships.test.jsx similarity index 99% rename from admin-js/tests/relationships.test.js rename to admin-js/tests/relationships.test.jsx index 43e0a904..8d316d5d 100644 --- a/admin-js/tests/relationships.test.js +++ b/admin-js/tests/relationships.test.jsx @@ -1,3 +1,4 @@ +import {expect, test} from "vitest"; import {within} from "@testing-library/dom"; import {screen, waitFor} from "@testing-library/react"; import userEvent from "@testing-library/user-event"; diff --git a/admin-js/tests/setupTests.js b/admin-js/tests/setupTests.jsx similarity index 84% rename from admin-js/tests/setupTests.js rename to admin-js/tests/setupTests.jsx index 97faf961..ef022d98 100644 --- a/admin-js/tests/setupTests.js +++ b/admin-js/tests/setupTests.jsx @@ -1,18 +1,21 @@ const http = require("http"); +//import "vitest-location-mock"; const {spawn} = require("child_process"); -import "whatwg-fetch"; // https://github.com/jsdom/jsdom/issues/1724 -import "@testing-library/jest-dom"; -import failOnConsole from "jest-fail-on-console"; +//import failOnConsole from "jest-fail-on-console"; import {memoryStore} from "react-admin"; +import {afterAll, beforeAll, beforeEach, expect} from "vitest"; import {configure, render, screen} from "@testing-library/react"; -import * as structuredClone from "@ungap/structured-clone"; +//import * as structuredClone from "@ungap/structured-clone"; -const {App} = require("../src/App"); +delete globalThis.fetch; +await import("whatwg-fetch"); + +import {App} from "../src/App"; let pythonProcess; let STATE; -jest.setTimeout(300000); // 5 mins +/*jest.setTimeout(300000); // 5 mins configure({"asyncUtilTimeout": 10000}); jest.mock("react-admin", () => { const originalModule = jest.requireActual("react-admin"); @@ -20,10 +23,10 @@ jest.mock("react-admin", () => { ...originalModule, downloadCSV: jest.fn(), // Mock downloadCSV to test export button. }; -}); +});*/ // https://github.com/jsdom/jsdom/issues/3363#issuecomment-1387439541 -global.structuredClone = structuredClone.default; +//global.structuredClone = structuredClone.default; // To render full-width window.matchMedia = (query) => ({ @@ -33,12 +36,12 @@ window.matchMedia = (query) => ({ }); // Ignore not implemented errors -window.scrollTo = jest.fn(); +//window.scrollTo = jest.fn(); global.sleep = (delay_s) => new Promise((resolve) => setTimeout(resolve, delay_s * 1000)); -failOnConsole({ +/*failOnConsole({ silenceMessage: (msg) => { return ( // Suppress act() warnings, because there's too many async changes happening. @@ -49,7 +52,7 @@ failOnConsole({ || msg.includes("The above error occurred in the component") ); } -}); +});*/ beforeAll(async() => { if (!global.pythonProcessPath) @@ -103,7 +106,9 @@ beforeEach(async () => { localStorage.clear(); if (STATE) { - const resp = await fetch("http://localhost:8080/admin/token", {"method": "POST", "body": JSON.stringify(login)}); + console.log("FOO"); + const resp = await fetch("/admin/token", {"method": "POST", "body": JSON.stringify(login)}); + console.log("BAR"); localStorage.setItem("identity", resp.headers.get("X-Token")); render(); const profile = await screen.findByText(login["username"], {"exact": false}); diff --git a/admin-js/tests/simple.test.js b/admin-js/tests/simple.test.jsx similarity index 99% rename from admin-js/tests/simple.test.js rename to admin-js/tests/simple.test.jsx index 96f3aa10..dcad4d40 100644 --- a/admin-js/tests/simple.test.js +++ b/admin-js/tests/simple.test.jsx @@ -1,3 +1,4 @@ +import {expect, test} from "vitest"; import {within} from "@testing-library/dom"; import {screen, waitFor} from "@testing-library/react"; import userEvent from "@testing-library/user-event"; diff --git a/admin-js/vite.config.js b/admin-js/vite.config.js index 67f1a929..c7d8a14e 100644 --- a/admin-js/vite.config.js +++ b/admin-js/vite.config.js @@ -1,4 +1,5 @@ -import { defineConfig } from "vite"; +import react from "@vitejs/plugin-react"; +import {defineConfig} from "vite"; export default defineConfig({ build: { @@ -12,4 +13,24 @@ export default defineConfig({ }, sourcemap: true, }, + plugins: [react()], + test: { + clearMocks: true, + coverage: { + exclude: [], + }, + environment: "jsdom", + environmentOptions: { + url: "http://localhost:8081", + pretendToBeVisual: true, + testURL: "http://localhost:8081" + }, + expect: { + requireAssertions: true + }, + fileParallelism: false, + mockReset: true, + restoreMocks: true, + setupFiles: "tests/setupTests.jsx", + } })