@testim/testim-cli 3.225.0 → 3.226.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.
@@ -1,12 +1,12 @@
1
1
  {
2
2
  "name": "@testim/testim-cli",
3
- "version": "3.225.0",
3
+ "version": "3.226.0",
4
4
  "lockfileVersion": 2,
5
5
  "requires": true,
6
6
  "packages": {
7
7
  "": {
8
8
  "name": "@testim/testim-cli",
9
- "version": "3.225.0",
9
+ "version": "3.226.0",
10
10
  "license": "Proprietary",
11
11
  "dependencies": {
12
12
  "@applitools/eyes-sdk-core": "13.0.0",
@@ -651,9 +651,9 @@
651
651
  }
652
652
  },
653
653
  "node_modules/@babel/helper-module-transforms": {
654
- "version": "7.16.7",
655
- "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.16.7.tgz",
656
- "integrity": "sha512-gaqtLDxJEFCeQbYp9aLAefjhkKdjKcdh6DB7jniIGU3Pz52WAmP268zK0VgPz9hUNkMSYeH976K2/Y6yPadpng==",
654
+ "version": "7.17.6",
655
+ "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.17.6.tgz",
656
+ "integrity": "sha512-2ULmRdqoOMpdvkbT8jONrZML/XALfzxlb052bldftkicAUy8AxSCkD5trDPQcwHNmolcl7wP6ehNqMlyUw6AaA==",
657
657
  "dev": true,
658
658
  "dependencies": {
659
659
  "@babel/helper-environment-visitor": "^7.16.7",
@@ -662,8 +662,8 @@
662
662
  "@babel/helper-split-export-declaration": "^7.16.7",
663
663
  "@babel/helper-validator-identifier": "^7.16.7",
664
664
  "@babel/template": "^7.16.7",
665
- "@babel/traverse": "^7.16.7",
666
- "@babel/types": "^7.16.7"
665
+ "@babel/traverse": "^7.17.3",
666
+ "@babel/types": "^7.17.0"
667
667
  },
668
668
  "engines": {
669
669
  "node": ">=6.9.0"
@@ -1812,6 +1812,14 @@
1812
1812
  "node": ">= 0.6"
1813
1813
  }
1814
1814
  },
1815
+ "node_modules/accepts/node_modules/mime-db": {
1816
+ "version": "1.51.0",
1817
+ "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.51.0.tgz",
1818
+ "integrity": "sha512-5y8A56jg7XVQx2mbv1lu49NR4dokRnhZYTtL+KGfaa27uq4pSTXkwQkFJl4pkRMyNFz/EtYDSkiiEHx3F7UN6g==",
1819
+ "engines": {
1820
+ "node": ">= 0.6"
1821
+ }
1822
+ },
1815
1823
  "node_modules/accepts/node_modules/mime-types": {
1816
1824
  "version": "2.1.34",
1817
1825
  "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.34.tgz",
@@ -1874,9 +1882,9 @@
1874
1882
  }
1875
1883
  },
1876
1884
  "node_modules/agentkeepalive": {
1877
- "version": "4.2.0",
1878
- "resolved": "https://registry.npmjs.org/agentkeepalive/-/agentkeepalive-4.2.0.tgz",
1879
- "integrity": "sha512-0PhAp58jZNw13UJv7NVdTGb0ZcghHUb3DrZ046JiiJY/BOaTTpbwdHq2VObPCBV8M2GPh7sgrJ3AQ8Ey468LJw==",
1885
+ "version": "4.2.1",
1886
+ "resolved": "https://registry.npmjs.org/agentkeepalive/-/agentkeepalive-4.2.1.tgz",
1887
+ "integrity": "sha512-Zn4cw2NEqd+9fiSVWMscnjyQ1a8Yfoc5oBajLeo5w+YBHgDUcEBY2hS4YpTz6iN5f/2zQiktcuM6tS8x1p9dpA==",
1880
1888
  "dependencies": {
1881
1889
  "debug": "^4.1.0",
1882
1890
  "depd": "^1.1.2",
@@ -4831,9 +4839,9 @@
4831
4839
  }
4832
4840
  },
4833
4841
  "node_modules/electron-to-chromium": {
4834
- "version": "1.4.71",
4835
- "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.71.tgz",
4836
- "integrity": "sha512-Hk61vXXKRb2cd3znPE9F+2pLWdIOmP7GjiTj45y6L3W/lO+hSnUSUhq+6lEaERWBdZOHbk2s3YV5c9xVl3boVw==",
4842
+ "version": "1.4.73",
4843
+ "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.73.tgz",
4844
+ "integrity": "sha512-RlCffXkE/LliqfA5m29+dVDPB2r72y2D2egMMfIy3Le8ODrxjuZNVo4NIC2yPL01N4xb4nZQLwzi6Z5tGIGLnA==",
4837
4845
  "dev": true
4838
4846
  },
4839
4847
  "node_modules/emoji-regex": {
@@ -8615,9 +8623,9 @@
8615
8623
  }
8616
8624
  },
8617
8625
  "node_modules/mime-db": {
8618
- "version": "1.51.0",
8619
- "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.51.0.tgz",
8620
- "integrity": "sha512-5y8A56jg7XVQx2mbv1lu49NR4dokRnhZYTtL+KGfaa27uq4pSTXkwQkFJl4pkRMyNFz/EtYDSkiiEHx3F7UN6g==",
8626
+ "version": "1.52.0",
8627
+ "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz",
8628
+ "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==",
8621
8629
  "engines": {
8622
8630
  "node": ">= 0.6"
8623
8631
  }
@@ -16135,9 +16143,9 @@
16135
16143
  }
16136
16144
  },
16137
16145
  "node_modules/vm2": {
16138
- "version": "3.9.8",
16139
- "resolved": "https://registry.npmjs.org/vm2/-/vm2-3.9.8.tgz",
16140
- "integrity": "sha512-/1PYg/BwdKzMPo8maOZ0heT7DLI0DAFTm7YQaz/Lim9oIaFZsJs3EdtalvXuBfZwczNwsYhju75NW4d6E+4q+w==",
16146
+ "version": "3.9.9",
16147
+ "resolved": "https://registry.npmjs.org/vm2/-/vm2-3.9.9.tgz",
16148
+ "integrity": "sha512-xwTm7NLh/uOjARRBs8/95H0e8fT3Ukw5D/JJWhxMbhKzNh1Nu981jQKvkep9iKYNxzlVrdzD0mlBGkDKZWprlw==",
16141
16149
  "dependencies": {
16142
16150
  "acorn": "^8.7.0",
16143
16151
  "acorn-walk": "^8.2.0"
@@ -17163,9 +17171,9 @@
17163
17171
  }
17164
17172
  },
17165
17173
  "@babel/helper-module-transforms": {
17166
- "version": "7.16.7",
17167
- "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.16.7.tgz",
17168
- "integrity": "sha512-gaqtLDxJEFCeQbYp9aLAefjhkKdjKcdh6DB7jniIGU3Pz52WAmP268zK0VgPz9hUNkMSYeH976K2/Y6yPadpng==",
17174
+ "version": "7.17.6",
17175
+ "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.17.6.tgz",
17176
+ "integrity": "sha512-2ULmRdqoOMpdvkbT8jONrZML/XALfzxlb052bldftkicAUy8AxSCkD5trDPQcwHNmolcl7wP6ehNqMlyUw6AaA==",
17169
17177
  "dev": true,
17170
17178
  "requires": {
17171
17179
  "@babel/helper-environment-visitor": "^7.16.7",
@@ -17174,8 +17182,8 @@
17174
17182
  "@babel/helper-split-export-declaration": "^7.16.7",
17175
17183
  "@babel/helper-validator-identifier": "^7.16.7",
17176
17184
  "@babel/template": "^7.16.7",
17177
- "@babel/traverse": "^7.16.7",
17178
- "@babel/types": "^7.16.7"
17185
+ "@babel/traverse": "^7.17.3",
17186
+ "@babel/types": "^7.17.0"
17179
17187
  }
17180
17188
  },
17181
17189
  "@babel/helper-simple-access": {
@@ -18099,6 +18107,11 @@
18099
18107
  "negotiator": "0.6.3"
18100
18108
  },
18101
18109
  "dependencies": {
18110
+ "mime-db": {
18111
+ "version": "1.51.0",
18112
+ "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.51.0.tgz",
18113
+ "integrity": "sha512-5y8A56jg7XVQx2mbv1lu49NR4dokRnhZYTtL+KGfaa27uq4pSTXkwQkFJl4pkRMyNFz/EtYDSkiiEHx3F7UN6g=="
18114
+ },
18102
18115
  "mime-types": {
18103
18116
  "version": "2.1.34",
18104
18117
  "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.34.tgz",
@@ -18144,9 +18157,9 @@
18144
18157
  }
18145
18158
  },
18146
18159
  "agentkeepalive": {
18147
- "version": "4.2.0",
18148
- "resolved": "https://registry.npmjs.org/agentkeepalive/-/agentkeepalive-4.2.0.tgz",
18149
- "integrity": "sha512-0PhAp58jZNw13UJv7NVdTGb0ZcghHUb3DrZ046JiiJY/BOaTTpbwdHq2VObPCBV8M2GPh7sgrJ3AQ8Ey468LJw==",
18160
+ "version": "4.2.1",
18161
+ "resolved": "https://registry.npmjs.org/agentkeepalive/-/agentkeepalive-4.2.1.tgz",
18162
+ "integrity": "sha512-Zn4cw2NEqd+9fiSVWMscnjyQ1a8Yfoc5oBajLeo5w+YBHgDUcEBY2hS4YpTz6iN5f/2zQiktcuM6tS8x1p9dpA==",
18150
18163
  "requires": {
18151
18164
  "debug": "^4.1.0",
18152
18165
  "depd": "^1.1.2",
@@ -20550,9 +20563,9 @@
20550
20563
  }
20551
20564
  },
20552
20565
  "electron-to-chromium": {
20553
- "version": "1.4.71",
20554
- "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.71.tgz",
20555
- "integrity": "sha512-Hk61vXXKRb2cd3znPE9F+2pLWdIOmP7GjiTj45y6L3W/lO+hSnUSUhq+6lEaERWBdZOHbk2s3YV5c9xVl3boVw==",
20566
+ "version": "1.4.73",
20567
+ "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.73.tgz",
20568
+ "integrity": "sha512-RlCffXkE/LliqfA5m29+dVDPB2r72y2D2egMMfIy3Le8ODrxjuZNVo4NIC2yPL01N4xb4nZQLwzi6Z5tGIGLnA==",
20556
20569
  "dev": true
20557
20570
  },
20558
20571
  "emoji-regex": {
@@ -23580,9 +23593,9 @@
23580
23593
  "integrity": "sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg=="
23581
23594
  },
23582
23595
  "mime-db": {
23583
- "version": "1.51.0",
23584
- "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.51.0.tgz",
23585
- "integrity": "sha512-5y8A56jg7XVQx2mbv1lu49NR4dokRnhZYTtL+KGfaa27uq4pSTXkwQkFJl4pkRMyNFz/EtYDSkiiEHx3F7UN6g=="
23596
+ "version": "1.52.0",
23597
+ "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz",
23598
+ "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg=="
23586
23599
  },
23587
23600
  "mime-types": {
23588
23601
  "version": "2.1.27",
@@ -29284,9 +29297,9 @@
29284
29297
  }
29285
29298
  },
29286
29299
  "vm2": {
29287
- "version": "3.9.8",
29288
- "resolved": "https://registry.npmjs.org/vm2/-/vm2-3.9.8.tgz",
29289
- "integrity": "sha512-/1PYg/BwdKzMPo8maOZ0heT7DLI0DAFTm7YQaz/Lim9oIaFZsJs3EdtalvXuBfZwczNwsYhju75NW4d6E+4q+w==",
29300
+ "version": "3.9.9",
29301
+ "resolved": "https://registry.npmjs.org/vm2/-/vm2-3.9.9.tgz",
29302
+ "integrity": "sha512-xwTm7NLh/uOjARRBs8/95H0e8fT3Ukw5D/JJWhxMbhKzNh1Nu981jQKvkep9iKYNxzlVrdzD0mlBGkDKZWprlw==",
29290
29303
  "requires": {
29291
29304
  "acorn": "^8.7.0",
29292
29305
  "acorn-walk": "^8.2.0"
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@testim/testim-cli",
3
- "version": "3.225.0",
3
+ "version": "3.226.0",
4
4
  "description": "Command line interface for running Testing on your CI",
5
5
  "author": "Oren Rubin",
6
6
  "contributors": [{
package/testRunStatus.js CHANGED
@@ -63,7 +63,7 @@ const RunStatus = function (testInfoList, options, testPlanId, branchToUse) {
63
63
  testPlanId,
64
64
  testPlans: options.testPlan,
65
65
  testLabels: options.label,
66
- testSuites: _.uniq(_.flatten(testInfoList.map(test => test.testSuites))),
66
+ testSuites: _.uniq(testInfoList.flatMap(test => test.testSuites)),
67
67
  testNames: options.name,
68
68
  testIds: options.testId,
69
69
  testConfigs: options.testConfigNames,
@@ -173,10 +173,12 @@ RunStatus.prototype.testStartReport = function (test, executionId, testRetryKey)
173
173
  return Promise.resolve();
174
174
  }
175
175
  return runHook(this.options.beforeTest, Object.assign({}, test, { exportsGlobal: this.exportsGlobal }), this.options.userData.loginData.token)
176
- .then(params => {
176
+ .then(async params => {
177
177
  this.options.runParams[test.resultId] = test.config.testData = Object.assign({}, test.config.testData, this.exportsGlobal, this.fileUserParamsData, this.beforeSuiteParams, params);
178
178
  test.startTime = Date.now();
179
- return this.updateTestStatusRunning(test, executionId, testRetryKey);
179
+ await this.updateTestStatusRunning(test, executionId, testRetryKey);
180
+
181
+ return test;
180
182
  }).catch(err => {
181
183
  logger.error('Failed to start test', { err });
182
184
  throw err;
@@ -141,8 +141,7 @@ class BaseWorker {
141
141
  const player = this.initPlayer(testRunHandler);
142
142
  try {
143
143
  gridInfo = await gridService.handleHybridOrVendorIfNeeded(
144
- this.options, gridInfo, this.testRunConfig, this.lambdatestService,
145
- { maxRetries: getBrowserRetriesNumber, currentRetry: failedGetBrowserAttempts + 1 },
144
+ this.options, gridInfo, this.testRunConfig, this.lambdatestService, { maxRetries: getBrowserRetriesNumber, currentRetry: failedGetBrowserAttempts + 1 },
146
145
  );
147
146
  this.options.gridData.provider = gridInfo.provider;
148
147
  this.options.gridData.host = gridInfo.host;
@@ -192,9 +191,10 @@ class BaseWorker {
192
191
  }
193
192
 
194
193
  perf.log('before runTest onTestStarted');
195
- await this.onTestStarted(this.id, testRunHandler.getTestId(), testRunHandler.getTestResultId(), shouldRerun, testRunHandler.getRetryKey());
196
- const testPlayer = await this.getTestPlayer(testRunHandler, customExtensionLocalLocation);
194
+ const test = await this.onTestStarted(this.id, testRunHandler.getTestId(), testRunHandler.getTestResultId(), shouldRerun, testRunHandler.getRetryKey());
195
+ testRunHandler._baseUrl = test.config.baseUrl;
197
196
 
197
+ const testPlayer = await this.getTestPlayer(testRunHandler, customExtensionLocalLocation);
198
198
  try {
199
199
  return await this.runTestOnce(testRunHandler, testPlayer);
200
200
  } finally {
@@ -276,13 +276,13 @@ class BaseWorker {
276
276
  }
277
277
 
278
278
  const msg = err instanceof Error ? err.message : err;
279
- if (msg.indexOf(GET_BROWSER_TIMEOUT_MSG) > -1) {
279
+ if (msg.includes(GET_BROWSER_TIMEOUT_MSG)) {
280
280
  return { errorType: SETUP_TIMEOUT, reason: "Test couldn't get browser" };
281
281
  }
282
- if (msg.indexOf(TEST_START_TIMEOUT_MSG) > -1) {
282
+ if (msg.includes(TEST_START_TIMEOUT_MSG)) {
283
283
  return { errorType: SETUP_TIMEOUT, reason: "Test couldn't be started" };
284
284
  }
285
- if (msg.indexOf(TEST_COMPLETE_TIMEOUT_MSG) > -1) {
285
+ if (msg.includes(TEST_COMPLETE_TIMEOUT_MSG)) {
286
286
  if (!this.testRunTimeout) {
287
287
  return { errorType: SETUP_TIMEOUT, reason: 'Test timeout reached: test is too long' };
288
288
  }
@@ -1,21 +1,32 @@
1
+ const proxyquire = require('proxyquire');
2
+
1
3
  const { expect, sinon } = require('../../test/utils/testUtils');
2
- const BaseWorker = require('./BaseWorker');
3
4
  const gridService = require('../services/gridService');
4
5
  const reporter = require('../reports/reporter');
5
6
  const Bluebird = require('bluebird');
6
7
  const { PageNotAvailableError, GridError, GetBrowserError } = require('../errors');
7
8
  const servicesApi = require('../commons/testimServicesApi');
9
+ const { releasePlayer } = require('./workerUtils');
10
+
8
11
 
9
12
  describe('BaseWorker', () => {
10
13
  let worker;
11
14
  let handleHybridStub;
12
15
  let getGridSlotStub;
13
- const sandbox = sinon.createSandbox();
16
+ let runTestOnceStub = sinon.stub();
14
17
  let testRunHandlerMock;
15
18
  let testPlayerMock;
19
+ const onTestStartedStub = sinon.stub();
20
+ const sandbox = sinon.createSandbox();
16
21
 
17
22
  beforeEach(() => {
18
- worker = new BaseWorker(null, {});
23
+ const BaseWorker = proxyquire.noCallThru()('./BaseWorker', {
24
+ './workerUtils': {
25
+ releasePlayer: () => sinon.stub().resolves({}),
26
+ },
27
+ });
28
+
29
+ worker = new BaseWorker(null, {}, null, null, onTestStartedStub);
19
30
  worker.userData = {};
20
31
  worker.options = { gridData: {}, browser: 'chrome', company: { companyId: 'companyId' }, getBrowserTimeout: 1000, getSessionTimeout: 100, getBrowserRetries: 10 };
21
32
  worker.testRunConfig = {};
@@ -25,6 +36,7 @@ describe('BaseWorker', () => {
25
36
 
26
37
  sinon.stub(worker, 'initPlayer').returns(testPlayerMock);
27
38
  sinon.stub(worker, 'getBrowserOnce').returns({});
39
+ runTestOnceStub = sinon.stub(worker, 'runTestOnce');
28
40
  handleHybridStub = sinon.stub(gridService, 'handleHybridOrVendorIfNeeded').callThrough();
29
41
  getGridSlotStub = sinon.stub(gridService, 'getGridSlot').resolves({});
30
42
 
@@ -154,5 +166,27 @@ describe('BaseWorker', () => {
154
166
  expect(worker.getBrowserOnce.getCall(2).args[3]).to.shallowDeepEqual({ type: 'testimHybrid', gridId: 'gridId', provider: 'a', host: 'google.com', user: undefined, key: undefined, port: 4444 });
155
167
  });
156
168
  });
169
+
170
+ describe('runTest', () => {
171
+ it('should call the runTestOnc with the base url of the test object we acquired from onTestStarted', async () => {
172
+ const testRunHandler = {
173
+ _baseUrl: 'https://testim.io',
174
+ getTestStatus: () => sinon.stub().returns(42),
175
+ getTestId: () => sinon.stub().returns(42),
176
+ getTestResultId: () => sinon.stub().returns(42),
177
+ getRetryKey: () => sinon.stub().returns(42),
178
+ getExecutionId: () => sinon.stub().returns(42),
179
+ testRunHandler: () => sinon.stub().returns(42),
180
+ clearTestResult: () => sinon.stub().returns(42),
181
+ };
182
+ onTestStartedStub.returns({
183
+ config: {
184
+ baseUrl: 'http://demo.testim.io/',
185
+ },
186
+ });
187
+ await worker.runTest(testRunHandler);
188
+ expect(runTestOnceStub.firstCall.firstArg._baseUrl).to.equals('http://demo.testim.io/');
189
+ });
190
+ });
157
191
  });
158
192
  });
@@ -45,7 +45,8 @@ class WorkerExtensionSingleBrowser extends WorkerExtension {
45
45
  }
46
46
 
47
47
  perf.log('before runTest onTestStarted single browser');
48
- await this.onTestStarted(this.id, testRunHandler.getTestId(), testRunHandler.getTestResultId(), shouldRerun, testRunHandler.getRetryKey());
48
+ const test = await this.onTestStarted(this.id, testRunHandler.getTestId(), testRunHandler.getTestResultId(), shouldRerun, testRunHandler.getRetryKey());
49
+ testRunHandler._baseUrl = test.config.baseUrl;
49
50
  const testPlayer = await this.getTestPlayer(testRunHandler, customExtensionLocalLocation);
50
51
 
51
52
  testRunHandler.markClearBrowser();