@testingbot/cli 1.0.5 → 1.0.7
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/dist/cli.d.ts.map +1 -1
- package/dist/cli.js +10 -4
- package/dist/models/espresso_options.d.ts +7 -4
- package/dist/models/espresso_options.d.ts.map +1 -1
- package/dist/models/espresso_options.js +11 -7
- package/dist/models/maestro_options.d.ts +4 -1
- package/dist/models/maestro_options.d.ts.map +1 -1
- package/dist/models/maestro_options.js +6 -1
- package/dist/models/xcuitest_options.d.ts +7 -4
- package/dist/models/xcuitest_options.d.ts.map +1 -1
- package/dist/models/xcuitest_options.js +11 -7
- package/dist/providers/base_provider.d.ts +14 -0
- package/dist/providers/base_provider.d.ts.map +1 -1
- package/dist/providers/base_provider.js +18 -0
- package/dist/providers/espresso.d.ts.map +1 -1
- package/dist/providers/espresso.js +27 -0
- package/dist/providers/maestro.d.ts +25 -0
- package/dist/providers/maestro.d.ts.map +1 -1
- package/dist/providers/maestro.js +248 -19
- package/dist/providers/xcuitest.d.ts.map +1 -1
- package/dist/providers/xcuitest.js +27 -0
- package/package.json +1 -1
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;
|
|
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;AA4lB9B,eAAe,OAAO,CAAC"}
|
package/dist/cli.js
CHANGED
|
@@ -84,12 +84,13 @@ const espressoCommand = program
|
|
|
84
84
|
// Localization
|
|
85
85
|
.option('--language <lang>', 'App language (ISO 639-1 code, e.g., "en", "fr", "de").')
|
|
86
86
|
// Geolocation
|
|
87
|
-
.option('--geo-
|
|
87
|
+
.option('--geo-country-code <code>', 'Geographic IP location (ISO country code, e.g., "US", "DE").')
|
|
88
88
|
// Network throttling
|
|
89
89
|
.option('--throttle-network <speed>', 'Network throttling: 4G, 3G, Edge, or airplane.', (val) => val)
|
|
90
90
|
// Execution mode
|
|
91
91
|
.option('-q, --quiet', 'Quieter console output without progress updates.')
|
|
92
92
|
.option('--async', 'Start tests and exit immediately without waiting for results.')
|
|
93
|
+
.option('--dry-run', 'Validate and prepare everything but skip HTTP calls. Shows what would be sent.')
|
|
93
94
|
// Report options
|
|
94
95
|
.option('--report <format>', 'Download test report after completion: html or junit.', (val) => val.toLowerCase())
|
|
95
96
|
.option('--report-output-dir <path>', 'Directory to save test reports (required when --report is used).')
|
|
@@ -136,10 +137,11 @@ const espressoCommand = program
|
|
|
136
137
|
language: args.language,
|
|
137
138
|
locale: args.locale,
|
|
138
139
|
timeZone: args.timezone,
|
|
139
|
-
|
|
140
|
+
geoCountryCode: args.geoCountryCode,
|
|
140
141
|
throttleNetwork: args.throttleNetwork,
|
|
141
142
|
quiet: args.quiet,
|
|
142
143
|
async: args.async,
|
|
144
|
+
dryRun: args.dryRun,
|
|
143
145
|
report: args.report,
|
|
144
146
|
reportOutputDir: args.reportOutputDir,
|
|
145
147
|
metadata,
|
|
@@ -200,6 +202,7 @@ const maestroCommand = program
|
|
|
200
202
|
// Execution mode
|
|
201
203
|
.option('-q, --quiet', 'Quieter console output without progress updates.')
|
|
202
204
|
.option('--async', 'Start tests and exit immediately without waiting for results.')
|
|
205
|
+
.option('--dry-run', 'Validate and prepare everything but skip HTTP calls. Shows what would be sent.')
|
|
203
206
|
// Report options
|
|
204
207
|
.option('--report <format>', 'Download test report after completion: html or junit.', (val) => val.toLowerCase())
|
|
205
208
|
.option('--report-output-dir <path>', 'Directory to save test reports (required when --report is used).')
|
|
@@ -270,6 +273,7 @@ const maestroCommand = program
|
|
|
270
273
|
maestroVersion: args.maestroVersion,
|
|
271
274
|
quiet: args.quiet,
|
|
272
275
|
async: args.async,
|
|
276
|
+
dryRun: args.dryRun,
|
|
273
277
|
report: args.report,
|
|
274
278
|
reportOutputDir: args.reportOutputDir,
|
|
275
279
|
realDevice: args.realDevice,
|
|
@@ -331,12 +335,13 @@ const xcuitestCommand = program
|
|
|
331
335
|
// Localization
|
|
332
336
|
.option('--language <lang>', 'App language (ISO 639-1 code, e.g., "en", "fr", "de").')
|
|
333
337
|
// Geolocation
|
|
334
|
-
.option('--geo-
|
|
338
|
+
.option('--geo-country-code <code>', 'Geographic IP location (ISO country code, e.g., "US", "DE").')
|
|
335
339
|
// Network throttling
|
|
336
340
|
.option('--throttle-network <speed>', 'Network throttling: 4G, 3G, Edge, or airplane.', (val) => val)
|
|
337
341
|
// Execution mode
|
|
338
342
|
.option('-q, --quiet', 'Quieter console output without progress updates.')
|
|
339
343
|
.option('--async', 'Start tests and exit immediately without waiting for results.')
|
|
344
|
+
.option('--dry-run', 'Validate and prepare everything but skip HTTP calls. Shows what would be sent.')
|
|
340
345
|
// Report options
|
|
341
346
|
.option('--report <format>', 'Download test report after completion: html or junit.', (val) => val.toLowerCase())
|
|
342
347
|
.option('--report-output-dir <path>', 'Directory to save test reports (required when --report is used).')
|
|
@@ -376,10 +381,11 @@ const xcuitestCommand = program
|
|
|
376
381
|
language: args.language,
|
|
377
382
|
locale: args.locale,
|
|
378
383
|
timeZone: args.timezone,
|
|
379
|
-
|
|
384
|
+
geoCountryCode: args.geoCountryCode,
|
|
380
385
|
throttleNetwork: args.throttleNetwork,
|
|
381
386
|
quiet: args.quiet,
|
|
382
387
|
async: args.async,
|
|
388
|
+
dryRun: args.dryRun,
|
|
383
389
|
report: args.report,
|
|
384
390
|
reportOutputDir: args.reportOutputDir,
|
|
385
391
|
metadata,
|
|
@@ -22,6 +22,7 @@ export interface EspressoCapabilities {
|
|
|
22
22
|
phoneOnly?: boolean;
|
|
23
23
|
name?: string;
|
|
24
24
|
build?: string;
|
|
25
|
+
'testingbot.geoCountryCode'?: string;
|
|
25
26
|
}
|
|
26
27
|
export interface EspressoRunOptions {
|
|
27
28
|
testRunner?: string;
|
|
@@ -35,7 +36,6 @@ export interface EspressoRunOptions {
|
|
|
35
36
|
language?: string;
|
|
36
37
|
locale?: string;
|
|
37
38
|
timeZone?: string;
|
|
38
|
-
geoLocation?: string;
|
|
39
39
|
throttle_network?: ThrottleNetwork | CustomNetworkProfile;
|
|
40
40
|
}
|
|
41
41
|
export default class EspressoOptions {
|
|
@@ -59,10 +59,11 @@ export default class EspressoOptions {
|
|
|
59
59
|
private _language?;
|
|
60
60
|
private _locale?;
|
|
61
61
|
private _timeZone?;
|
|
62
|
-
private
|
|
62
|
+
private _geoCountryCode?;
|
|
63
63
|
private _throttleNetwork?;
|
|
64
64
|
private _quiet;
|
|
65
65
|
private _async;
|
|
66
|
+
private _dryRun;
|
|
66
67
|
private _report?;
|
|
67
68
|
private _reportOutputDir?;
|
|
68
69
|
private _metadata?;
|
|
@@ -84,10 +85,11 @@ export default class EspressoOptions {
|
|
|
84
85
|
language?: string;
|
|
85
86
|
locale?: string;
|
|
86
87
|
timeZone?: string;
|
|
87
|
-
|
|
88
|
+
geoCountryCode?: string;
|
|
88
89
|
throttleNetwork?: ThrottleNetwork | CustomNetworkProfile;
|
|
89
90
|
quiet?: boolean;
|
|
90
91
|
async?: boolean;
|
|
92
|
+
dryRun?: boolean;
|
|
91
93
|
report?: ReportFormat;
|
|
92
94
|
reportOutputDir?: string;
|
|
93
95
|
metadata?: RunMetadata;
|
|
@@ -112,10 +114,11 @@ export default class EspressoOptions {
|
|
|
112
114
|
get language(): string | undefined;
|
|
113
115
|
get locale(): string | undefined;
|
|
114
116
|
get timeZone(): string | undefined;
|
|
115
|
-
get
|
|
117
|
+
get geoCountryCode(): string | undefined;
|
|
116
118
|
get throttleNetwork(): ThrottleNetwork | CustomNetworkProfile | undefined;
|
|
117
119
|
get quiet(): boolean;
|
|
118
120
|
get async(): boolean;
|
|
121
|
+
get dryRun(): boolean;
|
|
119
122
|
get report(): ReportFormat | undefined;
|
|
120
123
|
get reportOutputDir(): string | undefined;
|
|
121
124
|
get metadata(): RunMetadata | undefined;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"espresso_options.d.ts","sourceRoot":"","sources":["../../src/models/espresso_options.ts"],"names":[],"mappings":"AAEA,MAAM,MAAM,QAAQ,GAAG,OAAO,GAAG,QAAQ,GAAG,OAAO,CAAC;AACpD,MAAM,MAAM,YAAY,GAAG,MAAM,GAAG,OAAO,CAAC;AAC5C,MAAM,MAAM,eAAe,GAAG,IAAI,GAAG,IAAI,GAAG,MAAM,GAAG,UAAU,CAAC;AAEhE,MAAM,WAAW,WAAW;IAC1B,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAED,MAAM,WAAW,oBAAoB;IACnC,WAAW,EAAE,MAAM,CAAC;IACpB,aAAa,EAAE,MAAM,CAAC;IACtB,OAAO,EAAE,MAAM,CAAC;IAChB,IAAI,EAAE,MAAM,CAAC;CACd;AAED,MAAM,WAAW,oBAAoB;IACnC,YAAY,EAAE,SAAS,CAAC;IACxB,UAAU,EAAE,MAAM,CAAC;IACnB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,UAAU,CAAC,EAAE,OAAO,CAAC;IACrB,SAAS,CAAC,EAAE,OAAO,CAAC;IACpB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,KAAK,CAAC,EAAE,MAAM,CAAC;
|
|
1
|
+
{"version":3,"file":"espresso_options.d.ts","sourceRoot":"","sources":["../../src/models/espresso_options.ts"],"names":[],"mappings":"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"}
|
|
@@ -28,12 +28,13 @@ class EspressoOptions {
|
|
|
28
28
|
_locale;
|
|
29
29
|
_timeZone;
|
|
30
30
|
// Geolocation
|
|
31
|
-
|
|
31
|
+
_geoCountryCode;
|
|
32
32
|
// Network throttling
|
|
33
33
|
_throttleNetwork;
|
|
34
34
|
// Execution mode
|
|
35
35
|
_quiet;
|
|
36
36
|
_async;
|
|
37
|
+
_dryRun;
|
|
37
38
|
_report;
|
|
38
39
|
_reportOutputDir;
|
|
39
40
|
// Metadata
|
|
@@ -63,10 +64,11 @@ class EspressoOptions {
|
|
|
63
64
|
this._language = options?.language;
|
|
64
65
|
this._locale = options?.locale;
|
|
65
66
|
this._timeZone = options?.timeZone;
|
|
66
|
-
this.
|
|
67
|
+
this._geoCountryCode = options?.geoCountryCode;
|
|
67
68
|
this._throttleNetwork = options?.throttleNetwork;
|
|
68
69
|
this._quiet = options?.quiet ?? false;
|
|
69
70
|
this._async = options?.async ?? false;
|
|
71
|
+
this._dryRun = options?.dryRun ?? false;
|
|
70
72
|
this._report = options?.report;
|
|
71
73
|
this._reportOutputDir = options?.reportOutputDir;
|
|
72
74
|
this._metadata = options?.metadata;
|
|
@@ -131,8 +133,8 @@ class EspressoOptions {
|
|
|
131
133
|
get timeZone() {
|
|
132
134
|
return this._timeZone;
|
|
133
135
|
}
|
|
134
|
-
get
|
|
135
|
-
return this.
|
|
136
|
+
get geoCountryCode() {
|
|
137
|
+
return this._geoCountryCode;
|
|
136
138
|
}
|
|
137
139
|
get throttleNetwork() {
|
|
138
140
|
return this._throttleNetwork;
|
|
@@ -143,6 +145,9 @@ class EspressoOptions {
|
|
|
143
145
|
get async() {
|
|
144
146
|
return this._async;
|
|
145
147
|
}
|
|
148
|
+
get dryRun() {
|
|
149
|
+
return this._dryRun;
|
|
150
|
+
}
|
|
146
151
|
get report() {
|
|
147
152
|
return this._report;
|
|
148
153
|
}
|
|
@@ -169,6 +174,8 @@ class EspressoOptions {
|
|
|
169
174
|
caps.name = this._name;
|
|
170
175
|
if (this._build)
|
|
171
176
|
caps.build = this._build;
|
|
177
|
+
if (this._geoCountryCode)
|
|
178
|
+
caps['testingbot.geoCountryCode'] = this._geoCountryCode;
|
|
172
179
|
return caps;
|
|
173
180
|
}
|
|
174
181
|
getEspressoOptions() {
|
|
@@ -196,9 +203,6 @@ class EspressoOptions {
|
|
|
196
203
|
opts.locale = this._locale;
|
|
197
204
|
if (this._timeZone)
|
|
198
205
|
opts.timeZone = this._timeZone;
|
|
199
|
-
// Geolocation
|
|
200
|
-
if (this._geoLocation)
|
|
201
|
-
opts.geoLocation = this._geoLocation;
|
|
202
206
|
// Network throttling
|
|
203
207
|
if (this._throttleNetwork)
|
|
204
208
|
opts.throttle_network = this._throttleNetwork;
|
|
@@ -23,7 +23,7 @@ export interface MaestroCapabilities {
|
|
|
23
23
|
locale?: string;
|
|
24
24
|
timeZone?: string;
|
|
25
25
|
throttleNetwork?: ThrottleNetwork;
|
|
26
|
-
geoCountryCode?: string;
|
|
26
|
+
'testingbot.geoCountryCode'?: string;
|
|
27
27
|
realDevice?: string;
|
|
28
28
|
}
|
|
29
29
|
export interface MaestroRunOptions {
|
|
@@ -51,6 +51,7 @@ export default class MaestroOptions {
|
|
|
51
51
|
private _maestroVersion?;
|
|
52
52
|
private _quiet;
|
|
53
53
|
private _async;
|
|
54
|
+
private _dryRun;
|
|
54
55
|
private _report?;
|
|
55
56
|
private _reportOutputDir?;
|
|
56
57
|
private _realDevice;
|
|
@@ -75,6 +76,7 @@ export default class MaestroOptions {
|
|
|
75
76
|
maestroVersion?: string;
|
|
76
77
|
quiet?: boolean;
|
|
77
78
|
async?: boolean;
|
|
79
|
+
dryRun?: boolean;
|
|
78
80
|
report?: ReportFormat;
|
|
79
81
|
reportOutputDir?: string;
|
|
80
82
|
realDevice?: boolean;
|
|
@@ -102,6 +104,7 @@ export default class MaestroOptions {
|
|
|
102
104
|
get maestroVersion(): string | undefined;
|
|
103
105
|
get quiet(): boolean;
|
|
104
106
|
get async(): boolean;
|
|
107
|
+
get dryRun(): boolean;
|
|
105
108
|
get report(): ReportFormat | undefined;
|
|
106
109
|
get reportOutputDir(): string | undefined;
|
|
107
110
|
get realDevice(): boolean;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"maestro_options.d.ts","sourceRoot":"","sources":["../../src/models/maestro_options.ts"],"names":[],"mappings":"AAAA,MAAM,WAAW,aAAa;IAC5B,KAAK,CAAC,EAAE,MAAM,EAAE,CAAC;IACjB,WAAW,CAAC,EAAE,MAAM,EAAE,CAAC;IACvB,WAAW,CAAC,EAAE,MAAM,EAAE,CAAC;IACvB,cAAc,CAAC,EAAE,UAAU,GAAG,MAAM,CAAC;CACtC;AAED,MAAM,MAAM,WAAW,GAAG,UAAU,GAAG,WAAW,CAAC;AACnD,MAAM,MAAM,eAAe,GAAG,IAAI,GAAG,IAAI,GAAG,MAAM,GAAG,UAAU,GAAG,SAAS,CAAC;AAC5E,MAAM,MAAM,YAAY,GAAG,MAAM,GAAG,OAAO,CAAC;AAC5C,MAAM,MAAM,oBAAoB,GAAG,KAAK,GAAG,QAAQ,CAAC;AAEpD,MAAM,WAAW,WAAW;IAC1B,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAED,MAAM,WAAW,mBAAmB;IAClC,YAAY,CAAC,EAAE,SAAS,GAAG,KAAK,CAAC;IACjC,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,UAAU,EAAE,MAAM,CAAC;IACnB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,WAAW,CAAC,EAAE,WAAW,CAAC;IAC1B,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,eAAe,CAAC,EAAE,eAAe,CAAC;IAClC,
|
|
1
|
+
{"version":3,"file":"maestro_options.d.ts","sourceRoot":"","sources":["../../src/models/maestro_options.ts"],"names":[],"mappings":"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"}
|
|
@@ -21,6 +21,7 @@ class MaestroOptions {
|
|
|
21
21
|
_maestroVersion;
|
|
22
22
|
_quiet;
|
|
23
23
|
_async;
|
|
24
|
+
_dryRun;
|
|
24
25
|
_report;
|
|
25
26
|
_reportOutputDir;
|
|
26
27
|
_realDevice;
|
|
@@ -49,6 +50,7 @@ class MaestroOptions {
|
|
|
49
50
|
this._maestroVersion = options?.maestroVersion;
|
|
50
51
|
this._quiet = options?.quiet ?? false;
|
|
51
52
|
this._async = options?.async ?? false;
|
|
53
|
+
this._dryRun = options?.dryRun ?? false;
|
|
52
54
|
this._report = options?.report;
|
|
53
55
|
this._reportOutputDir = options?.reportOutputDir;
|
|
54
56
|
// IPA files can only be tested on real iOS devices, so automatically enable realDevice
|
|
@@ -112,6 +114,9 @@ class MaestroOptions {
|
|
|
112
114
|
get async() {
|
|
113
115
|
return this._async;
|
|
114
116
|
}
|
|
117
|
+
get dryRun() {
|
|
118
|
+
return this._dryRun;
|
|
119
|
+
}
|
|
115
120
|
get report() {
|
|
116
121
|
return this._report;
|
|
117
122
|
}
|
|
@@ -186,7 +191,7 @@ class MaestroOptions {
|
|
|
186
191
|
if (this._throttleNetwork)
|
|
187
192
|
caps.throttleNetwork = this._throttleNetwork;
|
|
188
193
|
if (this._geoCountryCode)
|
|
189
|
-
caps.geoCountryCode = this._geoCountryCode;
|
|
194
|
+
caps['testingbot.geoCountryCode'] = this._geoCountryCode;
|
|
190
195
|
if (this._realDevice)
|
|
191
196
|
caps.realDevice = 'true';
|
|
192
197
|
return caps;
|
|
@@ -22,13 +22,13 @@ export interface XCUITestCapabilities {
|
|
|
22
22
|
phoneOnly?: boolean;
|
|
23
23
|
name?: string;
|
|
24
24
|
build?: string;
|
|
25
|
+
'testingbot.geoCountryCode'?: string;
|
|
25
26
|
}
|
|
26
27
|
export interface XCUITestRunOptions {
|
|
27
28
|
orientation?: Orientation;
|
|
28
29
|
language?: string;
|
|
29
30
|
locale?: string;
|
|
30
31
|
timeZone?: string;
|
|
31
|
-
geoLocation?: string;
|
|
32
32
|
throttle_network?: ThrottleNetwork | CustomNetworkProfile;
|
|
33
33
|
}
|
|
34
34
|
export default class XCUITestOptions {
|
|
@@ -45,10 +45,11 @@ export default class XCUITestOptions {
|
|
|
45
45
|
private _language?;
|
|
46
46
|
private _locale?;
|
|
47
47
|
private _timeZone?;
|
|
48
|
-
private
|
|
48
|
+
private _geoCountryCode?;
|
|
49
49
|
private _throttleNetwork?;
|
|
50
50
|
private _quiet;
|
|
51
51
|
private _async;
|
|
52
|
+
private _dryRun;
|
|
52
53
|
private _report?;
|
|
53
54
|
private _reportOutputDir?;
|
|
54
55
|
private _metadata?;
|
|
@@ -63,10 +64,11 @@ export default class XCUITestOptions {
|
|
|
63
64
|
language?: string;
|
|
64
65
|
locale?: string;
|
|
65
66
|
timeZone?: string;
|
|
66
|
-
|
|
67
|
+
geoCountryCode?: string;
|
|
67
68
|
throttleNetwork?: ThrottleNetwork | CustomNetworkProfile;
|
|
68
69
|
quiet?: boolean;
|
|
69
70
|
async?: boolean;
|
|
71
|
+
dryRun?: boolean;
|
|
70
72
|
report?: ReportFormat;
|
|
71
73
|
reportOutputDir?: string;
|
|
72
74
|
metadata?: RunMetadata;
|
|
@@ -84,10 +86,11 @@ export default class XCUITestOptions {
|
|
|
84
86
|
get language(): string | undefined;
|
|
85
87
|
get locale(): string | undefined;
|
|
86
88
|
get timeZone(): string | undefined;
|
|
87
|
-
get
|
|
89
|
+
get geoCountryCode(): string | undefined;
|
|
88
90
|
get throttleNetwork(): ThrottleNetwork | CustomNetworkProfile | undefined;
|
|
89
91
|
get quiet(): boolean;
|
|
90
92
|
get async(): boolean;
|
|
93
|
+
get dryRun(): boolean;
|
|
91
94
|
get report(): ReportFormat | undefined;
|
|
92
95
|
get reportOutputDir(): string | undefined;
|
|
93
96
|
get metadata(): RunMetadata | undefined;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"xcuitest_options.d.ts","sourceRoot":"","sources":["../../src/models/xcuitest_options.ts"],"names":[],"mappings":"AAEA,MAAM,MAAM,WAAW,GAAG,UAAU,GAAG,WAAW,CAAC;AACnD,MAAM,MAAM,YAAY,GAAG,MAAM,GAAG,OAAO,CAAC;AAC5C,MAAM,MAAM,eAAe,GAAG,IAAI,GAAG,IAAI,GAAG,MAAM,GAAG,UAAU,CAAC;AAEhE,MAAM,WAAW,WAAW;IAC1B,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAED,MAAM,WAAW,oBAAoB;IACnC,WAAW,EAAE,MAAM,CAAC;IACpB,aAAa,EAAE,MAAM,CAAC;IACtB,OAAO,EAAE,MAAM,CAAC;IAChB,IAAI,EAAE,MAAM,CAAC;CACd;AAED,MAAM,WAAW,oBAAoB;IACnC,YAAY,EAAE,KAAK,CAAC;IACpB,UAAU,EAAE,MAAM,CAAC;IACnB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,UAAU,CAAC,EAAE,OAAO,CAAC;IACrB,SAAS,CAAC,EAAE,OAAO,CAAC;IACpB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,KAAK,CAAC,EAAE,MAAM,CAAC;
|
|
1
|
+
{"version":3,"file":"xcuitest_options.d.ts","sourceRoot":"","sources":["../../src/models/xcuitest_options.ts"],"names":[],"mappings":"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"}
|
|
@@ -21,12 +21,13 @@ class XCUITestOptions {
|
|
|
21
21
|
_locale;
|
|
22
22
|
_timeZone;
|
|
23
23
|
// Geolocation
|
|
24
|
-
|
|
24
|
+
_geoCountryCode;
|
|
25
25
|
// Network throttling
|
|
26
26
|
_throttleNetwork;
|
|
27
27
|
// Execution mode
|
|
28
28
|
_quiet;
|
|
29
29
|
_async;
|
|
30
|
+
_dryRun;
|
|
30
31
|
_report;
|
|
31
32
|
_reportOutputDir;
|
|
32
33
|
// Metadata
|
|
@@ -49,10 +50,11 @@ class XCUITestOptions {
|
|
|
49
50
|
this._language = options?.language;
|
|
50
51
|
this._locale = options?.locale;
|
|
51
52
|
this._timeZone = options?.timeZone;
|
|
52
|
-
this.
|
|
53
|
+
this._geoCountryCode = options?.geoCountryCode;
|
|
53
54
|
this._throttleNetwork = options?.throttleNetwork;
|
|
54
55
|
this._quiet = options?.quiet ?? false;
|
|
55
56
|
this._async = options?.async ?? false;
|
|
57
|
+
this._dryRun = options?.dryRun ?? false;
|
|
56
58
|
this._report = options?.report;
|
|
57
59
|
this._reportOutputDir = options?.reportOutputDir;
|
|
58
60
|
this._metadata = options?.metadata;
|
|
@@ -96,8 +98,8 @@ class XCUITestOptions {
|
|
|
96
98
|
get timeZone() {
|
|
97
99
|
return this._timeZone;
|
|
98
100
|
}
|
|
99
|
-
get
|
|
100
|
-
return this.
|
|
101
|
+
get geoCountryCode() {
|
|
102
|
+
return this._geoCountryCode;
|
|
101
103
|
}
|
|
102
104
|
get throttleNetwork() {
|
|
103
105
|
return this._throttleNetwork;
|
|
@@ -108,6 +110,9 @@ class XCUITestOptions {
|
|
|
108
110
|
get async() {
|
|
109
111
|
return this._async;
|
|
110
112
|
}
|
|
113
|
+
get dryRun() {
|
|
114
|
+
return this._dryRun;
|
|
115
|
+
}
|
|
111
116
|
get report() {
|
|
112
117
|
return this._report;
|
|
113
118
|
}
|
|
@@ -134,6 +139,8 @@ class XCUITestOptions {
|
|
|
134
139
|
caps.name = this._name;
|
|
135
140
|
if (this._build)
|
|
136
141
|
caps.build = this._build;
|
|
142
|
+
if (this._geoCountryCode)
|
|
143
|
+
caps['testingbot.geoCountryCode'] = this._geoCountryCode;
|
|
137
144
|
return caps;
|
|
138
145
|
}
|
|
139
146
|
getXCUITestOptions() {
|
|
@@ -148,9 +155,6 @@ class XCUITestOptions {
|
|
|
148
155
|
opts.locale = this._locale;
|
|
149
156
|
if (this._timeZone)
|
|
150
157
|
opts.timeZone = this._timeZone;
|
|
151
|
-
// Geolocation
|
|
152
|
-
if (this._geoLocation)
|
|
153
|
-
opts.geoLocation = this._geoLocation;
|
|
154
158
|
// Network throttling
|
|
155
159
|
if (this._throttleNetwork)
|
|
156
160
|
opts.throttle_network = this._throttleNetwork;
|
|
@@ -21,6 +21,7 @@ export interface BaseRunInfo {
|
|
|
21
21
|
export interface BaseProviderOptions {
|
|
22
22
|
quiet?: boolean;
|
|
23
23
|
reportOutputDir?: string;
|
|
24
|
+
dryRun?: boolean;
|
|
24
25
|
}
|
|
25
26
|
/**
|
|
26
27
|
* Abstract base class for test providers (Espresso, XCUITest, Maestro)
|
|
@@ -115,5 +116,18 @@ export default abstract class BaseProvider<TOptions extends BaseProviderOptions>
|
|
|
115
116
|
* Formats elapsed time in human-readable format
|
|
116
117
|
*/
|
|
117
118
|
protected formatElapsedTime(seconds: number): string;
|
|
119
|
+
/**
|
|
120
|
+
* Prints dry-run summary showing what would be sent to the API.
|
|
121
|
+
*/
|
|
122
|
+
protected printDryRunSummary(sections: {
|
|
123
|
+
provider: string;
|
|
124
|
+
apiUrl: string;
|
|
125
|
+
uploads: {
|
|
126
|
+
label: string;
|
|
127
|
+
filePath: string;
|
|
128
|
+
endpoint: string;
|
|
129
|
+
}[];
|
|
130
|
+
runPayload: Record<string, unknown>;
|
|
131
|
+
}): void;
|
|
118
132
|
}
|
|
119
133
|
//# sourceMappingURL=base_provider.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"base_provider.d.ts","sourceRoot":"","sources":["../../src/providers/base_provider.ts"],"names":[],"mappings":"AAAA,OAAO,WAAW,MAAM,uBAAuB,CAAC;AAGhD,OAAO,eAAe,MAAM,4BAA4B,CAAC;AAEzD,OAAO,MAAM,MAAM,WAAW,CAAC;AAa/B;;GAEG;AACH,MAAM,WAAW,WAAW;IAC1B,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,OAAO,EAAE,MAAM,CAAC;IAChB,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB;AAED;;GAEG;AACH,MAAM,WAAW,mBAAmB;IAClC,KAAK,CAAC,EAAE,OAAO,CAAC;IAChB,eAAe,CAAC,EAAE,MAAM,CAAC;
|
|
1
|
+
{"version":3,"file":"base_provider.d.ts","sourceRoot":"","sources":["../../src/providers/base_provider.ts"],"names":[],"mappings":"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"}
|
|
@@ -292,5 +292,23 @@ class BaseProvider {
|
|
|
292
292
|
const remainingSeconds = seconds % 60;
|
|
293
293
|
return `${minutes}m ${remainingSeconds}s`;
|
|
294
294
|
}
|
|
295
|
+
/**
|
|
296
|
+
* Prints dry-run summary showing what would be sent to the API.
|
|
297
|
+
*/
|
|
298
|
+
printDryRunSummary(sections) {
|
|
299
|
+
logger_1.default.info(`[DRY RUN] ${sections.provider}`);
|
|
300
|
+
logger_1.default.info('');
|
|
301
|
+
logger_1.default.info('Files to upload:');
|
|
302
|
+
for (const upload of sections.uploads) {
|
|
303
|
+
logger_1.default.info(` ${upload.label}: ${upload.filePath}`);
|
|
304
|
+
logger_1.default.info(` -> POST ${upload.endpoint}`);
|
|
305
|
+
}
|
|
306
|
+
logger_1.default.info('');
|
|
307
|
+
logger_1.default.info('Test run payload:');
|
|
308
|
+
logger_1.default.info(` POST ${sections.apiUrl}/<appId>/run`);
|
|
309
|
+
logger_1.default.info(JSON.stringify(sections.runPayload, null, 2));
|
|
310
|
+
logger_1.default.info('');
|
|
311
|
+
logger_1.default.info('No HTTP requests were made.');
|
|
312
|
+
}
|
|
295
313
|
}
|
|
296
314
|
exports.default = BaseProvider;
|
|
@@ -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;AAOhD,OAAO,YAAY,MAAM,iBAAiB,CAAC;AAE3C,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;gBAErB,WAAW,EAAE,WAAW,EAAE,OAAO,EAAE,eAAe;YAIvD,QAAQ;IAuCT,GAAG,IAAI,OAAO,CAAC,cAAc,CAAC;
|
|
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;AAOhD,OAAO,YAAY,MAAM,iBAAiB,CAAC;AAE3C,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;gBAErB,WAAW,EAAE,WAAW,EAAE,OAAO,EAAE,eAAe;YAIvD,QAAQ;IAuCT,GAAG,IAAI,OAAO,CAAC,cAAc,CAAC;YA6F7B,SAAS;YAcT,aAAa;YAab,QAAQ;YA0DR,SAAS;YA4BT,iBAAiB;IAwE/B,OAAO,CAAC,gBAAgB;IAmCxB;;;OAGG;IACH,OAAO,CAAC,iBAAiB;IAIzB,OAAO,CAAC,aAAa;YAkBP,YAAY;IAwD1B,OAAO,CAAC,qBAAqB;IAqC7B,OAAO,CAAC,0BAA0B;IAOlC,OAAO,CAAC,kBAAkB;IAc1B,OAAO,CAAC,mBAAmB;CAa5B"}
|
|
@@ -49,6 +49,33 @@ class Espresso extends base_provider_1.default {
|
|
|
49
49
|
if (!(await this.validate())) {
|
|
50
50
|
return { success: false, runs: [] };
|
|
51
51
|
}
|
|
52
|
+
if (this.options.dryRun) {
|
|
53
|
+
const capabilities = this.options.getCapabilities();
|
|
54
|
+
const espressoOptions = this.options.getEspressoOptions();
|
|
55
|
+
const metadata = this.options.metadata;
|
|
56
|
+
this.printDryRunSummary({
|
|
57
|
+
provider: 'Espresso',
|
|
58
|
+
apiUrl: this.URL,
|
|
59
|
+
uploads: [
|
|
60
|
+
{
|
|
61
|
+
label: 'App',
|
|
62
|
+
filePath: this.options.app,
|
|
63
|
+
endpoint: `${this.URL}/app`,
|
|
64
|
+
},
|
|
65
|
+
{
|
|
66
|
+
label: 'Test App',
|
|
67
|
+
filePath: this.options.testApp,
|
|
68
|
+
endpoint: `${this.URL}/<appId>/tests`,
|
|
69
|
+
},
|
|
70
|
+
],
|
|
71
|
+
runPayload: {
|
|
72
|
+
capabilities: [capabilities],
|
|
73
|
+
...(espressoOptions && { espressoOptions }),
|
|
74
|
+
...(metadata && { metadata }),
|
|
75
|
+
},
|
|
76
|
+
});
|
|
77
|
+
return { success: true, runs: [] };
|
|
78
|
+
}
|
|
52
79
|
try {
|
|
53
80
|
// Quick connectivity check before starting uploads
|
|
54
81
|
await this.ensureConnectivity();
|
|
@@ -81,13 +81,38 @@ export default class Maestro extends BaseProvider<MaestroOptions> {
|
|
|
81
81
|
*/
|
|
82
82
|
private zipAppBundle;
|
|
83
83
|
private checkAppChecksum;
|
|
84
|
+
/**
|
|
85
|
+
* Collect and resolve all flow files, their dependencies, and determine the
|
|
86
|
+
* base directory for the zip structure. This is shared by both uploadFlows
|
|
87
|
+
* and the dry-run path.
|
|
88
|
+
*
|
|
89
|
+
* Returns null if the input is a single .zip file (direct upload, no processing).
|
|
90
|
+
*/
|
|
91
|
+
collectFlows(): Promise<{
|
|
92
|
+
allFlowFiles: string[];
|
|
93
|
+
baseDir: string | undefined;
|
|
94
|
+
} | null>;
|
|
84
95
|
private uploadFlows;
|
|
96
|
+
/**
|
|
97
|
+
* Search ancestor directories of the given flow files for a Maestro config file
|
|
98
|
+
* (config.yaml or config.yml). This identifies the project root so the zip
|
|
99
|
+
* preserves the directory structure needed for relative paths like ../../screens/.
|
|
100
|
+
*/
|
|
101
|
+
private findMaestroProjectRoot;
|
|
85
102
|
private discoverFlows;
|
|
86
103
|
private discoverDependencies;
|
|
87
104
|
/**
|
|
88
105
|
* Check if a file path is a Maestro config file (config.yaml or config.yml)
|
|
89
106
|
*/
|
|
90
107
|
private isConfigFile;
|
|
108
|
+
private readFlowTags;
|
|
109
|
+
/**
|
|
110
|
+
* Load includeTags / excludeTags declared in the Maestro project's
|
|
111
|
+
* config.yaml (or config.yml). Returns undefined fields when no config
|
|
112
|
+
* exists or the values are not arrays.
|
|
113
|
+
*/
|
|
114
|
+
private loadConfigTags;
|
|
115
|
+
private filterFlowsByTags;
|
|
91
116
|
/**
|
|
92
117
|
* Check if a string looks like a file path (relative path with extension)
|
|
93
118
|
*/
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"maestro.d.ts","sourceRoot":"","sources":["../../src/providers/maestro.ts"],"names":[],"mappings":"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
|
|
1
|
+
{"version":3,"file":"maestro.d.ts","sourceRoot":"","sources":["../../src/providers/maestro.ts"],"names":[],"mappings":"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"}
|
|
@@ -121,6 +121,56 @@ class Maestro extends base_provider_1.default {
|
|
|
121
121
|
if (!(await this.validate())) {
|
|
122
122
|
return { success: false, runs: [] };
|
|
123
123
|
}
|
|
124
|
+
if (this.options.dryRun) {
|
|
125
|
+
// Detect platform for dry-run output (no network call needed)
|
|
126
|
+
if (!this.options.platformName) {
|
|
127
|
+
this.detectedPlatform = await this.detectPlatform();
|
|
128
|
+
}
|
|
129
|
+
const capabilities = this.options.getCapabilities(this.detectedPlatform);
|
|
130
|
+
const maestroOptions = this.options.getMaestroOptions();
|
|
131
|
+
const metadata = this.options.metadata;
|
|
132
|
+
// Process flows to show actual zip structure
|
|
133
|
+
const flowResult = await this.collectFlows();
|
|
134
|
+
this.printDryRunSummary({
|
|
135
|
+
provider: 'Maestro',
|
|
136
|
+
apiUrl: this.URL,
|
|
137
|
+
uploads: [
|
|
138
|
+
{
|
|
139
|
+
label: 'App',
|
|
140
|
+
filePath: this.options.app,
|
|
141
|
+
endpoint: `${this.URL}/app`,
|
|
142
|
+
},
|
|
143
|
+
{
|
|
144
|
+
label: 'Flows',
|
|
145
|
+
filePath: this.options.flows.join(', '),
|
|
146
|
+
endpoint: `${this.URL}/<appId>/tests`,
|
|
147
|
+
},
|
|
148
|
+
],
|
|
149
|
+
runPayload: {
|
|
150
|
+
capabilities: [capabilities],
|
|
151
|
+
...(maestroOptions && { maestroOptions }),
|
|
152
|
+
...(this.options.shardSplit && {
|
|
153
|
+
shardSplit: this.options.shardSplit,
|
|
154
|
+
}),
|
|
155
|
+
...(metadata && { metadata }),
|
|
156
|
+
},
|
|
157
|
+
});
|
|
158
|
+
// Show zip structure details
|
|
159
|
+
if (flowResult) {
|
|
160
|
+
const { allFlowFiles, baseDir } = flowResult;
|
|
161
|
+
const effectiveBase = baseDir || this.computeCommonDirectory(allFlowFiles);
|
|
162
|
+
logger_1.default.info('Zip structure (files as they will appear in the archive):');
|
|
163
|
+
for (const file of allFlowFiles) {
|
|
164
|
+
const archiveName = node_path_1.default.relative(effectiveBase, node_path_1.default.resolve(file));
|
|
165
|
+
logger_1.default.info(` ${archiveName}`);
|
|
166
|
+
}
|
|
167
|
+
logger_1.default.info(` Base directory: ${node_path_1.default.resolve(effectiveBase)}`);
|
|
168
|
+
}
|
|
169
|
+
else {
|
|
170
|
+
logger_1.default.info('Flows: single .zip file (uploaded as-is)');
|
|
171
|
+
}
|
|
172
|
+
return { success: true, runs: [] };
|
|
173
|
+
}
|
|
124
174
|
try {
|
|
125
175
|
// Quick connectivity check before starting uploads
|
|
126
176
|
await this.ensureConnectivity();
|
|
@@ -276,24 +326,22 @@ class Maestro extends base_provider_1.default {
|
|
|
276
326
|
return null;
|
|
277
327
|
}
|
|
278
328
|
}
|
|
279
|
-
|
|
329
|
+
/**
|
|
330
|
+
* Collect and resolve all flow files, their dependencies, and determine the
|
|
331
|
+
* base directory for the zip structure. This is shared by both uploadFlows
|
|
332
|
+
* and the dry-run path.
|
|
333
|
+
*
|
|
334
|
+
* Returns null if the input is a single .zip file (direct upload, no processing).
|
|
335
|
+
*/
|
|
336
|
+
async collectFlows() {
|
|
280
337
|
const flowsPaths = this.options.flows;
|
|
281
|
-
|
|
282
|
-
// Special case: single zip file - upload directly
|
|
338
|
+
// Special case: single zip file - no processing needed
|
|
283
339
|
if (flowsPaths.length === 1) {
|
|
284
340
|
const singlePath = flowsPaths[0];
|
|
285
341
|
const stat = await node_fs_1.default.promises.stat(singlePath).catch(() => null);
|
|
286
|
-
if (stat?.isFile() &&
|
|
287
|
-
|
|
288
|
-
|
|
289
|
-
filePath: zipPath,
|
|
290
|
-
url: `${this.URL}/${this.appId}/tests`,
|
|
291
|
-
credentials: this.credentials,
|
|
292
|
-
contentType: 'application/zip',
|
|
293
|
-
showProgress: !this.options.quiet,
|
|
294
|
-
validateZipFormat: true,
|
|
295
|
-
});
|
|
296
|
-
return true;
|
|
342
|
+
if (stat?.isFile() &&
|
|
343
|
+
node_path_1.default.extname(singlePath).toLowerCase() === '.zip') {
|
|
344
|
+
return null;
|
|
297
345
|
}
|
|
298
346
|
}
|
|
299
347
|
// Collect all flow files from all paths
|
|
@@ -339,8 +387,22 @@ class Maestro extends base_provider_1.default {
|
|
|
339
387
|
throw new testingbot_error_1.default(`No flow files (.yaml, .yml) found in the provided paths`);
|
|
340
388
|
}
|
|
341
389
|
// Determine base directory for zip structure
|
|
342
|
-
// If we have a single directory, use it as base; otherwise
|
|
343
|
-
|
|
390
|
+
// If we have a single directory, use it as base; otherwise try to find the Maestro project root
|
|
391
|
+
let baseDir = baseDirs.length === 1 ? baseDirs[0] : undefined;
|
|
392
|
+
// When individual files are passed (not a directory), search ancestor directories
|
|
393
|
+
// for config.yaml to find the Maestro project root. This ensures the zip preserves
|
|
394
|
+
// the full directory structure needed for relative runFlow paths (e.g., ../../screens/).
|
|
395
|
+
if (!baseDir && allFlowFiles.length > 0) {
|
|
396
|
+
const projectRoot = await this.findMaestroProjectRoot(allFlowFiles);
|
|
397
|
+
if (projectRoot) {
|
|
398
|
+
baseDir = projectRoot.dir;
|
|
399
|
+
// Include config.yaml and discover its dependencies
|
|
400
|
+
const configResolved = node_path_1.default.resolve(projectRoot.configPath);
|
|
401
|
+
if (!allFlowFiles.some((f) => node_path_1.default.resolve(f) === configResolved)) {
|
|
402
|
+
allFlowFiles.push(projectRoot.configPath);
|
|
403
|
+
}
|
|
404
|
+
}
|
|
405
|
+
}
|
|
344
406
|
// Discover dependencies (addMedia, runScript, runFlow, etc.) for all flow files
|
|
345
407
|
// This ensures referenced files are included even when individual YAML files are passed
|
|
346
408
|
const allFilesSet = new Set(allFlowFiles.map((f) => node_path_1.default.resolve(f)));
|
|
@@ -357,6 +419,18 @@ class Maestro extends base_provider_1.default {
|
|
|
357
419
|
}
|
|
358
420
|
}
|
|
359
421
|
}
|
|
422
|
+
// Apply --include-tags / --exclude-tags filtering: drop flow files whose
|
|
423
|
+
// frontmatter tags don't match, and drop dependencies orphaned as a result.
|
|
424
|
+
const configTags = baseDir
|
|
425
|
+
? await this.loadConfigTags(baseDir)
|
|
426
|
+
: { includeTags: undefined, excludeTags: undefined };
|
|
427
|
+
const effectiveIncludeTags = this.options.includeTags ?? configTags.includeTags;
|
|
428
|
+
const effectiveExcludeTags = this.options.excludeTags ?? configTags.excludeTags;
|
|
429
|
+
const filtered = await this.filterFlowsByTags(allFlowFiles, baseDir, effectiveIncludeTags, effectiveExcludeTags);
|
|
430
|
+
if (filtered !== allFlowFiles) {
|
|
431
|
+
allFlowFiles.length = 0;
|
|
432
|
+
allFlowFiles.push(...filtered);
|
|
433
|
+
}
|
|
360
434
|
if (!this.options.quiet) {
|
|
361
435
|
this.logIncludedFiles(allFlowFiles, baseDir);
|
|
362
436
|
// Show info about potential slow execution on specific real devices
|
|
@@ -375,7 +449,25 @@ class Maestro extends base_provider_1.default {
|
|
|
375
449
|
if (!this.options.quiet && missingReferences.length > 0) {
|
|
376
450
|
this.logMissingReferences(missingReferences, baseDir);
|
|
377
451
|
}
|
|
378
|
-
|
|
452
|
+
return { allFlowFiles, baseDir };
|
|
453
|
+
}
|
|
454
|
+
async uploadFlows() {
|
|
455
|
+
const result = await this.collectFlows();
|
|
456
|
+
if (result === null) {
|
|
457
|
+
// Single zip file - upload directly
|
|
458
|
+
const zipPath = this.options.flows[0];
|
|
459
|
+
await this.upload.upload({
|
|
460
|
+
filePath: zipPath,
|
|
461
|
+
url: `${this.URL}/${this.appId}/tests`,
|
|
462
|
+
credentials: this.credentials,
|
|
463
|
+
contentType: 'application/zip',
|
|
464
|
+
showProgress: !this.options.quiet,
|
|
465
|
+
validateZipFormat: true,
|
|
466
|
+
});
|
|
467
|
+
return true;
|
|
468
|
+
}
|
|
469
|
+
const { allFlowFiles, baseDir } = result;
|
|
470
|
+
const zipPath = await this.createFlowsZip(allFlowFiles, baseDir);
|
|
379
471
|
try {
|
|
380
472
|
await this.upload.upload({
|
|
381
473
|
filePath: zipPath,
|
|
@@ -390,6 +482,31 @@ class Maestro extends base_provider_1.default {
|
|
|
390
482
|
}
|
|
391
483
|
return true;
|
|
392
484
|
}
|
|
485
|
+
/**
|
|
486
|
+
* Search ancestor directories of the given flow files for a Maestro config file
|
|
487
|
+
* (config.yaml or config.yml). This identifies the project root so the zip
|
|
488
|
+
* preserves the directory structure needed for relative paths like ../../screens/.
|
|
489
|
+
*/
|
|
490
|
+
async findMaestroProjectRoot(flowFiles) {
|
|
491
|
+
// Start from the first flow file and walk up
|
|
492
|
+
const startDir = node_path_1.default.dirname(node_path_1.default.resolve(flowFiles[0]));
|
|
493
|
+
const rootDir = node_path_1.default.parse(startDir).root;
|
|
494
|
+
let currentDir = startDir;
|
|
495
|
+
while (currentDir !== rootDir) {
|
|
496
|
+
for (const configName of ['config.yaml', 'config.yml']) {
|
|
497
|
+
const candidatePath = node_path_1.default.join(currentDir, configName);
|
|
498
|
+
try {
|
|
499
|
+
await node_fs_1.default.promises.access(candidatePath);
|
|
500
|
+
return { dir: currentDir, configPath: candidatePath };
|
|
501
|
+
}
|
|
502
|
+
catch {
|
|
503
|
+
// Config not found here, keep searching
|
|
504
|
+
}
|
|
505
|
+
}
|
|
506
|
+
currentDir = node_path_1.default.dirname(currentDir);
|
|
507
|
+
}
|
|
508
|
+
return null;
|
|
509
|
+
}
|
|
393
510
|
async discoverFlows(directory) {
|
|
394
511
|
const entries = await node_fs_1.default.promises.readdir(directory, {
|
|
395
512
|
withFileTypes: true,
|
|
@@ -475,6 +592,98 @@ class Maestro extends base_provider_1.default {
|
|
|
475
592
|
const basename = node_path_1.default.basename(filePath);
|
|
476
593
|
return basename === 'config.yaml' || basename === 'config.yml';
|
|
477
594
|
}
|
|
595
|
+
async readFlowTags(flowFile) {
|
|
596
|
+
try {
|
|
597
|
+
const content = await node_fs_1.default.promises.readFile(flowFile, 'utf-8');
|
|
598
|
+
const documents = [];
|
|
599
|
+
yaml.loadAll(content, (doc) => documents.push(doc));
|
|
600
|
+
for (const doc of documents) {
|
|
601
|
+
if (doc !== null && typeof doc === 'object' && !Array.isArray(doc)) {
|
|
602
|
+
const tags = doc.tags;
|
|
603
|
+
if (Array.isArray(tags)) {
|
|
604
|
+
return tags.filter((t) => typeof t === 'string');
|
|
605
|
+
}
|
|
606
|
+
return [];
|
|
607
|
+
}
|
|
608
|
+
}
|
|
609
|
+
}
|
|
610
|
+
catch {
|
|
611
|
+
// ignore
|
|
612
|
+
}
|
|
613
|
+
return [];
|
|
614
|
+
}
|
|
615
|
+
/**
|
|
616
|
+
* Load includeTags / excludeTags declared in the Maestro project's
|
|
617
|
+
* config.yaml (or config.yml). Returns undefined fields when no config
|
|
618
|
+
* exists or the values are not arrays.
|
|
619
|
+
*/
|
|
620
|
+
async loadConfigTags(baseDir) {
|
|
621
|
+
for (const configName of ['config.yaml', 'config.yml']) {
|
|
622
|
+
const candidate = node_path_1.default.join(baseDir, configName);
|
|
623
|
+
try {
|
|
624
|
+
const content = await node_fs_1.default.promises.readFile(candidate, 'utf-8');
|
|
625
|
+
const parsed = yaml.load(content);
|
|
626
|
+
if (parsed && typeof parsed === 'object') {
|
|
627
|
+
const include = Array.isArray(parsed.includeTags)
|
|
628
|
+
? parsed.includeTags.filter((t) => typeof t === 'string')
|
|
629
|
+
: undefined;
|
|
630
|
+
const exclude = Array.isArray(parsed.excludeTags)
|
|
631
|
+
? parsed.excludeTags.filter((t) => typeof t === 'string')
|
|
632
|
+
: undefined;
|
|
633
|
+
return { includeTags: include, excludeTags: exclude };
|
|
634
|
+
}
|
|
635
|
+
return {};
|
|
636
|
+
}
|
|
637
|
+
catch {
|
|
638
|
+
// try next candidate
|
|
639
|
+
}
|
|
640
|
+
}
|
|
641
|
+
return {};
|
|
642
|
+
}
|
|
643
|
+
async filterFlowsByTags(allFlowFiles, baseDir, includeTagsArg, excludeTagsArg) {
|
|
644
|
+
const includeTags = includeTagsArg ?? [];
|
|
645
|
+
const excludeTags = excludeTagsArg ?? [];
|
|
646
|
+
const hasInclude = includeTags.length > 0;
|
|
647
|
+
const hasExclude = excludeTags.length > 0;
|
|
648
|
+
if (!hasInclude && !hasExclude) {
|
|
649
|
+
return allFlowFiles;
|
|
650
|
+
}
|
|
651
|
+
const yamlFlows = [];
|
|
652
|
+
const configFiles = [];
|
|
653
|
+
for (const f of allFlowFiles) {
|
|
654
|
+
const ext = node_path_1.default.extname(f).toLowerCase();
|
|
655
|
+
if (ext === '.yaml' || ext === '.yml') {
|
|
656
|
+
if (this.isConfigFile(f)) {
|
|
657
|
+
configFiles.push(f);
|
|
658
|
+
}
|
|
659
|
+
else {
|
|
660
|
+
yamlFlows.push(f);
|
|
661
|
+
}
|
|
662
|
+
}
|
|
663
|
+
}
|
|
664
|
+
const keptYamlFlows = [];
|
|
665
|
+
for (const flowFile of yamlFlows) {
|
|
666
|
+
const tags = await this.readFlowTags(flowFile);
|
|
667
|
+
if (hasInclude && !tags.some((t) => includeTags.includes(t))) {
|
|
668
|
+
continue;
|
|
669
|
+
}
|
|
670
|
+
if (hasExclude && tags.some((t) => excludeTags.includes(t))) {
|
|
671
|
+
continue;
|
|
672
|
+
}
|
|
673
|
+
keptYamlFlows.push(flowFile);
|
|
674
|
+
}
|
|
675
|
+
if (keptYamlFlows.length === 0) {
|
|
676
|
+
throw new testingbot_error_1.default(`No flow files match the provided tag filters (--include-tags / --exclude-tags)`);
|
|
677
|
+
}
|
|
678
|
+
const keptResolved = new Set([...keptYamlFlows, ...configFiles].map((f) => node_path_1.default.resolve(f)));
|
|
679
|
+
for (const flowFile of keptYamlFlows) {
|
|
680
|
+
const deps = await this.discoverDependencies(flowFile, baseDir || node_path_1.default.dirname(flowFile));
|
|
681
|
+
for (const dep of deps) {
|
|
682
|
+
keptResolved.add(node_path_1.default.resolve(dep));
|
|
683
|
+
}
|
|
684
|
+
}
|
|
685
|
+
return allFlowFiles.filter((f) => keptResolved.has(node_path_1.default.resolve(f)));
|
|
686
|
+
}
|
|
478
687
|
/**
|
|
479
688
|
* Check if a string looks like a file path (relative path with extension)
|
|
480
689
|
*/
|
|
@@ -621,8 +830,18 @@ class Maestro extends base_provider_1.default {
|
|
|
621
830
|
await this.tryAddDependency(obj.file, flowFile, baseDir, dependencies, visited);
|
|
622
831
|
}
|
|
623
832
|
// Recursively check remaining object properties for nested structures
|
|
833
|
+
// Skip config-only keys that contain path-like strings but aren't runtime
|
|
834
|
+
// file dependencies (e.g., executionOrder.flowsOrder, flows glob patterns)
|
|
835
|
+
const configOnlyKeys = new Set([
|
|
836
|
+
'executionOrder',
|
|
837
|
+
'flows',
|
|
838
|
+
'tags',
|
|
839
|
+
'includeTags',
|
|
840
|
+
'excludeTags',
|
|
841
|
+
'env',
|
|
842
|
+
]);
|
|
624
843
|
for (const [key, propValue] of Object.entries(obj)) {
|
|
625
|
-
if (!handledKeys.has(key)) {
|
|
844
|
+
if (!handledKeys.has(key) && !configOnlyKeys.has(key)) {
|
|
626
845
|
const deps = await this.extractPathsFromValue(propValue, flowFile, baseDir, visited);
|
|
627
846
|
dependencies.push(...deps);
|
|
628
847
|
}
|
|
@@ -776,8 +995,18 @@ class Maestro extends base_provider_1.default {
|
|
|
776
995
|
}
|
|
777
996
|
}
|
|
778
997
|
// Recursively check remaining properties
|
|
998
|
+
// Skip config-only keys that contain path-like strings but aren't runtime
|
|
999
|
+
// file dependencies (e.g., executionOrder.flowsOrder, flows glob patterns)
|
|
1000
|
+
const configOnlyKeys = new Set([
|
|
1001
|
+
'executionOrder',
|
|
1002
|
+
'flows',
|
|
1003
|
+
'tags',
|
|
1004
|
+
'includeTags',
|
|
1005
|
+
'excludeTags',
|
|
1006
|
+
'env',
|
|
1007
|
+
]);
|
|
779
1008
|
for (const [key, propValue] of Object.entries(obj)) {
|
|
780
|
-
if (!handledKeys.has(key)) {
|
|
1009
|
+
if (!handledKeys.has(key) && !configOnlyKeys.has(key)) {
|
|
781
1010
|
const nestedMissing = await this.findMissingInValue(propValue, flowFile, includedFiles);
|
|
782
1011
|
missingReferences.push(...nestedMissing);
|
|
783
1012
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"xcuitest.d.ts","sourceRoot":"","sources":["../../src/providers/xcuitest.ts"],"names":[],"mappings":"AAAA,OAAO,eAAe,MAAM,4BAA4B,CAAC;AAEzD,OAAO,WAAW,MAAM,uBAAuB,CAAC;AAOhD,OAAO,YAAY,MAAM,iBAAiB,CAAC;AAE3C,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;gBAErB,WAAW,EAAE,WAAW,EAAE,OAAO,EAAE,eAAe;YAIvD,QAAQ;IAuCT,GAAG,IAAI,OAAO,CAAC,cAAc,CAAC;
|
|
1
|
+
{"version":3,"file":"xcuitest.d.ts","sourceRoot":"","sources":["../../src/providers/xcuitest.ts"],"names":[],"mappings":"AAAA,OAAO,eAAe,MAAM,4BAA4B,CAAC;AAEzD,OAAO,WAAW,MAAM,uBAAuB,CAAC;AAOhD,OAAO,YAAY,MAAM,iBAAiB,CAAC;AAE3C,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;gBAErB,WAAW,EAAE,WAAW,EAAE,OAAO,EAAE,eAAe;YAIvD,QAAQ;IAuCT,GAAG,IAAI,OAAO,CAAC,cAAc,CAAC;YA6F7B,SAAS;YAcT,aAAa;YAab,QAAQ;YA0DR,SAAS;YA4BT,iBAAiB;IAwE/B,OAAO,CAAC,gBAAgB;IAmCxB;;;OAGG;IACH,OAAO,CAAC,iBAAiB;IAIzB,OAAO,CAAC,aAAa;YAkBP,YAAY;IA2D1B,OAAO,CAAC,qBAAqB;IAqC7B,OAAO,CAAC,0BAA0B;IAOlC,OAAO,CAAC,kBAAkB;IAc1B,OAAO,CAAC,mBAAmB;CAa5B"}
|
|
@@ -49,6 +49,33 @@ class XCUITest extends base_provider_1.default {
|
|
|
49
49
|
if (!(await this.validate())) {
|
|
50
50
|
return { success: false, runs: [] };
|
|
51
51
|
}
|
|
52
|
+
if (this.options.dryRun) {
|
|
53
|
+
const capabilities = this.options.getCapabilities();
|
|
54
|
+
const xcuitestOptions = this.options.getXCUITestOptions();
|
|
55
|
+
const metadata = this.options.metadata;
|
|
56
|
+
this.printDryRunSummary({
|
|
57
|
+
provider: 'XCUITest',
|
|
58
|
+
apiUrl: this.URL,
|
|
59
|
+
uploads: [
|
|
60
|
+
{
|
|
61
|
+
label: 'App',
|
|
62
|
+
filePath: this.options.app,
|
|
63
|
+
endpoint: `${this.URL}/app`,
|
|
64
|
+
},
|
|
65
|
+
{
|
|
66
|
+
label: 'Test App',
|
|
67
|
+
filePath: this.options.testApp,
|
|
68
|
+
endpoint: `${this.URL}/<appId>/tests`,
|
|
69
|
+
},
|
|
70
|
+
],
|
|
71
|
+
runPayload: {
|
|
72
|
+
capabilities: [capabilities],
|
|
73
|
+
...(xcuitestOptions && { options: xcuitestOptions }),
|
|
74
|
+
...(metadata && { metadata }),
|
|
75
|
+
},
|
|
76
|
+
});
|
|
77
|
+
return { success: true, runs: [] };
|
|
78
|
+
}
|
|
52
79
|
try {
|
|
53
80
|
// Quick connectivity check before starting uploads
|
|
54
81
|
await this.ensureConnectivity();
|