testcafe
Version:
Automated browser testing for the modern web development stack.
111 lines • 16.5 kB
JavaScript
;
var __importDefault = (this && this.__importDefault) || function (mod) {
return (mod && mod.__esModule) ? mod : { "default": mod };
};
Object.defineProperty(exports, "__esModule", { value: true });
const phase_1 = __importDefault(require("../test-run/phase"));
const process_test_fn_error_1 = __importDefault(require("../errors/process-test-fn-error"));
const execute_fn_with_timeout_1 = __importDefault(require("../utils/execute-fn-with-timeout"));
const get_test_and_fixture_info_1 = require("../utils/get-test-and-fixture-info");
class FixtureHookController {
constructor(tests, browserConnectionCount) {
this._fixtureMap = FixtureHookController._createFixtureMap(tests, browserConnectionCount);
}
static _ensureFixtureMapItem(fixtureMap, fixture) {
if (!fixtureMap.has(fixture)) {
const item = {
started: false,
testIsBlocked: false,
fixtureBeforeHookErr: null,
pendingTestRunCount: 0,
fixtureCtx: Object.create(null),
};
fixtureMap.set(fixture, item);
}
}
static _createFixtureMap(tests, browserConnectionCount) {
return tests.reduce((fixtureMap, test) => {
const fixture = test.fixture;
if (!test.skip) {
FixtureHookController._ensureFixtureMapItem(fixtureMap, fixture);
const item = fixtureMap.get(fixture);
item.pendingTestRunCount += browserConnectionCount;
}
return fixtureMap;
}, new Map());
}
_getFixtureMapItem(test) {
return test.skip ? null : this._fixtureMap.get(test.fixture);
}
isTestBlocked(test) {
const item = this._getFixtureMapItem(test);
return !!item && item.testIsBlocked;
}
unblockTest(test) {
const item = this._getFixtureMapItem(test);
if (item)
item.testIsBlocked = false;
}
blockTestIfNecessary(test) {
const fixture = test.fixture;
const item = this._getFixtureMapItem(test);
if (item && (fixture.globalBeforeFn || fixture.beforeFn))
item.testIsBlocked = true;
}
async _runFixtureBeforeHook(item, fn, testRun) {
if (!fn)
return true;
try {
await (0, execute_fn_with_timeout_1.default)(fn, testRun.executionTimeout, item.fixtureCtx, (0, get_test_and_fixture_info_1.getFixtureInfo)(testRun));
}
catch (err) {
item.fixtureBeforeHookErr = (0, process_test_fn_error_1.default)(err);
}
return !item.fixtureBeforeHookErr;
}
async _runFixtureAfterHook(item, fn, testRun) {
if (!fn)
return;
testRun.phase = phase_1.default.inFixtureAfterHook;
try {
await (0, execute_fn_with_timeout_1.default)(fn, testRun.executionTimeout, item.fixtureCtx, (0, get_test_and_fixture_info_1.getFixtureInfo)(testRun));
}
catch (err) {
testRun.addError((0, process_test_fn_error_1.default)(err));
}
}
async runFixtureBeforeHookIfNecessary(testRun) {
const fixture = testRun.test.fixture;
const item = this._getFixtureMapItem(testRun.test);
if (item) {
const shouldRunBeforeHook = !item.started;
item.started = true;
const success = shouldRunBeforeHook
&& await this._runFixtureBeforeHook(item, fixture.globalBeforeFn, testRun)
&& await this._runFixtureBeforeHook(item, fixture.beforeFn, testRun);
// NOTE: fail all tests in fixture if fixture.before hook has error
if (!success && item.fixtureBeforeHookErr) {
testRun.phase = phase_1.default.inFixtureBeforeHook;
testRun.addError(item.fixtureBeforeHookErr);
return false;
}
testRun.fixtureCtx = item.fixtureCtx;
}
return true;
}
async runFixtureAfterHookIfNecessary(testRun) {
const fixture = testRun.test.fixture;
const item = this._getFixtureMapItem(testRun.test);
if (!item)
return;
item.pendingTestRunCount--;
if (item.pendingTestRunCount !== 0)
return;
await this._runFixtureAfterHook(item, fixture.afterFn, testRun);
await this._runFixtureAfterHook(item, fixture.globalAfterFn, testRun);
this._fixtureMap.delete(fixture);
}
}
exports.default = FixtureHookController;
module.exports = exports.default;
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZml4dHVyZS1ob29rLWNvbnRyb2xsZXIuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvcnVubmVyL2ZpeHR1cmUtaG9vay1jb250cm9sbGVyLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7O0FBQUEsOERBQStDO0FBQy9DLDRGQUFpRTtBQUlqRSwrRkFBb0U7QUFDcEUsa0ZBQW9FO0FBVXBFLE1BQXFCLHFCQUFxQjtJQUd0QyxZQUFvQixLQUFhLEVBQUUsc0JBQThCO1FBQzdELElBQUksQ0FBQyxXQUFXLEdBQUcscUJBQXFCLENBQUMsaUJBQWlCLENBQUMsS0FBSyxFQUFFLHNCQUFzQixDQUFDLENBQUM7SUFDOUYsQ0FBQztJQUVPLE1BQU0sQ0FBQyxxQkFBcUIsQ0FBRSxVQUFzQyxFQUFFLE9BQWdCO1FBQzFGLElBQUksQ0FBQyxVQUFVLENBQUMsR0FBRyxDQUFDLE9BQU8sQ0FBQyxFQUFFO1lBQzFCLE1BQU0sSUFBSSxHQUFHO2dCQUNULE9BQU8sRUFBZSxLQUFLO2dCQUMzQixhQUFhLEVBQVMsS0FBSztnQkFDM0Isb0JBQW9CLEVBQUUsSUFBSTtnQkFDMUIsbUJBQW1CLEVBQUcsQ0FBQztnQkFDdkIsVUFBVSxFQUFZLE1BQU0sQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDO2FBQzVDLENBQUM7WUFFRixVQUFVLENBQUMsR0FBRyxDQUFDLE9BQU8sRUFBRSxJQUFJLENBQUMsQ0FBQztTQUNqQztJQUNMLENBQUM7SUFFTyxNQUFNLENBQUMsaUJBQWlCLENBQUUsS0FBYSxFQUFFLHNCQUE4QjtRQUMzRSxPQUFPLEtBQUssQ0FBQyxNQUFNLENBQUMsQ0FBQyxVQUFVLEVBQUUsSUFBSSxFQUFFLEVBQUU7WUFDckMsTUFBTSxPQUFPLEdBQUcsSUFBSSxDQUFDLE9BQU8sQ0FBQztZQUU3QixJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksRUFBRTtnQkFDWixxQkFBcUIsQ0FBQyxxQkFBcUIsQ0FBQyxVQUFVLEVBQUUsT0FBa0IsQ0FB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Q0FBQztRQUV0RSxJQUFJLENBQUMsV0FBVyxDQUFDLE1BQU0sQ0FBQyxPQUFPLENBQUMsQ0FBQztJQUNyQyxDQUFDO0NBQ0o7QUF2SUQsd0NBdUlDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IFRFU1RfUlVOX1BIQVNFIGZyb20gJy4uL3Rlc3QtcnVuL3BoYXNlJztcbmltcG9ydCBwcm9jZXNzVGVzdEZuRXJyb3IgZnJvbSAnLi4vZXJyb3JzL3Byb2Nlc3MtdGVzdC1mbi1lcnJvcic7XG5pbXBvcnQgVGVzdCBmcm9tICcuLi9hcGkvc3RydWN0dXJlL3Rlc3QnO1xuaW1wb3J0IEZpeHR1cmUgZnJvbSAnLi4vYXBpL3N0cnVjdHVyZS9maXh0dXJlJztcbmltcG9ydCBUZXN0UnVuIGZyb20gJy4uL3Rlc3QtcnVuJztcbmltcG9ydCBleGVjdXRlRm5XaXRoVGltZW91dCBmcm9tICcuLi91dGlscy9leGVjdXRlLWZuLXdpdGgtdGltZW91dCc7XG5pbXBvcnQgeyBnZXRGaXh0dXJlSW5mbyB9IGZyb20gJy4uL3V0aWxzL2dldC10ZXN0LWFuZC1maXh0dXJlLWluZm8nO1xuXG5pbnRlcmZhY2UgRml4dHVyZVN0YXRlIHtcbiAgICBzdGFydGVkOiBib29sZWFuO1xuICAgIHRlc3RJc0Jsb2NrZWQ6IGJvb2xlYW47XG4gICAgZml4dHVyZUJlZm9yZUhvb2tFcnI6IG51bGwgfCBFcnJvcjtcbiAgICBwZW5kaW5nVGVzdFJ1bkNvdW50OiBudW1iZXI7XG4gICAgZml4dHVyZUN0eDogb2JqZWN0O1xufVxuXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBGaXh0dXJlSG9va0NvbnRyb2xsZXIge1xuICAgIHByaXZhdGUgcmVhZG9ubHkgX2ZpeHR1cmVNYXA6IE1hcDxGaXh0dXJlLCBGaXh0dXJlU3RhdGU+O1xuXG4gICAgcHVibGljIGNvbnN0cnVjdG9yICh0ZXN0czogVGVzdFtdLCBicm93c2VyQ29ubmVjdGlvbkNvdW50OiBudW1iZXIpIHtcbiAgICAgICAgdGhpcy5fZml4dHVyZU1hcCA9IEZpeHR1cmVIb29rQ29udHJvbGxlci5fY3JlYXRlRml4dHVyZU1hcCh0ZXN0cywgYnJvd3NlckNvbm5lY3Rpb25Db3VudCk7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBzdGF0aWMgX2Vuc3VyZUZpeHR1cmVNYXBJdGVtIChmaXh0dXJlTWFwOiBNYXA8Rml4dHVyZSwgRml4dHVyZVN0YXRlPiwgZml4dHVyZTogRml4dHVyZSk6IHZvaWQge1xuICAgICAgICBpZiAoIWZpeHR1cmVNYXAuaGFzKGZpeHR1cmUpKSB7XG4gICAgICAgICAgICBjb25zdCBpdGVtID0ge1xuICAgICAgICAgICAgICAgIHN0YXJ0ZWQ6ICAgICAgICAgICAgICBmYWxzZSxcbiAgICAgICAgICAgICAgICB0ZXN0SXNCbG9ja2VkOiAgICAgICAgZmFsc2UsXG4gICAgICAgICAgICAgICAgZml4dHVyZUJlZm9yZUhvb2tFcnI6IG51bGwsXG4gICAgICAgICAgICAgICAgcGVuZGluZ1Rlc3RSdW5Db3VudDogIDAsXG4gICAgICAgICAgICAgICAgZml4dHVyZUN0eDogICAgICAgICAgIE9iamVjdC5jcmVhdGUobnVsbCksXG4gICAgICAgICAgICB9O1xuXG4gICAgICAgICAgICBmaXh0dXJlTWFwLnNldChmaXh0dXJlLCBpdGVtKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHByaXZhdGUgc3RhdGljIF9jcmVhdGVGaXh0dXJlTWFwICh0ZXN0czogVGVzdFtdLCBicm93c2VyQ29ubmVjdGlvbkNvdW50OiBudW1iZXIpOiBNYXA8Rml4dHVyZSwgRml4dHVyZVN0YXRlPiB7XG4gICAgICAgIHJldHVybiB0ZXN0cy5yZWR1Y2UoKGZpeHR1cmVNYXAsIHRlc3QpID0+IHtcbiAgICAgICAgICAgIGNvbnN0IGZpeHR1cmUgPSB0ZXN0LmZpeHR1cmU7XG5cbiAgICAgICAgICAgIGlmICghdGVzdC5za2lwKSB7XG4gICAgICAgICAgICAgICAgRml4dHVyZUhvb2tDb250cm9sbGVyLl9lbnN1cmVGaXh0dXJlTWFwSXRlbShmaXh0dXJlTWFwLCBmaXh0dXJlIGFzIEZpeHR1cmUpO1xuXG4gICAgICAgICAgICAgICAgY29uc3QgaXRlbSA9IGZpeHR1cmVNYXAuZ2V0KGZpeHR1cmUpO1xuXG4gICAgICAgICAgICAgICAgaXRlbS5wZW5kaW5nVGVzdFJ1bkNvdW50ICs9IGJyb3dzZXJDb25uZWN0aW9uQ291bnQ7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHJldHVybiBmaXh0dXJlTWFwO1xuICAgICAgICB9LCBuZXcgTWFwKCkpO1xuICAgIH1cblxuICAgIHByaXZhdGUgX2dldEZpeHR1cmVNYXBJdGVtICh0ZXN0OiBUZXN0KTogbnVsbCB8IEZpeHR1cmVTdGF0ZSB8IHVuZGVmaW5lZCB7XG4gICAgICAgIHJldHVybiB0ZXN0LnNraXAgPyBudWxsIDogdGhpcy5fZml4dHVyZU1hcC5nZXQodGVzdC5maXh0dXJlIGFzIEZpeHR1cmUpO1xuICAgIH1cblxuICAgIHB1YmxpYyBpc1Rlc3RCbG9ja2VkICh0ZXN0OiBUZXN0KTogYm9vbGVhbiB7XG4gICAgICAgIGNvbnN0IGl0ZW0gPSB0aGlzLl9nZXRGaXh0dXJlTWFwSXRlbSh0ZXN0KTtcblxuICAgICAgICByZXR1cm4gISFpdGVtICYmIGl0ZW0udGVzdElzQmxvY2tlZDtcbiAgICB9XG5cbiAgICBwdWJsaWMgdW5ibG9ja1Rlc3QgKHRlc3Q6IFRlc3QpOiB2b2lkIHtcbiAgICAgICAgY29uc3QgaXRlbSA9IHRoaXMuX2dldEZpeHR1cmVNYXBJdGVtKHRlc3QpO1xuXG4gICAgICAgIGlmIChpdGVtKVxuICAgICAgICAgICAgaXRlbS50ZXN0SXNCbG9ja2VkID0gZmFsc2U7XG4gICAgfVxuXG4gICAgcHVibGljIGJsb2NrVGVzdElmTmVjZXNzYXJ5ICh0ZXN0OiBUZXN0KTogdm9pZCB7XG4gICAgICAgIGNvbnN0IGZpeHR1cmUgPSB0ZXN0LmZpeHR1cmUgYXMgRml4dHVyZTtcbiAgICAgICAgY29uc3QgaXRlbSAgICA9IHRoaXMuX2dldEZpeHR1cmVNYXBJdGVtKHRlc3QpO1xuXG4gICAgICAgIGlmIChpdGVtICYmIChmaXh0dXJlLmdsb2JhbEJlZm9yZUZuIHx8IGZpeHR1cmUuYmVmb3JlRm4pKVxuICAgICAgICAgICAgaXRlbS50ZXN0SXNCbG9ja2VkID0gdHJ1ZTtcbiAgICB9XG5cbiAgICBwcml2YXRlIGFzeW5jIF9ydW5GaXh0dXJlQmVmb3JlSG9vayAoaXRlbTogRml4dHVyZVN0YXRlLCBmbjogRnVuY3Rpb24sIHRlc3RSdW46IFRlc3RSdW4pOiBQcm9taXNlPGJvb2xlYW4+IHtcbiAgICAgICAgaWYgKCFmbilcbiAgICAgICAgICAgIHJldHVybiB0cnVlO1xuXG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgICBhd2FpdCBleGVjdXRlRm5XaXRoVGltZW91dChmbiwgdGVzdFJ1bi5leGVjdXRpb25UaW1lb3V0LCBpdGVtLmZpeHR1cmVDdHgsIGdldEZpeHR1cmVJbmZvKHRlc3RSdW4pKTtcbiAgICAgICAgfVxuICAgICAgICBjYXRjaCAoZXJyKSB7XG4gICAgICAgICAgICBpdGVtLmZpeHR1cmVCZWZvcmVIb29rRXJyID0gcHJvY2Vzc1Rlc3RGbkVycm9yKGVycik7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gIWl0ZW0uZml4dHVyZUJlZm9yZUhvb2tFcnI7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBhc3luYyBfcnVuRml4dHVyZUFmdGVySG9vayAoaXRlbTogRml4dHVyZVN0YXRlLCBmbjogRnVuY3Rpb24gfCBudWxsLCB0ZXN0UnVuOiBUZXN0UnVuKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgICAgIGlmICghZm4pXG4gICAgICAgICAgICByZXR1cm47XG5cbiAgICAgICAgdGVzdFJ1bi5waGFzZSA9IFRFU1RfUlVOX1BIQVNFLmluRml4dHVyZUFmdGVySG9vaztcblxuICAgICAgICB0cnkge1xuICAgICAgICAgICAgYXdhaXQgZXhlY3V0ZUZuV2l0aFRpbWVvdXQoZm4sIHRlc3RSdW4uZXhlY3V0aW9uVGltZW91dCwgaXRlbS5maXh0dXJlQ3R4LCBnZXRGaXh0dXJlSW5mbyh0ZXN0UnVuKSk7XG4gICAgICAgIH1cbiAgICAgICAgY2F0Y2ggKGVycikge1xuICAgICAgICAgICAgdGVzdFJ1bi5hZGRFcnJvcihwcm9jZXNzVGVzdEZuRXJyb3IoZXJyKSk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBwdWJsaWMgYXN5bmMgcnVuRml4dHVyZUJlZm9yZUhvb2tJZk5lY2Vzc2FyeSAodGVzdFJ1bjogVGVzdFJ1bik6IFByb21pc2U8Ym9vbGVhbj4ge1xuICAgICAgICBjb25zdCBmaXh0dXJlID0gdGVzdFJ1bi50ZXN0LmZpeHR1cmUgYXMgRml4dHVyZTtcbiAgICAgICAgY29uc3QgaXRlbSAgICA9IHRoaXMuX2dldEZpeHR1cmVNYXBJdGVtKHRlc3RSdW4udGVzdCk7XG5cbiAgICAgICAgaWYgKGl0ZW0pIHtcbiAgICAgICAgICAgIGNvbnN0IHNob3VsZFJ1bkJlZm9yZUhvb2sgPSAhaXRlbS5zdGFydGVkO1xuXG4gICAgICAgICAgICBpdGVtLnN0YXJ0ZWQgPSB0cnVlO1xuXG4gICAgICAgICAgICBjb25zdCBzdWNjZXNzID0gc2hvdWxkUnVuQmVmb3JlSG9va1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICYmIGF3YWl0IHRoaXMuX3J1bkZpeHR1cmVCZWZvcmVIb29rKGl0ZW0sIGZpeHR1cmUuZ2xvYmFsQmVmb3JlRm4gYXMgRnVuY3Rpb24sIHRlc3RSdW4pXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgJiYgYXdhaXQgdGhpcy5fcnVuRml4dHVyZUJlZm9yZUhvb2soaXRlbSwgZml4dHVyZS5iZWZvcmVGbiBhcyBGdW5jdGlvbiwgdGVzdFJ1bik7XG5cbiAgICAgICAgICAgIC8vIE5PVEU6IGZhaWwgYWxsIHRlc3RzIGluIGZpeHR1cmUgaWYgZml4dHVyZS5iZWZvcmUgaG9vayBoYXMgZXJyb3JcbiAgICAgICAgICAgIGlmICghc3VjY2VzcyAmJiBpdGVtLmZpeHR1cmVCZWZvcmVIb29rRXJyKSB7XG4gICAgICAgICAgICAgICAgdGVzdFJ1bi5waGFzZSA9IFRFU1RfUlVOX1BIQVNFLmluRml4dHVyZUJlZm9yZUhvb2s7XG5cbiAgICAgICAgICAgICAgICB0ZXN0UnVuLmFkZEVycm9yKGl0ZW0uZml4dHVyZUJlZm9yZUhvb2tFcnIpO1xuXG4gICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICB0ZXN0UnVuLmZpeHR1cmVDdHggPSBpdGVtLmZpeHR1cmVDdHg7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG5cbiAgICBwdWJsaWMgYXN5bmMgcnVuRml4dHVyZUFmdGVySG9va0lmTmVjZXNzYXJ5ICh0ZXN0UnVuOiBUZXN0UnVuKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgICAgIGNvbnN0IGZpeHR1cmUgPSB0ZXN0UnVuLnRlc3QuZml4dHVyZSBhcyBGaXh0dXJlO1xuICAgICAgICBjb25zdCBpdGVtICAgID0gdGhpcy5fZ2V0Rml4dHVyZU1hcEl0ZW0odGVzdFJ1bi50ZXN0KTtcblxuICAgICAgICBpZiAoIWl0ZW0pXG4gICAgICAgICAgICByZXR1cm47XG5cbiAgICAgICAgaXRlbS5wZW5kaW5nVGVzdFJ1bkNvdW50LS07XG5cbiAgICAgICAgaWYgKGl0ZW0ucGVuZGluZ1Rlc3RSdW5Db3VudCAhPT0gMClcbiAgICAgICAgICAgIHJldHVybjtcblxuICAgICAgICBhd2FpdCB0aGlzLl9ydW5GaXh0dXJlQWZ0ZXJIb29rKGl0ZW0sIGZpeHR1cmUuYWZ0ZXJGbiwgdGVzdFJ1bik7XG4gICAgICAgIGF3YWl0IHRoaXMuX3J1bkZpeHR1cmVBZnRlckhvb2soaXRlbSwgZml4dHVyZS5nbG9iYWxBZnRlckZuLCB0ZXN0UnVuKTtcblxuICAgICAgICB0aGlzLl9maXh0dXJlTWFwLmRlbGV0ZShmaXh0dXJlKTtcbiAgICB9XG59XG4iXX0=