@wdio/browserstack-service 7.28.1 → 7.29.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -2,4 +2,13 @@ import type { BrowserstackConfig } from './types';
2
2
  export declare const BROWSER_DESCRIPTION: readonly ["device", "os", "osVersion", "os_version", "browserName", "browser", "browserVersion", "browser_version"];
3
3
  export declare const VALID_APP_EXTENSION: string[];
4
4
  export declare const DEFAULT_OPTIONS: Partial<BrowserstackConfig>;
5
+ export declare const DATA_ENDPOINT = "https://collector-observability.browserstack.com";
6
+ export declare const DATA_EVENT_ENDPOINT = "api/v1/event";
7
+ export declare const DATA_BATCH_ENDPOINT = "api/v1/batch";
8
+ export declare const DATA_SCREENSHOT_ENDPOINT = "api/v1/screenshots";
9
+ export declare const DATA_BATCH_SIZE = 1000;
10
+ export declare const DATA_BATCH_INTERVAL = 2000;
11
+ export declare const BATCH_EVENT_TYPES: string[];
12
+ export declare const DEFAULT_WAIT_TIMEOUT_FOR_PENDING_UPLOADS = 5000;
13
+ export declare const DEFAULT_WAIT_INTERVAL_FOR_PENDING_UPLOADS = 100;
5
14
  //# sourceMappingURL=constants.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"constants.d.ts","sourceRoot":"","sources":["../src/constants.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,SAAS,CAAA;AAEjD,eAAO,MAAM,mBAAmB,qHAStB,CAAA;AAEV,eAAO,MAAM,mBAAmB,UAI/B,CAAA;AAED,eAAO,MAAM,eAAe,EAAE,OAAO,CAAC,kBAAkB,CAGvD,CAAA"}
1
+ {"version":3,"file":"constants.d.ts","sourceRoot":"","sources":["../src/constants.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,SAAS,CAAA;AAEjD,eAAO,MAAM,mBAAmB,qHAStB,CAAA;AAEV,eAAO,MAAM,mBAAmB,UAI/B,CAAA;AAED,eAAO,MAAM,eAAe,EAAE,OAAO,CAAC,kBAAkB,CAIvD,CAAA;AAED,eAAO,MAAM,aAAa,qDAAqD,CAAA;AAC/E,eAAO,MAAM,mBAAmB,iBAAiB,CAAA;AACjD,eAAO,MAAM,mBAAmB,iBAAiB,CAAA;AACjD,eAAO,MAAM,wBAAwB,uBAAuB,CAAA;AAC5D,eAAO,MAAM,eAAe,OAAO,CAAA;AACnC,eAAO,MAAM,mBAAmB,OAAO,CAAA;AACvC,eAAO,MAAM,iBAAiB,UAAgH,CAAA;AAC9I,eAAO,MAAM,wCAAwC,OAAO,CAAA;AAC5D,eAAO,MAAM,yCAAyC,MAAM,CAAA"}
@@ -1,6 +1,6 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.DEFAULT_OPTIONS = exports.VALID_APP_EXTENSION = exports.BROWSER_DESCRIPTION = void 0;
3
+ exports.DEFAULT_WAIT_INTERVAL_FOR_PENDING_UPLOADS = exports.DEFAULT_WAIT_TIMEOUT_FOR_PENDING_UPLOADS = exports.BATCH_EVENT_TYPES = exports.DATA_BATCH_INTERVAL = exports.DATA_BATCH_SIZE = exports.DATA_SCREENSHOT_ENDPOINT = exports.DATA_BATCH_ENDPOINT = exports.DATA_EVENT_ENDPOINT = exports.DATA_ENDPOINT = exports.DEFAULT_OPTIONS = exports.VALID_APP_EXTENSION = exports.BROWSER_DESCRIPTION = void 0;
4
4
  exports.BROWSER_DESCRIPTION = [
5
5
  'device',
6
6
  'os',
@@ -18,5 +18,15 @@ exports.VALID_APP_EXTENSION = [
18
18
  ];
19
19
  exports.DEFAULT_OPTIONS = {
20
20
  setSessionName: true,
21
- setSessionStatus: true
21
+ setSessionStatus: true,
22
+ testObservability: true
22
23
  };
24
+ exports.DATA_ENDPOINT = 'https://collector-observability.browserstack.com';
25
+ exports.DATA_EVENT_ENDPOINT = 'api/v1/event';
26
+ exports.DATA_BATCH_ENDPOINT = 'api/v1/batch';
27
+ exports.DATA_SCREENSHOT_ENDPOINT = 'api/v1/screenshots';
28
+ exports.DATA_BATCH_SIZE = 1000;
29
+ exports.DATA_BATCH_INTERVAL = 2000;
30
+ exports.BATCH_EVENT_TYPES = ['LogCreated', 'TestRunStarted', 'TestRunFinished', 'HookRunFinished', 'HookRunStarted', 'ScreenshotCreated'];
31
+ exports.DEFAULT_WAIT_TIMEOUT_FOR_PENDING_UPLOADS = 5000; // 5s
32
+ exports.DEFAULT_WAIT_INTERVAL_FOR_PENDING_UPLOADS = 100; // 100ms
@@ -0,0 +1,177 @@
1
+ export interface ITestCaseHookParameter {
2
+ gherkinDocument: GherkinDocument;
3
+ pickle: Pickle;
4
+ result?: TestStepResult;
5
+ willBeRetried?: boolean;
6
+ testCaseStartedId: string;
7
+ }
8
+ export declare class Duration {
9
+ seconds: number;
10
+ nanos: number;
11
+ }
12
+ export declare class GherkinDocument {
13
+ uri?: string;
14
+ feature?: Feature;
15
+ comments: readonly Comment[];
16
+ }
17
+ export declare class Background {
18
+ location: Location;
19
+ keyword: string;
20
+ name: string;
21
+ description: string;
22
+ steps: readonly Step[];
23
+ id: string;
24
+ }
25
+ export declare class DataTable {
26
+ location: Location;
27
+ rows: readonly TableRow[];
28
+ }
29
+ export declare class DocString {
30
+ location: Location;
31
+ mediaType?: string;
32
+ content: string;
33
+ delimiter: string;
34
+ }
35
+ export declare class Examples {
36
+ location: Location;
37
+ tags: readonly Tag[];
38
+ keyword: string;
39
+ name: string;
40
+ description: string;
41
+ tableHeader?: TableRow;
42
+ tableBody: readonly TableRow[];
43
+ id: string;
44
+ }
45
+ export declare class Feature {
46
+ location: Location;
47
+ tags: readonly Tag[];
48
+ language: string;
49
+ keyword: string;
50
+ name: string;
51
+ description: string;
52
+ children: readonly FeatureChild[];
53
+ }
54
+ export declare class FeatureChild {
55
+ rule?: Rule;
56
+ background?: Background;
57
+ scenario?: Scenario;
58
+ }
59
+ export declare class Rule {
60
+ location: Location;
61
+ tags: readonly Tag[];
62
+ keyword: string;
63
+ name: string;
64
+ description: string;
65
+ children: readonly RuleChild[];
66
+ id: string;
67
+ }
68
+ export declare class RuleChild {
69
+ background?: Background;
70
+ scenario?: Scenario;
71
+ }
72
+ export declare class Scenario {
73
+ location: Location;
74
+ tags: readonly Tag[];
75
+ keyword: string;
76
+ name: string;
77
+ description: string;
78
+ steps: readonly Step[];
79
+ examples: readonly Examples[];
80
+ id: string;
81
+ }
82
+ export declare class Step {
83
+ location: Location;
84
+ keyword: string;
85
+ keywordType?: StepKeywordType;
86
+ text: string;
87
+ docString?: DocString;
88
+ dataTable?: DataTable;
89
+ id: string;
90
+ }
91
+ export declare class TableCell {
92
+ location: Location;
93
+ value: string;
94
+ }
95
+ export declare class TableRow {
96
+ location: Location;
97
+ cells: readonly TableCell[];
98
+ id: string;
99
+ }
100
+ export declare class Tag {
101
+ location: Location;
102
+ name: string;
103
+ id: string;
104
+ }
105
+ export declare class Pickle {
106
+ id: string;
107
+ uri: string;
108
+ name: string;
109
+ language: string;
110
+ steps: readonly PickleStep[];
111
+ tags: readonly PickleTag[];
112
+ astNodeIds: readonly string[];
113
+ }
114
+ export declare class PickleDocString {
115
+ mediaType?: string;
116
+ content: string;
117
+ }
118
+ export declare class PickleStep {
119
+ argument?: PickleStepArgument;
120
+ astNodeIds: readonly string[];
121
+ id: string;
122
+ type?: PickleStepType;
123
+ text: string;
124
+ }
125
+ export declare class PickleStepArgument {
126
+ docString?: PickleDocString;
127
+ dataTable?: PickleTable;
128
+ }
129
+ export declare class PickleTable {
130
+ rows: readonly PickleTableRow[];
131
+ }
132
+ export declare class PickleTableCell {
133
+ value: string;
134
+ }
135
+ export declare class PickleTableRow {
136
+ cells: readonly PickleTableCell[];
137
+ }
138
+ export declare class PickleTag {
139
+ name: string;
140
+ astNodeId: string;
141
+ }
142
+ export declare class TestStepResult {
143
+ duration: Duration;
144
+ message?: string;
145
+ status: TestStepResultStatus;
146
+ }
147
+ export declare enum PickleStepType {
148
+ UNKNOWN = "Unknown",
149
+ CONTEXT = "Context",
150
+ ACTION = "Action",
151
+ OUTCOME = "Outcome"
152
+ }
153
+ export declare enum StepKeywordType {
154
+ UNKNOWN = "Unknown",
155
+ CONTEXT = "Context",
156
+ ACTION = "Action",
157
+ OUTCOME = "Outcome",
158
+ CONJUNCTION = "Conjunction"
159
+ }
160
+ export declare enum TestStepResultStatus {
161
+ UNKNOWN = "UNKNOWN",
162
+ PASSED = "PASSED",
163
+ SKIPPED = "SKIPPED",
164
+ PENDING = "PENDING",
165
+ UNDEFINED = "UNDEFINED",
166
+ AMBIGUOUS = "AMBIGUOUS",
167
+ FAILED = "FAILED"
168
+ }
169
+ export declare class Location {
170
+ line: number;
171
+ column?: number;
172
+ }
173
+ export declare class Comment {
174
+ location: Location;
175
+ text: string;
176
+ }
177
+ //# sourceMappingURL=cucumber-types.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cucumber-types.d.ts","sourceRoot":"","sources":["../src/cucumber-types.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ "use strict";
2
+ // mimic types from @cucumber/@cucumber such that users don't install that dependency when not needed
3
+ Object.defineProperty(exports, "__esModule", { value: true });
@@ -0,0 +1,40 @@
1
+ import type { Capabilities, Frameworks } from '@wdio/types';
2
+ import type { Browser, MultiRemoteBrowser } from 'webdriverio';
3
+ import type { BeforeCommandArgs, AfterCommandArgs } from '@wdio/reporter';
4
+ import type { Pickle, ITestCaseHookParameter } from './cucumber-types';
5
+ export default class InsightsHandler {
6
+ private _browser;
7
+ private _framework?;
8
+ private _tests;
9
+ private _hooks;
10
+ private _platformMeta?;
11
+ private _commands;
12
+ private _gitConfigPath?;
13
+ private _requestQueueHandler;
14
+ constructor(_browser: Browser<'async'> | MultiRemoteBrowser<'async'>, browserCaps?: Capabilities.Capabilities, isAppAutomate?: boolean, sessionId?: string, _framework?: string | undefined);
15
+ before(): Promise<void>;
16
+ beforeHook(test: Frameworks.Test, context: any): Promise<void>;
17
+ afterHook(test: Frameworks.Test, result: Frameworks.TestResult): Promise<void>;
18
+ beforeTest(test: Frameworks.Test): Promise<void>;
19
+ afterTest(test: Frameworks.Test, result: Frameworks.TestResult): Promise<void>;
20
+ /**
21
+ * Cucumber Only
22
+ */
23
+ beforeScenario(world: ITestCaseHookParameter): Promise<void>;
24
+ afterScenario(world: ITestCaseHookParameter): Promise<void>;
25
+ beforeStep(step: Frameworks.PickleStep, scenario: Pickle): Promise<void>;
26
+ afterStep(step: Frameworks.PickleStep, scenario: Pickle, result: Frameworks.PickleResult): Promise<void>;
27
+ uploadPending(waitTimeout?: number, waitInterval?: number): any;
28
+ teardown(): Promise<void>;
29
+ /**
30
+ * misc methods
31
+ */
32
+ browserCommand(commandType: string, args: BeforeCommandArgs & AfterCommandArgs, test?: Frameworks.Test | ITestCaseHookParameter): Promise<void>;
33
+ private attachHookData;
34
+ private getHierarchy;
35
+ private sendTestRunEvent;
36
+ private sendTestRunEventForCucumber;
37
+ private getIntegrationsObject;
38
+ private getIdentifier;
39
+ }
40
+ //# sourceMappingURL=insights-handler.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"insights-handler.d.ts","sourceRoot":"","sources":["../src/insights-handler.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,YAAY,EAAE,UAAU,EAAE,MAAM,aAAa,CAAA;AAC3D,OAAO,KAAK,EAAE,OAAO,EAAE,kBAAkB,EAAE,MAAM,aAAa,CAAA;AAC9D,OAAO,KAAK,EAAE,iBAAiB,EAAE,gBAAgB,EAAE,MAAM,gBAAgB,CAAA;AAGzE,OAAO,KAAK,EAAE,MAAM,EAAE,sBAAsB,EAAE,MAAM,kBAAkB,CAAA;AAOtE,MAAM,CAAC,OAAO,OAAO,eAAe;IASnB,OAAO,CAAC,QAAQ;IAAwI,OAAO,CAAC,UAAU,CAAC;IAPxL,OAAO,CAAC,MAAM,CAA+B;IAC7C,OAAO,CAAC,MAAM,CAA+B;IAC7C,OAAO,CAAC,aAAa,CAAC,CAAc;IACpC,OAAO,CAAC,SAAS,CAA2D;IAC5E,OAAO,CAAC,cAAc,CAAC,CAAQ;IAC/B,OAAO,CAAC,oBAAoB,CAAoC;gBAE3C,QAAQ,EAAE,OAAO,CAAC,OAAO,CAAC,GAAG,kBAAkB,CAAC,OAAO,CAAC,EAAE,WAAW,CAAC,EAAE,YAAY,CAAC,YAAY,EAAE,aAAa,CAAC,EAAE,OAAO,EAAE,SAAS,CAAC,EAAE,MAAM,EAAU,UAAU,CAAC,oBAAQ;IAa1L,MAAM;IAWN,UAAU,CAAE,IAAI,EAAE,UAAU,CAAC,IAAI,EAAE,OAAO,EAAE,GAAG;IAW/C,SAAS,CAAE,IAAI,EAAE,UAAU,CAAC,IAAI,EAAE,MAAM,EAAE,UAAU,CAAC,UAAU;IAY/D,UAAU,CAAE,IAAI,EAAE,UAAU,CAAC,IAAI;IASjC,SAAS,CAAE,IAAI,EAAE,UAAU,CAAC,IAAI,EAAE,MAAM,EAAE,UAAU,CAAC,UAAU;IASrE;;QAEI;IAEE,cAAc,CAAE,KAAK,EAAE,sBAAsB;IA+B7C,aAAa,CAAE,KAAK,EAAE,sBAAsB;IAI5C,UAAU,CAAE,IAAI,EAAE,UAAU,CAAC,UAAU,EAAE,QAAQ,EAAE,MAAM;IAuBzD,SAAS,CAAE,IAAI,EAAE,UAAU,CAAC,UAAU,EAAE,QAAQ,EAAE,MAAM,EAAE,MAAM,EAAE,UAAU,CAAC,YAAY;IAgCzF,aAAa,CACf,WAAW,SAA2C,EACtD,YAAY,SAA4C;IAUtD,QAAQ;IAId;;OAEG;IAEG,cAAc,CAAE,WAAW,EAAE,MAAM,EAAE,IAAI,EAAE,iBAAiB,GAAG,gBAAgB,EAAE,IAAI,CAAC,EAAE,UAAU,CAAC,IAAI,GAAG,sBAAsB;IAoDtI,OAAO,CAAC,cAAc;IActB,OAAO,CAAC,YAAY;YAYN,gBAAgB;YAuEhB,2BAA2B;IAsFzC,OAAO,CAAC,qBAAqB;IAW7B,OAAO,CAAC,aAAa;CAMxB"}
@@ -0,0 +1,398 @@
1
+ "use strict";
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ const path_1 = __importDefault(require("path"));
7
+ const uuid_1 = require("uuid");
8
+ const util_1 = require("./util");
9
+ const request_handler_1 = __importDefault(require("./request-handler"));
10
+ const constants_1 = require("./constants");
11
+ class InsightsHandler {
12
+ constructor(_browser, browserCaps, isAppAutomate, sessionId, _framework) {
13
+ this._browser = _browser;
14
+ this._framework = _framework;
15
+ this._tests = {};
16
+ this._hooks = {};
17
+ this._commands = {};
18
+ this._requestQueueHandler = request_handler_1.default.getInstance();
19
+ this._requestQueueHandler.start();
20
+ this._platformMeta = {
21
+ browserName: browserCaps === null || browserCaps === void 0 ? void 0 : browserCaps.browserName,
22
+ browserVersion: browserCaps === null || browserCaps === void 0 ? void 0 : browserCaps.browserVersion,
23
+ platformName: browserCaps === null || browserCaps === void 0 ? void 0 : browserCaps.platformName,
24
+ caps: browserCaps,
25
+ sessionId: sessionId,
26
+ product: isAppAutomate ? 'app-automate' : 'automate'
27
+ };
28
+ }
29
+ async before() {
30
+ if ((0, util_1.isBrowserstackSession)(this._browser)) {
31
+ await this._browser.execute(`browserstack_executor: {"action": "annotate", "arguments": {"data": "ObservabilitySync:${Date.now()}","level": "debug"}}`);
32
+ }
33
+ const gitMeta = await (0, util_1.getGitMetaData)();
34
+ if (gitMeta) {
35
+ this._gitConfigPath = gitMeta.root;
36
+ }
37
+ }
38
+ async beforeHook(test, context) {
39
+ const fullTitle = `${test.parent} - ${test.title}`;
40
+ const hookId = (0, uuid_1.v4)();
41
+ this._tests[fullTitle] = {
42
+ uuid: hookId,
43
+ startedAt: (new Date()).toISOString()
44
+ };
45
+ this.attachHookData(context, hookId);
46
+ if (this._framework == 'mocha')
47
+ await this.sendTestRunEvent(test, 'HookRunStarted');
48
+ }
49
+ async afterHook(test, result) {
50
+ const fullTitle = (0, util_1.getUniqueIdentifier)(test);
51
+ if (this._tests[fullTitle]) {
52
+ this._tests[fullTitle].finishedAt = (new Date()).toISOString();
53
+ }
54
+ else {
55
+ this._tests[fullTitle] = {
56
+ finishedAt: (new Date()).toISOString()
57
+ };
58
+ }
59
+ if (this._framework == 'mocha')
60
+ await this.sendTestRunEvent(test, 'HookRunFinished', result);
61
+ }
62
+ async beforeTest(test) {
63
+ const fullTitle = (0, util_1.getUniqueIdentifier)(test);
64
+ this._tests[fullTitle] = {
65
+ uuid: (0, uuid_1.v4)(),
66
+ startedAt: (new Date()).toISOString()
67
+ };
68
+ await this.sendTestRunEvent(test, 'TestRunStarted');
69
+ }
70
+ async afterTest(test, result) {
71
+ const fullTitle = (0, util_1.getUniqueIdentifier)(test);
72
+ this._tests[fullTitle] = {
73
+ ...(this._tests[fullTitle] || {}),
74
+ finishedAt: (new Date()).toISOString()
75
+ };
76
+ await this.sendTestRunEvent(test, 'TestRunFinished', result);
77
+ }
78
+ /**
79
+ * Cucumber Only
80
+ */
81
+ async beforeScenario(world) {
82
+ const pickleData = world.pickle;
83
+ const gherkinDocument = world.gherkinDocument;
84
+ const featureData = gherkinDocument.feature;
85
+ const uniqueId = (0, util_1.getUniqueIdentifierForCucumber)(world);
86
+ let testMetaData = {
87
+ uuid: (0, uuid_1.v4)(),
88
+ startedAt: (new Date()).toISOString()
89
+ };
90
+ if (pickleData) {
91
+ testMetaData.scenario = {
92
+ name: pickleData.name,
93
+ };
94
+ }
95
+ if (gherkinDocument && featureData) {
96
+ testMetaData.feature = {
97
+ path: gherkinDocument.uri,
98
+ name: featureData.name,
99
+ description: featureData.description,
100
+ };
101
+ }
102
+ this._tests[uniqueId] = testMetaData;
103
+ await this.sendTestRunEventForCucumber(world, 'TestRunStarted');
104
+ }
105
+ async afterScenario(world) {
106
+ await this.sendTestRunEventForCucumber(world, 'TestRunFinished');
107
+ }
108
+ async beforeStep(step, scenario) {
109
+ var _a;
110
+ const uniqueId = (0, util_1.getUniqueIdentifierForCucumber)({ pickle: scenario });
111
+ let testMetaData = this._tests[uniqueId];
112
+ if (!testMetaData) {
113
+ testMetaData = {
114
+ steps: []
115
+ };
116
+ }
117
+ if (testMetaData && !testMetaData.steps) {
118
+ testMetaData.steps = [];
119
+ }
120
+ (_a = testMetaData.steps) === null || _a === void 0 ? void 0 : _a.push({
121
+ id: step.id,
122
+ text: step.text,
123
+ keyword: step.keyword,
124
+ started_at: (new Date()).toISOString()
125
+ });
126
+ this._tests[uniqueId] = testMetaData;
127
+ }
128
+ async afterStep(step, scenario, result) {
129
+ var _a;
130
+ const uniqueId = (0, util_1.getUniqueIdentifierForCucumber)({ pickle: scenario });
131
+ let testMetaData = this._tests[uniqueId];
132
+ if (!testMetaData) {
133
+ testMetaData = {
134
+ steps: []
135
+ };
136
+ }
137
+ if (!testMetaData.steps) {
138
+ testMetaData.steps = [{
139
+ id: step.id,
140
+ text: step.text,
141
+ keyword: step.keyword,
142
+ finished_at: (new Date()).toISOString(),
143
+ result: result.passed ? 'PASSED' : 'FAILED',
144
+ duration: result.duration,
145
+ failure: result.error ? (0, util_1.removeAnsiColors)(result.error) : result.error
146
+ }];
147
+ }
148
+ const stepDetails = (_a = testMetaData.steps) === null || _a === void 0 ? void 0 : _a.find(item => item.id == step.id);
149
+ if (stepDetails) {
150
+ stepDetails.finished_at = (new Date()).toISOString();
151
+ stepDetails.result = result.passed ? 'PASSED' : 'FAILED';
152
+ stepDetails.duration = result.duration;
153
+ stepDetails.failure = result.error ? (0, util_1.removeAnsiColors)(result.error) : result.error;
154
+ }
155
+ this._tests[uniqueId] = testMetaData;
156
+ }
157
+ //@ts-ignore
158
+ async uploadPending(waitTimeout = constants_1.DEFAULT_WAIT_TIMEOUT_FOR_PENDING_UPLOADS, waitInterval = constants_1.DEFAULT_WAIT_INTERVAL_FOR_PENDING_UPLOADS) {
159
+ if (this._requestQueueHandler.pendingUploads <= 0 || waitTimeout <= 0) {
160
+ return;
161
+ }
162
+ await (0, util_1.sleep)(waitInterval);
163
+ return this.uploadPending(waitTimeout - waitInterval);
164
+ }
165
+ async teardown() {
166
+ await this._requestQueueHandler.shutdown();
167
+ }
168
+ /**
169
+ * misc methods
170
+ */
171
+ async browserCommand(commandType, args, test) {
172
+ if (commandType === 'client:beforeCommand') {
173
+ this._commands[`${args.sessionId}_${args.method}_${args.endpoint}`] = args;
174
+ return;
175
+ }
176
+ if (!test) {
177
+ return;
178
+ }
179
+ const identifier = this.getIdentifier(test);
180
+ // log screenshot
181
+ if (Boolean(process.env.BS_TESTOPS_ALLOW_SCREENSHOTS) && (0, util_1.isScreenshotCommand)(args) && args.result.value) {
182
+ await (0, util_1.uploadEventData)([{
183
+ event_type: 'LogCreated',
184
+ logs: [{
185
+ test_run_uuid: this._tests[identifier].uuid,
186
+ timestamp: new Date().toISOString(),
187
+ message: args.result.value,
188
+ kind: 'TEST_SCREENSHOT'
189
+ }]
190
+ }], constants_1.DATA_SCREENSHOT_ENDPOINT);
191
+ }
192
+ const dataKey = `${args.sessionId}_${args.method}_${args.endpoint}`;
193
+ const requestData = this._commands[dataKey];
194
+ // log http request
195
+ const req = this._requestQueueHandler.add({
196
+ event_type: 'LogCreated',
197
+ logs: [{
198
+ test_run_uuid: this._tests[identifier].uuid,
199
+ timestamp: new Date().toISOString(),
200
+ kind: 'HTTP',
201
+ http_response: {
202
+ path: requestData.endpoint,
203
+ method: requestData.method,
204
+ body: requestData.body,
205
+ response: args.result
206
+ }
207
+ }]
208
+ });
209
+ if (req.proceed && req.data) {
210
+ await (0, util_1.uploadEventData)(req.data, req.url);
211
+ }
212
+ }
213
+ /*
214
+ * private methods
215
+ */
216
+ attachHookData(context, hookId) {
217
+ if (!context.currentTest || !context.currentTest.parent) {
218
+ return;
219
+ }
220
+ const parentTest = `${context.currentTest.parent.title} - ${context.currentTest.title}`;
221
+ if (!this._hooks[parentTest]) {
222
+ this._hooks[parentTest] = [];
223
+ }
224
+ this._hooks[parentTest].push(hookId);
225
+ }
226
+ /*
227
+ * Get hierarchy info
228
+ */
229
+ getHierarchy(test) {
230
+ const value = [];
231
+ if (test.ctx && test.ctx.test) {
232
+ let parent = test.ctx.test.parent;
233
+ while (parent && parent.title !== '') {
234
+ value.push(parent.title);
235
+ parent = parent.parent;
236
+ }
237
+ }
238
+ return value.reverse();
239
+ }
240
+ async sendTestRunEvent(test, eventType, results) {
241
+ var _a;
242
+ const fullTitle = (0, util_1.getUniqueIdentifier)(test);
243
+ const testMetaData = this._tests[fullTitle];
244
+ const testData = {
245
+ uuid: testMetaData.uuid,
246
+ type: test.type,
247
+ name: test.title,
248
+ body: {
249
+ lang: 'webdriverio',
250
+ code: test.body
251
+ },
252
+ scope: fullTitle,
253
+ scopes: this.getHierarchy(test),
254
+ identifier: fullTitle,
255
+ file_name: test.file,
256
+ location: test.file,
257
+ vc_filepath: (this._gitConfigPath && test.file) ? path_1.default.relative(this._gitConfigPath, test.file) : undefined,
258
+ started_at: testMetaData.startedAt,
259
+ finished_at: testMetaData.finishedAt,
260
+ result: 'pending',
261
+ framework: this._framework
262
+ };
263
+ if ((eventType == 'TestRunFinished' || eventType == 'HookRunFinished') && results) {
264
+ const { error, passed } = results;
265
+ if (!passed) {
266
+ testData.result = (error && error.message && error.message.includes('sync skip; aborting execution')) ? 'ignore' : 'failed';
267
+ if (error && testData.result != 'skipped') {
268
+ testData.failure = [{ backtrace: [(0, util_1.removeAnsiColors)(error.message)] }]; // add all errors here
269
+ testData.failure_reason = (0, util_1.removeAnsiColors)(error.message);
270
+ testData.failure_type = error.message == null ? null : error.message.toString().match(/AssertionError/) ? 'AssertionError' : 'UnhandledError'; //verify if this is working
271
+ }
272
+ }
273
+ else {
274
+ testData.result = 'passed';
275
+ }
276
+ testData.retries = results.retries;
277
+ testData.duration_in_ms = results.duration;
278
+ if (this._hooks[fullTitle]) {
279
+ testData.hooks = this._hooks[fullTitle];
280
+ }
281
+ }
282
+ if (eventType == 'TestRunStarted') {
283
+ testData.integrations = {};
284
+ if (this._browser && this._platformMeta) {
285
+ const provider = (0, util_1.getCloudProvider)(this._browser);
286
+ testData.integrations[provider] = this.getIntegrationsObject();
287
+ }
288
+ }
289
+ const uploadData = {
290
+ event_type: eventType,
291
+ };
292
+ /* istanbul ignore if */
293
+ if (eventType.match(/HookRun/)) {
294
+ testData.hook_type = ((_a = testData.name) === null || _a === void 0 ? void 0 : _a.toLowerCase()) ? (0, util_1.getHookType)(testData.name.toLowerCase()) : 'undefined';
295
+ uploadData.hook_run = testData;
296
+ }
297
+ else {
298
+ uploadData.test_run = testData;
299
+ }
300
+ const req = this._requestQueueHandler.add(uploadData);
301
+ if (req.proceed && req.data) {
302
+ await (0, util_1.uploadEventData)(req.data, req.url);
303
+ }
304
+ }
305
+ async sendTestRunEventForCucumber(world, eventType) {
306
+ const uniqueId = (0, util_1.getUniqueIdentifierForCucumber)(world);
307
+ const { feature, scenario, steps, uuid, startedAt, finishedAt } = this._tests[uniqueId] || {};
308
+ let fullNameWithExamples = world.pickle.name;
309
+ const examples = (0, util_1.getScenarioExamples)(world);
310
+ if (examples) {
311
+ fullNameWithExamples = world.pickle.name + ' (' + examples.join(', ') + ')';
312
+ }
313
+ let testData = {
314
+ uuid: uuid,
315
+ started_at: startedAt,
316
+ finished_at: finishedAt,
317
+ type: 'test',
318
+ body: {
319
+ lang: 'webdriverio',
320
+ code: null
321
+ },
322
+ name: fullNameWithExamples,
323
+ scope: fullNameWithExamples,
324
+ scopes: [(feature === null || feature === void 0 ? void 0 : feature.name) || ''],
325
+ identifier: scenario === null || scenario === void 0 ? void 0 : scenario.name,
326
+ file_name: feature === null || feature === void 0 ? void 0 : feature.path,
327
+ vc_filepath: (this._gitConfigPath && (feature === null || feature === void 0 ? void 0 : feature.path)) ? path_1.default.relative(this._gitConfigPath, feature === null || feature === void 0 ? void 0 : feature.path) : undefined,
328
+ location: feature === null || feature === void 0 ? void 0 : feature.path,
329
+ framework: this._framework,
330
+ result: 'pending',
331
+ meta: {
332
+ feature: feature,
333
+ scenario: scenario,
334
+ steps: steps,
335
+ examples: examples
336
+ }
337
+ };
338
+ if (eventType == 'TestRunStarted') {
339
+ testData.integrations = {};
340
+ if (this._browser && this._platformMeta) {
341
+ const provider = (0, util_1.getCloudProvider)(this._browser);
342
+ testData.integrations[provider] = this.getIntegrationsObject();
343
+ }
344
+ }
345
+ /* istanbul ignore if */
346
+ if (world.result) {
347
+ let result = world.result.status.toLowerCase();
348
+ if (result !== 'passed' && result !== 'failed') {
349
+ result = 'skipped'; // mark UNKNOWN/UNDEFINED/AMBIGUOUS/PENDING as skipped
350
+ }
351
+ testData.finished_at = (new Date()).toISOString();
352
+ testData.result = result;
353
+ testData.duration_in_ms = world.result.duration.nanos / 1000000; // send duration in ms
354
+ if (result === 'failed') {
355
+ testData.failure = [
356
+ {
357
+ 'backtrace': [world.result.message ? (0, util_1.removeAnsiColors)(world.result.message) : 'unknown']
358
+ }
359
+ ],
360
+ testData.failure_reason = world.result.message ? (0, util_1.removeAnsiColors)(world.result.message) : world.result.message;
361
+ if (world.result.message) {
362
+ testData.failure_type = world.result.message.match(/AssertionError/)
363
+ ? 'AssertionError'
364
+ : 'UnhandledError';
365
+ }
366
+ }
367
+ }
368
+ if (world.pickle) {
369
+ testData.tags = world.pickle.tags.map(({ name }) => (name));
370
+ }
371
+ const uploadData = {
372
+ event_type: eventType,
373
+ test_run: testData
374
+ };
375
+ const req = this._requestQueueHandler.add(uploadData);
376
+ if (req.proceed && req.data) {
377
+ await (0, util_1.uploadEventData)(req.data, req.url);
378
+ }
379
+ }
380
+ getIntegrationsObject() {
381
+ var _a, _b, _c, _d, _e, _f;
382
+ return {
383
+ capabilities: (_a = this._platformMeta) === null || _a === void 0 ? void 0 : _a.caps,
384
+ session_id: (_b = this._platformMeta) === null || _b === void 0 ? void 0 : _b.sessionId,
385
+ browser: (_c = this._platformMeta) === null || _c === void 0 ? void 0 : _c.browserName,
386
+ browser_version: (_d = this._platformMeta) === null || _d === void 0 ? void 0 : _d.browserVersion,
387
+ platform: (_e = this._platformMeta) === null || _e === void 0 ? void 0 : _e.platformName,
388
+ product: (_f = this._platformMeta) === null || _f === void 0 ? void 0 : _f.product
389
+ };
390
+ }
391
+ getIdentifier(test) {
392
+ if ('pickle' in test) {
393
+ return (0, util_1.getUniqueIdentifierForCucumber)(test);
394
+ }
395
+ return (0, util_1.getUniqueIdentifier)(test);
396
+ }
397
+ }
398
+ exports.default = InsightsHandler;