@testim/testim-cli 3.253.0 → 3.255.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.
Files changed (103) hide show
  1. package/OverrideTestDataBuilder.js +1 -1
  2. package/agent/routers/cliJsCode/index.js +4 -4
  3. package/agent/routers/cliJsCode/router.js +46 -42
  4. package/agent/routers/cliJsCode/service.js +18 -13
  5. package/agent/routers/codim/router.js +14 -17
  6. package/agent/routers/codim/router.test.js +19 -21
  7. package/agent/routers/codim/service.js +16 -16
  8. package/agent/routers/general/index.js +4 -8
  9. package/agent/routers/hybrid/registerRoutes.js +18 -18
  10. package/agent/routers/index.js +7 -7
  11. package/agent/routers/playground/router.js +11 -10
  12. package/agent/routers/playground/service.js +22 -23
  13. package/agent/routers/standalone-browser/registerRoutes.js +10 -10
  14. package/cdpTestRunner.js +4 -3
  15. package/chromiumInstaller.js +4 -5
  16. package/cli/onExit.js +2 -2
  17. package/cli.js +11 -10
  18. package/cliAgentMode.js +8 -8
  19. package/codim/codim-cli.js +20 -17
  20. package/codim/hybrid-utils.js +1 -1
  21. package/codim/measure-perf.js +9 -6
  22. package/codim/template.js/tests/examples/01-simple-text-validation.test.js +6 -6
  23. package/codim/template.js/tests/examples/02-using-locators.test.js +13 -15
  24. package/codim/template.js/tests/examples/03-using-hooks.test.js +17 -19
  25. package/codim/template.js/tests/examples/04-skip-and-only.test.js +16 -17
  26. package/codim/template.js/tests/examples/05-multiple-windows.test.js +16 -17
  27. package/codim/template.js/webpack.config.js +1 -1
  28. package/codim/template.ts/webpack.config.js +3 -3
  29. package/commons/AbortError.js +4 -4
  30. package/commons/detectDebugger.js +4 -2
  31. package/commons/featureFlags.js +8 -0
  32. package/commons/httpRequest.js +5 -1
  33. package/commons/httpRequestCounters.js +21 -10
  34. package/commons/lazyRequire.js +14 -12
  35. package/commons/logger.js +4 -4
  36. package/commons/performance-logger.js +14 -8
  37. package/commons/preloadTests.js +2 -2
  38. package/commons/prepareRunner.js +4 -2
  39. package/commons/prepareRunnerAndTestimStartUtils.js +40 -42
  40. package/commons/runnerFileCache.js +1 -1
  41. package/commons/socket/baseSocketServiceSocketIO.js +32 -34
  42. package/commons/socket/realDataService.js +6 -5
  43. package/commons/socket/realDataServiceSocketIO.js +4 -4
  44. package/commons/socket/remoteStepService.js +4 -3
  45. package/commons/socket/remoteStepServiceSocketIO.js +11 -12
  46. package/commons/socket/socketService.js +50 -52
  47. package/commons/socket/testResultServiceSocketIO.js +11 -11
  48. package/commons/testimDesiredCapabilitiesBuilder.js +3 -2
  49. package/commons/testimNgrok.js +2 -2
  50. package/commons/testimNgrok.test.js +1 -1
  51. package/commons/testimServicesApi.js +27 -20
  52. package/commons/testimTunnel.test.js +2 -1
  53. package/commons/xhr2.js +97 -100
  54. package/coverage/SummaryToObjectReport.js +0 -1
  55. package/coverage/jsCoverage.js +12 -10
  56. package/errors.js +5 -0
  57. package/fixLocalBuild.js +2 -0
  58. package/inputFileUtils.js +11 -9
  59. package/npm-shrinkwrap.json +2286 -1284
  60. package/package.json +9 -8
  61. package/player/appiumTestPlayer.js +1 -1
  62. package/player/chromeLauncherTestPlayer.js +0 -1
  63. package/player/services/tabService.js +15 -1
  64. package/player/services/tabServiceMock.js +166 -0
  65. package/player/stepActions/locateStepAction.js +2 -0
  66. package/player/stepActions/navigationStepAction.js +11 -10
  67. package/player/stepActions/sleepStepAction.js +4 -5
  68. package/player/stepActions/textStepAction.js +4 -11
  69. package/player/utils/imageCaptureUtils.js +81 -120
  70. package/player/utils/windowUtils.js +4 -3
  71. package/player/webdriver.js +26 -23
  72. package/processHandler.js +3 -3
  73. package/processHandler.test.js +1 -1
  74. package/reports/consoleReporter.js +3 -2
  75. package/reports/junitReporter.js +7 -9
  76. package/reports/reporter.js +34 -39
  77. package/runOptions.d.ts +260 -0
  78. package/runOptions.js +59 -44
  79. package/runner.js +14 -0
  80. package/runners/ParallelWorkerManager.js +9 -10
  81. package/runners/TestPlanRunner.js +142 -78
  82. package/runners/buildCodeTests.js +38 -37
  83. package/runners/runnerUtils.js +3 -3
  84. package/services/gridService.js +36 -40
  85. package/services/lambdatestService.js +3 -5
  86. package/stepPlayers/cliJsStepPlayback.js +22 -17
  87. package/testRunHandler.js +8 -0
  88. package/testRunStatus.js +9 -6
  89. package/utils/argsUtils.js +86 -0
  90. package/utils/argsUtils.test.js +32 -0
  91. package/utils/fsUtils.js +154 -0
  92. package/{utils.js → utils/index.js} +19 -262
  93. package/utils/promiseUtils.js +89 -0
  94. package/utils/stringUtils.js +98 -0
  95. package/utils/stringUtils.test.js +22 -0
  96. package/utils/timeUtils.js +25 -0
  97. package/utils/utils.test.js +27 -0
  98. package/workers/BaseWorker.js +16 -14
  99. package/workers/WorkerAppium.js +1 -1
  100. package/workers/WorkerExtension.js +6 -7
  101. package/workers/WorkerExtensionSingleBrowser.js +4 -4
  102. package/workers/WorkerSelenium.js +5 -2
  103. package/utils.test.js +0 -68
@@ -1,7 +1,6 @@
1
1
  'use strict';
2
2
 
3
3
  const logger = require('../commons/logger').getLogger('reporter');
4
- const Promise = require('bluebird');
5
4
 
6
5
  class Reporter {
7
6
  setOptions(options, branchToUse) {
@@ -46,7 +45,7 @@ class Reporter {
46
45
  }
47
46
  }
48
47
 
49
- onTestPlanFinished(testResults, testPlanName, startTime, executionId, isAnonymous, isCodeMode, childTestResults) {
48
+ async onTestPlanFinished(testResults, testPlanName, startTime, executionId, isAnonymous, isCodeMode, childTestResults) {
50
49
  let results = {};
51
50
 
52
51
  // TODO: remove mutation of testResults from the Reporter
@@ -68,62 +67,55 @@ class Reporter {
68
67
  } else {
69
68
  results = testResults;
70
69
  }
71
-
72
- return Promise.each(this.reporters, reporter => {
70
+ for (const reporter of this.reporters) {
73
71
  if (reporter?.onTestPlanFinished) {
74
72
  const duration = Date.now() - (startTime || 0);
75
- return reporter.onTestPlanFinished(results, testPlanName, duration, executionId, isAnonymous, isCodeMode);
73
+ await reporter.onTestPlanFinished(results, testPlanName, duration, executionId, isAnonymous, isCodeMode);
76
74
  }
77
- return undefined;
78
- });
75
+ }
79
76
  }
80
77
 
81
- onTestPlanStarted(beforeTests, tests, afterTests, testPlanName, executionId, isAnonymous, configName, isCodeMode) {
82
- return Promise.each(this.reporters, reporter => {
78
+ async onTestPlanStarted(beforeTests, tests, afterTests, testPlanName, executionId, isAnonymous, configName, isCodeMode) {
79
+ for (const reporter of this.reporters) {
83
80
  if (reporter?.onTestPlanStarted) {
84
- return reporter.onTestPlanStarted(beforeTests, tests, afterTests, testPlanName, executionId, isAnonymous, configName, isCodeMode);
81
+ await reporter.onTestPlanStarted(beforeTests, tests, afterTests, testPlanName, executionId, isAnonymous, configName, isCodeMode);
85
82
  }
86
- return undefined;
87
- });
83
+ }
88
84
  }
89
85
 
90
- onGetSlot(workerId, browser) {
91
- return Promise.each(this.reporters, reporter => {
86
+ async onGetSlot(workerId, browser) {
87
+ for (const reporter of this.reporters) {
92
88
  if (reporter?.onGetSlot) {
93
- return reporter.onGetSlot(workerId, browser);
89
+ await reporter.onGetSlot(workerId, browser);
94
90
  }
95
- return undefined;
96
- });
91
+ }
97
92
  }
98
93
 
99
- onGetSession(workerId, testName, mode) {
100
- return Promise.each(this.reporters, reporter => {
94
+ async onGetSession(workerId, testName, mode) {
95
+ for (const reporter of this.reporters) {
101
96
  if (reporter?.onGetSession) {
102
- return reporter.onGetSession(workerId, testName, mode);
97
+ await reporter.onGetSession(workerId, testName, mode);
103
98
  }
104
- return undefined;
105
- });
99
+ }
106
100
  }
107
101
 
108
- onWaitToTestComplete(workerId, isCodeMode, debuggerAddress) {
109
- return Promise.each(this.reporters, reporter => {
102
+ async onWaitToTestComplete(workerId, isCodeMode, debuggerAddress) {
103
+ for (const reporter of this.reporters) {
110
104
  if (reporter?.onWaitToTestComplete) {
111
- return reporter.onWaitToTestComplete(workerId, isCodeMode, debuggerAddress);
105
+ await reporter.onWaitToTestComplete(workerId, isCodeMode, debuggerAddress);
112
106
  }
113
- return undefined;
114
- });
107
+ }
115
108
  }
116
109
 
117
- onWaitToTestStart(workerId) {
118
- return Promise.each(this.reporters, reporter => {
110
+ async onWaitToTestStart(workerId) {
111
+ for (const reporter of this.reporters) {
119
112
  if (reporter?.onWaitToTestStart) {
120
- return reporter.onWaitToTestStart(workerId);
113
+ await reporter.onWaitToTestStart(workerId);
121
114
  }
122
- return undefined;
123
- });
115
+ }
124
116
  }
125
117
 
126
- onAllTestPlansFinished(testPlanResults) {
118
+ async onAllTestPlansFinished(testPlanResults) {
127
119
  // TODO: remove mutation of testPlanResults from the Reporter
128
120
  for (const result of testPlanResults) {
129
121
  if (result.childTestResults) {
@@ -140,18 +132,21 @@ class Reporter {
140
132
  }
141
133
  }
142
134
 
143
- return Promise.each(this.reporters, reporter => {
135
+ for (const reporter of this.reporters) {
144
136
  if (reporter?.onAllTestPlansFinished) {
145
- return reporter.onAllTestPlansFinished(testPlanResults);
137
+ await reporter.onAllTestPlansFinished(testPlanResults);
146
138
  }
147
- return undefined;
148
- });
139
+ }
149
140
  }
150
141
  }
151
142
 
152
143
  function addHook(name) {
153
- Reporter.prototype[name] = function (...args) {
154
- return Promise.filter(this.reporters, reporter => reporter?.[name]).each(reporter => reporter[name](...args));
144
+ Reporter.prototype[name] = async function (...args) {
145
+ for (const reporter of this.reporters) {
146
+ if (reporter?.[name]) {
147
+ await reporter[name](...args);
148
+ }
149
+ }
155
150
  };
156
151
  }
157
152
 
@@ -0,0 +1,260 @@
1
+ interface LoginModeOptions {
2
+ loginMode: true;
3
+ }
4
+
5
+ interface InitModeOptions {
6
+ initCodimMode: true;
7
+ initTestProject: string;
8
+ }
9
+
10
+ interface AgentModeOptions {
11
+ agentMode: true;
12
+ project?: string;
13
+ token?: string;
14
+ agentPort: number;
15
+ agentBind?: string;
16
+ openEditor?: boolean;
17
+ installPlaygroundPlaywrightDeps: boolean;
18
+ installPlaygroundPuppeteerDeps: boolean;
19
+ installPlaygroundSeleniumDeps: boolean;
20
+ startTestimBrowser: boolean;
21
+ ext?: string;
22
+ extensionPath?: string;
23
+ playerLocation: string;
24
+ canary?: boolean;
25
+ playerPath?: string;
26
+ playerRequirePath?: string;
27
+ downloadBrowser: boolean;
28
+ }
29
+
30
+ interface TunnelDaemonOptions {
31
+ tunnelOnlyMode: true;
32
+ tunnelRoutes: string[];
33
+ tunnelRoutesOutput: string;
34
+ tunnelHostHeader?: string;
35
+ tunnelRegion?: string;
36
+ }
37
+ interface NgrokTunnelOptions {
38
+ tunnelPort: number;
39
+ tunnelDiagnostics?: boolean;
40
+ }
41
+
42
+ type TunnelOptions = (TunnelDaemonOptions | NgrokTunnelOptions) & {
43
+ tunnel: true;
44
+ tunnelUseHttpAddress?: boolean;
45
+ token: string;
46
+ project: string;
47
+ };
48
+
49
+ type CodeCoverageReporter = 'clover' | 'html' | 'json-summary' | 'json' | 'lcov' | 'lcovonly' | 'teamcity' | 'text-lcov' | 'text-summary' | 'text';
50
+
51
+ interface LightweightSettings {
52
+ type: 'lightweight' | 'turboMode';
53
+ general: boolean;
54
+ disableLabs: boolean;
55
+ disableFeatureFlags: boolean;
56
+ disableAssets: boolean;
57
+ disablePixelValidation: boolean;
58
+ disableResults: boolean;
59
+ disableStepDelay: boolean;
60
+ disableRemoteStep: boolean;
61
+ assumePreloadedSharedSteps: boolean;
62
+ disableVisibilityCheck: boolean;
63
+ disableLocators: boolean;
64
+ bypassSetup: boolean;
65
+ disableAutoImprove: boolean;
66
+ disableQuotaBlocking: boolean;
67
+ onlyTestIdsNoSuite: boolean;
68
+ uploadAssetsAndResultsOnFailure: boolean;
69
+ preloadTests: boolean;
70
+ disableProjectDefaults: boolean;
71
+ }
72
+
73
+ // TODO: consider typing better, based on the validations we do (example: must have one of grid/grid-id/host&port/test plan)
74
+ interface RunnerOptions extends Partial<Omit<TunnelOptions, 'tunnelOnlyMode' | 'tunnel'>> {
75
+ token: string;
76
+ project: string;
77
+ user?: string;
78
+ webpackConfig?: string;
79
+ headless?: boolean;
80
+ disableNativeEvents?: boolean;
81
+ baseUrl?: string;
82
+ branch: string;
83
+ autoDetect: boolean;
84
+ userParamsData: object;
85
+ mode: 'selenium' | 'extension';
86
+ isRegressionBaselineRun?: boolean;
87
+ canary?: boolean;
88
+ rerunFailedByRunId?: string;
89
+ disableTimeoutRetry?: boolean;
90
+ resultLabels: string[];
91
+ path?: string;
92
+ protocol?: string;
93
+ testobjectSauce: { testobjectApiKey?: string };
94
+ overrideExecutionName?: string;
95
+ passZeroTests: boolean;
96
+ runQuarantinedTests: boolean;
97
+ downloadBrowser: boolean;
98
+ disableSockets: boolean;
99
+ disableCookiesSameSiteNoneRequiresSecure: boolean;
100
+ shouldMonitorPerformance?: boolean;
101
+ exitCodeIgnoreFailingTests?: boolean;
102
+ seleniumCapsFileContent: object;
103
+ retentionDays?: 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10;
104
+ retries?: 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20;
105
+
106
+ // #region What to execute
107
+ testId: string[];
108
+ name: string[];
109
+ label: string[];
110
+ suites: string[];
111
+ suiteIds: string[];
112
+ testPlan: string[];
113
+ testPlanIds: string[];
114
+ files: string[];
115
+ // #endregion
116
+
117
+ // #region Test config to use
118
+ testConfigNames?: string[];
119
+ testConfigIds?: string[];
120
+ // #endregion
121
+
122
+ // #region Grid details
123
+ grid?: string;
124
+ gridId?: string;
125
+ host?: string;
126
+ port?: number;
127
+ gridUsername?: string;
128
+ gridPassword?: string;
129
+ useLocalChromeDriver?: boolean;
130
+ chromeBinaryLocation?: string;
131
+ useChromeLauncher?: boolean;
132
+
133
+ disableGridCheck: boolean;
134
+ browser?: 'ie11' | 'ie' | 'internet explorer' | 'edge' | 'edge-chromium' | 'firefox' | 'safari' | 'chrome';
135
+
136
+ proxyForGrid: string;
137
+
138
+ experitestToken?: string;
139
+ saucelabs: { username: string; accessKey: string };
140
+ perfecto: { securityToken?: string; location?: string };
141
+ browserstack: { 'browserstack.user': string; 'browserstack.key': string };
142
+ // #endregion
143
+
144
+ // #region Report settings
145
+ reportFile?: string;
146
+ reportFileClassname?: string;
147
+ reporters?: string[];
148
+ // #endregion
149
+
150
+ // #region Parallel settings
151
+ beforeParallel: number;
152
+ parallel: number;
153
+ afterParallel: number;
154
+ //#endregion
155
+
156
+ // #region TMS
157
+ tmsSuppressReporting: boolean;
158
+ tmsRunId?: string;
159
+ tmsCustomFields?: string;
160
+ // #endregion
161
+
162
+ // #region Extension debugging
163
+ ext?: string;
164
+ extensionLocation?: string[];
165
+ extensionPath?: string;
166
+ // #endregion
167
+
168
+ // #region Session Player debugging
169
+ playerLocation: string;
170
+ playerPath?: string;
171
+ playerRequirePath?: string;
172
+ // #endregion
173
+
174
+ // #region Tunnel
175
+ tunnel?: boolean;
176
+ externalLambdatestTunnelId?: string;
177
+ externalLambdatestUseWss?: string;
178
+ externalLambdatestDisableAutomationTunneling: boolean;
179
+ externalLambdatestMitm: boolean;
180
+ // #endregion
181
+
182
+ // #region Hooks
183
+ beforeTest?: Function;
184
+ afterTest?: Function;
185
+ beforeSuite?: Function;
186
+ afterSuite?: Function;
187
+ // #endregion
188
+
189
+ // #region Timeouts
190
+ testStartTimeout: number;
191
+ timeout: number;
192
+ timeoutWasGiven: boolean;
193
+ browserTimeout: number;
194
+ newBrowserWaitTimeout: number;
195
+ getBrowserTimeout: number;
196
+ getBrowserRetries: number;
197
+ getSessionTimeout: number;
198
+ getSessionRetries: number;
199
+ driverRequestTimeout: number;
200
+ driverRequestRetries: number;
201
+ // #endregion
202
+
203
+ // #region Mock network
204
+ overrideMappingFile?: string;
205
+ mockNetworkRules?: object;
206
+ disableMockNetwork?: boolean;
207
+ // #endregion
208
+
209
+ // #region Code coverage
210
+ codeCoverageUrlFilter?: string;
211
+ collectCodeCoverage?: boolean;
212
+ codeCoverageReportPath?: string;
213
+ codeCoverageSourceMapPath?: string;
214
+ codeCoverageReporter: CodeCoverageReporter[];
215
+ codeCoverageInclude: string[];
216
+ // #endregion
217
+
218
+ // #region Remote run options
219
+ executionId?: string;
220
+ remoteRunId?: string;
221
+ schedulerId?: string;
222
+ source?: string;
223
+ resultId?: string;
224
+ // #endregion
225
+
226
+ // #region Customer Extension
227
+ installCustomExtension?: string;
228
+ // #endregion
229
+
230
+ // #region Capabilities format
231
+ w3cCapabilities: boolean;
232
+ oldCapabilities: boolean;
233
+ // #endregion
234
+
235
+ // #region Chrome specific settings
236
+ chromeBlockLocation: boolean;
237
+ chromeUserDataDir: false | string;
238
+ chromeExtraPrefs: object;
239
+ chromeExtraArgs: string[];
240
+ // #endregion
241
+
242
+ // #region Lightweight / Turbo Mode
243
+ lightweightMode?: LightweightSettings;
244
+ createPrefechedData?: boolean;
245
+ saveRCALocally?: boolean | string;
246
+ // #endregion
247
+
248
+ // #region intersections
249
+ intersections: { labels?: string[]; suiteNames?: string[]; suiteIds?: string[] };
250
+ // #endregion
251
+ }
252
+
253
+ type Options = |
254
+ LoginModeOptions |
255
+ InitModeOptions |
256
+ AgentModeOptions |
257
+ TunnelOptions |
258
+ RunnerOptions;
259
+
260
+ export function process(): Promise<Options>;