fix(test-runner): with automatic fixtures workerInfo was undefined after conditional skip (#7521)

This commit is contained in:
Max Schmitt 2021-07-08 21:55:43 +02:00 committed by GitHub
parent b2742976a8
commit e604f185ca
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
3 changed files with 31 additions and 3 deletions

View file

@ -16,7 +16,7 @@
import { wrapInPromise } from './util';
import * as crypto from 'crypto';
import { FixturesWithLocation, Location } from './types';
import { FixturesWithLocation, Location, WorkerInfo, TestInfo } from './types';
type FixtureScope = 'test' | 'worker';
type FixtureRegistration = {
@ -228,7 +228,7 @@ export class FixtureRunner {
this.testScopeClean = true;
}
async resolveParametersAndRunHookOrTest(fn: Function, scope: FixtureScope, info: any) {
async resolveParametersAndRunHookOrTest(fn: Function, scope: FixtureScope, info: WorkerInfo|TestInfo) {
// Install all automatic fixtures.
for (const registration of this.pool!.registrations.values()) {
const shouldSkip = scope === 'worker' && registration.scope === 'test';

View file

@ -147,7 +147,7 @@ export class WorkerRunner extends EventEmitter {
if (!this._fixtureRunner.dependsOnWorkerFixturesOnly(beforeAllModifier.fn, beforeAllModifier.location))
continue;
// TODO: separate timeout for beforeAll modifiers?
const result = await raceAgainstDeadline(this._fixtureRunner.resolveParametersAndRunHookOrTest(beforeAllModifier.fn, 'worker', undefined), this._deadline());
const result = await raceAgainstDeadline(this._fixtureRunner.resolveParametersAndRunHookOrTest(beforeAllModifier.fn, 'worker', this._workerInfo), this._deadline());
if (result.timedOut) {
this._fatalError = serializeError(new Error(`Timeout of ${this._project.config.timeout}ms exceeded while running ${beforeAllModifier.type} modifier`));
this._reportDoneAndStop();

View file

@ -340,6 +340,34 @@ test('automatic fixtures should work', async ({ runInlineTest }) => {
expect(result.results.map(r => r.status)).toEqual(['passed', 'passed']);
});
test('automatic fixtures should keep workerInfo after conditional skip', async ({ runInlineTest }) => {
const result = await runInlineTest({
'a.test.js': `
const test = pwt.test;
test.use({
automaticTestFixture: [ async ({}, runTest, workerInfo) => {
await runTest();
expect(workerInfo.workerIndex).toBe(0);
console.log('success test fixture')
}, { auto: true } ],
automaticWorkerFixture: [ async ({}, runTest, workerInfo) => {
await runTest();
expect(workerInfo.workerIndex).toBe(0);
console.log('success worker fixture')
}, { scope: 'worker', auto: true } ],
});
test.skip(({ }) => false);
test('good', async ({ }) => {
});
`
});
expect(result.exitCode).toBe(0);
expect(result.output).toContain('success test fixture');
expect(result.output).toContain('success worker fixture');
expect(result.results.map(r => r.status)).toEqual(['passed']);
});
test('tests does not run non-automatic worker fixtures', async ({ runInlineTest }) => {
const result = await runInlineTest({
'a.test.js': `