diff --git a/.github/workflows/ci.yaml b/.github/workflows/ci.yaml index 48eabc80c0..262960df9a 100644 --- a/.github/workflows/ci.yaml +++ b/.github/workflows/ci.yaml @@ -512,7 +512,7 @@ jobs: - name: Install node_modules run: ./scripts/yarn_install.sh - - run: yarn test:ci + - run: yarn test:ci --max-workers ${{ steps.cpu-cores.outputs.count }} working-directory: site - uses: codecov/codecov-action@v3 diff --git a/.gitignore b/.gitignore index 93e51a408d..0e9597870f 100644 --- a/.gitignore +++ b/.gitignore @@ -27,6 +27,7 @@ site/test-results/* site/e2e/test-results/* site/e2e/states/*.json site/playwright-report/* +site/.swc # Make target for updating golden files. cli/testdata/.gen-golden diff --git a/.prettierignore b/.prettierignore index 4b84d6c541..021deb7bc7 100644 --- a/.prettierignore +++ b/.prettierignore @@ -30,6 +30,7 @@ site/test-results/* site/e2e/test-results/* site/e2e/states/*.json site/playwright-report/* +site/.swc # Make target for updating golden files. cli/testdata/.gen-golden diff --git a/site/.eslintignore b/site/.eslintignore index b6fe15d57f..4ecb220f6c 100644 --- a/site/.eslintignore +++ b/site/.eslintignore @@ -30,6 +30,7 @@ test-results/* e2e/test-results/* e2e/states/*.json playwright-report/* +.swc # Make target for updating golden files. ../cli/testdata/.gen-golden diff --git a/site/.prettierignore b/site/.prettierignore index b6fe15d57f..4ecb220f6c 100644 --- a/site/.prettierignore +++ b/site/.prettierignore @@ -30,6 +30,7 @@ test-results/* e2e/test-results/* e2e/states/*.json playwright-report/* +.swc # Make target for updating golden files. ../cli/testdata/.gen-golden diff --git a/site/jest.config.js b/site/jest.config.js index b9246b5590..c61832b570 100644 --- a/site/jest.config.js +++ b/site/jest.config.js @@ -1,28 +1,28 @@ -// REMARK: Jest is supposed to never exceed 50% maxWorkers by default. However, -// there seems to be an issue with this in our Ubuntu-based workspaces. -// If we don't limit it, then 100% CPU and high MEM usage is hit -// unexpectedly, leading to OOM kills. -// -// SEE thread: https://github.com/coder/coder/pull/483#discussion_r829636583 -const maxWorkers = 2 - module.exports = { - maxWorkers, + testTimeout: 10_000, + maxWorkers: 8, projects: [ { - globals: { - "ts-jest": { - tsconfig: "./tsconfig.test.json", - }, - }, - coverageReporters: ["text", "lcov"], displayName: "test", - preset: "ts-jest", roots: [""], setupFilesAfterEnv: ["./jest.setup.ts"], + extensionsToTreatAsEsm: [".ts"], transform: { - "^.+\\.tsx?$": "ts-jest", - "\\.m?jsx?$": "jest-esm-transformer", + "^.+\\.(t|j)sx?$": [ + "@swc/jest", + { + jsc: { + transform: { + react: { + runtime: "automatic", + }, + }, + experimental: { + plugins: [["jest_workaround", {}]], + }, + }, + }, + ], }, testEnvironment: "jsdom", testRegex: "(/__tests__/.*|(\\.|/)(test|spec))\\.tsx?$", diff --git a/site/jest.setup.ts b/site/jest.setup.ts index 2a93969f6d..34a00bad80 100644 --- a/site/jest.setup.ts +++ b/site/jest.setup.ts @@ -5,7 +5,9 @@ import { server } from "./src/testHelpers/server" import "jest-location-mock" import { TextEncoder, TextDecoder } from "util" import { Blob } from "buffer" -import { fetch, Request, Response, Headers } from "@remix-run/web-fetch" +import jestFetchMock from "jest-fetch-mock" + +jestFetchMock.enableMocks() global.TextEncoder = TextEncoder // eslint-disable-next-line @typescript-eslint/no-explicit-any -- Polyfill for jsdom @@ -13,22 +15,6 @@ global.TextDecoder = TextDecoder as any // eslint-disable-next-line @typescript-eslint/no-explicit-any -- Polyfill for jsdom global.Blob = Blob as any -// From REMIX https://github.com/remix-run/react-router/blob/main/packages/react-router-dom/__tests__/setup.ts -if (!global.fetch) { - // Built-in lib.dom.d.ts expects `fetch(Request | string, ...)` but the web - // fetch API allows a URL so @remix-run/web-fetch defines - // `fetch(string | URL | Request, ...)` - // @ts-expect-error -- Polyfill for jsdom - global.fetch = fetch - // Same as above, lib.dom.d.ts doesn't allow a URL to the Request constructor - // @ts-expect-error -- Polyfill for jsdom - global.Request = Request - // web-std/fetch Response does not currently implement Response.error() - // @ts-expect-error -- Polyfill for jsdom - global.Response = Response - global.Headers = Headers -} - // Polyfill the getRandomValues that is used on utils/random.ts Object.defineProperty(global.self, "crypto", { value: { diff --git a/site/package.json b/site/package.json index 21854772d2..24cf7c8ac7 100644 --- a/site/package.json +++ b/site/package.json @@ -36,7 +36,6 @@ "@material-ui/icons": "4.5.1", "@material-ui/lab": "4.0.0-alpha.42", "@monaco-editor/react": "4.4.6", - "@remix-run/web-fetch": "4.3.2", "@tanstack/react-query": "4.22.4", "@testing-library/react-hooks": "8.0.1", "@types/color-convert": "2.0.0", @@ -59,6 +58,7 @@ "front-matter": "4.0.2", "history": "5.3.0", "i18next": "21.9.1", + "jest-environment-jsdom": "29.5.0", "jest-location-mock": "1.0.9", "just-debounce-it": "3.1.1", "lodash": "4.17.21", @@ -93,10 +93,12 @@ "@storybook/addon-essentials": "6.5.12", "@storybook/addon-links": "6.5.9", "@storybook/react": "6.5.12", + "@swc/core": "1.3.38", + "@swc/jest": "0.2.24", "@testing-library/jest-dom": "5.16.4", "@testing-library/react": "13.4.0", "@testing-library/user-event": "14.4.3", - "@types/jest": "27.4.1", + "@types/jest": "29.4.0", "@types/node": "14.18.22", "@types/react": "18.0.15", "@types/react-dom": "18.0.6", @@ -120,17 +122,17 @@ "eslint-plugin-react": "7.31.1", "eslint-plugin-react-hooks": "4.6.0", "eslint-plugin-unicorn": "44.0.0", - "jest": "27.5.1", + "jest": "29.5.0", "jest-canvas-mock": "2.4.0", - "jest-esm-transformer": "1.0.0", + "jest-fetch-mock": "3.0.3", "jest-runner-eslint": "1.1.0", "jest-websocket-mock": "2.4.0", + "jest_workaround": "0.1.14", "monaco-editor": "0.34.1", - "msw": "0.47.0", + "msw": "1.1.0", "prettier": "2.8.1", "resize-observer": "1.0.4", "semver": "7.3.7", - "ts-jest": "27.1.4", "typescript": "4.8.2" }, "browserslist": [ diff --git a/site/src/components/DeploymentBanner/DeploymentBannerView.tsx b/site/src/components/DeploymentBanner/DeploymentBannerView.tsx index 38e002b071..0e5dbd9b7a 100644 --- a/site/src/components/DeploymentBanner/DeploymentBannerView.tsx +++ b/site/src/components/DeploymentBanner/DeploymentBannerView.tsx @@ -192,7 +192,6 @@ export const DeploymentBannerView: FC = ({