UNPKG

3.01 kBJavaScriptView Raw
1"use strict";
2var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
3 return new (P || (P = Promise))(function (resolve, reject) {
4 function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
5 function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
6 function step(result) { result.done ? resolve(result.value) : new P(function (resolve) { resolve(result.value); }).then(fulfilled, rejected); }
7 step((generator = generator.apply(thisArg, _arguments || [])).next());
8 });
9};
10Object.defineProperty(exports, "__esModule", { value: true });
11const util_1 = require("util");
12// This import lacks type definitions.
13const SaucelabsAPI = require('saucelabs');
14/**
15 * Karma browser reported that updates corresponding Saucelabs jobs whenever a given
16 * browser finishes.
17 */
18function SaucelabsReporter(logger, browserMap) {
19 const log = logger.create('reporter.sauce');
20 let pendingUpdates = [];
21 // This fires whenever any browser completes. This is when we want to report results
22 // to the Saucelabs API, so that people can create coverage banners for their project.
23 this.onBrowserComplete = function (browser) {
24 const result = browser.lastResult;
25 const browserId = browser.id;
26 if (result.disconnected) {
27 log.error('✖ Browser disconnected');
28 }
29 if (result.error) {
30 log.error('✖ Tests errored');
31 }
32 const browserData = browserMap.get(browserId);
33 // Do nothing if the current browser has not been launched through the Saucelabs
34 // launcher.
35 if (!browserData) {
36 return;
37 }
38 const { sessionId } = browserData;
39 // TODO: This would be nice to have typed. Not a priority right now, though.
40 const apiInstance = new SaucelabsAPI({
41 username: browserData.username,
42 password: browserData.accessKey,
43 proxy: browserData.proxy,
44 });
45 const updateJob = util_1.promisify(apiInstance.updateJob.bind(apiInstance));
46 const hasPassed = !(result.failed || result.error || result.disconnected);
47 // Update the job by reporting the test results. Also we need to store the promise here
48 // because in case "onExit" is being called, we want to wait for the API calls to finish.
49 pendingUpdates.push(updateJob(sessionId, { passed: hasPassed, 'custom-data': result })
50 .catch(error => log.error('Could not report results to Saucelabs: %s', error)));
51 };
52 // Whenever this method is being called, we just need to wait for all API calls to finish,
53 // and then we can notify Karma about proceeding with the exit.
54 this.onExit = (doneFn) => __awaiter(this, void 0, void 0, function* () {
55 yield Promise.all(pendingUpdates);
56 doneFn();
57 });
58}
59exports.SaucelabsReporter = SaucelabsReporter;
60//# sourceMappingURL=reporter.js.map
\No newline at end of file