github-pages-deploy-action/node_modules/jest-circus/build/run.js

224 lines
5.0 KiB
JavaScript
Raw Normal View History

2020-01-28 12:58:23 +08:00
'use strict';
Object.defineProperty(exports, '__esModule', {
value: true
});
exports.default = void 0;
var _types = require('./types');
var _state = require('./state');
var _utils = require('./utils');
var Symbol = global['jest-symbol-do-not-touch'] || global.Symbol;
var Symbol = global['jest-symbol-do-not-touch'] || global.Symbol;
var Promise = global[Symbol.for('jest-native-promise')] || global.Promise;
const run = async () => {
const {rootDescribeBlock} = (0, _state.getState)();
(0, _state.dispatch)({
name: 'run_start'
});
await _runTestsForDescribeBlock(rootDescribeBlock);
(0, _state.dispatch)({
name: 'run_finish'
});
return (0, _utils.makeRunResult)(
(0, _state.getState)().rootDescribeBlock,
(0, _state.getState)().unhandledErrors
);
};
const _runTestsForDescribeBlock = async describeBlock => {
(0, _state.dispatch)({
describeBlock,
name: 'run_describe_start'
});
const {beforeAll, afterAll} = (0, _utils.getAllHooksForDescribe)(
describeBlock
);
for (const hook of beforeAll) {
await _callCircusHook({
describeBlock,
hook
});
} // Tests that fail and are retried we run after other tests
const retryTimes = parseInt(global[_types.RETRY_TIMES], 10) || 0;
const deferredRetryTests = [];
for (const test of describeBlock.tests) {
const hasErrorsBeforeTestRun = test.errors.length > 0;
await _runTest(test);
if (
hasErrorsBeforeTestRun === false &&
retryTimes > 0 &&
test.errors.length > 0
) {
deferredRetryTests.push(test);
}
} // Re-run failed tests n-times if configured
for (const test of deferredRetryTests) {
let numRetriesAvailable = retryTimes;
while (numRetriesAvailable > 0 && test.errors.length > 0) {
// Clear errors so retries occur
(0, _state.dispatch)({
name: 'test_retry',
test
});
await _runTest(test);
numRetriesAvailable--;
}
}
for (const child of describeBlock.children) {
await _runTestsForDescribeBlock(child);
}
for (const hook of afterAll) {
await _callCircusHook({
describeBlock,
hook
});
}
(0, _state.dispatch)({
describeBlock,
name: 'run_describe_finish'
});
};
const _runTest = async test => {
(0, _state.dispatch)({
name: 'test_start',
test
});
const testContext = Object.create(null);
const {hasFocusedTests, testNamePattern} = (0, _state.getState)();
const isSkipped =
test.mode === 'skip' ||
(hasFocusedTests && test.mode !== 'only') ||
(testNamePattern && !testNamePattern.test((0, _utils.getTestID)(test)));
if (isSkipped) {
(0, _state.dispatch)({
name: 'test_skip',
test
});
return;
}
if (test.mode === 'todo') {
(0, _state.dispatch)({
name: 'test_todo',
test
});
return;
}
const {afterEach, beforeEach} = (0, _utils.getEachHooksForTest)(test);
for (const hook of beforeEach) {
if (test.errors.length) {
// If any of the before hooks failed already, we don't run any
// hooks after that.
break;
}
await _callCircusHook({
hook,
test,
testContext
});
}
await _callCircusTest(test, testContext);
for (const hook of afterEach) {
await _callCircusHook({
hook,
test,
testContext
});
} // `afterAll` hooks should not affect test status (pass or fail), because if
// we had a global `afterAll` hook it would block all existing tests until
// this hook is executed. So we dispatch `test_done` right away.
(0, _state.dispatch)({
name: 'test_done',
test
});
};
const _callCircusHook = ({hook, test, describeBlock, testContext}) => {
(0, _state.dispatch)({
hook,
name: 'hook_start'
});
const timeout = hook.timeout || (0, _state.getState)().testTimeout;
return (0, _utils.callAsyncCircusFn)(hook.fn, testContext, {
isHook: true,
timeout
})
.then(() =>
(0, _state.dispatch)({
describeBlock,
hook,
name: 'hook_success',
test
})
)
.catch(error =>
(0, _state.dispatch)({
describeBlock,
error,
hook,
name: 'hook_failure',
test
})
);
};
const _callCircusTest = (test, testContext) => {
(0, _state.dispatch)({
name: 'test_fn_start',
test
});
const timeout = test.timeout || (0, _state.getState)().testTimeout;
(0, _utils.invariant)(
test.fn,
`Tests with no 'fn' should have 'mode' set to 'skipped'`
);
if (test.errors.length) {
// We don't run the test if there's already an error in before hooks.
return Promise.resolve();
}
return (0, _utils.callAsyncCircusFn)(test.fn, testContext, {
isHook: false,
timeout
})
.then(() =>
(0, _state.dispatch)({
name: 'test_fn_success',
test
})
)
.catch(error =>
(0, _state.dispatch)({
error,
name: 'test_fn_failure',
test
})
);
};
var _default = run;
exports.default = _default;