fix(deps): apply env vars back to the main process for reporters

This commit is contained in:
Max Schmitt 2024-03-15 13:51:29 +01:00
parent 94348bb3c5
commit c2366710f5
4 changed files with 27 additions and 6 deletions

View file

@ -63,6 +63,7 @@ if (process.env.PW_TS_ESM_LOADER_ON)
let processRunner: ProcessRunner | undefined; let processRunner: ProcessRunner | undefined;
let processName: string | undefined; let processName: string | undefined;
const startingEnv = { ...process.env }; const startingEnv = { ...process.env };
const kPredefinedWorkerEnvs = new Set(['TEST_WORKER_INDEX', 'TEST_PARALLEL_INDEX']);
process.on('message', async (message: any) => { process.on('message', async (message: any) => {
if (message.method === '__init__') { if (message.method === '__init__') {
@ -77,7 +78,7 @@ process.on('message', async (message: any) => {
} }
if (message.method === '__stop__') { if (message.method === '__stop__') {
const keys = new Set([...Object.keys(process.env), ...Object.keys(startingEnv)]); const keys = new Set([...Object.keys(process.env), ...Object.keys(startingEnv)]);
const producedEnv: EnvProducedPayload = [...keys].filter(key => startingEnv[key] !== process.env[key]).map(key => [key, process.env[key] ?? null]); const producedEnv: EnvProducedPayload = [...keys].filter(key => startingEnv[key] !== process.env[key] && !kPredefinedWorkerEnvs.has(key)).map(key => [key, process.env[key] ?? null]);
sendMessageToParent({ method: '__env_produced__', params: producedEnv }); sendMessageToParent({ method: '__env_produced__', params: producedEnv });
await gracefullyCloseAndExit(); await gracefullyCloseAndExit();
return; return;

View file

@ -36,7 +36,6 @@ export class Dispatcher {
private _finished = new ManualPromise<void>(); private _finished = new ManualPromise<void>();
private _isStopped = true; private _isStopped = true;
private _allTests: TestCase[] = [];
private _config: FullConfigInternal; private _config: FullConfigInternal;
private _reporter: ReporterV2; private _reporter: ReporterV2;
private _failureTracker: FailureTracker; private _failureTracker: FailureTracker;
@ -159,7 +158,6 @@ export class Dispatcher {
async run(testGroups: TestGroup[], extraEnvByProjectId: EnvByProjectId) { async run(testGroups: TestGroup[], extraEnvByProjectId: EnvByProjectId) {
this._extraEnvByProjectId = extraEnvByProjectId; this._extraEnvByProjectId = extraEnvByProjectId;
this._queue = testGroups; this._queue = testGroups;
this._allTests = testGroups.map(g => g.tests).flat();
for (const group of testGroups) for (const group of testGroups)
this._updateCounterForWorkerHash(group.workerHash, +1); this._updateCounterForWorkerHash(group.workerHash, +1);
this._isStopped = false; this._isStopped = false;

View file

@ -315,8 +315,12 @@ function createRunTestsTask(): Task<TestRun> {
} }
}, },
teardown: async ({ phases }) => { teardown: async ({ phases }) => {
for (const { dispatcher } of phases.reverse()) for (const { dispatcher, projects } of phases.reverse()) {
for (const project of projects)
process.env = { ...process.env, ...dispatcher.producedEnvByProjectId().get(project.project.id) };
dispatcher.producedEnvByProjectId();
await dispatcher.stop(); await dispatcher.stop();
}
}, },
}; };
} }

View file

@ -82,11 +82,29 @@ test('should inherit env changes from dependencies', async ({ runInlineTest }) =
console.log('\\n%%E-' + process.env.SET_IN_A + '-' + process.env.SET_IN_B + '-' + process.env.SET_OUTSIDE); console.log('\\n%%E-' + process.env.SET_IN_A + '-' + process.env.SET_IN_B + '-' + process.env.SET_OUTSIDE);
}); });
`, `,
}, {}, { SET_OUTSIDE: 'outside' }); 'myReporter.ts': `
export default class MyReporter {
onEnd() {
console.log('\\n%%Reporter-onEnd-TEST_WORKER_INDEX=' + process.env.TEST_WORKER_INDEX);
console.log('\\n%%Reporter-onEnd-TEST_PARALLEL_INDEX=' + process.env.TEST_PARALLEL_INDEX);
console.log('\\n%%Reporter-onEnd-' + process.env.SET_IN_A + '-' + process.env.SET_IN_B + '-' + process.env.SET_OUTSIDE);
}
}
`
}, { reporter: './myReporter.ts,list' }, { SET_OUTSIDE: 'outside' });
expect(result.passed).toBe(5); expect(result.passed).toBe(5);
expect(result.failed).toBe(0); expect(result.failed).toBe(0);
expect(result.skipped).toBe(0); expect(result.skipped).toBe(0);
expect(result.outputLines.sort()).toEqual(['A', 'B', 'C-valuea-undefined-undefined', 'D-undefined-valueb-outside', 'E-undefined-valueb-outside']); expect(result.outputLines.sort()).toEqual([
'A',
'B',
'C-valuea-undefined-undefined',
'D-undefined-valueb-outside',
'E-undefined-valueb-outside',
'Reporter-onEnd-TEST_PARALLEL_INDEX=undefined',
'Reporter-onEnd-TEST_WORKER_INDEX=undefined',
'Reporter-onEnd-valuea-valueb-undefined',
]);
}); });
test('should not run projects with dependencies when --no-deps is passed', async ({ runInlineTest }) => { test('should not run projects with dependencies when --no-deps is passed', async ({ runInlineTest }) => {