sealights-cypress-plugin 2.0.17

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.
package/README.md ADDED
@@ -0,0 +1,104 @@
1
+ # sealights-cypress-plugin
2
+
3
+ **sealights-cypress-plugin** is a custom plugin for the Cypress testing framework that enhances your testing capabilities by providing additional support for various tasks and configurations. <br>
4
+ This plugin adds support for Sealights, reporting coverage and test skipping as well.
5
+
6
+ ## Supported Node / Cypress versions
7
+
8
+ - Node >= 12
9
+ - Cypress >= 9
10
+
11
+ ## Features
12
+
13
+ - **Support File:** The plugin introduces a support file, it is automatically loaded before each test, providing a centralized location to manage the Sealights information and execute the required hooks
14
+
15
+ - **Config File:** The config file empowers the Cypress tests run by adding the required tasks and communicates with Sealights
16
+
17
+ ## Installation
18
+
19
+ To use **sealights-cypress-plugin** in your Cypress project, follow these steps:
20
+
21
+ 1. Install and Setup Cypress if you haven't already:
22
+
23
+ ```bash
24
+ npm install cypress --save-dev
25
+ ```
26
+
27
+ 2. Install the plugin from GitHub/npm
28
+ ```bash
29
+ npm install sealights-cypress-plugin
30
+ ```
31
+
32
+ # Cypress v10+
33
+
34
+ In your `cypress.config.js` register the plugin:
35
+
36
+ ```javascript
37
+ const { defineConfig } = require('cypress');
38
+ const { registerSealightsTasks } = require('sealights-cypress-plugin');
39
+
40
+ module.exports = defineConfig({
41
+ e2e: {
42
+ experimentalInteractiveRunEvents: true,
43
+ testIsolation: false,
44
+ setupNodeEvents(on, config) {
45
+ registerSealightsTasks(on, config);
46
+ },
47
+ },
48
+ });
49
+ ```
50
+
51
+ Add to your `cypress/support/e2e.js`:
52
+
53
+ ```javascript
54
+ // This is your existing support/e2e.js file content
55
+ // ...
56
+
57
+ // Import sealights-cypress-plugin's support file
58
+ import 'sealights-cypress-plugin/support';
59
+ ```
60
+
61
+ # Cypress v9
62
+
63
+ Add to your cypress/plugins/index.js file
64
+
65
+ ```typescript
66
+ const { registerSealightsTasks } = require('sealights-cypress-plugin');
67
+
68
+ module.exports = (on, config) => {
69
+ registerSealightsTasks(on, config);
70
+ // IMPORTANT: return the config object
71
+ // because the plugin might have changed it
72
+ return config;
73
+ };
74
+ ```
75
+
76
+ Add to your `cypress/support/index.js` file
77
+
78
+ ```javascript
79
+ import 'sealights-cypress-plugin/support';
80
+ ```
81
+
82
+ ## Configuration
83
+
84
+ In order for the Sealights integration to work, three parameters have to be exported to the Cypress config.<br>
85
+ This can be done using environment variables and exposing them to Cypress. The three environment variables are:
86
+
87
+ ```text
88
+ SL_BUILD_SESSION_ID // this or labId
89
+ SL_LAB_ID // this or buildSessionId
90
+ SL_TOKEN
91
+ SL_TEST_STAGE
92
+ ```
93
+
94
+ For them to be available to Cypress, they have to be prefixed with `CYPRESS_`, for example:
95
+
96
+ ```shell
97
+ export CYPRESS_SL_TOKEN={token}
98
+ export CYPRESS_SL_BUILD_SESSION_ID={buildSessionId}
99
+ export CYPRESS_SL_LAB_ID={labId}
100
+ export CYPRESS_SL_TEST_STAGE={your-test-stage}
101
+ ```
102
+
103
+ More about defining the environment variables in Cypress at the following link:
104
+ https://docs.cypress.io/guides/guides/environment-variables
package/package.json ADDED
@@ -0,0 +1,37 @@
1
+ {
2
+ "name": "sealights-cypress-plugin",
3
+ "version": "2.0.17",
4
+ "description": "Support and config files for Cypress to support Sealights integration.",
5
+ "scripts": {
6
+ "build": "tsc",
7
+ "lint": "eslint src/**/*.ts",
8
+ "format": "eslint src/**/*.ts --fix"
9
+ },
10
+ "keywords": [],
11
+ "author": "Kristijan Stefanoski<kristijan.stefanoski@sealights.io>",
12
+ "license": "ISC",
13
+ "devDependencies": {
14
+ "cypress": "^12.17.4",
15
+ "husky": "4.3.8",
16
+ "prettier": "^3.0.2",
17
+ "typescript": "^5.1.6"
18
+ },
19
+ "husky": {
20
+ "hooks": {
21
+ "pre-commit": "npm run lint && prettier --write . && git add -A ."
22
+ }
23
+ },
24
+ "dependencies": {
25
+ "axios": "0.21.4",
26
+ "jwt-decode": "^3.1.2"
27
+ },
28
+ "bugs": {
29
+ "url": "https://github.com/Sealights/SL.OnPremis.Plugins.JavaScript/issues"
30
+ },
31
+ "files": [
32
+ "tsOutputs/*",
33
+ "support.js"
34
+ ],
35
+ "main": "tsOutputs/index.js",
36
+ "gitHead": "013fffdc5746b52d5e4d56e54f4c59d894919b4a"
37
+ }
package/support.js ADDED
@@ -0,0 +1 @@
1
+ import './tsOutputs/support';
@@ -0,0 +1 @@
1
+ export declare const registerSealightsTasks: (on: any, config: any) => any;
@@ -0,0 +1,50 @@
1
+ "use strict";
2
+ var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
3
+ function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
4
+ return new (P || (P = Promise))(function (resolve, reject) {
5
+ function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
6
+ function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
7
+ function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
8
+ step((generator = generator.apply(thisArg, _arguments || [])).next());
9
+ });
10
+ };
11
+ Object.defineProperty(exports, "__esModule", { value: true });
12
+ exports.registerSealightsTasks = void 0;
13
+ const const_1 = require("./const");
14
+ const sealights_service_1 = require("./sealights-service");
15
+ const utils_1 = require("./utils");
16
+ const registerSealightsTasks = (on, config) => {
17
+ const slConfig = {
18
+ buildsessionid: config.env[const_1.SL_CYPRESS_ENVIRONMENT.BUILD_SESSION_ID],
19
+ token: config.env[const_1.SL_CYPRESS_ENVIRONMENT.TOKEN],
20
+ teststage: config.env[const_1.SL_CYPRESS_ENVIRONMENT.TEST_STAGE],
21
+ labid: config.env[const_1.SL_CYPRESS_ENVIRONMENT.LAB_ID],
22
+ };
23
+ on('before:run', () => __awaiter(void 0, void 0, void 0, function* () {
24
+ sealights_service_1.SealightsTestSessionService.setConfig(slConfig.token, slConfig.teststage, slConfig.buildsessionid, slConfig.labid);
25
+ yield sealights_service_1.SealightsTestSessionService.createTestSession();
26
+ }));
27
+ on('after:run', () => __awaiter(void 0, void 0, void 0, function* () {
28
+ yield sealights_service_1.SealightsTestSessionService.endTestSession();
29
+ }));
30
+ on('task', {
31
+ [const_1.REPORT_TEST_END_TASK]({ suiteName, testName, duration, state }) {
32
+ return __awaiter(this, void 0, void 0, function* () {
33
+ const name = (0, utils_1.constructTestName)(suiteName, testName);
34
+ const start = Date.now() - duration;
35
+ const end = Date.now();
36
+ yield sealights_service_1.SealightsTestSessionService.sendTestEvent(name, start, end, state);
37
+ return null;
38
+ });
39
+ },
40
+ [const_1.EXCLUDED_TESTS_TASK]() {
41
+ return __awaiter(this, void 0, void 0, function* () {
42
+ return yield sealights_service_1.SealightsTestSessionService.getTestRecommendations();
43
+ });
44
+ },
45
+ });
46
+ config.env[const_1.SL_TASKS_REGISTERED] = true;
47
+ return config;
48
+ };
49
+ exports.registerSealightsTasks = registerSealightsTasks;
50
+ //# sourceMappingURL=config.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"config.js","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":";;;;;;;;;;;;AAAA,mCAAiH;AACjH,2DAAkE;AAClE,mCAA4C;AAErC,MAAM,sBAAsB,GAAG,CAAC,EAAE,EAAE,MAAM,EAAE,EAAE;IACnD,MAAM,QAAQ,GAAG;QACf,cAAc,EAAE,MAAM,CAAC,GAAG,CAAC,8BAAsB,CAAC,gBAAgB,CAAC;QACnE,KAAK,EAAE,MAAM,CAAC,GAAG,CAAC,8BAAsB,CAAC,KAAK,CAAC;QAC/C,SAAS,EAAE,MAAM,CAAC,GAAG,CAAC,8BAAsB,CAAC,UAAU,CAAC;QACxD,KAAK,EAAE,MAAM,CAAC,GAAG,CAAC,8BAAsB,CAAC,MAAM,CAAC;KACjD,CAAC;IAGF,EAAE,CAAC,YAAY,EAAE,GAAS,EAAE;QAC1B,+CAA2B,CAAC,SAAS,CAAC,QAAQ,CAAC,KAAK,EAAE,QAAQ,CAAC,SAAS,EAAE,QAAQ,CAAC,cAAc,EAAE,QAAQ,CAAC,KAAK,CAAC,CAAC;QACnH,MAAM,+CAA2B,CAAC,iBAAiB,EAAE,CAAC;IACxD,CAAC,CAAA,CAAC,CAAC;IAGH,EAAE,CAAC,WAAW,EAAE,GAAS,EAAE;QACzB,MAAM,+CAA2B,CAAC,cAAc,EAAE,CAAC;IACrD,CAAC,CAAA,CAAC,CAAC;IAEH,EAAE,CAAC,MAAM,EAAE;QAEH,CAAC,4BAAoB,CAAC,CAAC,EAAE,SAAS,EAAE,QAAQ,EAAE,QAAQ,EAAE,KAAK,EAAE;;gBACnE,MAAM,IAAI,GAAG,IAAA,yBAAiB,EAAC,SAAS,EAAE,QAAQ,CAAC,CAAC;gBACpD,MAAM,KAAK,GAAG,IAAI,CAAC,GAAG,EAAE,GAAG,QAAQ,CAAC;gBACpC,MAAM,GAAG,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;gBACvB,MAAM,+CAA2B,CAAC,aAAa,CAAC,IAAI,EAAE,KAAK,EAAE,GAAG,EAAE,KAAK,CAAC,CAAC;gBAEzE,OAAO,IAAI,CAAC;YACd,CAAC;SAAA;QACK,CAAC,2BAAmB,CAAC;;gBACzB,OAAO,MAAM,+CAA2B,CAAC,sBAAsB,EAAE,CAAC;YACpE,CAAC;SAAA;KACF,CAAC,CAAC;IAGH,MAAM,CAAC,GAAG,CAAC,2BAAmB,CAAC,GAAG,IAAI,CAAC;IAEvC,OAAO,MAAM,CAAC;AAChB,CAAC,CAAC;AAtCW,QAAA,sBAAsB,0BAsCjC"}
@@ -0,0 +1,22 @@
1
+ export declare const SL_CYPRESS_ENVIRONMENT: {
2
+ BUILD_SESSION_ID: string;
3
+ TOKEN: string;
4
+ TEST_STAGE: string;
5
+ LAB_ID: string;
6
+ };
7
+ export declare const SL_TASKS_REGISTERED = "sealightsTasksRegistered";
8
+ export declare const EXCLUDED_TESTS_TASK = "getExcludedTests";
9
+ export declare const X_SL_SERVER = "x-sl-server";
10
+ export declare const REPORT_TEST_END_TASK = "reportTestEnd";
11
+ export declare const SL_COLORING_EVENTS: {
12
+ SET_CONTEXT: string;
13
+ DELETE_CONTEXT: string;
14
+ };
15
+ export declare const SL_COLORING_HEADERS: {
16
+ TEST_NAME: string;
17
+ TEST_SESSION_ID: string;
18
+ };
19
+ export declare enum TEST_STATUS {
20
+ SKIPPED = "skipped",
21
+ PENDING = "pending"
22
+ }
@@ -0,0 +1,27 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.TEST_STATUS = exports.SL_COLORING_HEADERS = exports.SL_COLORING_EVENTS = exports.REPORT_TEST_END_TASK = exports.X_SL_SERVER = exports.EXCLUDED_TESTS_TASK = exports.SL_TASKS_REGISTERED = exports.SL_CYPRESS_ENVIRONMENT = void 0;
4
+ exports.SL_CYPRESS_ENVIRONMENT = {
5
+ BUILD_SESSION_ID: 'SL_BUILD_SESSION_ID',
6
+ TOKEN: 'SL_TOKEN',
7
+ TEST_STAGE: 'SL_TEST_STAGE',
8
+ LAB_ID: 'SL_LAB_ID',
9
+ };
10
+ exports.SL_TASKS_REGISTERED = 'sealightsTasksRegistered';
11
+ exports.EXCLUDED_TESTS_TASK = 'getExcludedTests';
12
+ exports.X_SL_SERVER = 'x-sl-server';
13
+ exports.REPORT_TEST_END_TASK = 'reportTestEnd';
14
+ exports.SL_COLORING_EVENTS = {
15
+ SET_CONTEXT: 'set:context',
16
+ DELETE_CONTEXT: 'delete:context',
17
+ };
18
+ exports.SL_COLORING_HEADERS = {
19
+ TEST_NAME: 'x-sl-test-name',
20
+ TEST_SESSION_ID: 'x-sl-test-session-id',
21
+ };
22
+ var TEST_STATUS;
23
+ (function (TEST_STATUS) {
24
+ TEST_STATUS["SKIPPED"] = "skipped";
25
+ TEST_STATUS["PENDING"] = "pending";
26
+ })(TEST_STATUS || (exports.TEST_STATUS = TEST_STATUS = {}));
27
+ //# sourceMappingURL=const.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"const.js","sourceRoot":"","sources":["../src/const.ts"],"names":[],"mappings":";;;AAAa,QAAA,sBAAsB,GAAG;IACpC,gBAAgB,EAAE,qBAAqB;IACvC,KAAK,EAAE,UAAU;IACjB,UAAU,EAAE,eAAe;IAC3B,MAAM,EAAE,WAAW;CACpB,CAAC;AAEW,QAAA,mBAAmB,GAAG,0BAA0B,CAAC;AACjD,QAAA,mBAAmB,GAAG,kBAAkB,CAAC;AAEzC,QAAA,WAAW,GAAG,aAAa,CAAC;AAE5B,QAAA,oBAAoB,GAAG,eAAe,CAAC;AAEvC,QAAA,kBAAkB,GAAG;IAChC,WAAW,EAAE,aAAa;IAC1B,cAAc,EAAE,gBAAgB;CACjC,CAAC;AAEW,QAAA,mBAAmB,GAAG;IACjC,SAAS,EAAE,gBAAgB;IAC3B,eAAe,EAAE,sBAAsB;CACxC,CAAC;AAEF,IAAY,WAGX;AAHD,WAAY,WAAW;IACrB,kCAAmB,CAAA;IACnB,kCAAmB,CAAA;AACrB,CAAC,EAHW,WAAW,2BAAX,WAAW,QAGtB"}
@@ -0,0 +1 @@
1
+ export { registerSealightsTasks } from './config';
@@ -0,0 +1,6 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.registerSealightsTasks = void 0;
4
+ var config_1 = require("./config");
5
+ Object.defineProperty(exports, "registerSealightsTasks", { enumerable: true, get: function () { return config_1.registerSealightsTasks; } });
6
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";;;AAAA,mCAAkD;AAAzC,gHAAA,sBAAsB,OAAA"}
@@ -0,0 +1,27 @@
1
+ declare class TestSessionService {
2
+ private static instance;
3
+ private apiToken;
4
+ private baseUrl;
5
+ private buildSessionId;
6
+ private labId;
7
+ private testStage;
8
+ private testSessionId;
9
+ private testSessionsV1Instance;
10
+ private testSessionsV2Instance;
11
+ private excludedTests;
12
+ private configurationError;
13
+ private constructor();
14
+ static getInstance(): TestSessionService;
15
+ setConfig(apiToken: string, testStage: string, buildSessionId: string, labId?: string): void;
16
+ private createInstanceV1;
17
+ private createInstanceV2;
18
+ createTestSession(testStage?: string): Promise<void>;
19
+ endTestSession(): Promise<void>;
20
+ getTestRecommendations(): Promise<Record<string, string>>;
21
+ sendTestEvent(name: string, start: number, end: number, status: string): Promise<void>;
22
+ get _testSessionId(): string;
23
+ get _excludedTests(): Record<string, string>;
24
+ static runServiceMethodSafe(target: unknown, propertyKey: string, descriptor: PropertyDescriptor): PropertyDescriptor;
25
+ }
26
+ export declare const SealightsTestSessionService: TestSessionService;
27
+ export {};
@@ -0,0 +1,158 @@
1
+ "use strict";
2
+ var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
3
+ var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
4
+ if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
5
+ else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
6
+ return c > 3 && r && Object.defineProperty(target, key, r), r;
7
+ };
8
+ var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
9
+ function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
10
+ return new (P || (P = Promise))(function (resolve, reject) {
11
+ function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
12
+ function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
13
+ function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
14
+ step((generator = generator.apply(thisArg, _arguments || [])).next());
15
+ });
16
+ };
17
+ Object.defineProperty(exports, "__esModule", { value: true });
18
+ exports.SealightsTestSessionService = void 0;
19
+ const axios_1 = require("axios");
20
+ const jwt_decode_1 = require("jwt-decode");
21
+ const const_1 = require("./const");
22
+ class TestSessionService {
23
+ constructor() {
24
+ this.apiToken = null;
25
+ this.baseUrl = null;
26
+ this.buildSessionId = null;
27
+ this.labId = null;
28
+ this.testStage = null;
29
+ this.testSessionId = null;
30
+ this.testSessionsV1Instance = null;
31
+ this.testSessionsV2Instance = null;
32
+ this.excludedTests = null;
33
+ this.configurationError = false;
34
+ }
35
+ static getInstance() {
36
+ if (!TestSessionService.instance) {
37
+ TestSessionService.instance = new TestSessionService();
38
+ }
39
+ return TestSessionService.instance;
40
+ }
41
+ setConfig(apiToken, testStage, buildSessionId, labId) {
42
+ if (!(buildSessionId === null || buildSessionId === void 0 ? void 0 : buildSessionId.length) && !(labId === null || labId === void 0 ? void 0 : labId.length)) {
43
+ this.configurationError = true;
44
+ throw new Error('At least one of buildSessionId/labId must be provided for Sealights integration. Test suite will resume with disabled integration.');
45
+ }
46
+ const decoded = (0, jwt_decode_1.default)(apiToken);
47
+ this.baseUrl = decoded[const_1.X_SL_SERVER];
48
+ this.apiToken = apiToken;
49
+ this.buildSessionId = buildSessionId;
50
+ this.labId = labId;
51
+ this.testStage = testStage;
52
+ this.createInstanceV1();
53
+ this.createInstanceV2();
54
+ }
55
+ createInstanceV1() {
56
+ var _a;
57
+ this.testSessionsV1Instance = axios_1.default.create({
58
+ baseURL: (_a = this.baseUrl) === null || _a === void 0 ? void 0 : _a.replace('/api', '/sl-api/v1/test-sessions'),
59
+ headers: {
60
+ Authorization: `Bearer ${this.apiToken}`,
61
+ },
62
+ });
63
+ }
64
+ createInstanceV2() {
65
+ var _a;
66
+ this.testSessionsV2Instance = axios_1.default.create({
67
+ baseURL: (_a = this.baseUrl) === null || _a === void 0 ? void 0 : _a.replace('/api', '/sl-api/v2/test-sessions'),
68
+ headers: {
69
+ Authorization: `Bearer ${this.apiToken}`,
70
+ },
71
+ });
72
+ }
73
+ createTestSession(testStage = this.testStage) {
74
+ var _a;
75
+ return __awaiter(this, void 0, void 0, function* () {
76
+ const { data } = yield ((_a = this.testSessionsV1Instance) === null || _a === void 0 ? void 0 : _a.post('/', {
77
+ testStage,
78
+ bsid: this.buildSessionId,
79
+ labid: this.labId,
80
+ }));
81
+ this.testSessionId = data.data.testSessionId;
82
+ });
83
+ }
84
+ endTestSession() {
85
+ var _a;
86
+ return (_a = this.testSessionsV1Instance) === null || _a === void 0 ? void 0 : _a.delete(`/${this.testSessionId}`);
87
+ }
88
+ getTestRecommendations() {
89
+ var _a, _b;
90
+ return __awaiter(this, void 0, void 0, function* () {
91
+ try {
92
+ const { data } = yield ((_a = this.testSessionsV1Instance) === null || _a === void 0 ? void 0 : _a.get(`/${this.testSessionId}/exclude-tests`));
93
+ this.excludedTests = (((_b = data === null || data === void 0 ? void 0 : data.data) === null || _b === void 0 ? void 0 : _b.length) ? data.data : []).reduce((acc, testName) => (Object.assign(Object.assign({}, acc), { [testName]: testName })), {});
94
+ return this._excludedTests;
95
+ }
96
+ catch (e) {
97
+ console.error(e);
98
+ this.excludedTests = null;
99
+ return this._excludedTests;
100
+ }
101
+ });
102
+ }
103
+ sendTestEvent(name, start, end, status) {
104
+ var _a;
105
+ if (!!this._excludedTests[name] && status === const_1.TEST_STATUS.PENDING) {
106
+ status = const_1.TEST_STATUS.SKIPPED;
107
+ }
108
+ return (_a = this.testSessionsV2Instance) === null || _a === void 0 ? void 0 : _a.post(`/${this.testSessionId}`, [
109
+ {
110
+ name,
111
+ start,
112
+ end,
113
+ status,
114
+ },
115
+ ]);
116
+ }
117
+ get _testSessionId() {
118
+ return this.testSessionId;
119
+ }
120
+ get _excludedTests() {
121
+ var _a;
122
+ return (_a = this.excludedTests) !== null && _a !== void 0 ? _a : {};
123
+ }
124
+ static runServiceMethodSafe(target, propertyKey, descriptor) {
125
+ const originalMethod = descriptor.value;
126
+ descriptor.value = function (...args) {
127
+ return __awaiter(this, void 0, void 0, function* () {
128
+ try {
129
+ if (this.configurationError) {
130
+ return null;
131
+ }
132
+ return yield originalMethod.apply(this, args);
133
+ }
134
+ catch (error) {
135
+ console.error(`An error occurred in method ${propertyKey}:`, error);
136
+ }
137
+ });
138
+ };
139
+ return descriptor;
140
+ }
141
+ }
142
+ __decorate([
143
+ TestSessionService.runServiceMethodSafe
144
+ ], TestSessionService.prototype, "setConfig", null);
145
+ __decorate([
146
+ TestSessionService.runServiceMethodSafe
147
+ ], TestSessionService.prototype, "createTestSession", null);
148
+ __decorate([
149
+ TestSessionService.runServiceMethodSafe
150
+ ], TestSessionService.prototype, "endTestSession", null);
151
+ __decorate([
152
+ TestSessionService.runServiceMethodSafe
153
+ ], TestSessionService.prototype, "getTestRecommendations", null);
154
+ __decorate([
155
+ TestSessionService.runServiceMethodSafe
156
+ ], TestSessionService.prototype, "sendTestEvent", null);
157
+ exports.SealightsTestSessionService = TestSessionService.getInstance();
158
+ //# sourceMappingURL=sealights-service.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"sealights-service.js","sourceRoot":"","sources":["../src/sealights-service.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;AAAA,iCAA6C;AAC7C,2CAAmC;AAEnC,mCAAmD;AAEnD,MAAM,kBAAkB;IAatB;QAXQ,aAAQ,GAAkB,IAAI,CAAC;QAC/B,YAAO,GAAkB,IAAI,CAAC;QAC9B,mBAAc,GAAkB,IAAI,CAAC;QACrC,UAAK,GAAkB,IAAI,CAAC;QAC5B,cAAS,GAAkB,IAAI,CAAC;QAChC,kBAAa,GAAkB,IAAI,CAAC;QACpC,2BAAsB,GAAyB,IAAI,CAAC;QACpD,2BAAsB,GAAyB,IAAI,CAAC;QACpD,kBAAa,GAAkC,IAAI,CAAC;QACpD,uBAAkB,GAAG,KAAK,CAAC;IAEZ,CAAC;IAEjB,MAAM,CAAC,WAAW;QACvB,IAAI,CAAC,kBAAkB,CAAC,QAAQ,EAAE;YAChC,kBAAkB,CAAC,QAAQ,GAAG,IAAI,kBAAkB,EAAE,CAAC;SACxD;QACD,OAAO,kBAAkB,CAAC,QAAQ,CAAC;IACrC,CAAC;IAGM,SAAS,CAAC,QAAgB,EAAE,SAAiB,EAAE,cAAsB,EAAE,KAAc;QAC1F,IAAI,CAAC,CAAA,cAAc,aAAd,cAAc,uBAAd,cAAc,CAAE,MAAM,CAAA,IAAI,CAAC,CAAA,KAAK,aAAL,KAAK,uBAAL,KAAK,CAAE,MAAM,CAAA,EAAE;YAC7C,IAAI,CAAC,kBAAkB,GAAG,IAAI,CAAC;YAC/B,MAAM,IAAI,KAAK,CACb,oIAAoI,CACrI,CAAC;SACH;QACD,MAAM,OAAO,GAAG,IAAA,oBAAS,EAAC,QAAQ,CAAC,CAAC;QACpC,IAAI,CAAC,OAAO,GAAG,OAAO,CAAC,mBAAW,CAAC,CAAC;QACpC,IAAI,CAAC,QAAQ,GAAG,QAAQ,CAAC;QACzB,IAAI,CAAC,cAAc,GAAG,cAAc,CAAC;QACrC,IAAI,CAAC,KAAK,GAAG,KAAK,CAAC;QACnB,IAAI,CAAC,SAAS,GAAG,SAAS,CAAC;QAC3B,IAAI,CAAC,gBAAgB,EAAE,CAAC;QACxB,IAAI,CAAC,gBAAgB,EAAE,CAAC;IAC1B,CAAC;IAEO,gBAAgB;;QACtB,IAAI,CAAC,sBAAsB,GAAG,eAAK,CAAC,MAAM,CAAC;YACzC,OAAO,EAAE,MAAA,IAAI,CAAC,OAAO,0CAAE,OAAO,CAAC,MAAM,EAAE,0BAA0B,CAAC;YAClE,OAAO,EAAE;gBACP,aAAa,EAAE,UAAU,IAAI,CAAC,QAAQ,EAAE;aACzC;SACF,CAAC,CAAC;IACL,CAAC;IAEO,gBAAgB;;QACtB,IAAI,CAAC,sBAAsB,GAAG,eAAK,CAAC,MAAM,CAAC;YACzC,OAAO,EAAE,MAAA,IAAI,CAAC,OAAO,0CAAE,OAAO,CAAC,MAAM,EAAE,0BAA0B,CAAC;YAClE,OAAO,EAAE;gBACP,aAAa,EAAE,UAAU,IAAI,CAAC,QAAQ,EAAE;aACzC;SACF,CAAC,CAAC;IACL,CAAC;IAGY,iBAAiB,CAAC,YAAoB,IAAI,CAAC,SAAS;;;YAC/D,MAAM,EAAE,IAAI,EAAE,GAAG,MAAM,CAAA,MAAA,IAAI,CAAC,sBAAsB,0CAAE,IAAI,CAAsC,GAAG,EAAE;gBACjG,SAAS;gBACT,IAAI,EAAE,IAAI,CAAC,cAAc;gBACzB,KAAK,EAAE,IAAI,CAAC,KAAK;aAClB,CAAC,CAAA,CAAC;YACH,IAAI,CAAC,aAAa,GAAG,IAAI,CAAC,IAAI,CAAC,aAAa,CAAC;;KAC9C;IAGM,cAAc;;QACnB,OAAO,MAAA,IAAI,CAAC,sBAAsB,0CAAE,MAAM,CAAC,IAAI,IAAI,CAAC,aAAa,EAAE,CAAC,CAAC;IACvE,CAAC;IAGY,sBAAsB;;;YACjC,IAAI;gBACF,MAAM,EAAE,IAAI,EAAE,GAAG,MAAM,CAAA,MAAA,IAAI,CAAC,sBAAsB,0CAAE,GAAG,CAAC,IAAI,IAAI,CAAC,aAAa,gBAAgB,CAAC,CAAA,CAAC;gBAChG,IAAI,CAAC,aAAa,GAAG,CAAC,CAAA,MAAA,IAAI,aAAJ,IAAI,uBAAJ,IAAI,CAAE,IAAI,0CAAE,MAAM,EAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,MAAM,CAC/D,CAAC,GAAG,EAAE,QAAQ,EAAE,EAAE,CAAC,iCAAM,GAAG,KAAE,CAAC,QAAQ,CAAC,EAAE,QAAQ,IAAG,EACrD,EAAE,CACH,CAAC;gBACF,OAAO,IAAI,CAAC,cAAc,CAAC;aAC5B;YAAC,OAAO,CAAC,EAAE;gBACV,OAAO,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;gBACjB,IAAI,CAAC,aAAa,GAAG,IAAI,CAAC;gBAC1B,OAAO,IAAI,CAAC,cAAc,CAAC;aAC5B;;KACF;IAGM,aAAa,CAAC,IAAY,EAAE,KAAa,EAAE,GAAW,EAAE,MAAc;;QAC3E,IAAI,CAAC,CAAC,IAAI,CAAC,cAAc,CAAC,IAAI,CAAC,IAAI,MAAM,KAAK,mBAAW,CAAC,OAAO,EAAE;YACjE,MAAM,GAAG,mBAAW,CAAC,OAAO,CAAC;SAC9B;QACD,OAAO,MAAA,IAAI,CAAC,sBAAsB,0CAAE,IAAI,CAAC,IAAI,IAAI,CAAC,aAAa,EAAE,EAAE;YACjE;gBACE,IAAI;gBACJ,KAAK;gBACL,GAAG;gBACH,MAAM;aACP;SACF,CAAC,CAAC;IACL,CAAC;IAED,IAAI,cAAc;QAChB,OAAO,IAAI,CAAC,aAAa,CAAC;IAC5B,CAAC;IAED,IAAI,cAAc;;QAChB,OAAO,MAAA,IAAI,CAAC,aAAa,mCAAI,EAAE,CAAC;IAClC,CAAC;IAEM,MAAM,CAAC,oBAAoB,CAAC,MAAe,EAAE,WAAmB,EAAE,UAA8B;QACrG,MAAM,cAAc,GAAG,UAAU,CAAC,KAAK,CAAC;QAExC,UAAU,CAAC,KAAK,GAAG,UAAgB,GAAG,IAAe;;gBACnD,IAAI;oBACF,IAAyB,IAAK,CAAC,kBAAkB,EAAE;wBACjD,OAAO,IAAI,CAAC;qBACb;oBAED,OAAO,MAAM,cAAc,CAAC,KAAK,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC;iBAC/C;gBAAC,OAAO,KAAK,EAAE;oBACd,OAAO,CAAC,KAAK,CAAC,+BAA+B,WAAW,GAAG,EAAE,KAAK,CAAC,CAAC;iBACrE;YACH,CAAC;SAAA,CAAC;QAEF,OAAO,UAAU,CAAC;IACpB,CAAC;CACF;AA1GQ;IADN,kBAAkB,CAAC,oBAAoB;mDAgBvC;AAqBY;IADZ,kBAAkB,CAAC,oBAAoB;2DAQvC;AAGM;IADN,kBAAkB,CAAC,oBAAoB;wDAGvC;AAGY;IADZ,kBAAkB,CAAC,oBAAoB;gEAcvC;AAGM;IADN,kBAAkB,CAAC,oBAAoB;uDAavC;AA6BU,QAAA,2BAA2B,GAAG,kBAAkB,CAAC,WAAW,EAAE,CAAC"}
@@ -0,0 +1 @@
1
+ export {};
@@ -0,0 +1,78 @@
1
+ "use strict";
2
+ var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
3
+ function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
4
+ return new (P || (P = Promise))(function (resolve, reject) {
5
+ function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
6
+ function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
7
+ function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
8
+ step((generator = generator.apply(thisArg, _arguments || [])).next());
9
+ });
10
+ };
11
+ Object.defineProperty(exports, "__esModule", { value: true });
12
+ const const_1 = require("./const");
13
+ const sealights_service_1 = require("./sealights-service");
14
+ const utils_1 = require("./utils");
15
+ function registerHooks() {
16
+ before(function () {
17
+ cy.task(const_1.EXCLUDED_TESTS_TASK).then({ timeout: 20000 }, (excludedTests) => {
18
+ markExcludedTests(this.test.parent, excludedTests);
19
+ });
20
+ });
21
+ after((done) => {
22
+ cy.window().then((win) => __awaiter(this, void 0, void 0, function* () {
23
+ var _a, _b, _c;
24
+ if (typeof ((_a = win === null || win === void 0 ? void 0 : win.$SealightsAgent) === null || _a === void 0 ? void 0 : _a.sendAllFootprints) !== 'function') {
25
+ return;
26
+ }
27
+ yield ((_c = (_b = win === null || win === void 0 ? void 0 : win.$SealightsAgent) === null || _b === void 0 ? void 0 : _b.sendAllFootprints) === null || _c === void 0 ? void 0 : _c.call(_b));
28
+ }));
29
+ });
30
+ beforeEach(() => {
31
+ cy.window().then((win) => __awaiter(this, void 0, void 0, function* () {
32
+ const agentLoaded = yield (0, utils_1.checkAgentLoaded)(win, 100, 1);
33
+ if (!agentLoaded) {
34
+ return;
35
+ }
36
+ const testName = Cypress.currentTest.title;
37
+ const customEvent = new CustomEvent(const_1.SL_COLORING_EVENTS.SET_CONTEXT, {
38
+ detail: {
39
+ baggage: {
40
+ [const_1.SL_COLORING_HEADERS.TEST_NAME]: testName,
41
+ [const_1.SL_COLORING_HEADERS.TEST_SESSION_ID]: sealights_service_1.SealightsTestSessionService._testSessionId,
42
+ },
43
+ },
44
+ });
45
+ win.dispatchEvent(customEvent);
46
+ }));
47
+ });
48
+ afterEach(function () {
49
+ const currentTest = this.currentTest;
50
+ const duration = currentTest.duration;
51
+ const testName = currentTest.title;
52
+ const suiteName = currentTest.parent.title;
53
+ const state = currentTest.state;
54
+ cy.task(const_1.REPORT_TEST_END_TASK, { testName, suiteName, duration, state });
55
+ });
56
+ afterEach((done) => {
57
+ cy.window().then((win) => __awaiter(this, void 0, void 0, function* () {
58
+ var _a, _b, _c;
59
+ if (typeof ((_a = win === null || win === void 0 ? void 0 : win.$SealightsAgent) === null || _a === void 0 ? void 0 : _a.sendAllFootprints) !== 'function') {
60
+ return;
61
+ }
62
+ yield ((_c = (_b = win === null || win === void 0 ? void 0 : win.$SealightsAgent) === null || _b === void 0 ? void 0 : _b.sendAllFootprints) === null || _c === void 0 ? void 0 : _c.call(_b));
63
+ }));
64
+ });
65
+ function markExcludedTests(suite, excludedTests) {
66
+ if (!excludedTests) {
67
+ return;
68
+ }
69
+ suite.suites.forEach((suite) => markExcludedTests(suite, excludedTests));
70
+ suite.tests.forEach((test) => {
71
+ test.pending = excludedTests[(0, utils_1.constructTestName)(suite.title, test.title)] ? true : test.pending;
72
+ });
73
+ }
74
+ }
75
+ if (Cypress.env(const_1.SL_TASKS_REGISTERED) !== true) {
76
+ registerHooks();
77
+ }
78
+ //# sourceMappingURL=support.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"support.js","sourceRoot":"","sources":["../src/support.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ /// <reference types="cypress" />
2
+ export declare function constructTestName(suiteName: string, testName: string): string;
3
+ export declare function checkAgentLoaded(win: Cypress.AUTWindow, intervalMs?: number, timeoutSeconds?: number): Promise<boolean>;
@@ -0,0 +1,27 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.checkAgentLoaded = exports.constructTestName = void 0;
4
+ function constructTestName(suiteName, testName) {
5
+ return `${suiteName} - ${testName}`;
6
+ }
7
+ exports.constructTestName = constructTestName;
8
+ function checkAgentLoaded(win, intervalMs = 100, timeoutSeconds = 5) {
9
+ return new Promise((resolve) => {
10
+ const start = Date.now();
11
+ const intervalId = setInterval(() => {
12
+ if (win['$SealightsAgent'] !== undefined) {
13
+ clearInterval(intervalId);
14
+ resolve(true);
15
+ }
16
+ else {
17
+ const elapsed = Date.now() - start;
18
+ if (elapsed >= timeoutSeconds * 1000) {
19
+ clearInterval(intervalId);
20
+ resolve(false);
21
+ }
22
+ }
23
+ }, intervalMs);
24
+ });
25
+ }
26
+ exports.checkAgentLoaded = checkAgentLoaded;
27
+ //# sourceMappingURL=utils.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"utils.js","sourceRoot":"","sources":["../src/utils.ts"],"names":[],"mappings":";;;AAAA,SAAgB,iBAAiB,CAAC,SAAiB,EAAE,QAAgB;IACnE,OAAO,GAAG,SAAS,MAAM,QAAQ,EAAE,CAAC;AACtC,CAAC;AAFD,8CAEC;AAED,SAAgB,gBAAgB,CAC9B,GAAsB,EACtB,aAAqB,GAAG,EACxB,iBAAyB,CAAC;IAE1B,OAAO,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,EAAE;QAC7B,MAAM,KAAK,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;QACzB,MAAM,UAAU,GAAG,WAAW,CAAC,GAAG,EAAE;YAClC,IAAI,GAAG,CAAC,iBAAiB,CAAC,KAAK,SAAS,EAAE;gBACxC,aAAa,CAAC,UAAU,CAAC,CAAC;gBAC1B,OAAO,CAAC,IAAI,CAAC,CAAC;aACf;iBAAM;gBACL,MAAM,OAAO,GAAG,IAAI,CAAC,GAAG,EAAE,GAAG,KAAK,CAAC;gBACnC,IAAI,OAAO,IAAI,cAAc,GAAG,IAAI,EAAE;oBACpC,aAAa,CAAC,UAAU,CAAC,CAAC;oBAC1B,OAAO,CAAC,KAAK,CAAC,CAAC;iBAChB;aACF;QACH,CAAC,EAAE,UAAU,CAAC,CAAC;IACjB,CAAC,CAAC,CAAC;AACL,CAAC;AApBD,4CAoBC"}