export default ({ config, globalConfig, localRequire, testPath, }: SetupOptions) => { // Jest tests snapshotSerializers in order preceding built-in serializers. // Therefore, add in reverse because the last added is the first tested. config.snapshotSerializers .concat() .reverse() .forEach(path => { addSerializer(localRequire(path)); }); patchJasmine(); const {expand, updateSnapshot} = globalConfig; const snapshotResolver = buildSnapshotResolver(config); const snapshotPath = snapshotResolver.resolveSnapshotPath(testPath); const snapshotState = new SnapshotState(snapshotPath, { expand, getBabelTraverse: () => require('@babel/traverse').default, getPrettier: () => config.prettierPath ? require(config.prettierPath) : null, updateSnapshot, }); setState({snapshotState, testPath}); // Return it back to the outer scope (test runner outside the VM). return snapshotState; };
const _addSuppressedErrors = (test: Circus.TestEntry) => { const {suppressedErrors} = getState(); setState({suppressedErrors: []}); if (suppressedErrors.length) { test.errors = test.errors.concat(suppressedErrors); } };
const eventHandler = (event: Circus.Event) => { switch (event.name) { case 'test_start': { setState({currentTestName: getTestID(event.test)}); break; } case 'test_done': { _addSuppressedErrors(event.test); _addExpectedAssertionErrors(event.test); break; } } };
export default (config: {expand: boolean}) => { global.expect = expect; expect.setState({ expand: config.expand, }); expect.extend({ toMatchInlineSnapshot, toMatchSnapshot, toThrowErrorMatchingInlineSnapshot, toThrowErrorMatchingSnapshot, }); expect.addSnapshotSerializer = addSerializer; };
export default (config: {expand: boolean}) => { global.expect = expect; expect.setState({expand: config.expand}); expect.extend({ toMatchInlineSnapshot, toMatchSnapshot, toThrowErrorMatchingInlineSnapshot, toThrowErrorMatchingSnapshot, }); expect.addSnapshotSerializer = addSerializer; const jasmine = global.jasmine as Jasmine; jasmine.anything = expect.anything; jasmine.any = expect.any; jasmine.objectContaining = expect.objectContaining; jasmine.arrayContaining = expect.arrayContaining; jasmine.stringMatching = expect.stringMatching; jasmine.addMatchers = (jasmineMatchersObject: JasmineMatchersObject) => { const jestMatchersObject = Object.create(null); Object.keys(jasmineMatchersObject).forEach(name => { jestMatchersObject[name] = function( this: MatcherState, ...args: Array<unknown> ): RawMatcherFn { // use "expect.extend" if you need to use equality testers (via this.equal) const result = jasmineMatchersObject[name](null, null); // if there is no 'negativeCompare', both should be handled by `compare` const negativeCompare = result.negativeCompare || result.compare; return this.isNot ? negativeCompare.apply( null, // @ts-ignore args, ) : result.compare.apply( null, // @ts-ignore args, ); }; }); const expect = global.expect; expect.extend(jestMatchersObject); }; };
const addSuppressedErrors = (result: SpecResult) => { const {suppressedErrors} = getState(); setState({suppressedErrors: []}); if (suppressedErrors.length) { result.status = 'failed'; result.failedExpectations = suppressedErrors.map(error => ({ actual: '', // passing error for custom test reporters error, expected: '', matcherName: '', message: error.message, passed: false, stack: error.stack, })); } };
attr.onStart = (context: JasmineSpec) => { setState({currentTestName: context.getFullName()}); onStart && onStart.call(attr, context); };
export const initialize = ({ config, environment, getPrettier, getBabelTraverse, globalConfig, localRequire, parentProcess, testPath, }: { config: Config.ProjectConfig; environment: JestEnvironment; getPrettier: () => null | any; getBabelTraverse: () => Function; globalConfig: Config.GlobalConfig; localRequire: (path: Config.Path) => any; testPath: Config.Path; parentProcess: Process; }) => { const mutex = throat(globalConfig.maxConcurrency); Object.assign(global, globals); global.xit = global.it.skip; global.xtest = global.it.skip; global.xdescribe = global.describe.skip; global.fit = global.it.only; global.fdescribe = global.describe.only; global.test.concurrent = (test => { const concurrent = ( testName: string, testFn: () => Promise<any>, timeout?: number, ) => { // For concurrent tests we first run the function that returns promise, and then register a // nomral test that will be waiting on the returned promise (when we start the test, the promise // will already be in the process of execution). // Unfortunately at this stage there's no way to know if there are any `.only` tests in the suite // that will result in this test to be skipped, so we'll be executing the promise function anyway, // even if it ends up being skipped. const promise = mutex(() => testFn()); global.test(testName, () => promise, timeout); }; concurrent.only = ( testName: string, testFn: () => Promise<any>, timeout?: number, ) => { const promise = mutex(() => testFn()); // eslint-disable-next-line jest/no-focused-tests test.only(testName, () => promise, timeout); }; concurrent.skip = test.skip; return concurrent; })(global.test); addEventHandler(eventHandler); if (environment.handleTestEvent) { addEventHandler(environment.handleTestEvent.bind(environment)); } dispatch({ name: 'setup', parentProcess, testNamePattern: globalConfig.testNamePattern, }); if (config.testLocationInResults) { dispatch({ name: 'include_test_location_in_result', }); } // Jest tests snapshotSerializers in order preceding built-in serializers. // Therefore, add in reverse because the last added is the first tested. config.snapshotSerializers .concat() .reverse() .forEach(path => { addSerializer(localRequire(path)); }); const {expand, updateSnapshot} = globalConfig; const snapshotResolver = buildSnapshotResolver(config); const snapshotPath = snapshotResolver.resolveSnapshotPath(testPath); const snapshotState = new SnapshotState(snapshotPath, { expand, getBabelTraverse, getPrettier, updateSnapshot, }); setState({snapshotState, testPath}); // Return it back to the outer scope (test runner outside the VM). return {globals, snapshotState}; };