puppeteer/tools/mochaRunner/src/interface.ts
2023-02-15 15:09:31 -08:00

126 lines
3.6 KiB
TypeScript

/**
* Copyright 2022 Google Inc. All rights reserved.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* https://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
import Mocha from 'mocha';
import commonInterface from 'mocha/lib/interfaces/common';
import {getTestId} from './utils.js';
type SuiteFunction = ((this: Mocha.Suite) => void) | undefined;
type ExclusiveSuiteFunction = (this: Mocha.Suite) => void;
const skippedTests: Array<{testIdPattern: string; skip: true}> = process.env[
'PUPPETEER_SKIPPED_TEST_CONFIG'
]
? JSON.parse(process.env['PUPPETEER_SKIPPED_TEST_CONFIG'])
: [];
skippedTests.reverse();
function shouldSkipTest(test: Mocha.Test): boolean {
const testIdForFileName = getTestId(test.file!);
const testIdForTestName = getTestId(test.file!, test.fullTitle());
// TODO: more efficient lookup.
const definition = skippedTests.find(skippedTest => {
return (
'' === skippedTest.testIdPattern ||
testIdForFileName === skippedTest.testIdPattern ||
testIdForTestName === skippedTest.testIdPattern
);
});
if (definition && definition.skip) {
return true;
}
return false;
}
function customBDDInterface(suite: Mocha.Suite) {
const suites = [suite];
suite.on(
Mocha.Suite.constants.EVENT_FILE_PRE_REQUIRE,
function (context, file, mocha) {
const common = commonInterface(suites, context, mocha);
context['before'] = common.before;
context['after'] = common.after;
context['beforeEach'] = common.beforeEach;
context['afterEach'] = common.afterEach;
if (mocha.options.delay) {
context['run'] = common.runWithSuite(suite);
}
function describe(title: string, fn: SuiteFunction) {
return common.suite.create({
title: title,
file: file,
fn: fn,
});
}
describe.only = function (title: string, fn: ExclusiveSuiteFunction) {
return common.suite.only({
title: title,
file: file,
fn: fn,
});
};
describe.skip = function (title: string, fn: SuiteFunction) {
return common.suite.skip({
title: title,
file: file,
fn: fn,
});
};
// eslint-disable-next-line @typescript-eslint/ban-ts-comment
// @ts-ignore
context['describe'] = describe;
function it(title: string, fn: Mocha.TestFunction) {
const suite = suites[0]!;
const test = new Mocha.Test(title, suite.isPending() ? undefined : fn);
test.file = file;
test.parent = suite;
if (shouldSkipTest(test)) {
const test = new Mocha.Test(title);
test.file = file;
suite.addTest(test);
return test;
} else {
suite.addTest(test);
return test;
}
}
it.only = function (title: string, fn: Mocha.TestFunction) {
return common.test.only(mocha, context['it'](title, fn));
};
it.skip = function (title: string) {
return context['it'](title);
};
// eslint-disable-next-line @typescript-eslint/ban-ts-comment
// @ts-ignore
context.it = it;
}
);
}
customBDDInterface.description = 'Custom BDD';
module.exports = customBDDInterface;