feat(test runner): support test.setTimeout for the whole block (#7387)
This enables `test.setTimeout()` outside of the test body, that affects all tests in the block (either file or describe).
This commit is contained in:
parent
2166b98efc
commit
6b3614fd4c
|
|
@ -78,6 +78,7 @@ export class Suite extends Base implements reporterTypes.Suite {
|
||||||
fn: Function,
|
fn: Function,
|
||||||
location: Location,
|
location: Location,
|
||||||
}[] = [];
|
}[] = [];
|
||||||
|
_timeout: number | undefined;
|
||||||
|
|
||||||
_addSpec(spec: Spec) {
|
_addSpec(spec: Spec) {
|
||||||
spec.parent = this;
|
spec.parent = this;
|
||||||
|
|
|
||||||
|
|
@ -125,9 +125,15 @@ export class TestTypeImpl {
|
||||||
}
|
}
|
||||||
|
|
||||||
private _setTimeout(timeout: number) {
|
private _setTimeout(timeout: number) {
|
||||||
|
const suite = currentlyLoadingFileSuite();
|
||||||
|
if (suite) {
|
||||||
|
suite._timeout = timeout;
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
const testInfo = currentTestInfo();
|
const testInfo = currentTestInfo();
|
||||||
if (!testInfo)
|
if (!testInfo)
|
||||||
throw new Error(`test.setTimeout() can only be called inside test or fixture`);
|
throw new Error(`test.setTimeout() can only be called from a test file`);
|
||||||
testInfo.setTimeout(timeout);
|
testInfo.setTimeout(timeout);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -243,6 +243,15 @@ export class WorkerRunner extends EventEmitter {
|
||||||
deadlineRunner.setDeadline(deadline());
|
deadlineRunner.setDeadline(deadline());
|
||||||
},
|
},
|
||||||
};
|
};
|
||||||
|
|
||||||
|
// Inherit test.setTimeout() from parent suites.
|
||||||
|
for (let suite = spec.parent; suite; suite = suite.parent) {
|
||||||
|
if (suite._timeout !== undefined) {
|
||||||
|
testInfo.setTimeout(suite._timeout);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
this._setCurrentTest({ testInfo, testId });
|
this._setCurrentTest({ testInfo, testId });
|
||||||
const deadline = () => {
|
const deadline = () => {
|
||||||
return testInfo.timeout ? startTime + testInfo.timeout : undefined;
|
return testInfo.timeout ? startTime + testInfo.timeout : undefined;
|
||||||
|
|
|
||||||
|
|
@ -68,6 +68,35 @@ test('should respect test.setTimeout', async ({ runInlineTest }) => {
|
||||||
expect(result.output).toContain('Timeout of 1000ms exceeded');
|
expect(result.output).toContain('Timeout of 1000ms exceeded');
|
||||||
});
|
});
|
||||||
|
|
||||||
|
test('should respect test.setTimeout outside of the test', async ({ runInlineTest }) => {
|
||||||
|
const result = await runInlineTest({
|
||||||
|
'a.spec.ts': `
|
||||||
|
const { test } = pwt;
|
||||||
|
|
||||||
|
test.setTimeout(500);
|
||||||
|
test('fails', async ({}) => {
|
||||||
|
await new Promise(f => setTimeout(f, 1000));
|
||||||
|
});
|
||||||
|
test('passes', async ({}) => {
|
||||||
|
await new Promise(f => setTimeout(f, 100));
|
||||||
|
});
|
||||||
|
|
||||||
|
test.describe('suite', () => {
|
||||||
|
test.setTimeout(50);
|
||||||
|
test('fails', async ({}) => {
|
||||||
|
await new Promise(f => setTimeout(f, 100));
|
||||||
|
});
|
||||||
|
test('passes', async ({}) => {
|
||||||
|
});
|
||||||
|
});
|
||||||
|
`
|
||||||
|
});
|
||||||
|
expect(result.exitCode).toBe(1);
|
||||||
|
expect(result.failed).toBe(2);
|
||||||
|
expect(result.passed).toBe(2);
|
||||||
|
expect(result.output).toContain('Timeout of 500ms exceeded');
|
||||||
|
});
|
||||||
|
|
||||||
test('should timeout when calling test.setTimeout too late', async ({ runInlineTest }) => {
|
test('should timeout when calling test.setTimeout too late', async ({ runInlineTest }) => {
|
||||||
const result = await runInlineTest({
|
const result = await runInlineTest({
|
||||||
'a.spec.ts': `
|
'a.spec.ts': `
|
||||||
|
|
|
||||||
Loading…
Reference in a new issue