From e81241fcbdfdd9ac96fb4506a21966991f571156 Mon Sep 17 00:00:00 2001 From: avivkeller Date: Thu, 17 Apr 2025 14:50:08 -0400 Subject: [PATCH] chore(test): use `t.module.mock` for mocking --- apps/site/package.json | 2 +- apps/site/tests/loader.mjs | 37 --------------------------- apps/site/tests/mocks/next-intl.jsx | 16 ------------ apps/site/tests/mocks/next-router.mjs | 6 ----- apps/site/tests/setup.jsx | 28 ++++++++++++++++++++ apps/site/tests/setup.mjs | 5 ---- 6 files changed, 29 insertions(+), 65 deletions(-) delete mode 100644 apps/site/tests/loader.mjs delete mode 100644 apps/site/tests/mocks/next-intl.jsx delete mode 100644 apps/site/tests/mocks/next-router.mjs create mode 100644 apps/site/tests/setup.jsx delete mode 100644 apps/site/tests/setup.mjs diff --git a/apps/site/package.json b/apps/site/package.json index 7e2faf5782987..7e34d4fb855c1 100644 --- a/apps/site/package.json +++ b/apps/site/package.json @@ -16,7 +16,7 @@ "lint": "turbo run lint:md lint:snippets lint:js lint:css", "lint:fix": "turbo run lint:md lint:js lint:css --no-cache -- --fix", "sync-orama": "node ./scripts/orama-search/sync-orama-cloud.mjs", - "test:unit": "cross-env NODE_NO_WARNINGS=1 node --experimental-test-coverage --test-coverage-exclude=**/*.test.* --experimental-test-module-mocks --enable-source-maps --import=global-jsdom/register --import=tsx --import=tests/setup.mjs --test **/*.test.*", + "test:unit": "cross-env NODE_NO_WARNINGS=1 node --experimental-test-coverage --test-coverage-exclude=**/*.test.* --experimental-test-module-mocks --enable-source-maps --import=global-jsdom/register --import=tsx --import=tests/setup.jsx --test **/*.test.*", "test:unit:watch": "cross-env NODE_OPTIONS=\"--watch\" npm run test:unit", "test": "turbo test:unit" }, diff --git a/apps/site/tests/loader.mjs b/apps/site/tests/loader.mjs deleted file mode 100644 index ff823c379e7d7..0000000000000 --- a/apps/site/tests/loader.mjs +++ /dev/null @@ -1,37 +0,0 @@ -// Map of module specifier prefixes to their corresponding mock files -const mockEntries = [ - ['next-intl', new URL('mocks/next-intl.jsx', import.meta.url).href], - ['next-router', new URL('mocks/next-intl.jsx', import.meta.url).href], -]; - -/** - * Returns the corresponding mock file for a given module specifier, if matched. - * - * @param {string} specifier - Module name or path being imported. - * @returns {string|null} - File name of the mock module or null if no match. - */ -function getMockFile(specifier) { - const entry = mockEntries.find( - ([prefix]) => specifier === prefix || specifier.startsWith(prefix + '/') - ); - return entry?.[1] ?? null; -} - -/** - * Node.js custom module resolution hook to inject mock modules. - * - * @type {import('node:module').ResolveHook} - */ -export async function resolve(specifier, ctx, nextResolve) { - const mockFile = getMockFile(specifier); - - if (mockFile) { - return { - format: 'module', - url: mockFile, - shortCircuit: true, - }; - } - - return nextResolve(specifier); -} diff --git a/apps/site/tests/mocks/next-intl.jsx b/apps/site/tests/mocks/next-intl.jsx deleted file mode 100644 index 116c56347ea9c..0000000000000 --- a/apps/site/tests/mocks/next-intl.jsx +++ /dev/null @@ -1,16 +0,0 @@ -'use strict'; - -export const useTranslations = () => key => key; - -export const useFormatter = () => { - const formatter = format => new Intl.DateTimeFormat('en-US', format); - - return { - date: (date, format) => formatter(format).format(date), - dateTime: (date, format) => formatter(format).format(date), - }; -}; - -export const createNavigation = () => ({ - Link: props => e.preventDefault()} />, -}); diff --git a/apps/site/tests/mocks/next-router.mjs b/apps/site/tests/mocks/next-router.mjs deleted file mode 100644 index 51e1c773089e7..0000000000000 --- a/apps/site/tests/mocks/next-router.mjs +++ /dev/null @@ -1,6 +0,0 @@ -'use strict'; - -export const useRouter = () => ({ - isReady: true, - asPath: '/', -}); diff --git a/apps/site/tests/setup.jsx b/apps/site/tests/setup.jsx new file mode 100644 index 0000000000000..da7511bbf0495 --- /dev/null +++ b/apps/site/tests/setup.jsx @@ -0,0 +1,28 @@ +// We import this file before the root setup.mjs, so React is not automatically imported +import * as React from 'react'; + +import { mock } from 'node:test'; + +import '../../../tests/setup.mjs'; + +mock.module('next-intl', { + namedExports: { + useTranslations: () => key => key, + + useFormatter: () => { + const formatWith = format => new Intl.DateTimeFormat('en-US', format); + return { + date: (date, format) => formatWith(format).format(date), + dateTime: (date, format) => formatWith(format).format(date), + }; + }, + }, +}); + +mock.module('next-intl/navigation', { + namedExports: { + createNavigation: () => ({ + Link: props => e.preventDefault()} />, + }), + }, +}); diff --git a/apps/site/tests/setup.mjs b/apps/site/tests/setup.mjs deleted file mode 100644 index e95b95c76855b..0000000000000 --- a/apps/site/tests/setup.mjs +++ /dev/null @@ -1,5 +0,0 @@ -import { register } from 'node:module'; - -import '../../../tests/setup.mjs'; - -register('./loader.mjs', import.meta.url);