@browserstack/testcafe
Version:
Automated browser testing for the modern web development stack.
113 lines • 15.7 kB
JavaScript
"use strict";
var __importDefault = (this && this.__importDefault) || function (mod) {
return (mod && mod.__esModule) ? mod : { "default": mod };
};
var __importStar = (this && this.__importStar) || function (mod) {
if (mod && mod.__esModule) return mod;
var result = {};
if (mod != null) for (var k in mod) if (Object.hasOwnProperty.call(mod, k)) result[k] = mod[k];
result["default"] = mod;
return result;
};
Object.defineProperty(exports, "__esModule", { value: true });
/* eslint-disable */
const lodash_1 = require("lodash");
const moment_1 = __importDefault(require("moment"));
const async_event_emitter_1 = __importDefault(require("../utils/async-event-emitter"));
const browser_job_1 = __importDefault(require("./browser-job"));
const screenshots_1 = __importDefault(require("../screenshots"));
const warning_log_1 = __importDefault(require("../notifications/warning-log"));
const fixture_hook_controller_1 = __importDefault(require("./fixture-hook-controller"));
const clientScriptsRouting = __importStar(require("../custom-client-scripts/routing"));
const videos_1 = __importDefault(require("../video-recorder/videos"));
class Task extends async_event_emitter_1.default {
constructor(tests, browserConnectionGroups, proxy, opts) {
super();
this.timeStamp = moment_1.default();
this.running = false;
this.browserConnectionGroups = browserConnectionGroups;
this.tests = tests;
this.opts = opts;
this.proxy = proxy;
this.warningLog = new warning_log_1.default();
this.screenshots = new screenshots_1.default(Object.assign({ enabled: !this.opts.disableScreenshots }, this.opts.screenshots));
this.fixtureHookController = new fixture_hook_controller_1.default(tests, browserConnectionGroups.length);
this.pendingBrowserJobs = this._createBrowserJobs(proxy, this.opts);
this.clientScriptRoutes = clientScriptsRouting.register(proxy, tests);
this.testStructure = this._prepareTestStructure(tests);
if (this.opts.videoPath)
this.videos = new videos_1.default(this.pendingBrowserJobs, this.opts, this.warningLog, this.timeStamp);
}
_assignBrowserJobEventHandlers(job) {
job.on('test-run-start', async (testRun) => {
await this.emit('test-run-start', testRun);
});
job.on('test-run-done', async (testRun) => {
await this.emit('test-run-done', testRun);
if (this.opts.stopOnFirstFail && testRun.errs.length) {
this.abort();
await this.emit('done');
}
});
job.once('start', async () => {
if (!this.running) {
this.running = true;
await this.emit('start');
}
});
job.once('done', async () => {
await this.emit('browser-job-done', job);
lodash_1.pull(this.pendingBrowserJobs, job);
// console.log(`
// Jobs is asked to remove from queue
// ${this.pendingBrowserJobs.length}
// `);
if (!this.pendingBrowserJobs.length)
await this.emit('done');
});
job.on('test-action-start', async (args) => {
await this.emit('test-action-start', args);
});
job.on('test-action-done', async (args) => {
await this.emit('test-action-done', args);
});
}
_prepareTestStructure(tests) {
const groups = lodash_1.groupBy(tests, 'fixture.id');
return Object.keys(groups).map(fixtureId => {
const testsByGroup = groups[fixtureId];
const fixture = testsByGroup[0].fixture;
return {
fixture: {
id: fixture.id,
name: fixture.name,
tests: testsByGroup.map(test => {
return {
id: test.id,
name: test.name,
skip: test.skip
};
})
}
};
});
}
_createBrowserJobs(proxy, opts) {
return this.browserConnectionGroups.map(browserConnectionGroup => {
const job = new browser_job_1.default(this.tests, browserConnectionGroup, proxy, this.screenshots, this.warningLog, this.fixtureHookController, opts);
this._assignBrowserJobEventHandlers(job);
browserConnectionGroup.map(bc => bc.addJob(job));
return job;
});
}
unRegisterClientScriptRouting() {
clientScriptsRouting.unRegister(this.proxy, this.clientScriptRoutes);
}
// API
abort() {
this.pendingBrowserJobs.forEach(job => job.abort());
}
}
exports.default = Task;
module.exports = exports.default;
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidGFzay5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9ydW5uZXIvdGFzay5qcyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7QUFBQSxvQkFBb0I7QUFDcEIsbUNBQWlEO0FBQ2pELG9EQUE0QjtBQUM1Qix1RkFBNkQ7QUFDN0QsZ0VBQXVDO0FBQ3ZDLGlFQUF5QztBQUN6QywrRUFBc0Q7QUFDdEQsd0ZBQThEO0FBQzlELHVGQUF5RTtBQUN6RSxzRUFBOEM7QUFFOUMsTUFBcUIsSUFBSyxTQUFRLDZCQUFpQjtJQUMvQyxZQUFhLEtBQUssRUFBRSx1QkFBdUIsRUFBRSxLQUFLLEVBQUUsSUFBSTtRQUNwRCxLQUFLLEVBQUUsQ0FBQztRQUVSLElBQUksQ0FBQyxTQUFTLEdBQWlCLGdCQUFNLEVBQUUsQ0FBQztRQUN4QyxJQUFJLENBQUMsT0FBTyxHQUFtQixLQUFLLENBQUM7UUFDckMsSUFBSSxDQUFDLHVCQUF1QixHQUFHLHVCQUF1QixDQUFDO1FBQ3ZELElBQUksQ0FBQyxLQUFLLEdBQXFCLEtBQUssQ0FBQztRQUNyQyxJQUFJLENBQUMsSUFBSSxHQUFzQixJQUFJLENBQUM7UUFDcEMsSUFBSSxDQUFDLEtBQUssR0FBcUIsS0FBSyxDQUFDO1FBQ3JDLElBQUksQ0FBQyxVQUFVLEdBQWdCLElBQUkscUJBQVUsRUFBRSxDQUFDO1FBRWhELElBQUksQ0FBQyxXQUFXLEdBQUcsSUFBSSxxQkFBVyxpQkFDOUIsT0FBTyxFQUFFLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxrQkFBa0IsSUFFbkMsSUFBSSxDQUFDLElBQUksQ0FBQyxXQUFXLEVBQzFCLENBQUM7UUFFSCxJQUFJLENBQUMscUJBQXFCLEdBQUcsSUFBSSxpQ0FBcUIsQ0FBQyxLQUFLLEVBQUUsdUJBQXVCLENBQUMsTUFBTSxDQUFDLENBQUM7UUFDOUYsSUFBSSxDQUFDLGtCQUFrQixHQUFNLElBQUksQ0FBQyxrQkFBa0IsQ0FBQyxLQUFLLEVBQUUsSUFBSSxD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RCxNQUFNO0lBQ04sS0FBSztRQUNELElBQUksQ0FBQyxrQkFBa0IsQ0FBQyxPQUFPLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLENBQUMsS0FBSyxFQUFFLENBQUMsQ0FBQztJQUN4RCxDQUFDO0NBQ0o7QUFqSEQsdUJBaUhDIiwic291cmNlc0NvbnRlbnQiOlsiLyogZXNsaW50LWRpc2FibGUgKi9cbmltcG9ydCB7IHB1bGwgYXMgcmVtb3ZlLCBncm91cEJ5IH0gZnJvbSAnbG9kYXNoJztcbmltcG9ydCBtb21lbnQgZnJvbSAnbW9tZW50JztcbmltcG9ydCBBc3luY0V2ZW50RW1pdHRlciBmcm9tICcuLi91dGlscy9hc3luYy1ldmVudC1lbWl0dGVyJztcbmltcG9ydCBCcm93c2VySm9iIGZyb20gJy4vYnJvd3Nlci1qb2InO1xuaW1wb3J0IFNjcmVlbnNob3RzIGZyb20gJy4uL3NjcmVlbnNob3RzJztcbmltcG9ydCBXYXJuaW5nTG9nIGZyb20gJy4uL25vdGlmaWNhdGlvbnMvd2FybmluZy1sb2cnO1xuaW1wb3J0IEZpeHR1cmVIb29rQ29udHJvbGxlciBmcm9tICcuL2ZpeHR1cmUtaG9vay1jb250cm9sbGVyJztcbmltcG9ydCAqIGFzIGNsaWVudFNjcmlwdHNSb3V0aW5nIGZyb20gJy4uL2N1c3RvbS1jbGllbnQtc2NyaXB0cy9yb3V0aW5nJztcbmltcG9ydCBWaWRlb3MgZnJvbSAnLi4vdmlkZW8tcmVjb3JkZXIvdmlkZW9zJztcblxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgVGFzayBleHRlbmRzIEFzeW5jRXZlbnRFbWl0dGVyIHtcbiAgICBjb25zdHJ1Y3RvciAodGVzdHMsIGJyb3dzZXJDb25uZWN0aW9uR3JvdXBzLCBwcm94eSwgb3B0cykge1xuICAgICAgICBzdXBlcigpO1xuXG4gICAgICAgIHRoaXMudGltZVN0YW1wICAgICAgICAgICAgICAgPSBtb21lbnQoKTtcbiAgICAgICAgdGhpcy5ydW5uaW5nICAgICAgICAgICAgICAgICA9IGZhbHNlO1xuICAgICAgICB0aGlzLmJyb3dzZXJDb25uZWN0aW9uR3JvdXBzID0gYnJvd3NlckNvbm5lY3Rpb25Hcm91cHM7XG4gICAgICAgIHRoaXMudGVzdHMgICAgICAgICAgICAgICAgICAgPSB0ZXN0cztcbiAgICAgICAgdGhpcy5vcHRzICAgICAgICAgICAgICAgICAgICA9IG9wdHM7XG4gICAgICAgIHRoaXMucHJveHkgICAgICAgICAgICAgICAgICAgPSBwcm94eTtcbiAgICAgICAgdGhpcy53YXJuaW5nTG9nICAgICAgICAgICAgICA9IG5ldyBXYXJuaW5nTG9nKCk7XG5cbiAgICAgICAgdGhpcy5zY3JlZW5zaG90cyA9IG5ldyBTY3JlZW5zaG90cyh7XG4gICAgICAgICAgICBlbmFibGVkOiAhdGhpcy5vcHRzLmRpc2FibGVTY3JlZW5zaG90cyxcblxuICAgICAgICAgICAgLi4udGhpcy5vcHRzLnNjcmVlbnNob3RzXG4gICAgICAgIH0pO1xuXG4gICAgICAgIHRoaXMuZml4dHVyZUhvb2tDb250cm9sbGVyID0gbmV3IEZpeHR1cmVIb29rQ29udHJvbGxlcih0ZXN0cywgYnJvd3NlckNvbm5lY3Rpb25Hcm91cHMubGVuZ3RoKTtcbiAgICAgICAgdGhpcy5wZW5kaW5nQnJvd3NlckpvYnMgICAgPSB0aGlzLl9jcmVhdGVCcm93c2VySm9icyhwcm94eSwgdGhpcy5vcHRzKTtcbiAgICAgICAgdGhpcy5jbGllbnRTY3JpcHRSb3V0ZXMgICAgPSBjbGllbnRTY3JpcHRzUm91dGluZy5yZWdpc3Rlcihwcm94eSwgdGVzdHMpO1xuICAgICAgICB0aGlzLnRlc3RTdHJ1Y3R1cmUgICAgICAgICA9IHRoaXMuX3ByZXBhcmVUZXN0U3RydWN0dXJlKHRlc3RzKTtcblxuICAgICAgICBpZiAodGhpcy5vcHRzLnZpZGVvUGF0aClcbiAgICAgICAgICAgIHRoaXMudmlkZW9zID0gbmV3IFZpZGVvcyh0aGlzLnBlbmRpbmdCcm93c2VySm9icywgdGhpcy5vcHRzLCB0aGlzLndhcm5pbmdMb2csIHRoaXMudGltZVN0YW1wKTtcbiAgICB9XG5cbiAgICBfYXNzaWduQnJvd3NlckpvYkV2ZW50SGFuZGxlcnMgKGpvYikge1xuICAgICAgICBqb2Iub24oJ3Rlc3QtcnVuLXN0YXJ0JywgYXN5bmMgdGVzdFJ1biA9PiB7XG4gICAgICAgICAgICBhd2FpdCB0aGlzLmVtaXQoJ3Rlc3QtcnVuLXN0YXJ0JywgdGVzdFJ1bik7XG4gICAgICAgIH0pO1xuXG4gICAgICAgIGpvYi5vbigndGVzdC1ydW4tZG9uZScsIGFzeW5jIHRlc3RSdW4gPT4ge1xuICAgICAgICAgICAgYXdhaXQgdGhpcy5lbWl0KCd0ZXN0LXJ1bi1kb25lJywgdGVzdFJ1bik7XG5cbiAgICAgICAgICAgIGlmICh0aGlzLm9wdHMuc3RvcE9uRmlyc3RGYWlsICYmIHRlc3RSdW4uZXJycy5sZW5ndGgpIHtcbiAgICAgICAgICAgICAgICB0aGlzLmFib3J0KCk7XG4gICAgICAgICAgICAgICAgYXdhaXQgdGhpcy5lbWl0KCdkb25lJyk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuXG4gICAgICAgIGpvYi5vbmNlKCdzdGFydCcsIGFzeW5jICgpID0+IHtcbiAgICAgICAgICAgIGlmICghdGhpcy5ydW5uaW5nKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5ydW5uaW5nID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICBhd2FpdCB0aGlzLmVtaXQoJ3N0YXJ0Jyk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuXG4gICAgICAgIGpvYi5vbmNlKCdkb25lJywgYXN5bmMgKCkgPT4ge1xuICAgICAgICAgICAgYXdhaXQgdGhpcy5lbWl0KCdicm93c2VyLWpvYi1kb25lJywgam9iKTtcblxuICAgICAgICAgICAgcmVtb3ZlKHRoaXMucGVuZGluZ0Jyb3dzZXJKb2JzLCBqb2IpO1xuICAgICAgICAgICAgLy8gY29uc29sZS5sb2coYFxuICAgICAgICAgICAgLy8gICAgIEpvYnMgaXMgYXNrZWQgdG8gcmVtb3ZlIGZyb20gcXVldWVcbiAgICAgICAgICAgIC8vICAgICAke3RoaXMucGVuZGluZ0Jyb3dzZXJKb2JzLmxlbmd0aH1cbiAgICAgICAgICAgIC8vIGApO1xuXG4gICAgICAgICAgICBpZiAoIXRoaXMucGVuZGluZ0Jyb3dzZXJKb2JzLmxlbmd0aClcbiAgICAgICAgICAgICAgICBhd2FpdCB0aGlzLmVtaXQoJ2RvbmUnKTtcbiAgICAgICAgfSk7XG5cbiAgICAgICAgam9iLm9uKCd0ZXN0LWFjdGlvbi1zdGFydCcsIGFzeW5jIGFyZ3MgPT4ge1xuICAgICAgICAgICAgYXdhaXQgdGhpcy5lbWl0KCd0ZXN0LWFjdGlvbi1zdGFydCcsIGFyZ3MpO1xuICAgICAgICB9KTtcblxuICAgICAgICBqb2Iub24oJ3Rlc3QtYWN0aW9uLWRvbmUnLCBhc3luYyBhcmdzID0+IHtcbiAgICAgICAgICAgIGF3YWl0IHRoaXMuZW1pdCgndGVzdC1hY3Rpb24tZG9uZScsIGFyZ3MpO1xuICAgICAgICB9KTtcblxuICAgIH1cblxuICAgIF9wcmVwYXJlVGVzdFN0cnVjdHVyZSAodGVzdHMpIHtcbiAgICAgICAgY29uc3QgZ3JvdXBzID0gZ3JvdXBCeSh0ZXN0cywgJ2ZpeHR1cmUuaWQnKTtcblxuICAgICAgICByZXR1cm4gT2JqZWN0LmtleXMoZ3JvdXBzKS5tYXAoZml4dHVyZUlkID0+IHtcbiAgICAgICAgICAgIGNvbnN0IHRlc3RzQnlHcm91cCA9IGdyb3Vwc1tmaXh0dXJlSWRdO1xuICAgICAgICAgICAgY29uc3QgZml4dHVyZSAgICAgID0gdGVzdHNCeUdyb3VwWzBdLmZpeHR1cmU7XG5cbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgZml4dHVyZToge1xuICAgICAgICAgICAgICAgICAgICBpZDogICAgZml4dHVyZS5pZCxcbiAgICAgICAgICAgICAgICAgICAgbmFtZTogIGZpeHR1cmUubmFtZSxcbiAgICAgICAgICAgICAgICAgICAgdGVzdHM6IHRlc3RzQnlHcm91cC5tYXAodGVzdCA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlkOiAgIHRlc3QuaWQsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbmFtZTogdGVzdC5uYW1lLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNraXA6IHRlc3Quc2tpcFxuICAgICAgICAgICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgICAgICAgICAgfSlcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9O1xuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICBfY3JlYXRlQnJvd3NlckpvYnMgKHByb3h5LCBvcHRzKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmJyb3dzZXJDb25uZWN0aW9uR3JvdXBzLm1hcChicm93c2VyQ29ubmVjdGlvbkdyb3VwID0+IHtcbiAgICAgICAgICAgIGNvbnN0IGpvYiA9IG5ldyBCcm93c2VySm9iKHRoaXMudGVzdHMsIGJyb3dzZXJDb25uZWN0aW9uR3JvdXAsIHByb3h5LCB0aGlzLnNjcmVlbnNob3RzLCB0aGlzLndhcm5pbmdMb2csIHRoaXMuZml4dHVyZUhvb2tDb250cm9sbGVyLCBvcHRzKTtcblxuICAgICAgICAgICAgdGhpcy5fYXNzaWduQnJvd3NlckpvYkV2ZW50SGFuZGxlcnMoam9iKTtcbiAgICAgICAgICAgIGJyb3dzZXJDb25uZWN0aW9uR3JvdXAubWFwKGJjID0+IGJjLmFkZEpvYihqb2IpKTtcblxuICAgICAgICAgICAgcmV0dXJuIGpvYjtcbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgdW5SZWdpc3RlckNsaWVudFNjcmlwdFJvdXRpbmcgKCkge1xuICAgICAgICBjbGllbnRTY3JpcHRzUm91dGluZy51blJlZ2lzdGVyKHRoaXMucHJveHksIHRoaXMuY2xpZW50U2NyaXB0Um91dGVzKTtcbiAgICB9XG5cbiAgICAvLyBBUElcbiAgICBhYm9ydCAoKSB7XG4gICAgICAgIHRoaXMucGVuZGluZ0Jyb3dzZXJKb2JzLmZvckVhY2goam9iID0+IGpvYi5hYm9ydCgpKTtcbiAgICB9XG59XG4iXX0=