mobilewright 0.0.52 → 0.0.54
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.js +1 -2
- package/dist/cli.js.map +1 -1
- package/dist/config.d.ts +11 -24
- package/dist/config.d.ts.map +1 -1
- package/dist/config.js +89 -24
- package/dist/config.js.map +1 -1
- package/dist/config.test.js +174 -142
- package/dist/config.test.js.map +1 -1
- package/dist/device-pool/adapters/http-client.test.js +4 -4
- package/dist/device-pool/adapters/http-client.test.js.map +1 -1
- package/dist/device-pool/adapters/http-server.test.js +7 -7
- package/dist/device-pool/adapters/http-server.test.js.map +1 -1
- package/dist/device-pool/application/device-pool.d.ts +4 -3
- package/dist/device-pool/application/device-pool.d.ts.map +1 -1
- package/dist/device-pool/application/device-pool.js +30 -8
- package/dist/device-pool/application/device-pool.js.map +1 -1
- package/dist/device-pool/application/device-pool.test.js +71 -35
- package/dist/device-pool/application/device-pool.test.js.map +1 -1
- package/dist/device-pool/application/ports.d.ts +3 -33
- package/dist/device-pool/application/ports.d.ts.map +1 -1
- package/dist/device-pool/application/ports.js +1 -12
- package/dist/device-pool/application/ports.js.map +1 -1
- package/dist/device-pool/setup.d.ts.map +1 -1
- package/dist/device-pool/setup.js +5 -7
- package/dist/device-pool/setup.js.map +1 -1
- package/dist/driver-registry.d.ts +10 -0
- package/dist/driver-registry.d.ts.map +1 -0
- package/dist/driver-registry.js +14 -0
- package/dist/driver-registry.js.map +1 -0
- package/dist/index.d.ts +2 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js.map +1 -1
- package/dist/launchers.d.ts +5 -5
- package/dist/launchers.d.ts.map +1 -1
- package/dist/launchers.js +8 -32
- package/dist/launchers.js.map +1 -1
- package/dist/observer-reporter.d.ts +21 -0
- package/dist/observer-reporter.d.ts.map +1 -0
- package/dist/observer-reporter.js +106 -0
- package/dist/observer-reporter.js.map +1 -0
- package/dist/observer-reporter.test.d.ts +2 -0
- package/dist/observer-reporter.test.d.ts.map +1 -0
- package/dist/observer-reporter.test.js +182 -0
- package/dist/observer-reporter.test.js.map +1 -0
- package/package.json +6 -6
- package/dist/device-pool/adapters/mobilecli-allocator.d.ts +0 -19
- package/dist/device-pool/adapters/mobilecli-allocator.d.ts.map +0 -1
- package/dist/device-pool/adapters/mobilecli-allocator.js +0 -26
- package/dist/device-pool/adapters/mobilecli-allocator.js.map +0 -1
- package/dist/device-pool/adapters/mobilecli-allocator.test.d.ts +0 -2
- package/dist/device-pool/adapters/mobilecli-allocator.test.d.ts.map +0 -1
- package/dist/device-pool/adapters/mobilecli-allocator.test.js +0 -61
- package/dist/device-pool/adapters/mobilecli-allocator.test.js.map +0 -1
- package/dist/device-pool/adapters/mobilenext-allocator.d.ts +0 -24
- package/dist/device-pool/adapters/mobilenext-allocator.d.ts.map +0 -1
- package/dist/device-pool/adapters/mobilenext-allocator.js +0 -90
- package/dist/device-pool/adapters/mobilenext-allocator.js.map +0 -1
- package/dist/device-pool/adapters/mobilenext-allocator.test.d.ts +0 -2
- package/dist/device-pool/adapters/mobilenext-allocator.test.d.ts.map +0 -1
- package/dist/device-pool/adapters/mobilenext-allocator.test.js +0 -42
- package/dist/device-pool/adapters/mobilenext-allocator.test.js.map +0 -1
- package/dist/device-pool/allocator-factory.d.ts +0 -10
- package/dist/device-pool/allocator-factory.d.ts.map +0 -1
- package/dist/device-pool/allocator-factory.js +0 -23
- package/dist/device-pool/allocator-factory.js.map +0 -1
- package/dist/server.d.ts +0 -16
- package/dist/server.d.ts.map +0 -1
- package/dist/server.js +0 -101
- package/dist/server.js.map +0 -1
package/dist/launchers.d.ts
CHANGED
|
@@ -1,16 +1,17 @@
|
|
|
1
1
|
import type { Platform, DeviceInfo, DeviceType, DeviceSettings, MobilewrightDriver } from '@mobilewright/protocol';
|
|
2
2
|
import { Device } from '@mobilewright/core';
|
|
3
|
-
import type { DriverConfig } from './config.js';
|
|
4
3
|
export interface LaunchOptions {
|
|
5
4
|
bundleId?: string;
|
|
6
5
|
installApps?: string | string[];
|
|
7
6
|
autoAppLaunch?: boolean;
|
|
8
7
|
deviceId?: string;
|
|
9
8
|
deviceName?: RegExp;
|
|
9
|
+
/** mobilecli server URL. Ignored when `driver` is set — construct the driver with its own url instead. */
|
|
10
10
|
url?: string;
|
|
11
11
|
timeout?: number;
|
|
12
|
+
/** Auto-start the mobilecli server if not running. Ignored when `driver` is set. Default: true. */
|
|
12
13
|
autoStart?: boolean;
|
|
13
|
-
driver?:
|
|
14
|
+
driver?: MobilewrightDriver;
|
|
14
15
|
actionTimeout?: number;
|
|
15
16
|
expectTimeout?: number;
|
|
16
17
|
appLaunchTimeout?: number;
|
|
@@ -25,7 +26,7 @@ export interface ConnectDeviceParams {
|
|
|
25
26
|
platform: Platform;
|
|
26
27
|
deviceId: string;
|
|
27
28
|
deviceType?: DeviceType;
|
|
28
|
-
|
|
29
|
+
driver?: MobilewrightDriver;
|
|
29
30
|
url?: string;
|
|
30
31
|
timeout?: number;
|
|
31
32
|
actionTimeout?: number;
|
|
@@ -38,10 +39,9 @@ export interface FindDeviceParams {
|
|
|
38
39
|
platform: Platform;
|
|
39
40
|
deviceId?: string;
|
|
40
41
|
deviceName?: RegExp;
|
|
41
|
-
|
|
42
|
+
driver?: MobilewrightDriver;
|
|
42
43
|
url?: string;
|
|
43
44
|
}
|
|
44
|
-
export declare function createDriver(driverConfig?: DriverConfig, url?: string): MobilewrightDriver;
|
|
45
45
|
export declare function connectDevice(params: ConnectDeviceParams): Promise<Device>;
|
|
46
46
|
export declare function installAndLaunchApps(device: Device, opts: LaunchOptions): Promise<void>;
|
|
47
47
|
export declare function findDevice(params: FindDeviceParams): Promise<DeviceInfo>;
|
package/dist/launchers.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"launchers.d.ts","sourceRoot":"","sources":["../src/launchers.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,QAAQ,EAAE,UAAU,EAAE,UAAU,EAAE,cAAc,EAAE,kBAAkB,EAAE,MAAM,wBAAwB,CAAC;AACnH,OAAO,EAAE,MAAM,EAAE,MAAM,oBAAoB,CAAC;
|
|
1
|
+
{"version":3,"file":"launchers.d.ts","sourceRoot":"","sources":["../src/launchers.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,QAAQ,EAAE,UAAU,EAAE,UAAU,EAAE,cAAc,EAAE,kBAAkB,EAAE,MAAM,wBAAwB,CAAC;AACnH,OAAO,EAAE,MAAM,EAAE,MAAM,oBAAoB,CAAC;AAI5C,MAAM,WAAW,aAAa;IAC5B,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,WAAW,CAAC,EAAE,MAAM,GAAG,MAAM,EAAE,CAAC;IAChC,aAAa,CAAC,EAAE,OAAO,CAAC;IACxB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,0GAA0G;IAC1G,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,mGAAmG;IACnG,SAAS,CAAC,EAAE,OAAO,CAAC;IACpB,MAAM,CAAC,EAAE,kBAAkB,CAAC;IAC5B,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAC1B,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,UAAU,CAAC,EAAE,IAAI,GAAG,KAAK,CAAC;CAC3B;AAED,UAAU,gBAAgB;IACxB,MAAM,CAAC,IAAI,CAAC,EAAE,aAAa,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC;IAC9C,OAAO,IAAI,OAAO,CAAC,UAAU,EAAE,CAAC,CAAC;CAClC;AAED,MAAM,WAAW,mBAAmB;IAClC,QAAQ,EAAE,QAAQ,CAAC;IACnB,QAAQ,EAAE,MAAM,CAAC;IACjB,UAAU,CAAC,EAAE,UAAU,CAAC;IACxB,MAAM,CAAC,EAAE,kBAAkB,CAAC;IAC5B,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAC1B,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,cAAc,CAAC,EAAE,cAAc,CAAC;CACjC;AAED,MAAM,WAAW,gBAAgB;IAC/B,QAAQ,EAAE,QAAQ,CAAC;IACnB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,MAAM,CAAC,EAAE,kBAAkB,CAAC;IAC5B,GAAG,CAAC,EAAE,MAAM,CAAC;CACd;AAED,wBAAsB,aAAa,CAAC,MAAM,EAAE,mBAAmB,GAAG,OAAO,CAAC,MAAM,CAAC,CAuBhF;AAED,wBAAsB,oBAAoB,CAAC,MAAM,EAAE,MAAM,EAAE,IAAI,EAAE,aAAa,GAAG,OAAO,CAAC,IAAI,CAAC,CAQ7F;AAED,wBAAsB,UAAU,CAAC,MAAM,EAAE,gBAAgB,GAAG,OAAO,CAAC,UAAU,CAAC,CAc9E;AAwCD,4BAA4B;AAC5B,eAAO,MAAM,GAAG,kBAAwB,CAAC;AAEzC,gCAAgC;AAChC,eAAO,MAAM,OAAO,kBAA4B,CAAC"}
|
package/dist/launchers.js
CHANGED
|
@@ -1,22 +1,8 @@
|
|
|
1
1
|
import { Device } from '@mobilewright/core';
|
|
2
2
|
import { MobilecliDriver, DEFAULT_URL } from '@mobilewright/driver-mobilecli';
|
|
3
|
-
import { MobileNextDriver } from '@mobilewright/driver-mobilenext';
|
|
4
|
-
import { ensureMobilecliReachable } from './server.js';
|
|
5
3
|
import { toArray } from './config.js';
|
|
6
|
-
export function createDriver(driverConfig, url) {
|
|
7
|
-
if (driverConfig?.type === 'mobilenext' || driverConfig?.type === 'mobile-use') {
|
|
8
|
-
return new MobileNextDriver({
|
|
9
|
-
region: driverConfig.region,
|
|
10
|
-
apiKey: driverConfig.apiKey,
|
|
11
|
-
});
|
|
12
|
-
}
|
|
13
|
-
return new MobilecliDriver({ url });
|
|
14
|
-
}
|
|
15
4
|
export async function connectDevice(params) {
|
|
16
|
-
|
|
17
|
-
// Passing mobilecli's default URL into MobileNextDriver.connect() would send
|
|
18
|
-
// requests to the wrong server.
|
|
19
|
-
const driver = createDriver(params.driverConfig, params.url);
|
|
5
|
+
const driver = params.driver ?? new MobilecliDriver({ url: params.url });
|
|
20
6
|
const device = new Device(driver, {
|
|
21
7
|
locatorDefaults: {
|
|
22
8
|
...(params.actionTimeout !== undefined && { timeout: params.actionTimeout }),
|
|
@@ -47,8 +33,7 @@ export async function installAndLaunchApps(device, opts) {
|
|
|
47
33
|
}
|
|
48
34
|
}
|
|
49
35
|
export async function findDevice(params) {
|
|
50
|
-
const
|
|
51
|
-
const driver = createDriver(params.driverConfig, url);
|
|
36
|
+
const driver = params.driver ?? new MobilecliDriver({ url: params.url ?? DEFAULT_URL });
|
|
52
37
|
const devices = await driver.listDevices({ platform: params.platform });
|
|
53
38
|
const match = devices
|
|
54
39
|
.filter((d) => d.state === 'online')
|
|
@@ -63,25 +48,20 @@ export async function findDevice(params) {
|
|
|
63
48
|
function createLauncher(platform) {
|
|
64
49
|
return {
|
|
65
50
|
async launch(opts = {}) {
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
const ensured = await ensureMobilecliReachable(url, { autoStart: opts.autoStart ?? true });
|
|
71
|
-
serverProcess = ensured.serverProcess ?? undefined;
|
|
72
|
-
}
|
|
51
|
+
// One driver instance shared across find + connect: mobilecli's own
|
|
52
|
+
// connect() handles server auto-start/reachability internally, and
|
|
53
|
+
// owns killing any server it started when the device disconnects.
|
|
54
|
+
const driver = opts.driver ?? new MobilecliDriver({ url: opts.url, autoStart: opts.autoStart });
|
|
73
55
|
const found = await findDevice({
|
|
74
56
|
platform,
|
|
75
57
|
deviceId: opts.deviceId,
|
|
76
58
|
deviceName: opts.deviceName,
|
|
77
|
-
|
|
78
|
-
url,
|
|
59
|
+
driver,
|
|
79
60
|
});
|
|
80
61
|
const device = await connectDevice({
|
|
81
62
|
platform,
|
|
82
63
|
deviceId: found.id,
|
|
83
|
-
|
|
84
|
-
url,
|
|
64
|
+
driver,
|
|
85
65
|
timeout: opts.timeout,
|
|
86
66
|
actionTimeout: opts.actionTimeout,
|
|
87
67
|
expectTimeout: opts.expectTimeout,
|
|
@@ -89,10 +69,6 @@ function createLauncher(platform) {
|
|
|
89
69
|
installTimeout: opts.installTimeout,
|
|
90
70
|
deviceSettings: { animations: opts.animations },
|
|
91
71
|
});
|
|
92
|
-
if (serverProcess) {
|
|
93
|
-
const proc = serverProcess;
|
|
94
|
-
device.onClose(() => Promise.resolve(proc.kill()).then(() => undefined));
|
|
95
|
-
}
|
|
96
72
|
await installAndLaunchApps(device, opts);
|
|
97
73
|
return device;
|
|
98
74
|
},
|
package/dist/launchers.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"launchers.js","sourceRoot":"","sources":["../src/launchers.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,MAAM,EAAE,MAAM,oBAAoB,CAAC;AAC5C,OAAO,EAAE,eAAe,EAAE,WAAW,EAAE,MAAM,gCAAgC,CAAC;AAC9E,OAAO,EAAE,
|
|
1
|
+
{"version":3,"file":"launchers.js","sourceRoot":"","sources":["../src/launchers.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
import type { Reporter, TestCase, TestResult, FullResult, FullConfig, Suite } from '@playwright/test/reporter';
|
|
2
|
+
export interface ObserverReporterOptions {
|
|
3
|
+
/** Path to the JSON report this run writes, if any — read lazily to build `RunResultInfo.jsonReport()`. */
|
|
4
|
+
jsonResultsPath?: string;
|
|
5
|
+
/** Remove the jsonResultsPath directory after the run — set only for the private tmp dir defineConfig created. */
|
|
6
|
+
cleanupJsonResults?: boolean;
|
|
7
|
+
}
|
|
8
|
+
/**
|
|
9
|
+
* Shim Playwright reporter that forwards test-lifecycle events to the active
|
|
10
|
+
* driver's `TestObserver`, if any. No-ops entirely when no driver is
|
|
11
|
+
* registered or the driver has no observer — safe to always inject.
|
|
12
|
+
*/
|
|
13
|
+
export default class ObserverReporter implements Reporter {
|
|
14
|
+
private readonly options;
|
|
15
|
+
constructor(options?: ObserverReporterOptions);
|
|
16
|
+
onBegin(_config: FullConfig, suite: Suite): void;
|
|
17
|
+
onTestEnd(test: TestCase, result: TestResult): void;
|
|
18
|
+
onEnd(result: FullResult): Promise<void>;
|
|
19
|
+
printsToStdio(): boolean;
|
|
20
|
+
}
|
|
21
|
+
//# sourceMappingURL=observer-reporter.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"observer-reporter.d.ts","sourceRoot":"","sources":["../src/observer-reporter.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EACV,QAAQ,EACR,QAAQ,EAER,UAAU,EAEV,UAAU,EACV,UAAU,EACV,KAAK,EACN,MAAM,2BAA2B,CAAC;AAInC,MAAM,WAAW,uBAAuB;IACtC,2GAA2G;IAC3G,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB,kHAAkH;IAClH,kBAAkB,CAAC,EAAE,OAAO,CAAC;CAC9B;AA0CD;;;;GAIG;AACH,MAAM,CAAC,OAAO,OAAO,gBAAiB,YAAW,QAAQ;IACvD,OAAO,CAAC,QAAQ,CAAC,OAAO,CAA0B;gBAEtC,OAAO,GAAE,uBAA4B;IAIjD,OAAO,CAAC,OAAO,EAAE,UAAU,EAAE,KAAK,EAAE,KAAK,GAAG,IAAI;IAahD,SAAS,CAAC,IAAI,EAAE,QAAQ,EAAE,MAAM,EAAE,UAAU,GAAG,IAAI;IAY7C,KAAK,CAAC,MAAM,EAAE,UAAU,GAAG,OAAO,CAAC,IAAI,CAAC;IA6B9C,aAAa,IAAI,OAAO;CAGzB"}
|
|
@@ -0,0 +1,106 @@
|
|
|
1
|
+
import { readFile } from 'node:fs/promises';
|
|
2
|
+
import { rmSync } from 'node:fs';
|
|
3
|
+
import { dirname } from 'node:path';
|
|
4
|
+
import { getActiveDriver } from './driver-registry.js';
|
|
5
|
+
// `message` is set for thrown Errors, `value` for thrown non-Errors.
|
|
6
|
+
function errorText(error) {
|
|
7
|
+
return error.message ?? error.value ?? String(error);
|
|
8
|
+
}
|
|
9
|
+
function toStepInfo(step) {
|
|
10
|
+
return {
|
|
11
|
+
title: step.title,
|
|
12
|
+
category: step.category,
|
|
13
|
+
duration: step.duration,
|
|
14
|
+
...(step.error !== undefined && { error: errorText(step.error) }),
|
|
15
|
+
...(step.location !== undefined && { location: step.location }),
|
|
16
|
+
steps: step.steps.map(toStepInfo),
|
|
17
|
+
};
|
|
18
|
+
}
|
|
19
|
+
function toTestInfo(test) {
|
|
20
|
+
return {
|
|
21
|
+
id: test.id,
|
|
22
|
+
title: test.title,
|
|
23
|
+
titlePath: test.titlePath(),
|
|
24
|
+
...(test.location !== undefined && { location: test.location }),
|
|
25
|
+
};
|
|
26
|
+
}
|
|
27
|
+
function toResultInfo(result) {
|
|
28
|
+
return {
|
|
29
|
+
status: result.status,
|
|
30
|
+
retry: result.retry,
|
|
31
|
+
duration: result.duration,
|
|
32
|
+
errors: result.errors.map(errorText),
|
|
33
|
+
steps: result.steps.map(toStepInfo),
|
|
34
|
+
};
|
|
35
|
+
}
|
|
36
|
+
// An observer failure must never crash or fail the test run — warn and move on.
|
|
37
|
+
function warnObserverFailure(hook, err) {
|
|
38
|
+
console.warn(`\n [mobilewright] Test observer ${hook} failed: ${err}`);
|
|
39
|
+
}
|
|
40
|
+
/**
|
|
41
|
+
* Shim Playwright reporter that forwards test-lifecycle events to the active
|
|
42
|
+
* driver's `TestObserver`, if any. No-ops entirely when no driver is
|
|
43
|
+
* registered or the driver has no observer — safe to always inject.
|
|
44
|
+
*/
|
|
45
|
+
export default class ObserverReporter {
|
|
46
|
+
constructor(options = {}) {
|
|
47
|
+
this.options = options;
|
|
48
|
+
}
|
|
49
|
+
onBegin(_config, suite) {
|
|
50
|
+
const observer = getActiveDriver()?.observer;
|
|
51
|
+
if (!observer?.onRunStart) {
|
|
52
|
+
return;
|
|
53
|
+
}
|
|
54
|
+
try {
|
|
55
|
+
const started = observer.onRunStart({ totalTests: suite.allTests().length });
|
|
56
|
+
void Promise.resolve(started).catch((err) => warnObserverFailure('onRunStart', err));
|
|
57
|
+
}
|
|
58
|
+
catch (err) {
|
|
59
|
+
warnObserverFailure('onRunStart', err);
|
|
60
|
+
}
|
|
61
|
+
}
|
|
62
|
+
onTestEnd(test, result) {
|
|
63
|
+
const observer = getActiveDriver()?.observer;
|
|
64
|
+
if (!observer?.onTestEnd) {
|
|
65
|
+
return;
|
|
66
|
+
}
|
|
67
|
+
try {
|
|
68
|
+
observer.onTestEnd(toTestInfo(test), toResultInfo(result));
|
|
69
|
+
}
|
|
70
|
+
catch (err) {
|
|
71
|
+
warnObserverFailure('onTestEnd', err);
|
|
72
|
+
}
|
|
73
|
+
}
|
|
74
|
+
async onEnd(result) {
|
|
75
|
+
const jsonResultsPath = this.options.jsonResultsPath;
|
|
76
|
+
try {
|
|
77
|
+
const observer = getActiveDriver()?.observer;
|
|
78
|
+
if (!observer?.onRunEnd) {
|
|
79
|
+
return;
|
|
80
|
+
}
|
|
81
|
+
const runResult = {
|
|
82
|
+
status: result.status,
|
|
83
|
+
startTime: result.startTime,
|
|
84
|
+
duration: result.duration,
|
|
85
|
+
...(jsonResultsPath !== undefined && {
|
|
86
|
+
jsonReport: async () => JSON.parse(await readFile(jsonResultsPath, 'utf8')),
|
|
87
|
+
}),
|
|
88
|
+
};
|
|
89
|
+
try {
|
|
90
|
+
await observer.onRunEnd(runResult);
|
|
91
|
+
}
|
|
92
|
+
catch (err) {
|
|
93
|
+
warnObserverFailure('onRunEnd', err);
|
|
94
|
+
}
|
|
95
|
+
}
|
|
96
|
+
finally {
|
|
97
|
+
if (this.options.cleanupJsonResults && jsonResultsPath !== undefined) {
|
|
98
|
+
rmSync(dirname(jsonResultsPath), { recursive: true, force: true });
|
|
99
|
+
}
|
|
100
|
+
}
|
|
101
|
+
}
|
|
102
|
+
printsToStdio() {
|
|
103
|
+
return false;
|
|
104
|
+
}
|
|
105
|
+
}
|
|
106
|
+
//# sourceMappingURL=observer-reporter.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"observer-reporter.js","sourceRoot":"","sources":["../src/observer-reporter.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"observer-reporter.test.d.ts","sourceRoot":"","sources":["../src/observer-reporter.test.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,182 @@
|
|
|
1
|
+
import { test, expect } from '@playwright/test';
|
|
2
|
+
import { writeFileSync, mkdtempSync, rmSync, existsSync } from 'node:fs';
|
|
3
|
+
import { join } from 'node:path';
|
|
4
|
+
import { tmpdir } from 'node:os';
|
|
5
|
+
import ObserverReporter from './observer-reporter.js';
|
|
6
|
+
import { setActiveDriver } from './driver-registry.js';
|
|
7
|
+
function makeRecordingObserver() {
|
|
8
|
+
const observer = {
|
|
9
|
+
runStarts: [],
|
|
10
|
+
testEnds: [],
|
|
11
|
+
runEnds: [],
|
|
12
|
+
onRunStart(run) {
|
|
13
|
+
observer.runStarts.push(run);
|
|
14
|
+
},
|
|
15
|
+
onTestEnd(testInfo, resultInfo) {
|
|
16
|
+
observer.testEnds.push({ test: testInfo, result: resultInfo });
|
|
17
|
+
},
|
|
18
|
+
onRunEnd(resultInfo) {
|
|
19
|
+
observer.runEnds.push(resultInfo);
|
|
20
|
+
return Promise.resolve();
|
|
21
|
+
},
|
|
22
|
+
};
|
|
23
|
+
return observer;
|
|
24
|
+
}
|
|
25
|
+
function fakeSuite(testCount) {
|
|
26
|
+
return { allTests: () => new Array(testCount).fill({}) };
|
|
27
|
+
}
|
|
28
|
+
function fakeTestCase(overrides = {}) {
|
|
29
|
+
const titlePath = overrides.titlePath ?? ['example.spec.ts', 'suite', 'a test'];
|
|
30
|
+
return {
|
|
31
|
+
id: overrides.id ?? 'test-1',
|
|
32
|
+
title: overrides.title ?? 'a test',
|
|
33
|
+
titlePath: () => titlePath,
|
|
34
|
+
location: { file: 'example.spec.ts', line: 5, column: 3 },
|
|
35
|
+
};
|
|
36
|
+
}
|
|
37
|
+
function fakeStep(overrides = {}) {
|
|
38
|
+
return {
|
|
39
|
+
title: overrides.title ?? 'a step',
|
|
40
|
+
category: overrides.category ?? 'test.step',
|
|
41
|
+
duration: overrides.duration ?? 12,
|
|
42
|
+
steps: overrides.steps ?? [],
|
|
43
|
+
...(overrides.error && { error: overrides.error }),
|
|
44
|
+
};
|
|
45
|
+
}
|
|
46
|
+
function fakeTestResult(overrides = {}) {
|
|
47
|
+
return {
|
|
48
|
+
status: overrides.status ?? 'passed',
|
|
49
|
+
retry: overrides.retry ?? 0,
|
|
50
|
+
duration: overrides.duration ?? 100,
|
|
51
|
+
errors: overrides.errors ?? [],
|
|
52
|
+
steps: overrides.steps ?? [],
|
|
53
|
+
};
|
|
54
|
+
}
|
|
55
|
+
test.afterEach(() => {
|
|
56
|
+
setActiveDriver(undefined);
|
|
57
|
+
});
|
|
58
|
+
test('onBegin forwards the scheduled test count to observer.onRunStart', () => {
|
|
59
|
+
const observer = makeRecordingObserver();
|
|
60
|
+
setActiveDriver({ observer });
|
|
61
|
+
const reporter = new ObserverReporter();
|
|
62
|
+
reporter.onBegin({}, fakeSuite(3));
|
|
63
|
+
expect(observer.runStarts).toEqual([{ totalTests: 3 }]);
|
|
64
|
+
});
|
|
65
|
+
test('onTestEnd maps the test case and result into the slim protocol shapes', () => {
|
|
66
|
+
const observer = makeRecordingObserver();
|
|
67
|
+
setActiveDriver({ observer });
|
|
68
|
+
const reporter = new ObserverReporter();
|
|
69
|
+
const innerStep = fakeStep({ title: 'inner', duration: 3 });
|
|
70
|
+
const outerStep = fakeStep({ title: 'outer', duration: 10, steps: [innerStep], error: { message: 'boom' } });
|
|
71
|
+
const testCase = fakeTestCase({ id: 'spec-1', title: 'does a thing', titlePath: ['file.spec.ts', 'does a thing'] });
|
|
72
|
+
const result = fakeTestResult({ status: 'failed', retry: 1, duration: 50, errors: [{ message: 'oops' }], steps: [outerStep] });
|
|
73
|
+
reporter.onTestEnd(testCase, result);
|
|
74
|
+
expect(observer.testEnds).toHaveLength(1);
|
|
75
|
+
const recorded = observer.testEnds[0];
|
|
76
|
+
expect(recorded.test.id).toBe('spec-1');
|
|
77
|
+
expect(recorded.test.title).toBe('does a thing');
|
|
78
|
+
expect(recorded.test.titlePath).toEqual(['file.spec.ts', 'does a thing']);
|
|
79
|
+
expect(recorded.result.status).toBe('failed');
|
|
80
|
+
expect(recorded.result.retry).toBe(1);
|
|
81
|
+
expect(recorded.result.errors).toEqual(['oops']);
|
|
82
|
+
expect(recorded.result.steps).toHaveLength(1);
|
|
83
|
+
expect(recorded.result.steps[0].title).toBe('outer');
|
|
84
|
+
expect(recorded.result.steps[0].error).toBe('boom');
|
|
85
|
+
expect(recorded.result.steps[0].steps).toHaveLength(1);
|
|
86
|
+
expect(recorded.result.steps[0].steps[0].title).toBe('inner');
|
|
87
|
+
});
|
|
88
|
+
test('onEnd awaits observer.onRunEnd and its jsonReport() reads the results file', async () => {
|
|
89
|
+
const dir = mkdtempSync(join(tmpdir(), 'mw-observer-reporter-test-'));
|
|
90
|
+
const filePath = join(dir, 'results.json');
|
|
91
|
+
writeFileSync(filePath, JSON.stringify({ hello: 'world' }));
|
|
92
|
+
const observer = makeRecordingObserver();
|
|
93
|
+
setActiveDriver({ observer });
|
|
94
|
+
const reporter = new ObserverReporter({ jsonResultsPath: filePath });
|
|
95
|
+
await reporter.onEnd({ status: 'passed', startTime: new Date(), duration: 500 });
|
|
96
|
+
expect(observer.runEnds).toHaveLength(1);
|
|
97
|
+
const report = await observer.runEnds[0].jsonReport?.();
|
|
98
|
+
expect(report).toEqual({ hello: 'world' });
|
|
99
|
+
rmSync(dir, { recursive: true });
|
|
100
|
+
});
|
|
101
|
+
test('onEnd removes the results directory when cleanupJsonResults is set, even without an onRunEnd hook', async () => {
|
|
102
|
+
const dir = mkdtempSync(join(tmpdir(), 'mw-observer-reporter-test-'));
|
|
103
|
+
const filePath = join(dir, 'results.json');
|
|
104
|
+
writeFileSync(filePath, JSON.stringify({}));
|
|
105
|
+
setActiveDriver({ observer: {} });
|
|
106
|
+
const reporter = new ObserverReporter({ jsonResultsPath: filePath, cleanupJsonResults: true });
|
|
107
|
+
await reporter.onEnd({ status: 'passed', startTime: new Date(), duration: 0 });
|
|
108
|
+
expect(existsSync(dir)).toBe(false);
|
|
109
|
+
});
|
|
110
|
+
test('onEnd leaves the results file in place when cleanupJsonResults is not set', async () => {
|
|
111
|
+
const dir = mkdtempSync(join(tmpdir(), 'mw-observer-reporter-test-'));
|
|
112
|
+
const filePath = join(dir, 'results.json');
|
|
113
|
+
writeFileSync(filePath, JSON.stringify({}));
|
|
114
|
+
const observer = makeRecordingObserver();
|
|
115
|
+
setActiveDriver({ observer });
|
|
116
|
+
const reporter = new ObserverReporter({ jsonResultsPath: filePath });
|
|
117
|
+
await reporter.onEnd({ status: 'passed', startTime: new Date(), duration: 0 });
|
|
118
|
+
expect(existsSync(filePath)).toBe(true);
|
|
119
|
+
rmSync(dir, { recursive: true });
|
|
120
|
+
});
|
|
121
|
+
test('onTestEnd maps non-Error thrown values using the error value fallback', () => {
|
|
122
|
+
const observer = makeRecordingObserver();
|
|
123
|
+
setActiveDriver({ observer });
|
|
124
|
+
const step = fakeStep({ title: 'step', error: { value: 'thrown-string' } });
|
|
125
|
+
const result = fakeTestResult({ errors: [{ value: 'thrown-string' }], steps: [step] });
|
|
126
|
+
const reporter = new ObserverReporter();
|
|
127
|
+
reporter.onTestEnd(fakeTestCase(), result);
|
|
128
|
+
expect(observer.testEnds[0].result.errors).toEqual(['thrown-string']);
|
|
129
|
+
expect(observer.testEnds[0].result.steps[0].error).toBe('thrown-string');
|
|
130
|
+
});
|
|
131
|
+
test('onEnd does not attach jsonReport when no jsonResultsPath was configured', async () => {
|
|
132
|
+
const observer = makeRecordingObserver();
|
|
133
|
+
setActiveDriver({ observer });
|
|
134
|
+
const reporter = new ObserverReporter();
|
|
135
|
+
await reporter.onEnd({ status: 'passed', startTime: new Date(), duration: 0 });
|
|
136
|
+
expect(observer.runEnds[0].jsonReport).toBeUndefined();
|
|
137
|
+
});
|
|
138
|
+
test('onEnd does not throw when the observer rejects', async () => {
|
|
139
|
+
const failingObserver = {
|
|
140
|
+
onRunEnd: () => Promise.reject(new Error('boom')),
|
|
141
|
+
};
|
|
142
|
+
setActiveDriver({ observer: failingObserver });
|
|
143
|
+
const reporter = new ObserverReporter();
|
|
144
|
+
await expect(reporter.onEnd({ status: 'passed', startTime: new Date(), duration: 0 })).resolves.not.toThrow();
|
|
145
|
+
});
|
|
146
|
+
test('onBegin and onTestEnd do not throw when the observer throws', () => {
|
|
147
|
+
const failingObserver = {
|
|
148
|
+
onRunStart: () => { throw new Error('boom'); },
|
|
149
|
+
onTestEnd: () => { throw new Error('boom'); },
|
|
150
|
+
};
|
|
151
|
+
setActiveDriver({ observer: failingObserver });
|
|
152
|
+
const reporter = new ObserverReporter();
|
|
153
|
+
expect(() => reporter.onBegin({}, fakeSuite(1))).not.toThrow();
|
|
154
|
+
expect(() => reporter.onTestEnd(fakeTestCase(), fakeTestResult())).not.toThrow();
|
|
155
|
+
});
|
|
156
|
+
test('onBegin does not leave an unhandled rejection when observer.onRunStart rejects', async () => {
|
|
157
|
+
const failingObserver = {
|
|
158
|
+
onRunStart: () => Promise.reject(new Error('boom')),
|
|
159
|
+
};
|
|
160
|
+
setActiveDriver({ observer: failingObserver });
|
|
161
|
+
const reporter = new ObserverReporter();
|
|
162
|
+
reporter.onBegin({}, fakeSuite(1));
|
|
163
|
+
// Give the rejection a microtask to surface — the test fails on unhandledRejection if unhandled.
|
|
164
|
+
await new Promise((resolve) => setImmediate(resolve));
|
|
165
|
+
});
|
|
166
|
+
test('reporter methods no-op when no driver is registered', () => {
|
|
167
|
+
setActiveDriver(undefined);
|
|
168
|
+
const reporter = new ObserverReporter();
|
|
169
|
+
expect(() => reporter.onBegin({}, fakeSuite(1))).not.toThrow();
|
|
170
|
+
expect(() => reporter.onTestEnd(fakeTestCase(), fakeTestResult())).not.toThrow();
|
|
171
|
+
});
|
|
172
|
+
test('reporter methods no-op when the registered driver has no observer', () => {
|
|
173
|
+
setActiveDriver({});
|
|
174
|
+
const reporter = new ObserverReporter();
|
|
175
|
+
expect(() => reporter.onBegin({}, fakeSuite(1))).not.toThrow();
|
|
176
|
+
expect(() => reporter.onTestEnd(fakeTestCase(), fakeTestResult())).not.toThrow();
|
|
177
|
+
});
|
|
178
|
+
test('printsToStdio returns false', () => {
|
|
179
|
+
const reporter = new ObserverReporter();
|
|
180
|
+
expect(reporter.printsToStdio()).toBe(false);
|
|
181
|
+
});
|
|
182
|
+
//# sourceMappingURL=observer-reporter.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"observer-reporter.test.js","sourceRoot":"","sources":["../src/observer-reporter.test.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "mobilewright",
|
|
3
|
-
"version": "0.0.
|
|
3
|
+
"version": "0.0.54",
|
|
4
4
|
"description": "Mobile device automation framework inspired by Playwright",
|
|
5
5
|
"homepage": "https://mobilewright.dev",
|
|
6
6
|
"license": "Apache-2.0",
|
|
@@ -34,11 +34,11 @@
|
|
|
34
34
|
"templates"
|
|
35
35
|
],
|
|
36
36
|
"dependencies": {
|
|
37
|
-
"@mobilewright/core": "^0.0.
|
|
38
|
-
"@mobilewright/driver-mobilecli": "^0.0.
|
|
39
|
-
"@mobilewright/driver-mobilenext": "^0.0.
|
|
40
|
-
"@mobilewright/inspector": "^0.0.
|
|
41
|
-
"@mobilewright/protocol": "^0.0.
|
|
37
|
+
"@mobilewright/core": "^0.0.54",
|
|
38
|
+
"@mobilewright/driver-mobilecli": "^0.0.54",
|
|
39
|
+
"@mobilewright/driver-mobilenext": "^0.0.54",
|
|
40
|
+
"@mobilewright/inspector": "^0.0.54",
|
|
41
|
+
"@mobilewright/protocol": "^0.0.54",
|
|
42
42
|
"commander": "^14.0.3",
|
|
43
43
|
"open": "^10.2.0",
|
|
44
44
|
"debug": "^4.4.3",
|
|
@@ -1,19 +0,0 @@
|
|
|
1
|
-
import type { DeviceInfo, Platform } from '@mobilewright/protocol';
|
|
2
|
-
import type { AllocationCriteria, AllocateResult, DeviceAllocator } from '../application/ports.js';
|
|
3
|
-
interface ListDevicesOpts {
|
|
4
|
-
platform?: Platform;
|
|
5
|
-
}
|
|
6
|
-
interface ListDevicesDriver {
|
|
7
|
-
listDevices(opts?: ListDevicesOpts): Promise<DeviceInfo[]>;
|
|
8
|
-
}
|
|
9
|
-
export interface MobilecliAllocatorOptions {
|
|
10
|
-
driver: ListDevicesDriver;
|
|
11
|
-
}
|
|
12
|
-
export declare class MobilecliAllocator implements DeviceAllocator {
|
|
13
|
-
private readonly driver;
|
|
14
|
-
constructor(options: MobilecliAllocatorOptions);
|
|
15
|
-
allocate(criteria: AllocationCriteria, takenDeviceIds: ReadonlySet<string>): Promise<AllocateResult>;
|
|
16
|
-
release(_deviceId: string): Promise<void>;
|
|
17
|
-
}
|
|
18
|
-
export {};
|
|
19
|
-
//# sourceMappingURL=mobilecli-allocator.d.ts.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"mobilecli-allocator.d.ts","sourceRoot":"","sources":["../../../src/device-pool/adapters/mobilecli-allocator.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,UAAU,EAAE,QAAQ,EAAE,MAAM,wBAAwB,CAAC;AAEnE,OAAO,KAAK,EAAE,kBAAkB,EAAE,cAAc,EAAE,eAAe,EAAE,MAAM,yBAAyB,CAAC;AAEnG,UAAU,eAAe;IACvB,QAAQ,CAAC,EAAE,QAAQ,CAAC;CACrB;AAED,UAAU,iBAAiB;IACzB,WAAW,CAAC,IAAI,CAAC,EAAE,eAAe,GAAG,OAAO,CAAC,UAAU,EAAE,CAAC,CAAC;CAC5D;AAED,MAAM,WAAW,yBAAyB;IACxC,MAAM,EAAE,iBAAiB,CAAC;CAC3B;AAED,qBAAa,kBAAmB,YAAW,eAAe;IACxD,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAoB;gBAE/B,OAAO,EAAE,yBAAyB;IAIxC,QAAQ,CACZ,QAAQ,EAAE,kBAAkB,EAC5B,cAAc,EAAE,WAAW,CAAC,MAAM,CAAC,GAClC,OAAO,CAAC,cAAc,CAAC;IAwBpB,OAAO,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;CAGhD"}
|
|
@@ -1,26 +0,0 @@
|
|
|
1
|
-
import { NoDeviceAvailableError } from '../application/ports.js';
|
|
2
|
-
export class MobilecliAllocator {
|
|
3
|
-
constructor(options) {
|
|
4
|
-
this.driver = options.driver;
|
|
5
|
-
}
|
|
6
|
-
async allocate(criteria, takenDeviceIds) {
|
|
7
|
-
const devices = await this.driver.listDevices(criteria.platform ? { platform: criteria.platform } : undefined);
|
|
8
|
-
const namePattern = criteria.deviceNamePattern
|
|
9
|
-
? new RegExp(criteria.deviceNamePattern)
|
|
10
|
-
: undefined;
|
|
11
|
-
const match = devices
|
|
12
|
-
.filter((d) => d.state === 'online')
|
|
13
|
-
.filter((d) => !takenDeviceIds.has(d.id))
|
|
14
|
-
.filter((d) => !criteria.deviceId || d.id === criteria.deviceId)
|
|
15
|
-
.filter((d) => !namePattern || namePattern.test(d.name))
|
|
16
|
-
.at(0);
|
|
17
|
-
if (!match) {
|
|
18
|
-
throw new NoDeviceAvailableError(`no online device available matching criteria ${JSON.stringify(criteria)}`);
|
|
19
|
-
}
|
|
20
|
-
return { deviceId: match.id, platform: match.platform, driver: 'mobilecli', model: match.model, osVersion: match.osVersion, type: match.type };
|
|
21
|
-
}
|
|
22
|
-
async release(_deviceId) {
|
|
23
|
-
// mobilecli devices are local; nothing to release.
|
|
24
|
-
}
|
|
25
|
-
}
|
|
26
|
-
//# sourceMappingURL=mobilecli-allocator.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"mobilecli-allocator.js","sourceRoot":"","sources":["../../../src/device-pool/adapters/mobilecli-allocator.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,sBAAsB,EAAE,MAAM,yBAAyB,CAAC;AAejE,MAAM,OAAO,kBAAkB;IAG7B,YAAY,OAAkC;QAC5C,IAAI,CAAC,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC;IAC/B,CAAC;IAED,KAAK,CAAC,QAAQ,CACZ,QAA4B,EAC5B,cAAmC;QAEnC,MAAM,OAAO,GAAG,MAAM,IAAI,CAAC,MAAM,CAAC,WAAW,CAC3C,QAAQ,CAAC,QAAQ,CAAC,CAAC,CAAC,EAAE,QAAQ,EAAE,QAAQ,CAAC,QAAQ,EAAE,CAAC,CAAC,CAAC,SAAS,CAChE,CAAC;QAEF,MAAM,WAAW,GAAG,QAAQ,CAAC,iBAAiB;YAC5C,CAAC,CAAC,IAAI,MAAM,CAAC,QAAQ,CAAC,iBAAiB,CAAC;YACxC,CAAC,CAAC,SAAS,CAAC;QAEd,MAAM,KAAK,GAAG,OAAO;aAClB,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,KAAK,KAAK,QAAQ,CAAC;aACnC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,cAAc,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC;aACxC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,QAAQ,CAAC,QAAQ,IAAI,CAAC,CAAC,EAAE,KAAK,QAAQ,CAAC,QAAQ,CAAC;aAC/D,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,WAAW,IAAI,WAAW,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC;aACvD,EAAE,CAAC,CAAC,CAAC,CAAC;QAET,IAAI,CAAC,KAAK,EAAE,CAAC;YACX,MAAM,IAAI,sBAAsB,CAC9B,gDAAgD,IAAI,CAAC,SAAS,CAAC,QAAQ,CAAC,EAAE,CAC3E,CAAC;QACJ,CAAC;QACD,OAAO,EAAE,QAAQ,EAAE,KAAK,CAAC,EAAE,EAAE,QAAQ,EAAE,KAAK,CAAC,QAAQ,EAAE,MAAM,EAAE,WAAW,EAAE,KAAK,EAAE,KAAK,CAAC,KAAK,EAAE,SAAS,EAAE,KAAK,CAAC,SAAS,EAAE,IAAI,EAAE,KAAK,CAAC,IAAI,EAAE,CAAC;IACjJ,CAAC;IAED,KAAK,CAAC,OAAO,CAAC,SAAiB;QAC7B,mDAAmD;IACrD,CAAC;CACF"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"mobilecli-allocator.test.d.ts","sourceRoot":"","sources":["../../../src/device-pool/adapters/mobilecli-allocator.test.ts"],"names":[],"mappings":""}
|