@mablhq/mabl-cli 2.29.7 → 2.31.2

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/api/featureSet.js CHANGED
@@ -1,12 +1,13 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.FeatureSet = exports.FindImplementationVersion = exports.ADVANCED_AUTO_HEALING_FEATURE_FLAG = exports.GENERATIVE_AI_FEATURE_FLAG = void 0;
3
+ exports.FeatureSet = exports.FindImplementationVersion = exports.AI_ASSERTIONS_FEATURE_FLAG = exports.ADVANCED_AUTO_HEALING_FEATURE_FLAG = exports.GENERATIVE_AI_FEATURE_FLAG = void 0;
4
4
  const types_1 = require("../browserLauncher/types");
5
5
  const ACCESSIBILITY_CHECK_FEATURE_FLAG = 'accessibility_checks';
6
6
  const PERFORMANCE_TESTING_FEATURE_FLAG = 'performance_testing';
7
7
  const SMARTER_WAIT_FEATURE_FLAG = 'smarter_wait';
8
8
  exports.GENERATIVE_AI_FEATURE_FLAG = 'generative_ai';
9
9
  exports.ADVANCED_AUTO_HEALING_FEATURE_FLAG = 'advanced_auto_healing';
10
+ exports.AI_ASSERTIONS_FEATURE_FLAG = 'ai_assertions';
10
11
  var FindImplementationVersion;
11
12
  (function (FindImplementationVersion) {
12
13
  FindImplementationVersion[FindImplementationVersion["V1"] = 0] = "V1";
@@ -30,6 +31,9 @@ class FeatureSet {
30
31
  hasPerformanceTestingFeatureEnabled() {
31
32
  return this.featureFlags.has(PERFORMANCE_TESTING_FEATURE_FLAG);
32
33
  }
34
+ hasAIAssertions() {
35
+ return this.featureFlags.has(exports.AI_ASSERTIONS_FEATURE_FLAG);
36
+ }
33
37
  allowGenerativeAi() {
34
38
  return this.featureFlags.has(exports.GENERATIVE_AI_FEATURE_FLAG);
35
39
  }
@@ -569,6 +569,24 @@ class MablApiClient extends basicApiClient_1.BasicApiClient {
569
569
  throw toApiError(`Failed to update mailbox ${mailboxId} with error`, error);
570
570
  }
571
571
  }
572
+ async evaluateAiAssertion(workspaceId, testRunId, screenshot, userPrompt, metaPrompt) {
573
+ try {
574
+ const body = {
575
+ test_run_id: testRunId,
576
+ assertion_prompt: userPrompt,
577
+ screenshot: Buffer.from(screenshot).toString('base64'),
578
+ };
579
+ if (metaPrompt !== undefined) {
580
+ body.override = {
581
+ meta_prompt: metaPrompt,
582
+ };
583
+ }
584
+ return await this.makePostRequestWithRetries(`${this.baseApiUrl}/analysis/${workspaceId}/assertion/evaluate`, body);
585
+ }
586
+ catch (error) {
587
+ throw toApiError('Failed to evaluate the AI prompt assertion', error);
588
+ }
589
+ }
572
590
  async createBranch(workspaceId, branchName) {
573
591
  try {
574
592
  const body = {
@@ -1,11 +1,13 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.CommandArgMobileAppFileId = exports.CommandArgMobileAppFile = exports.CommandArgiOSdMobileAppFileId = exports.CommandArgAndroidMobileAppFileId = exports.CommandArgMablBranchChangesOnly = exports.CommandArgMablBranch = exports.CommandArgMablAutoLogin = exports.CommandArgMablAutoBranch = exports.CommandArgLinkBypass = exports.CommandArgLinkLabel = exports.CommandArgLimitOutput = exports.CommandArgLabels = exports.CommandArgLabelsInclude = exports.CommandArgLabelsExclude = exports.CommandArgTestInteractionSpeed = exports.CommandArgTestRunId = exports.CommandArgTestFile = exports.CommandArgKeepBrowserOpen = exports.CommandArgInput = exports.CommandArgIncludedTests = exports.CommandArgIncludeDefaults = exports.CommandArgId = exports.CommandArgUserAgent = exports.CommandArgHttpHeaders = exports.CommandArgHelp = exports.CommandArgHeadless = exports.CommandArgFromPlanId = exports.CommandArgFrom = exports.CommandArgFormat = exports.CommandArgFindPath = exports.CommandArgFastFailure = exports.CommandArgOverrideEnvironmentId = exports.CommandArgExistingReport = exports.CommandArgExcludedTests = exports.CommandArgEnvironmentId = exports.CommandArgDetailLevel = exports.CommandArgDestination = exports.CommandArgDescription = exports.CommandArgDeploymentId = exports.CommandArgDecrypt = exports.CommandArgDataTables = exports.CommandArgDataTableId = exports.CommandArgCredentials = exports.CommandArgBasicAuthCredentials = exports.CommandArgBrowsers = exports.CommandArgBrowser = exports.CommandArgBranch = exports.CommandArgApplicationId = exports.CommandArgApiKey = exports.CommandArgABConfigFile = void 0;
4
- exports.SCENARIO_ID_HEADER = exports.SCENARIO_NAME_HEADER = exports.ValidBrowserTypesForLocalRuns = exports.BrowserTypeSelections = exports.DefaultBrowserType = exports.DefaultBranchName = exports.DefaultOutputFormatChoices = exports.DetailLevelFormats = exports.ReporterOptions = exports.OutputFormats = exports.CommandArgAliases = exports.CommandArgBrowserEnableExtensions = exports.CommandArgBrowserIgnoreCertificateErrors = exports.CommandArgBrowserDisableIsolation = exports.ListTimeFormat = exports.CommandArgTimezoneID = exports.CommandArgLocale = exports.CommandArgUseTestExecutionProxy = exports.CommandArgScenarioId = exports.CommandArgReporterOptions = exports.CommandArgReporter = exports.CommandArgWorkspaceId = exports.CommandArgVersion = exports.CommandArgVariables = exports.CommandArgUrlApi = exports.CommandArgUrlApp = exports.CommandArgUrl = exports.CommandArgTrainerVersion = exports.CommandArgTo = exports.CommandArgSilent = exports.CommandArgRevision = exports.CommandArgMaxHeartbeatAge = exports.CommandArgPlanId = exports.CommandArgContentTypes = exports.CommandArgPreview = exports.CommandArgOutputFilePath = exports.CommandArgOutput = exports.CommandArgNoPrompt = exports.CommandArgPrompt = exports.CommandArgPortNumber = exports.CommandArgName = exports.CommandArgMobileDeviceName = exports.CommandArgMobilePlatform = void 0;
3
+ exports.CommandArgMablBranchChangesOnly = exports.CommandArgMablBranch = exports.CommandArgMablAutoLogin = exports.CommandArgMablAutoBranch = exports.CommandArgLinkBypass = exports.CommandArgLinkLabel = exports.CommandArgLimitOutput = exports.CommandArgLabels = exports.CommandArgLabelsInclude = exports.CommandArgLabelsExclude = exports.CommandArgTestInteractionSpeed = exports.CommandArgTestRunId = exports.CommandArgTestFile = exports.CommandArgKeepBrowserOpen = exports.CommandArgInput = exports.CommandArgIncludedTests = exports.CommandArgIncludeDefaults = exports.CommandArgId = exports.CommandArgUserAgent = exports.CommandArgHttpHeaders = exports.CommandArgHelp = exports.CommandArgHeadless = exports.CommandArgFromPlanId = exports.CommandArgFrom = exports.CommandArgFormat = exports.CommandArgFindPath = exports.CommandArgFastFailure = exports.CommandArgOverrideEnvironmentId = exports.CommandArgGrep = exports.CommandArgExtraArguments = exports.CommandArgExistingReport = exports.CommandArgExcludedTests = exports.CommandArgEnvironmentId = exports.CommandArgDetailLevel = exports.CommandArgDestination = exports.CommandArgDescription = exports.CommandArgDeploymentId = exports.CommandArgDecrypt = exports.CommandArgDebug = exports.CommandArgDataTables = exports.CommandArgDataTableId = exports.CommandArgCredentials = exports.CommandArgBasicAuthCredentials = exports.CommandArgBrowsers = exports.CommandArgBrowser = exports.CommandArgBranch = exports.CommandArgAuto = exports.CommandArgApplicationId = exports.CommandArgApiKey = exports.CommandArgABConfigFile = void 0;
4
+ exports.BrowserTypeSelections = exports.DefaultBrowserType = exports.DefaultBranchName = exports.DefaultOutputFormatChoices = exports.DetailLevelFormats = exports.ReporterOptions = exports.OutputFormats = exports.CommandArgAliases = exports.CommandArgBrowserEnableExtensions = exports.CommandArgBrowserIgnoreCertificateErrors = exports.CommandArgBrowserDisableIsolation = exports.ListTimeFormat = exports.CommandArgTimezoneID = exports.CommandArgLocale = exports.CommandArgUseTestExecutionProxy = exports.CommandArgScenarioId = exports.CommandArgReporterOptions = exports.CommandArgReporter = exports.CommandArgWorkspaceId = exports.CommandArgVersion = exports.CommandArgVariables = exports.CommandArgUrlApi = exports.CommandArgUrlApp = exports.CommandArgUrl = exports.CommandArgTo = exports.CommandArgTrainerVersion = exports.CommandArgTraceFile = exports.CommandArgTracesPath = exports.CommandArgTestPath = exports.CommandArgSilent = exports.CommandArgRevision = exports.CommandArgMaxHeartbeatAge = exports.CommandArgPlanId = exports.CommandArgContentTypes = exports.CommandArgPreview = exports.CommandArgPath = exports.CommandArgOutputFilePath = exports.CommandArgOutput = exports.CommandArgNoPrompt = exports.CommandArgPrompt = exports.CommandArgProject = exports.CommandArgPortNumber = exports.CommandArgName = exports.CommandArgMobileDeviceName = exports.CommandArgMobilePlatform = exports.CommandArgMobileAppFileId = exports.CommandArgMobileAppFile = exports.CommandArgiOSdMobileAppFileId = exports.CommandArgAndroidMobileAppFileId = exports.CommandArgMulti = void 0;
5
+ exports.SCENARIO_ID_HEADER = exports.SCENARIO_NAME_HEADER = exports.ValidBrowserTypesForLocalRuns = void 0;
5
6
  const browserTypes_1 = require("./browserTypes");
6
7
  exports.CommandArgABConfigFile = 'ab-config-file';
7
8
  exports.CommandArgApiKey = 'api-key';
8
9
  exports.CommandArgApplicationId = 'application-id';
10
+ exports.CommandArgAuto = 'auto-save';
9
11
  exports.CommandArgBranch = 'branch';
10
12
  exports.CommandArgBrowser = 'browser';
11
13
  exports.CommandArgBrowsers = 'browsers';
@@ -13,6 +15,7 @@ exports.CommandArgBasicAuthCredentials = 'basic-auth-credentials-id';
13
15
  exports.CommandArgCredentials = 'credentials-id';
14
16
  exports.CommandArgDataTableId = 'data-table-id';
15
17
  exports.CommandArgDataTables = 'data-tables';
18
+ exports.CommandArgDebug = 'debug';
16
19
  exports.CommandArgDecrypt = 'decrypt';
17
20
  exports.CommandArgDeploymentId = 'deployment-id';
18
21
  exports.CommandArgDescription = 'description';
@@ -21,6 +24,8 @@ exports.CommandArgDetailLevel = 'detail-level';
21
24
  exports.CommandArgEnvironmentId = 'environment-id';
22
25
  exports.CommandArgExcludedTests = 'excluded-tests';
23
26
  exports.CommandArgExistingReport = 'existing-report';
27
+ exports.CommandArgExtraArguments = 'extra-arguments';
28
+ exports.CommandArgGrep = 'grep';
24
29
  exports.CommandArgOverrideEnvironmentId = 'override-environment-id';
25
30
  exports.CommandArgFastFailure = 'fast-failure';
26
31
  exports.CommandArgFindPath = 'find-path';
@@ -49,6 +54,7 @@ exports.CommandArgMablAutoBranch = 'auto-branch';
49
54
  exports.CommandArgMablAutoLogin = 'auto-login';
50
55
  exports.CommandArgMablBranch = 'mabl-branch';
51
56
  exports.CommandArgMablBranchChangesOnly = 'branch-changes-only';
57
+ exports.CommandArgMulti = 'multi';
52
58
  exports.CommandArgAndroidMobileAppFileId = 'android-app-file-id';
53
59
  exports.CommandArgiOSdMobileAppFileId = 'ios-app-file-id';
54
60
  exports.CommandArgMobileAppFile = 'app-file';
@@ -57,18 +63,23 @@ exports.CommandArgMobilePlatform = 'platform';
57
63
  exports.CommandArgMobileDeviceName = 'device';
58
64
  exports.CommandArgName = 'name';
59
65
  exports.CommandArgPortNumber = 'port';
66
+ exports.CommandArgProject = 'project';
60
67
  exports.CommandArgPrompt = 'prompt';
61
68
  exports.CommandArgNoPrompt = `no-${exports.CommandArgPrompt}`;
62
69
  exports.CommandArgOutput = 'output';
63
70
  exports.CommandArgOutputFilePath = 'file';
71
+ exports.CommandArgPath = 'path';
64
72
  exports.CommandArgPreview = 'preview';
65
73
  exports.CommandArgContentTypes = 'types';
66
74
  exports.CommandArgPlanId = 'plan-id';
67
75
  exports.CommandArgMaxHeartbeatAge = 'max-heartbeat-age';
68
76
  exports.CommandArgRevision = 'revision';
69
77
  exports.CommandArgSilent = 'silent';
70
- exports.CommandArgTo = 'to';
78
+ exports.CommandArgTestPath = 'tests-path';
79
+ exports.CommandArgTracesPath = 'traces-path';
80
+ exports.CommandArgTraceFile = 'trace-file';
71
81
  exports.CommandArgTrainerVersion = 'trainer-version';
82
+ exports.CommandArgTo = 'to';
72
83
  exports.CommandArgUrl = 'url';
73
84
  exports.CommandArgUrlApp = 'app-url';
74
85
  exports.CommandArgUrlApi = 'api-url';
@@ -1,299 +1,5 @@
1
1
  "use strict";
2
- var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
- if (k2 === undefined) k2 = k;
4
- var desc = Object.getOwnPropertyDescriptor(m, k);
5
- if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
- desc = { enumerable: true, get: function() { return m[k]; } };
7
- }
8
- Object.defineProperty(o, k2, desc);
9
- }) : (function(o, m, k, k2) {
10
- if (k2 === undefined) k2 = k;
11
- o[k2] = m[k];
12
- }));
13
- var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
14
- Object.defineProperty(o, "default", { enumerable: true, value: v });
15
- }) : function(o, v) {
16
- o["default"] = v;
17
- });
18
- var __importStar = (this && this.__importStar) || function (mod) {
19
- if (mod && mod.__esModule) return mod;
20
- var result = {};
21
- if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);
22
- __setModuleDefault(result, mod);
23
- return result;
24
- };
25
- var __importDefault = (this && this.__importDefault) || function (mod) {
26
- return (mod && mod.__esModule) ? mod : { "default": mod };
27
- };
28
2
  Object.defineProperty(exports, "__esModule", { value: true });
29
- const env_1 = require("../../../env/env");
30
- const Timers = __importStar(require("timers"));
31
- const pluralize_1 = __importDefault(require("pluralize"));
32
- const inquirer = __importStar(require("inquirer"));
33
- const mablApiClientFactory_1 = require("../../../api/mablApiClientFactory");
34
- const util_1 = require("../../commandUtil/util");
35
- const mablApi_1 = require("../../../mablApi");
36
- const index_1 = require("../../../proxy/index");
37
- const RichPromise_1 = __importDefault(require("../../../util/RichPromise"));
38
- const pureUtil_1 = require("../../../util/pureUtil");
39
- const constants_1 = require("../../constants");
40
- const authenticationProvider_1 = require("../../../providers/authenticationProvider");
41
- const asyncUtil_1 = require("../../../util/asyncUtil");
42
- const loggingProvider_1 = require("../../../providers/logging/loggingProvider");
43
- const chromiumBrowserEngine_1 = require("../../../browserEngines/chromiumBrowserEngine");
44
- const { MablTestRunner, MablTestsRunner } = require('../../../execution');
45
- const DEFAULT_ASYNC_TIMEOUT_MILLIS = 120000;
46
- const CommandArgAuto = 'auto-save';
47
- const CommandArgDebug = 'debug';
48
- const CommandArgMulti = 'multi';
49
- const CommandArgPort = 'port';
50
- var PostImportActions;
51
- (function (PostImportActions) {
52
- PostImportActions["Discard"] = "Discard the test";
53
- PostImportActions["Run"] = "Run the test locally";
54
- PostImportActions["Save"] = "Save the test";
55
- PostImportActions["View"] = "View the test description";
56
- })(PostImportActions || (PostImportActions = {}));
57
- exports.command = 'import';
58
- exports.describe = false;
59
- exports.builder = (yargs) => {
60
- yargs
61
- .option(CommandArgAuto, {
62
- default: false,
63
- describe: 'Automatically save imported test when complete',
64
- required: false,
65
- requiresArg: false,
66
- type: 'boolean',
67
- })
68
- .option(CommandArgDebug, {
69
- default: false,
70
- describe: 'Enable debug mode',
71
- hidden: true,
72
- required: false,
73
- requiresArg: false,
74
- type: 'boolean',
75
- })
76
- .option(CommandArgMulti, {
77
- default: false,
78
- describe: 'Import multiple tests at once',
79
- required: false,
80
- requiresArg: false,
81
- type: 'boolean',
82
- })
83
- .option(constants_1.CommandArgName, {
84
- alias: constants_1.CommandArgAliases.Name,
85
- describe: 'The name to give this test in mabl',
86
- nargs: 1,
87
- required: false,
88
- type: 'string',
89
- })
90
- .option(CommandArgPort, {
91
- default: 8889,
92
- describe: 'The port on which the Selenium proxy should listen',
93
- min: 1,
94
- max: 65535,
95
- nargs: 1,
96
- required: false,
97
- type: 'number',
98
- })
99
- .option(constants_1.CommandArgWorkspaceId, {
100
- alias: constants_1.CommandArgAliases.WorkspaceId,
101
- describe: 'Workspace into which tests should be imported',
102
- nargs: 1,
103
- required: false,
104
- requiresArg: true,
105
- type: 'string',
106
- });
107
- };
108
- exports.handler = (0, util_1.failWrapper)(importTest);
109
- async function importTest(parsed) {
110
- const workspaceId = await (0, util_1.getWorkspaceId)(parsed);
111
- const importMultipleTests = parsed.multi;
112
- const apiClient = await mablApiClientFactory_1.MablApiClientFactory.createApiClient();
113
- const name = await getTestName(parsed.name);
114
- const importedTests = await importTests(parsed.port, parsed.debug, importMultipleTests);
115
- if (!importedTests.length) {
116
- return Promise.reject(new Error(`No ${importMultipleTests ? 'tests' : 'steps'} were imported.`));
117
- }
118
- if (importedTests.length > 1) {
119
- loggingProvider_1.logger.info(`Imported ${importedTests.length} tests.\n`);
120
- }
121
- else {
122
- loggingProvider_1.logger.info(`Imported ${(0, pluralize_1.default)('step', importedTests[0].length, true)}.\n`);
123
- }
124
- return handlePostImportActions(workspaceId, name, apiClient, importedTests, parsed.autoSave);
125
- }
126
- function getTestName(name) {
127
- const nameValidator = (value) => !(value === null || value === void 0 ? void 0 : value.length) ? 'Name must not be empty' : true;
128
- return name
129
- ? Promise.resolve(name)
130
- : inquirer
131
- .prompt([
132
- {
133
- type: 'input',
134
- name: 'name',
135
- message: 'Enter a name for this test',
136
- validate: nameValidator,
137
- },
138
- ])
139
- .then((answers) => answers.name);
140
- }
141
- async function importTests(port, debug, importMultipleTests) {
142
- const importedTests = [];
143
- const importCancelPromise = new RichPromise_1.default();
144
- const sessionClosedPromise = new RichPromise_1.default();
145
- const seleniumProxy = new index_1.SeleniumProxy(port, debug, () => {
146
- const steps = seleniumProxy.reset();
147
- if (steps.length) {
148
- importedTests.push(steps);
149
- if (importMultipleTests) {
150
- loggingProvider_1.logger.info(`Detected end of test ${importedTests.length} with ${(0, pluralize_1.default)('step', steps.length, true)}.`);
151
- loggingProvider_1.logger.info('Press CTRL+C to end multiple test import.');
152
- }
153
- }
154
- if (sessionClosedPromise.isPending()) {
155
- sessionClosedPromise.resolve();
156
- }
157
- });
158
- process.once('SIGINT', () => {
159
- loggingProvider_1.logger.logNewLine();
160
- importCancelPromise.resolve();
161
- });
162
- await seleniumProxy.start();
163
- loggingProvider_1.logger.info(`Configure your test to use a selenium proxy at localhost:${port} and run the test now.`);
164
- if (importMultipleTests) {
165
- loggingProvider_1.logger.info('Press CTRL+C to end multiple test import.');
166
- await importCancelPromise;
167
- }
168
- else {
169
- loggingProvider_1.logger.info('Import will end automatically when the Selenium session is closed or CTRL+C is pressed');
170
- await Promise.race([importCancelPromise, sessionClosedPromise]);
171
- }
172
- Timers.setImmediate(async () => {
173
- try {
174
- await seleniumProxy.stop();
175
- }
176
- catch (error) {
177
- if (debug) {
178
- loggingProvider_1.logger.error(`Error stopping selenium proxy: ${error}`);
179
- }
180
- }
181
- });
182
- return importedTests;
183
- }
184
- async function handlePostImportActions(workspaceId, name, apiClient, importedTests, autoSave) {
185
- let nextAction;
186
- do {
187
- nextAction = await getNextAction(autoSave);
188
- loggingProvider_1.logger.logNewLine();
189
- switch (nextAction) {
190
- case PostImportActions.Save:
191
- return saveTests(workspaceId, name, apiClient, importedTests).then(() => {
192
- loggingProvider_1.logger.info('Import complete.');
193
- });
194
- case PostImportActions.View:
195
- displayTestDescriptions(importedTests);
196
- break;
197
- case PostImportActions.Run:
198
- await runTests(workspaceId, name, apiClient, importedTests);
199
- break;
200
- case PostImportActions.Discard:
201
- loggingProvider_1.logger.info('Exiting without saving.');
202
- return;
203
- }
204
- loggingProvider_1.logger.logNewLine();
205
- } while ([PostImportActions.View, PostImportActions.Run].includes(nextAction));
206
- }
207
- async function getNextAction(autoSave) {
208
- if (autoSave) {
209
- return PostImportActions.Save;
210
- }
211
- const answer = await inquirer.prompt([
212
- {
213
- type: 'list',
214
- name: 'action',
215
- hint: false,
216
- message: 'What do you want to do next?',
217
- choices: Object.values(PostImportActions),
218
- },
219
- ]);
220
- return answer.action;
221
- }
222
- function saveTests(workspaceId, name, apiClient, importedTests) {
223
- loggingProvider_1.logger.info(`Saving ${(0, pluralize_1.default)('test', importedTests.length, true)}...`);
224
- const savePromises = importedTests.map((steps, index) => apiClient
225
- .createFlow(stepsToFlow(workspaceId, steps))
226
- .then((flow) => apiClient.createJourney(flowToJourney(importedTests.length === 1
227
- ? name
228
- : `${name} (${index + 1} of ${importedTests.length})`, flow)))
229
- .then((journey) => {
230
- loggingProvider_1.logger.info(`Saved test ${journey.invariant_id} : ${env_1.BASE_APP_URL}/workspaces/${journey.organization_id}/train/tests/${journey.invariant_id}/current`);
231
- return journey;
232
- }));
233
- return Promise.all(savePromises);
234
- }
235
- function displayTestDescriptions(importedTests) {
236
- importedTests.forEach((steps, index) => {
237
- if (importedTests.length > 1) {
238
- loggingProvider_1.logger.info(`Test ${index + 1} of ${importedTests.length}:`);
239
- }
240
- loggingProvider_1.logger.info(steps.map((step) => step.description).join('\n'));
241
- loggingProvider_1.logger.logNewLine();
242
- });
243
- }
244
- async function runTests(workspaceId, name, apiClient, importedTests) {
245
- var _a, _b;
246
- const flows = importedTests.map((steps) => stepsToFlow(workspaceId, steps));
247
- const firstUrl = (_a = flows.find((flow) => flow.url)) === null || _a === void 0 ? void 0 : _a.url;
248
- const browserPath = await new chromiumBrowserEngine_1.ChromiumBrowserEngine().findBrowserExecutable();
249
- for (let flowIndex = 0; flowIndex < flows.length; flowIndex++) {
250
- loggingProvider_1.logger.info(`Running test ${flowIndex + 1} of ${flows.length}.`);
251
- const flow = flows[flowIndex];
252
- const journey = {
253
- organization_id: workspaceId,
254
- name,
255
- flows: [],
256
- url: (_b = flow.url) !== null && _b !== void 0 ? _b : firstUrl,
257
- };
258
- const testRunner = await createTestRunner(apiClient, journey, flow, journey.url, workspaceId, browserPath);
259
- const results = await testRunner.run();
260
- loggingProvider_1.logger.info(`Test result: ${results.status}`);
261
- }
262
- }
263
- function stepsToFlow(workspaceId, steps) {
264
- const prototype = {
265
- import_source_id: mablApi_1.Flow.ImportSourceIdEnum.SeleniumNodeProxy,
266
- import_source_version: (0, pureUtil_1.getCliVersion)(),
267
- flow_type: mablApi_1.Flow.FlowTypeEnum.Mablscript,
268
- organization_id: workspaceId,
269
- reusable: false,
270
- selectors: steps
271
- .map((step) => step.selector)
272
- .map((selector) => selector === null || selector === void 0 ? void 0 : selector.toMablscriptSelector())
273
- .filter((selector) => selector)
274
- .map((selector) => selector),
275
- script: steps.map((step) => step.mablscript).join('\n'),
276
- script_description: steps.map((step) => step.description).join('\n'),
277
- url: steps.map((step) => step.url).find((url) => url),
278
- };
279
- return prototype;
280
- }
281
- function flowToJourney(name, flow) {
282
- const prototype = {
283
- organization_id: flow.organization_id,
284
- name,
285
- flows: [flow.id],
286
- url: flow.url,
287
- };
288
- return prototype;
289
- }
290
- async function createTestRunner(apiClient, test, flow, url, workspaceId, browserPath) {
291
- const authConfig = await (0, asyncUtil_1.promiseWithTimeout)(new authenticationProvider_1.AuthenticationProvider().getAuthConfigWithAutoRenew(), DEFAULT_ASYNC_TIMEOUT_MILLIS, 'Get auth config with auto renew');
292
- await (0, asyncUtil_1.promiseWithTimeout)(MablTestsRunner.validateAuth(apiClient, authConfig), DEFAULT_ASYNC_TIMEOUT_MILLIS, 'Validate auth');
293
- const runner = new MablTestRunner({
294
- mablApiClient: apiClient,
295
- testRunConfig: { imported: true, url, workspaceId },
296
- });
297
- await runner.initializeTestRunner(test, [flow], 'master', apiClient, browserPath, false, { url });
298
- return runner;
299
- }
3
+ exports.command = 'import <command>';
4
+ exports.describe = 'Import tests';
5
+ exports.builder = (yargs) => yargs.commandDir('import_cmds').demandCommand();