diff --git a/e2e/env/fixtures/index.test.ts b/e2e/env/fixtures/index.test.ts new file mode 100644 index 00000000..c73d2d1e --- /dev/null +++ b/e2e/env/fixtures/index.test.ts @@ -0,0 +1,5 @@ +import { expect, it } from '@rstest/core'; + +it('should get environment variables correctly', () => { + expect(process.env.printLogger).toBe('true'); +}); diff --git a/e2e/env/fixtures/rstest.config.ts b/e2e/env/fixtures/rstest.config.ts new file mode 100644 index 00000000..01a629ca --- /dev/null +++ b/e2e/env/fixtures/rstest.config.ts @@ -0,0 +1,7 @@ +import { defineConfig } from '@rstest/core'; + +export default defineConfig({ + env: { + printLogger: 'true', + }, +}); diff --git a/e2e/env/index.test.ts b/e2e/env/index.test.ts new file mode 100644 index 00000000..89ca3aec --- /dev/null +++ b/e2e/env/index.test.ts @@ -0,0 +1,25 @@ +import { dirname } from 'node:path'; +import { fileURLToPath } from 'node:url'; +import { describe, it } from '@rstest/core'; +import { join } from 'pathe'; +import { runRstestCli } from '../scripts/'; + +const __filename = fileURLToPath(import.meta.url); + +const __dirname = dirname(__filename); + +describe('test environment variables', () => { + it('should get environment variables correctly in test', async () => { + const { expectExecSuccess } = await runRstestCli({ + command: 'rstest', + args: ['run', 'index.test.ts'], + options: { + nodeOptions: { + cwd: join(__dirname, 'fixtures'), + }, + }, + }); + + await expectExecSuccess(); + }); +}); diff --git a/packages/core/src/config.ts b/packages/core/src/config.ts index f6ab1611..93c9720b 100644 --- a/packages/core/src/config.ts +++ b/packages/core/src/config.ts @@ -145,6 +145,7 @@ const createDefaultConfig = (): NormalizedConfig => ({ printConsoleTrace: false, disableConsoleIntercept: false, snapshotFormat: {}, + env: {}, coverage: { exclude: [ '**/node_modules/**', diff --git a/packages/core/src/pool/index.ts b/packages/core/src/pool/index.ts index 59fe3775..cc788def 100644 --- a/packages/core/src/pool/index.ts +++ b/packages/core/src/pool/index.ts @@ -52,9 +52,11 @@ const getRuntimeConfig = (context: ProjectContext): RuntimeConfig => { isolate, coverage, snapshotFormat, + env, } = context.normalizedConfig; return { + env, testNamePattern, testTimeout, hookTimeout, diff --git a/packages/core/src/runtime/worker/index.ts b/packages/core/src/runtime/worker/index.ts index 21921de0..28cbb4c1 100644 --- a/packages/core/src/runtime/worker/index.ts +++ b/packages/core/src/runtime/worker/index.ts @@ -28,6 +28,12 @@ const registerGlobalApi = (api: Rstest) => { const listeners: (() => void)[] = []; let isTeardown = false; +const setupEnv = (env?: Partial) => { + if (env) { + Object.assign(process.env, env); + } +}; + const preparePool = async ({ entryInfo: { distPath, testPath }, sourceMaps, @@ -47,9 +53,12 @@ const preparePool = async ({ disableConsoleIntercept, testEnvironment, snapshotFormat, + env, }, } = context; + setupEnv(env); + if (!disableConsoleIntercept) { const { createCustomConsole } = await import('./console'); diff --git a/packages/core/src/types/config.ts b/packages/core/src/types/config.ts index 9fc973b6..101ac990 100644 --- a/packages/core/src/types/config.ts +++ b/packages/core/src/types/config.ts @@ -218,6 +218,11 @@ export interface RstestConfig { /** Format snapshot output */ snapshotFormat?: SnapshotFormat; + /** + * Custom environment variables available on `process.env` during tests. + */ + env?: Partial; + /** * Coverage options */ diff --git a/packages/core/src/types/worker.ts b/packages/core/src/types/worker.ts index 52093731..72ea4b1a 100644 --- a/packages/core/src/types/worker.ts +++ b/packages/core/src/types/worker.ts @@ -49,6 +49,7 @@ export type RuntimeConfig = Pick< | 'hookTimeout' | 'coverage' | 'snapshotFormat' + | 'env' >; export type WorkerContext = { diff --git a/packages/core/tests/__snapshots__/config.test.ts.snap b/packages/core/tests/__snapshots__/config.test.ts.snap index 2b38596f..4465db34 100644 --- a/packages/core/tests/__snapshots__/config.test.ts.snap +++ b/packages/core/tests/__snapshots__/config.test.ts.snap @@ -30,6 +30,7 @@ exports[`mergeRstestConfig > should merge config correctly with default config 1 "reportsDirectory": "/packages/core/tests/coverage", }, "disableConsoleIntercept": false, + "env": {}, "exclude": { "override": false, "patterns": [ diff --git a/packages/core/tests/core/__snapshots__/rstest.test.ts.snap b/packages/core/tests/core/__snapshots__/rstest.test.ts.snap index 77e535c4..1774ad1e 100644 --- a/packages/core/tests/core/__snapshots__/rstest.test.ts.snap +++ b/packages/core/tests/core/__snapshots__/rstest.test.ts.snap @@ -30,6 +30,7 @@ exports[`rstest context > should generate rstest context correctly 1`] = ` "reportsDirectory": "/packages/core/coverage", }, "disableConsoleIntercept": false, + "env": {}, "exclude": { "override": false, "patterns": [ @@ -101,6 +102,7 @@ exports[`rstest context > should generate rstest context correctly with multiple "reportsDirectory": "/packages/core/coverage", }, "disableConsoleIntercept": false, + "env": {}, "exclude": { "override": false, "patterns": [ @@ -175,6 +177,7 @@ exports[`rstest context > should generate rstest context correctly with multiple "reportsDirectory": "/packages/core/coverage", }, "disableConsoleIntercept": false, + "env": {}, "exclude": { "override": false, "patterns": [ diff --git a/website/docs/en/config/test/_meta.json b/website/docs/en/config/test/_meta.json index 411b6180..073ebf68 100644 --- a/website/docs/en/config/test/_meta.json +++ b/website/docs/en/config/test/_meta.json @@ -11,6 +11,7 @@ "includeSource", "testNamePattern", + "env", "retry", "testTimeout", "hookTimeout", diff --git a/website/docs/en/config/test/env.mdx b/website/docs/en/config/test/env.mdx new file mode 100644 index 00000000..76e2ebc5 --- /dev/null +++ b/website/docs/en/config/test/env.mdx @@ -0,0 +1,30 @@ +--- +overviewHeaders: [] +--- + +# env + +- **Type:** `Partial` +- **Default:** `undefined` + +Custom environment variables available on `process.env` during tests. + +```ts title="rstest.config.ts" +import { defineConfig } from '@rstest/core'; + +export default defineConfig({ + env: { + PRINT_LOGGER: 'true', + }, +}); +``` + +After setting the above configuration, you can access the `PRINT_LOGGER` variable in your tests: + +```ts title="index.test.ts" +import { describe, it } from '@rstest/core'; + +if (process.env.PRINT_LOGGER === 'true') { + console.log('PRINT_LOGGER is enabled'); +} +``` diff --git a/website/docs/zh/config/test/_meta.json b/website/docs/zh/config/test/_meta.json index 411b6180..073ebf68 100644 --- a/website/docs/zh/config/test/_meta.json +++ b/website/docs/zh/config/test/_meta.json @@ -11,6 +11,7 @@ "includeSource", "testNamePattern", + "env", "retry", "testTimeout", "hookTimeout", diff --git a/website/docs/zh/config/test/env.mdx b/website/docs/zh/config/test/env.mdx new file mode 100644 index 00000000..44ca2801 --- /dev/null +++ b/website/docs/zh/config/test/env.mdx @@ -0,0 +1,30 @@ +--- +overviewHeaders: [] +--- + +# env + +- **类型:** `Partial` +- **默认值:** `undefined` + +自定义环境变量,在测试过程中可以通过 `process.env` 访问。 + +```ts title="rstest.config.ts" +import { defineConfig } from '@rstest/core'; + +export default defineConfig({ + env: { + PRINT_LOGGER: 'true', + }, +}); +``` + +在设置上述配置后,现在,你可以在测试中访问 `PRINT_LOGGER` 变量: + +```ts title="index.test.ts" +import { describe, it } from '@rstest/core'; + +if (process.env.PRINT_LOGGER === 'true') { + console.log('PRINT_LOGGER is enabled'); +} +``` diff --git a/website/theme/components/ConfigOverview.tsx b/website/theme/components/ConfigOverview.tsx index db0bf62a..0c480346 100644 --- a/website/theme/components/ConfigOverview.tsx +++ b/website/theme/components/ConfigOverview.tsx @@ -31,7 +31,7 @@ const OVERVIEW_GROUPS: Group[] = [ }, { name: 'runtime', - items: ['retry', 'testTimeout', 'hookTimeout', 'maxConcurrency'], + items: ['env', 'retry', 'testTimeout', 'hookTimeout', 'maxConcurrency'], }, { name: 'environment',