@testingbot/cli 1.0.8 → 1.1.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.
package/README.md CHANGED
@@ -92,6 +92,13 @@ testingbot maestro <app> <flows...> [options]
92
92
  - `app` - Path to your app file (.apk, .ipa, .app, or .zip)
93
93
  - `flows` - One or more paths to flow files (.yaml/.yml), directories, .zip files, or glob patterns
94
94
 
95
+ **App Options:**
96
+
97
+ | Option | Description |
98
+ |--------|-------------|
99
+ | `--app <path>` | Path to the application under test (alternative to the positional `app` argument) |
100
+ | `--other-app <path-or-url>` | Additional companion app to install on the device alongside `--app`. Accepts a local file path (`.apk`, `.ipa`, `.app`, `.zip`) **or** a `tb://<appkey>` / `http(s)://...` URL — local paths are uploaded; URLs are passed through to the run as-is. Repeatable, **max 4** entries. |
101
+
95
102
  **Device Options:**
96
103
 
97
104
  | Option | Description |
@@ -110,6 +117,7 @@ testingbot maestro <app> <flows...> [options]
110
117
  |--------|-------------|
111
118
  | `--name <name>` | Test name for dashboard identification |
112
119
  | `--build <build>` | Build identifier for grouping test runs |
120
+ | `--groups <names>` | Tag the test session with one or more groups (comma-separated). Groups appear on the test in the TestingBot dashboard |
113
121
  | `--include-tags <tags>` | Only run flows with these tags (comma-separated) |
114
122
  | `--exclude-tags <tags>` | Exclude flows with these tags (comma-separated) |
115
123
  | `-e, --env <KEY=VALUE>` | Environment variable for flows (can be repeated) |
@@ -146,8 +154,11 @@ testingbot maestro <app> <flows...> [options]
146
154
  | Option | Description |
147
155
  |--------|-------------|
148
156
  | `--shard-split <number>` | Split flows into N parallel sessions for faster execution |
157
+ | `--retry <count>` | Retry failed flows up to N times (0-2, default 0). Re-runs only the flows (or shards) that failed, the moment they fail, while the rest of the run continues. Cannot be combined with `--async`. |
149
158
  | `--ignore-checksum-check` | Skip checksum verification and always upload the app |
150
159
 
160
+ > **Note on `--retry`:** a failed flow/shard is retried immediately — as soon as it fails — without waiting for the other flows in the run to finish. Retry attempts appear live in the flow table marked with a `↻` icon. Each flow is retried independently up to N times, stopping as soon as that flow passes. Pass/fail uses the result of the **last** attempt per flow (last-attempt-wins), consistently across the CLI exit code, the TestingBot dashboard, and reports downloaded via `--report`.
161
+
151
162
  **CI/CD Integration:**
152
163
 
153
164
  | Option | Description |
@@ -172,9 +183,20 @@ testingbot maestro app.apk ./flows --device "Pixel 8" --deviceVersion "14"
172
183
  # Android app on real device with tags
173
184
  testingbot maestro app.apk ./flows --device "Samsung Galaxy S24" --real-device --include-tags "smoke,regression"
174
185
 
186
+ # Tag the test session with groups (visible in the dashboard)
187
+ testingbot maestro app.apk ./flows --groups "smoke,critical"
188
+
175
189
  # With environment variables
176
190
  testingbot maestro app.apk ./flows -e API_URL=https://staging.example.com -e API_KEY=secret
177
191
 
192
+ # With companion apps installed alongside the main app (up to 4)
193
+ # Each --other-app can be a local file (uploaded) or a tb:// / http(s):// URL (passed through)
194
+ testingbot maestro --app main.apk \
195
+ --other-app helper.apk \
196
+ --other-app tb://existing-appkey \
197
+ --other-app https://example.com/mock-server.apk \
198
+ ./flows
199
+
178
200
  # Download JUnit report
179
201
  testingbot maestro app.apk ./flows --report junit --report-output-dir ./reports
180
202
 
@@ -193,6 +215,9 @@ testingbot maestro app.apk ./flows --async
193
215
  # Split flows across 3 shards, grouping all flows over 3 parallel sessions
194
216
  testingbot maestro app.apk ./flows --shard-split 3
195
217
 
218
+ # Retry failed flows up to 2 times (re-runs only the flows that failed)
219
+ testingbot maestro app.apk ./flows --retry 2
220
+
196
221
  # CI/CD integration with Git metadata
197
222
  testingbot maestro app.apk ./flows \
198
223
  --commit-sha "abc123def" \
package/dist/cli.d.ts.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"cli.d.ts","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AA0BpC,QAAA,MAAM,OAAO,SAAgB,CAAC;AA2oB9B,eAAe,OAAO,CAAC"}
1
+ {"version":3,"file":"cli.d.ts","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AA0BpC,QAAA,MAAM,OAAO,SAAgB,CAAC;AA4rB9B,eAAe,OAAO,CAAC"}
package/dist/cli.js CHANGED
@@ -185,16 +185,25 @@ program
185
185
  .argument('[flows...]', 'Paths to flow files, directories, or glob patterns (can specify multiple)')
186
186
  // App and flows options
187
187
  .option('--app <path>', 'Path to application under test (.apk, .ipa, .app, or .zip).')
188
+ .option('--other-app <path>', 'Additional app to install alongside --app (.apk, .ipa, .app, or .zip). Repeatable, max 4.', (val, acc) => {
189
+ acc.push(val);
190
+ return acc;
191
+ }, [])
188
192
  // Device configuration
189
193
  .option('--device <device>', 'Device name to use for testing (e.g., "Pixel 9", "iPhone 17").')
190
194
  .option('--platform <platform>', 'Platform name: Android or iOS.', (val) => val)
191
195
  .option('--deviceVersion <version>', 'OS version (e.g., "14", "17.2").')
192
196
  .option('--real-device', 'Use a real device instead of an emulator/simulator.')
197
+ .option('--google-play', 'Use the Google Play Store-enabled version (Android emulator only).')
193
198
  .option('--orientation <orientation>', 'Screen orientation: PORTRAIT or LANDSCAPE.', (val) => val.toUpperCase())
194
199
  .option('--device-locale <locale>', 'Device locale (e.g., "en_US", "de_DE").')
195
200
  .option('--timezone <timezone>', 'Device timezone (e.g., "America/New_York", "Europe/London").')
196
201
  // Test metadata
197
202
  .option('--name <name>', 'Name for this Maestro run.')
203
+ .option('--groups <names>', 'Tag the test session with one or more groups (comma-separated).', (val) => val
204
+ .split(',')
205
+ .map((g) => g.trim())
206
+ .filter((g) => g.length > 0))
198
207
  // Network and geo
199
208
  .option('--throttle-network <speed>', 'Network throttling: 4G, 3G, Edge, airplane, or disable.', (val) => val)
200
209
  .option('--geo-country-code <code>', 'Geographic IP location (ISO country code, e.g., "US", "DE").')
@@ -211,6 +220,7 @@ program
211
220
  .option('--maestro-version <version>', 'Maestro version to use (e.g., "2.0.10").')
212
221
  // Execution mode
213
222
  .option('-q, --quiet', 'Quieter console output without progress updates.')
223
+ .option('--retry <count>', 'Retry failed flows up to N times (0-2, default 0). Stops as soon as a flow passes.', (val) => parseInt(val, 10), 0)
214
224
  .option('--async', 'Start tests and exit immediately without waiting for results.')
215
225
  .option('--dry-run', 'Validate and prepare everything but skip HTTP calls. Shows what would be sent.')
216
226
  // Tunnel
@@ -257,6 +267,16 @@ program
257
267
  if (missing.length > 0) {
258
268
  throw new testingbot_error_1.default(`Missing required argument: ${missing.join(', ')}. Run "testingbot maestro --help" for usage.`);
259
269
  }
270
+ const otherApps = Array.isArray(args.otherApp)
271
+ ? args.otherApp.slice()
272
+ : [];
273
+ // Commander stores the accumulator on a shared default array; reset it so
274
+ // values do not leak across repeated parses (e.g. in tests).
275
+ if (Array.isArray(args.otherApp))
276
+ args.otherApp.length = 0;
277
+ if (otherApps.length > 4) {
278
+ throw new testingbot_error_1.default(`Too many --other-app entries (${otherApps.length}). Maximum is 4.`);
279
+ }
260
280
  const credentials = await auth_1.default.getCredentials({
261
281
  apiKey: args.apiKey,
262
282
  apiSecret: args.apiSecret,
@@ -313,9 +333,13 @@ program
313
333
  artifactsOutputDir: args.artifactsOutputDir,
314
334
  ignoreChecksumCheck: args.ignoreChecksumCheck,
315
335
  shardSplit: args.shardSplit,
336
+ retry: args.retry,
316
337
  debug: args.debug,
338
+ googlePlayStore: args.googlePlay,
317
339
  configFile: args.config,
340
+ groups: args.groups,
318
341
  metadata,
342
+ otherApps,
319
343
  });
320
344
  if (args.debug) {
321
345
  (0, logger_1.enableDebugLogging)();
@@ -376,6 +400,7 @@ program
376
400
  // Authentication
377
401
  .option('--api-key <key>', 'TestingBot API key.')
378
402
  .option('--api-secret <secret>', 'TestingBot API secret.')
403
+ .option('--debug', 'Enable debug logging of API responses.')
379
404
  .action(async (appFileArg, testAppFileArg, args) => {
380
405
  try {
381
406
  // Positional arguments take precedence, fall back to options
@@ -428,8 +453,12 @@ program
428
453
  dryRun: args.dryRun,
429
454
  report: args.report,
430
455
  reportOutputDir: args.reportOutputDir,
456
+ debug: args.debug,
431
457
  metadata,
432
458
  });
459
+ if (args.debug) {
460
+ (0, logger_1.enableDebugLogging)();
461
+ }
433
462
  const xcuitest = new xcuitest_1.default(credentials, options);
434
463
  const result = await xcuitest.run();
435
464
  if (!result.success) {
@@ -1 +1 @@
1
- {"version":3,"file":"logger.d.ts","sourceRoot":"","sources":["../src/logger.ts"],"names":[],"mappings":"AACA,OAAO,MAAM,MAAM,QAAQ,CAAC;AAE5B,QAAA,MAAM,MAAM,8BAWV,CAAC;AAEH,wBAAgB,kBAAkB,IAAI,IAAI,CAEzC;AAED,eAAe,MAAM,CAAC"}
1
+ {"version":3,"file":"logger.d.ts","sourceRoot":"","sources":["../src/logger.ts"],"names":[],"mappings":"AACA,OAAO,MAAM,MAAM,QAAQ,CAAC;AAE5B,QAAA,MAAM,MAAM,8BAUV,CAAC;AAIH,wBAAgB,kBAAkB,IAAI,IAAI,CAEzC;AAED,eAAe,MAAM,CAAC"}
package/dist/logger.js CHANGED
@@ -7,7 +7,6 @@ exports.enableDebugLogging = enableDebugLogging;
7
7
  const picocolors_1 = __importDefault(require("picocolors"));
8
8
  const tracer_1 = __importDefault(require("tracer"));
9
9
  const logger = tracer_1.default.colorConsole({
10
- level: 'info',
11
10
  format: '{{timestamp}} {{message}}',
12
11
  dateformat: 'HH:MM:ss.L',
13
12
  filters: [
@@ -18,6 +17,7 @@ const logger = tracer_1.default.colorConsole({
18
17
  },
19
18
  ],
20
19
  });
20
+ tracer_1.default.setLevel('info');
21
21
  function enableDebugLogging() {
22
22
  tracer_1.default.setLevel('debug');
23
23
  }
@@ -26,6 +26,8 @@ export interface MaestroCapabilities {
26
26
  'testingbot.geoCountryCode'?: string;
27
27
  tunnelIdentifier?: string;
28
28
  realDevice?: string;
29
+ groups?: string[];
30
+ googlePlayStore?: boolean;
29
31
  }
30
32
  export interface MaestroRunOptions {
31
33
  includeTags?: string[];
@@ -33,10 +35,13 @@ export interface MaestroRunOptions {
33
35
  env?: Record<string, string>;
34
36
  version?: string;
35
37
  }
38
+ export declare const MAX_OTHER_APPS = 4;
39
+ export declare const MAX_RETRY = 2;
36
40
  export default class MaestroOptions {
37
41
  private static isIpaFile;
38
42
  private _app;
39
43
  private _flows;
44
+ private _otherApps;
40
45
  private _device?;
41
46
  private _includeTags?;
42
47
  private _excludeTags?;
@@ -62,8 +67,11 @@ export default class MaestroOptions {
62
67
  private _artifactsOutputDir?;
63
68
  private _ignoreChecksumCheck;
64
69
  private _shardSplit?;
70
+ private _retry;
65
71
  private _debug;
66
72
  private _configFile?;
73
+ private _groups?;
74
+ private _googlePlayStore;
67
75
  private _metadata?;
68
76
  constructor(app: string, flows: string | string[], device?: string, options?: {
69
77
  includeTags?: string[];
@@ -90,12 +98,17 @@ export default class MaestroOptions {
90
98
  artifactsOutputDir?: string;
91
99
  ignoreChecksumCheck?: boolean;
92
100
  shardSplit?: number;
101
+ retry?: number;
93
102
  debug?: boolean;
94
103
  configFile?: string;
104
+ groups?: string[];
105
+ googlePlayStore?: boolean;
95
106
  metadata?: RunMetadata;
107
+ otherApps?: string[];
96
108
  });
97
109
  get app(): string;
98
110
  get flows(): string[];
111
+ get otherApps(): string[];
99
112
  get device(): string | undefined;
100
113
  get includeTags(): string[] | undefined;
101
114
  get excludeTags(): string[] | undefined;
@@ -121,9 +134,12 @@ export default class MaestroOptions {
121
134
  get artifactsOutputDir(): string | undefined;
122
135
  get ignoreChecksumCheck(): boolean;
123
136
  get shardSplit(): number | undefined;
137
+ get retry(): number;
124
138
  get debug(): boolean;
125
139
  get configFile(): string | undefined;
126
140
  get metadata(): RunMetadata | undefined;
141
+ get groups(): string[] | undefined;
142
+ get googlePlayStore(): boolean;
127
143
  getMaestroOptions(): MaestroRunOptions | undefined;
128
144
  getCapabilities(detectedPlatform?: 'Android' | 'iOS'): MaestroCapabilities;
129
145
  }
@@ -1 +1 @@
1
- {"version":3,"file":"maestro_options.d.ts","sourceRoot":"","sources":["../../src/models/maestro_options.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"maestro_options.d.ts","sourceRoot":"","sources":["../../src/models/maestro_options.ts"],"names":[],"mappings":"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"}
@@ -1,12 +1,17 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.MAX_RETRY = exports.MAX_OTHER_APPS = void 0;
3
4
  const node_crypto_1 = require("node:crypto");
5
+ exports.MAX_OTHER_APPS = 4;
6
+ // Mirror devicecloud.dev: retries are capped at 2 (max 3 total runs per flow).
7
+ exports.MAX_RETRY = 2;
4
8
  class MaestroOptions {
5
9
  static isIpaFile(app) {
6
10
  return app?.toLowerCase().endsWith('.ipa') ?? false;
7
11
  }
8
12
  _app;
9
13
  _flows;
14
+ _otherApps;
10
15
  _device;
11
16
  _includeTags;
12
17
  _excludeTags;
@@ -33,13 +38,20 @@ class MaestroOptions {
33
38
  _artifactsOutputDir;
34
39
  _ignoreChecksumCheck;
35
40
  _shardSplit;
41
+ _retry;
36
42
  _debug;
37
43
  _configFile;
44
+ _groups;
45
+ _googlePlayStore;
38
46
  // Metadata
39
47
  _metadata;
40
48
  constructor(app, flows, device, options) {
41
49
  this._app = app;
42
50
  this._flows = flows ? (Array.isArray(flows) ? flows : [flows]) : [];
51
+ this._otherApps = options?.otherApps ?? [];
52
+ if (this._otherApps.length > exports.MAX_OTHER_APPS) {
53
+ throw new Error(`Too many other apps (${this._otherApps.length}). Maximum is ${exports.MAX_OTHER_APPS}.`);
54
+ }
43
55
  this._device = device;
44
56
  this._includeTags = options?.includeTags;
45
57
  this._excludeTags = options?.excludeTags;
@@ -71,8 +83,16 @@ class MaestroOptions {
71
83
  this._artifactsOutputDir = options?.artifactsOutputDir;
72
84
  this._ignoreChecksumCheck = options?.ignoreChecksumCheck ?? false;
73
85
  this._shardSplit = options?.shardSplit;
86
+ this._retry = options?.retry ?? 0;
87
+ if (!Number.isInteger(this._retry) ||
88
+ this._retry < 0 ||
89
+ this._retry > exports.MAX_RETRY) {
90
+ throw new Error(`Invalid --retry value (${options?.retry}). It must be an integer between 0 and ${exports.MAX_RETRY}.`);
91
+ }
74
92
  this._debug = options?.debug ?? false;
75
93
  this._configFile = options?.configFile;
94
+ this._groups = options?.groups;
95
+ this._googlePlayStore = options?.googlePlayStore ?? false;
76
96
  this._metadata = options?.metadata;
77
97
  }
78
98
  get app() {
@@ -81,6 +101,9 @@ class MaestroOptions {
81
101
  get flows() {
82
102
  return this._flows;
83
103
  }
104
+ get otherApps() {
105
+ return this._otherApps;
106
+ }
84
107
  get device() {
85
108
  return this._device;
86
109
  }
@@ -156,6 +179,9 @@ class MaestroOptions {
156
179
  get shardSplit() {
157
180
  return this._shardSplit;
158
181
  }
182
+ get retry() {
183
+ return this._retry;
184
+ }
159
185
  get debug() {
160
186
  return this._debug;
161
187
  }
@@ -165,6 +191,12 @@ class MaestroOptions {
165
191
  get metadata() {
166
192
  return this._metadata;
167
193
  }
194
+ get groups() {
195
+ return this._groups;
196
+ }
197
+ get googlePlayStore() {
198
+ return this._googlePlayStore;
199
+ }
168
200
  getMaestroOptions() {
169
201
  const opts = {};
170
202
  if (this._includeTags && this._includeTags.length > 0) {
@@ -217,6 +249,10 @@ class MaestroOptions {
217
249
  caps.tunnelIdentifier = this._tunnelIdentifier;
218
250
  if (this._realDevice)
219
251
  caps.realDevice = 'true';
252
+ if (this._groups && this._groups.length > 0)
253
+ caps.groups = this._groups;
254
+ if (this._googlePlayStore)
255
+ caps.googlePlayStore = true;
220
256
  return caps;
221
257
  }
222
258
  }
@@ -55,6 +55,7 @@ export default class XCUITestOptions {
55
55
  private _dryRun;
56
56
  private _report?;
57
57
  private _reportOutputDir?;
58
+ private _debug;
58
59
  private _metadata?;
59
60
  constructor(app: string, testApp: string, device?: string, options?: {
60
61
  version?: string;
@@ -76,6 +77,7 @@ export default class XCUITestOptions {
76
77
  dryRun?: boolean;
77
78
  report?: ReportFormat;
78
79
  reportOutputDir?: string;
80
+ debug?: boolean;
79
81
  metadata?: RunMetadata;
80
82
  });
81
83
  get app(): string;
@@ -100,6 +102,7 @@ export default class XCUITestOptions {
100
102
  get dryRun(): boolean;
101
103
  get report(): ReportFormat | undefined;
102
104
  get reportOutputDir(): string | undefined;
105
+ get debug(): boolean;
103
106
  get metadata(): RunMetadata | undefined;
104
107
  getCapabilities(): XCUITestCapabilities;
105
108
  getXCUITestOptions(): XCUITestRunOptions | undefined;
@@ -1 +1 @@
1
- {"version":3,"file":"xcuitest_options.d.ts","sourceRoot":"","sources":["../../src/models/xcuitest_options.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"xcuitest_options.d.ts","sourceRoot":"","sources":["../../src/models/xcuitest_options.ts"],"names":[],"mappings":"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"}
@@ -34,6 +34,8 @@ class XCUITestOptions {
34
34
  _dryRun;
35
35
  _report;
36
36
  _reportOutputDir;
37
+ // Debugging
38
+ _debug;
37
39
  // Metadata
38
40
  _metadata;
39
41
  constructor(app, testApp, device, options) {
@@ -67,6 +69,7 @@ class XCUITestOptions {
67
69
  this._dryRun = options?.dryRun ?? false;
68
70
  this._report = options?.report;
69
71
  this._reportOutputDir = options?.reportOutputDir;
72
+ this._debug = options?.debug ?? false;
70
73
  this._metadata = options?.metadata;
71
74
  }
72
75
  get app() {
@@ -135,6 +138,9 @@ class XCUITestOptions {
135
138
  get reportOutputDir() {
136
139
  return this._reportOutputDir;
137
140
  }
141
+ get debug() {
142
+ return this._debug;
143
+ }
138
144
  get metadata() {
139
145
  return this._metadata;
140
146
  }
@@ -35,6 +35,15 @@ export default abstract class BaseProvider<TOptions extends BaseProviderOptions>
35
35
  protected readonly MAX_POLL_INTERVAL_MS: number;
36
36
  protected readonly POLL_BACKOFF_MULTIPLIER: number;
37
37
  protected readonly MAX_POLL_DURATION_MS: number;
38
+ /**
39
+ * Whether a run/flow `success` field reported by the API indicates success.
40
+ * The API is inconsistent about the representation: some endpoints return a
41
+ * boolean (`true`/`false`) and others a number (`1`/`0`). A strict
42
+ * `success === 1` check silently treats a passing run reported as `true` as a
43
+ * failure, which is why a test that passes on TestingBot was shown as failed
44
+ * by the CLI. Accept both representations.
45
+ */
46
+ protected isRunSuccessful(success: number | boolean | undefined): boolean;
38
47
  /**
39
48
  * Returns the next polling interval based on whether the status payload
40
49
  * changed since the last poll. Resets to the minimum on change; otherwise
@@ -1 +1 @@
1
- {"version":3,"file":"base_provider.d.ts","sourceRoot":"","sources":["../../src/providers/base_provider.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"base_provider.d.ts","sourceRoot":"","sources":["../../src/providers/base_provider.ts"],"names":[],"mappings":"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"}
@@ -24,6 +24,17 @@ class BaseProvider {
24
24
  MAX_POLL_INTERVAL_MS = constants_1.POLLING.MAX_INTERVAL_MS;
25
25
  POLL_BACKOFF_MULTIPLIER = constants_1.POLLING.BACKOFF_MULTIPLIER;
26
26
  MAX_POLL_DURATION_MS = constants_1.POLLING.MAX_DURATION_MS;
27
+ /**
28
+ * Whether a run/flow `success` field reported by the API indicates success.
29
+ * The API is inconsistent about the representation: some endpoints return a
30
+ * boolean (`true`/`false`) and others a number (`1`/`0`). A strict
31
+ * `success === 1` check silently treats a passing run reported as `true` as a
32
+ * failure, which is why a test that passes on TestingBot was shown as failed
33
+ * by the CLI. Accept both representations.
34
+ */
35
+ isRunSuccessful(success) {
36
+ return success === 1 || success === true;
37
+ }
27
38
  /**
28
39
  * Returns the next polling interval based on whether the status payload
29
40
  * changed since the last poll. Resets to the minimum on change; otherwise
@@ -15,7 +15,7 @@ export interface EspressoRunInfo {
15
15
  version?: string;
16
16
  };
17
17
  environment?: EspressoRunEnvironment;
18
- success: number;
18
+ success: number | boolean;
19
19
  report?: string;
20
20
  }
21
21
  export interface EspressoStatusResponse {
@@ -1 +1 @@
1
- {"version":3,"file":"espresso.d.ts","sourceRoot":"","sources":["../../src/providers/espresso.ts"],"names":[],"mappings":"AAAA,OAAO,eAAe,MAAM,4BAA4B,CAAC;AAEzD,OAAO,WAAW,MAAM,uBAAuB,CAAC;AAQhD,OAAO,YAAY,MAAM,iBAAiB,CAAC;AAI3C,MAAM,WAAW,sBAAsB;IACrC,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB;AAED,MAAM,WAAW,eAAe;IAC9B,EAAE,EAAE,MAAM,CAAC;IACX,MAAM,EAAE,SAAS,GAAG,OAAO,GAAG,MAAM,GAAG,QAAQ,CAAC;IAChD,YAAY,EAAE;QACZ,UAAU,EAAE,MAAM,CAAC;QACnB,YAAY,EAAE,MAAM,CAAC;QACrB,OAAO,CAAC,EAAE,MAAM,CAAC;KAClB,CAAC;IACF,WAAW,CAAC,EAAE,sBAAsB,CAAC;IACrC,OAAO,EAAE,MAAM,CAAC;IAChB,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB;AAED,MAAM,WAAW,sBAAsB;IACrC,IAAI,EAAE,eAAe,EAAE,CAAC;IACxB,OAAO,EAAE,OAAO,CAAC;IACjB,SAAS,EAAE,OAAO,CAAC;CACpB;AAED,MAAM,WAAW,cAAc;IAC7B,OAAO,EAAE,OAAO,CAAC;IACjB,IAAI,EAAE,eAAe,EAAE,CAAC;CACzB;AAED,MAAM,WAAW,qBAAqB;IACpC,EAAE,EAAE,MAAM,CAAC;IACX,OAAO,EAAE,MAAM,CAAC;CACjB;AAED,MAAM,CAAC,OAAO,OAAO,QAAS,SAAQ,YAAY,CAAC,eAAe,CAAC;IACjE,SAAS,CAAC,QAAQ,CAAC,GAAG,yDACkC;IAExD,OAAO,CAAC,MAAM,CAAuB;IACrC,OAAO,CAAC,YAAY,CAAuB;IAC3C,OAAO,CAAC,SAAS,CAAuB;IACxC,OAAO,CAAC,oBAAoB,CAAS;gBAElB,WAAW,EAAE,WAAW,EAAE,OAAO,EAAE,eAAe;YAIvD,QAAQ;IAuCT,GAAG,IAAI,OAAO,CAAC,cAAc,CAAC;YA6G7B,SAAS;YAcT,aAAa;YAab,QAAQ;YA0DR,SAAS;YA4BT,iBAAiB;IA+F/B,OAAO,CAAC,gBAAgB;IA0CxB;;;OAGG;IACH,OAAO,CAAC,iBAAiB;IAIzB,OAAO,CAAC,aAAa;YAkBP,YAAY;IAwD1B,OAAO,CAAC,qBAAqB;IA6C7B,OAAO,CAAC,0BAA0B;IAOlC,OAAO,CAAC,kBAAkB;IAc1B,OAAO,CAAC,mBAAmB;CAa5B"}
1
+ {"version":3,"file":"espresso.d.ts","sourceRoot":"","sources":["../../src/providers/espresso.ts"],"names":[],"mappings":"AAAA,OAAO,eAAe,MAAM,4BAA4B,CAAC;AAEzD,OAAO,WAAW,MAAM,uBAAuB,CAAC;AAQhD,OAAO,YAAY,MAAM,iBAAiB,CAAC;AAI3C,MAAM,WAAW,sBAAsB;IACrC,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB;AAED,MAAM,WAAW,eAAe;IAC9B,EAAE,EAAE,MAAM,CAAC;IACX,MAAM,EAAE,SAAS,GAAG,OAAO,GAAG,MAAM,GAAG,QAAQ,CAAC;IAChD,YAAY,EAAE;QACZ,UAAU,EAAE,MAAM,CAAC;QACnB,YAAY,EAAE,MAAM,CAAC;QACrB,OAAO,CAAC,EAAE,MAAM,CAAC;KAClB,CAAC;IACF,WAAW,CAAC,EAAE,sBAAsB,CAAC;IAGrC,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC;IAC1B,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB;AAED,MAAM,WAAW,sBAAsB;IACrC,IAAI,EAAE,eAAe,EAAE,CAAC;IACxB,OAAO,EAAE,OAAO,CAAC;IACjB,SAAS,EAAE,OAAO,CAAC;CACpB;AAED,MAAM,WAAW,cAAc;IAC7B,OAAO,EAAE,OAAO,CAAC;IACjB,IAAI,EAAE,eAAe,EAAE,CAAC;CACzB;AAED,MAAM,WAAW,qBAAqB;IACpC,EAAE,EAAE,MAAM,CAAC;IACX,OAAO,EAAE,MAAM,CAAC;CACjB;AAED,MAAM,CAAC,OAAO,OAAO,QAAS,SAAQ,YAAY,CAAC,eAAe,CAAC;IACjE,SAAS,CAAC,QAAQ,CAAC,GAAG,yDACkC;IAExD,OAAO,CAAC,MAAM,CAAuB;IACrC,OAAO,CAAC,YAAY,CAAuB;IAC3C,OAAO,CAAC,SAAS,CAAuB;IACxC,OAAO,CAAC,oBAAoB,CAAS;gBAElB,WAAW,EAAE,WAAW,EAAE,OAAO,EAAE,eAAe;YAIvD,QAAQ;IAuCT,GAAG,IAAI,OAAO,CAAC,cAAc,CAAC;YA6G7B,SAAS;YAcT,aAAa;YAab,QAAQ;YA0DR,SAAS;YA4BT,iBAAiB;IAmG/B,OAAO,CAAC,gBAAgB;IA0CxB;;;OAGG;IACH,OAAO,CAAC,iBAAiB;IAIzB,OAAO,CAAC,aAAa;YAkBP,YAAY;IAwD1B,OAAO,CAAC,qBAAqB;IA6C7B,OAAO,CAAC,0BAA0B;IAOlC,OAAO,CAAC,kBAAkB;IAc1B,OAAO,CAAC,mBAAmB;CAa5B"}
@@ -259,7 +259,7 @@ class Espresso extends base_provider_1.default {
259
259
  if (!this.options.quiet) {
260
260
  this.spinner.stop();
261
261
  for (const run of status.runs) {
262
- const passed = run.success === 1;
262
+ const passed = this.isRunSuccessful(run.success);
263
263
  const symbol = passed ? picocolors_1.default.green('✔') : picocolors_1.default.red('✘');
264
264
  const statusText = passed
265
265
  ? picocolors_1.default.green('Test completed successfully')
@@ -267,7 +267,7 @@ class Espresso extends base_provider_1.default {
267
267
  console.log(` ${symbol} Run ${run.id} ${picocolors_1.default.dim(`(${this.getRunDisplayName(run)})`)}: ${statusText}`);
268
268
  }
269
269
  }
270
- const allSucceeded = status.runs.every((run) => run.success === 1);
270
+ const allSucceeded = status.runs.every((run) => this.isRunSuccessful(run.success));
271
271
  if (allSucceeded) {
272
272
  (0, terminal_title_1.setTitle)('espresso · ✔ passed');
273
273
  if (!this.options.quiet) {
@@ -275,7 +275,7 @@ class Espresso extends base_provider_1.default {
275
275
  }
276
276
  }
277
277
  else {
278
- const failedRuns = status.runs.filter((run) => run.success !== 1);
278
+ const failedRuns = status.runs.filter((run) => !this.isRunSuccessful(run.success));
279
279
  (0, terminal_title_1.setTitle)(`espresso · ✘ ${failedRuns.length} failed`);
280
280
  logger_1.default.error(`${failedRuns.length} test run(s) failed:`);
281
281
  for (const run of failedRuns) {