Skip to content

Latest commit

 

History

History
140 lines (123 loc) · 6.56 KB

File metadata and controls

140 lines (123 loc) · 6.56 KB

Rstest migration plan for packages/enhanced

This document captures the work needed to migrate the enhanced package tests from Jest to Rstest. It is written against the current repo state and the Rstest docs listed in the references section.

Current state

  • Jest configs are in packages/enhanced/jest.config.ts and packages/enhanced/jest.embed.ts, with Nx targets test:jest and test:experiments in packages/enhanced/project.json.
  • The default enhanced:test target runs Vitest via packages/enhanced/vitest.config.ts.
  • Rstest is already wired in packages/enhanced/rstest.config.ts, but only includes test/ConfigTestCases.*.rstest.ts files.
  • Many unit and compiler tests under packages/enhanced/test/** are Jest-only (global jest, jest.mock, jest.fn, callback-style done, etc).

Target state

  • All enhanced package tests run under Rstest via enhanced:rstest.
  • Nx target enhanced:test uses Rstest and no longer depends on Jest/Vitest.
  • Jest-only helpers/configs in packages/enhanced are removed or unused.

Work items

1) Update scripts and Nx targets

  • Switch packages/enhanced/project.json test target to Rstest: rstest run -c packages/enhanced/rstest.config.ts (match CLI usage).
  • Replace or remove test:jest and test:experiments targets, or rewrite them as Rstest equivalents (for example, separate includes/projects).
  • Keep enhanced:rstest in the root package.json as the user-facing entry point and ensure it uses rstest run (or rstest) consistently.

2) Expand rstest.config.ts coverage

  • Include unit and compiler tests (not just ConfigTestCases):
    • test/**/*.test.ts
    • test/**/*.spec.ts
    • test/**/*.rstest.ts (keep existing Rstest cases)
  • Exclude non-Rstest variants to prevent duplicate runs:
    • test/**/*.vitest.ts
    • test/**/*.basictest.js (Jest-only)
    • test/**/*.embedruntime.js (Jest-only)
  • Consider Rstest projects to separate long-running config-case tests from fast unit tests (different testTimeout, include, etc).
  • Add setupFiles to reapply test/setupTestFramework.js logic (custom matchers and debug hooks).
  • If cleaning packages/enhanced/test/js is still required, move it to globalSetup or a pretest script instead of Jest config.

3) Replace Jest APIs in tests

Map Jest-only APIs to Rstest equivalents and update imports where needed.

Core mappings:

  • jest.fn -> rs.fn (from @rstest/core)
  • jest.spyOn -> rs.spyOn
  • jest.mock -> rs.mock
  • jest.doMock -> rs.doMock
  • jest.dontMock -> rs.unmock or rs.doUnmock
  • jest.resetModules -> rs.resetModules (note: does not clear mocks)
  • jest.clearAllMocks -> rs.clearAllMocks
  • jest.resetAllMocks -> rs.resetAllMocks
  • jest.restoreAllMocks -> rs.restoreAllMocks
  • jest.setTimeout -> rs.setConfig({ testTimeout }) or config testTimeout
  • jest.requireActual -> await rs.importActual(...) or import ... with { rstest: 'importActual' }

Known gaps to rework:

  • jest.isolateModules has no direct Rstest equivalent; use rs.resetModules + dynamic import() and refactor those tests.

Files to review specifically (non-exhaustive):

  • packages/enhanced/test/helpers/webpackMocks.ts
  • packages/enhanced/test/compiler-unit/**/*.test.ts
  • packages/enhanced/test/unit/**/*.test.ts
  • packages/enhanced/test/ConfigTestCases.template.js
  • packages/enhanced/test/ConfigTestCases.embedruntime.js
  • packages/enhanced/test/ConfigTestCases.basictest.js

4) Remove callback-style done usage

Rstest does not support done callbacks in tests. Convert to async/Promise style (return a Promise or async function). Key files include:

  • packages/enhanced/test/warmup-webpack.js
  • packages/enhanced/test/helpers/expectWarningFactory.js
  • packages/enhanced/test/compiler-unit/container/HoistContainerReferencesPlugin.test.ts
  • packages/enhanced/test/ConfigTestCases.template.js (if still used)

Note: callback-style functions inside config-case bundles are already wrapped in packages/enhanced/test/ConfigTestCases.rstest.ts and do not require Rstest to support done.

5) TypeScript types and globals

  • Decide between explicit imports (import { describe, it, expect, rs }) vs globals: true. The current rstest.config.ts uses globals: true.
  • If keeping globals, update packages/enhanced/tsconfig.spec.json to include @rstest/core/globals and remove jest types.
  • Replace jest.Mock, jest.MockedFunction, etc. with Rstest types (Mock, MockInstance) from @rstest/core.

6) Remove Jest-only infra

  • Drop or ignore packages/enhanced/jest.config.ts, packages/enhanced/jest.embed.ts, and packages/enhanced/test/patch-node-env.js once no tests rely on them.
  • Rework packages/enhanced/test/helpers/createLazyTestEnv.js, which depends on JEST_STATE_SYMBOL. Prefer avoiding this helper under Rstest or implement a Rstest-native alternative if still needed.

7) Verify behavior and parity

  • Run pnpm enhanced:rstest and check for parity with the old Jest suite.
  • Use rstest list --filesOnly -c packages/enhanced/rstest.config.ts to verify include/exclude patterns.
  • Validate that custom matchers in test/setupTestFramework.js still work with Rstest's expect.extend.

Suggested file-level checklist

  • packages/enhanced/project.json: update test target and pre-release steps.
  • packages/enhanced/rstest.config.ts: include patterns, setupFiles, globalSetup, timeouts.
  • packages/enhanced/tsconfig.spec.json: replace Jest types with Rstest types.
  • packages/enhanced/test/setupTestFramework.js: ensure compatibility with Rstest (no done usage).
  • packages/enhanced/test/helpers/webpackMocks.ts: replace Jest mocks.
  • packages/enhanced/test/unit/**: replace Jest APIs and types.
  • packages/enhanced/test/compiler-unit/**: replace Jest APIs and types.

References (Rstest docs)