From 0cb94dec6df8207048e64bb927b465a646088185 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Micha=C5=82=20Pierzcha=C5=82a?= Date: Thu, 15 Oct 2026 13:04:23 +0200 Subject: [PATCH 1/4] refactor(tests): name platform-web, android, host-kit, kernel, webdriver and vega tests for the module they test Pure renames; the only content changes are the vega test's self-import (now relative) and the dispatch-disclosure driver path that names the web test. Co-Authored-By: Claude Opus 5.5 --- packages/contracts/src/dispatch-disclosure.fixtures.ts | 2 +- .../{durable-file.test.ts => atomic-file-durable.test.ts} | 0 ...esented-surface.test.ts => record-presented-surface.test.ts} | 0 .../{failed-finish.test.ts => runtime-failed-finish.test.ts} | 0 .../src/{__tests__/plugin.test.ts => index.test.ts} | 2 +- ...s.test.ts => agent-browser-provider-boundary-faults.test.ts} | 0 ...st.ts => agent-browser-provider-dispatch-disclosure.test.ts} | 0 ...sh.test.ts => agent-browser-provider-record-refresh.test.ts} | 0 ....test.ts => agent-browser-provider-record-retention.test.ts} | 0 ...end.test.ts => webdriver-interactor-mutation-resend.test.ts} | 0 10 files changed, 2 insertions(+), 2 deletions(-) rename packages/host-kit/src/internal/{durable-file.test.ts => atomic-file-durable.test.ts} (100%) rename packages/kernel/src/{presented-surface.test.ts => record-presented-surface.test.ts} (100%) rename packages/platform-android/src/recording/{failed-finish.test.ts => runtime-failed-finish.test.ts} (100%) rename packages/platform-vega/src/{__tests__/plugin.test.ts => index.test.ts} (92%) rename packages/platform-web/src/__tests__/{agent-browser-boundary-faults.test.ts => agent-browser-provider-boundary-faults.test.ts} (100%) rename packages/platform-web/src/__tests__/{agent-browser-dispatch-disclosure.test.ts => agent-browser-provider-dispatch-disclosure.test.ts} (100%) rename packages/platform-web/src/__tests__/{agent-browser-record-refresh.test.ts => agent-browser-provider-record-refresh.test.ts} (100%) rename packages/platform-web/src/__tests__/{agent-browser-record-retention.test.ts => agent-browser-provider-record-retention.test.ts} (100%) rename packages/provider-webdriver/src/{webdriver-mutation-resend.test.ts => webdriver-interactor-mutation-resend.test.ts} (100%) diff --git a/packages/contracts/src/dispatch-disclosure.fixtures.ts b/packages/contracts/src/dispatch-disclosure.fixtures.ts index bcf8d9ab65..c960f77e0c 100644 --- a/packages/contracts/src/dispatch-disclosure.fixtures.ts +++ b/packages/contracts/src/dispatch-disclosure.fixtures.ts @@ -54,7 +54,7 @@ export const DISPATCH_DISCLOSURE_DRIVER_OWNERS: Readonly> 'webdriver.': 'packages/provider-webdriver/src/webdriver-transport.test.ts', 'webdriver.orientation.': 'packages/provider-webdriver/src/webdriver-orientation.test.ts', 'web-agent-browser.': - 'packages/platform-web/src/__tests__/agent-browser-dispatch-disclosure.test.ts', + 'packages/platform-web/src/__tests__/agent-browser-provider-dispatch-disclosure.test.ts', 'maestro-direct.': 'src/__tests__/daemon-composition/interaction/interaction-touch-direct-ios.test.ts', }; diff --git a/packages/host-kit/src/internal/durable-file.test.ts b/packages/host-kit/src/internal/atomic-file-durable.test.ts similarity index 100% rename from packages/host-kit/src/internal/durable-file.test.ts rename to packages/host-kit/src/internal/atomic-file-durable.test.ts diff --git a/packages/kernel/src/presented-surface.test.ts b/packages/kernel/src/record-presented-surface.test.ts similarity index 100% rename from packages/kernel/src/presented-surface.test.ts rename to packages/kernel/src/record-presented-surface.test.ts diff --git a/packages/platform-android/src/recording/failed-finish.test.ts b/packages/platform-android/src/recording/runtime-failed-finish.test.ts similarity index 100% rename from packages/platform-android/src/recording/failed-finish.test.ts rename to packages/platform-android/src/recording/runtime-failed-finish.test.ts diff --git a/packages/platform-vega/src/__tests__/plugin.test.ts b/packages/platform-vega/src/index.test.ts similarity index 92% rename from packages/platform-vega/src/__tests__/plugin.test.ts rename to packages/platform-vega/src/index.test.ts index 0ae50cf022..33cf97b9f0 100644 --- a/packages/platform-vega/src/__tests__/plugin.test.ts +++ b/packages/platform-vega/src/index.test.ts @@ -1,7 +1,7 @@ import assert from 'node:assert/strict'; import { test } from 'vitest'; import type { DeviceInfo } from '@agent-device/kernel/device'; -import { vegaPlugin } from '@agent-device/platform-vega'; +import { vegaPlugin } from './index.ts'; const VEGA_VVD = { platform: 'vega', diff --git a/packages/platform-web/src/__tests__/agent-browser-boundary-faults.test.ts b/packages/platform-web/src/__tests__/agent-browser-provider-boundary-faults.test.ts similarity index 100% rename from packages/platform-web/src/__tests__/agent-browser-boundary-faults.test.ts rename to packages/platform-web/src/__tests__/agent-browser-provider-boundary-faults.test.ts diff --git a/packages/platform-web/src/__tests__/agent-browser-dispatch-disclosure.test.ts b/packages/platform-web/src/__tests__/agent-browser-provider-dispatch-disclosure.test.ts similarity index 100% rename from packages/platform-web/src/__tests__/agent-browser-dispatch-disclosure.test.ts rename to packages/platform-web/src/__tests__/agent-browser-provider-dispatch-disclosure.test.ts diff --git a/packages/platform-web/src/__tests__/agent-browser-record-refresh.test.ts b/packages/platform-web/src/__tests__/agent-browser-provider-record-refresh.test.ts similarity index 100% rename from packages/platform-web/src/__tests__/agent-browser-record-refresh.test.ts rename to packages/platform-web/src/__tests__/agent-browser-provider-record-refresh.test.ts diff --git a/packages/platform-web/src/__tests__/agent-browser-record-retention.test.ts b/packages/platform-web/src/__tests__/agent-browser-provider-record-retention.test.ts similarity index 100% rename from packages/platform-web/src/__tests__/agent-browser-record-retention.test.ts rename to packages/platform-web/src/__tests__/agent-browser-provider-record-retention.test.ts diff --git a/packages/provider-webdriver/src/webdriver-mutation-resend.test.ts b/packages/provider-webdriver/src/webdriver-interactor-mutation-resend.test.ts similarity index 100% rename from packages/provider-webdriver/src/webdriver-mutation-resend.test.ts rename to packages/provider-webdriver/src/webdriver-interactor-mutation-resend.test.ts From b1fdefecf2bb78a91d14e6a225741503258dad2c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Micha=C5=82=20Pierzcha=C5=82a?= Date: Thu, 15 Oct 2026 13:05:05 +0200 Subject: [PATCH 2/4] refactor(webdriver): split the profile-field declaration test by the module it covers browserstack-profile-fields, aws-device-farm-profile-fields and index-profile-fields each sit beside their module; the shared consumedProfileFields helper joins the package's profile-fields fixtures. Co-Authored-By: Claude Opus 5.5 --- .../aws-device-farm-profile-fields.test.ts | 15 +++++ .../src/browserstack-profile-fields.test.ts | 23 ++++++++ .../src/index-profile-fields.test.ts | 18 ++++++ .../src/profile-fields.fixtures.ts | 11 +++- .../src/provider-profile-fields.test.ts | 59 ------------------- 5 files changed, 66 insertions(+), 60 deletions(-) create mode 100644 packages/provider-webdriver/src/aws-device-farm-profile-fields.test.ts create mode 100644 packages/provider-webdriver/src/browserstack-profile-fields.test.ts create mode 100644 packages/provider-webdriver/src/index-profile-fields.test.ts delete mode 100644 packages/provider-webdriver/src/provider-profile-fields.test.ts diff --git a/packages/provider-webdriver/src/aws-device-farm-profile-fields.test.ts b/packages/provider-webdriver/src/aws-device-farm-profile-fields.test.ts new file mode 100644 index 0000000000..45efd819eb --- /dev/null +++ b/packages/provider-webdriver/src/aws-device-farm-profile-fields.test.ts @@ -0,0 +1,15 @@ +import { test } from 'vitest'; +import assert from 'node:assert/strict'; +import { AWS_DEVICE_FARM_PROFILE_FIELDS } from './aws-device-farm.ts'; +import { consumedProfileFields } from './profile-fields.fixtures.ts'; + +test('AWS Device Farm consumes only its own fields and the session name', () => { + assert.deepEqual(consumedProfileFields(AWS_DEVICE_FARM_PROFILE_FIELDS), [ + 'awsAppArn', + 'awsDeviceArn', + 'awsInteractionMode', + 'awsProjectArn', + 'awsRegion', + 'providerSessionName', + ]); +}); diff --git a/packages/provider-webdriver/src/browserstack-profile-fields.test.ts b/packages/provider-webdriver/src/browserstack-profile-fields.test.ts new file mode 100644 index 0000000000..0f57ca4975 --- /dev/null +++ b/packages/provider-webdriver/src/browserstack-profile-fields.test.ts @@ -0,0 +1,23 @@ +import { test } from 'vitest'; +import assert from 'node:assert/strict'; +import type { ProviderProfileField } from '@agent-device/contracts/provider-profile-fields'; +import { BROWSERSTACK_PROFILE_FIELDS } from './browserstack.ts'; +import { BROWSERSTACK_DEVICE_FEATURE_SPECS } from './browserstack-device-features.ts'; +import { consumedProfileFields } from './profile-fields.fixtures.ts'; + +// Fields a hub reads directly while building its session, outside the device-feature table. +const HUB_SESSION_FIELDS: readonly ProviderProfileField[] = [ + 'providerApp', + 'providerOsVersion', + 'providerProject', + 'providerBuild', + 'providerSessionName', +]; + +// A consumed device feature with no capability row would be accepted and then dropped at the hub. +test('BrowserStack consumes exactly the fields its capability builder reads', () => { + assert.deepEqual( + consumedProfileFields(BROWSERSTACK_PROFILE_FIELDS), + [...HUB_SESSION_FIELDS, ...BROWSERSTACK_DEVICE_FEATURE_SPECS.map((spec) => spec.field)].sort(), + ); +}); diff --git a/packages/provider-webdriver/src/index-profile-fields.test.ts b/packages/provider-webdriver/src/index-profile-fields.test.ts new file mode 100644 index 0000000000..636b49850b --- /dev/null +++ b/packages/provider-webdriver/src/index-profile-fields.test.ts @@ -0,0 +1,18 @@ +import { test } from 'vitest'; +import assert from 'node:assert/strict'; +import { BUNDLED_CLOUD_WEBDRIVER_PROVIDERS } from './index.ts'; + +test('every bundled runtime reads the profile fields declared under its provider id', () => { + const host = { + env: {}, + clientVersion: 'test', + runHostCommand: async () => { + throw new Error('declarations need no host command'); + }, + }; + for (const bundled of BUNDLED_CLOUD_WEBDRIVER_PROVIDERS) { + const { webDriver } = bundled.create(host); + assert.equal(webDriver.provider, bundled.declaration.provider); + assert.equal(webDriver.profileFields.provider, bundled.declaration.provider); + } +}); diff --git a/packages/provider-webdriver/src/profile-fields.fixtures.ts b/packages/provider-webdriver/src/profile-fields.fixtures.ts index f52e710f25..a9afea4594 100644 --- a/packages/provider-webdriver/src/profile-fields.fixtures.ts +++ b/packages/provider-webdriver/src/profile-fields.fixtures.ts @@ -1,4 +1,7 @@ -import type { ProviderProfileFieldDeclaration } from '@agent-device/contracts/provider-profile-fields'; +import type { + ProviderProfileField, + ProviderProfileFieldDeclaration, +} from '@agent-device/contracts/provider-profile-fields'; /** A test hub that reads every profile field, so no flag is refused. */ export function consumeAllProfileFields(provider: string): ProviderProfileFieldDeclaration { @@ -29,3 +32,9 @@ export function consumeAllProfileFields(provider: string): ProviderProfileFieldD }, }; } + +export function consumedProfileFields({ fields }: ProviderProfileFieldDeclaration): string[] { + return (Object.keys(fields) as ProviderProfileField[]) + .filter((field) => fields[field] === 'consumed') + .sort(); +} diff --git a/packages/provider-webdriver/src/provider-profile-fields.test.ts b/packages/provider-webdriver/src/provider-profile-fields.test.ts deleted file mode 100644 index 7439bacd61..0000000000 --- a/packages/provider-webdriver/src/provider-profile-fields.test.ts +++ /dev/null @@ -1,59 +0,0 @@ -import { test } from 'vitest'; -import assert from 'node:assert/strict'; -import type { - ProviderProfileField, - ProviderProfileFieldDeclaration, -} from '@agent-device/contracts/provider-profile-fields'; -import { AWS_DEVICE_FARM_PROFILE_FIELDS } from './aws-device-farm.ts'; -import { BROWSERSTACK_PROFILE_FIELDS } from './browserstack.ts'; -import { BUNDLED_CLOUD_WEBDRIVER_PROVIDERS } from './index.ts'; -import { BROWSERSTACK_DEVICE_FEATURE_SPECS } from './browserstack-device-features.ts'; - -// Fields a hub reads directly while building its session, outside the device-feature table. -const HUB_SESSION_FIELDS: readonly ProviderProfileField[] = [ - 'providerApp', - 'providerOsVersion', - 'providerProject', - 'providerBuild', - 'providerSessionName', -]; - -function consumedFields({ fields }: ProviderProfileFieldDeclaration): string[] { - return (Object.keys(fields) as ProviderProfileField[]) - .filter((field) => fields[field] === 'consumed') - .sort(); -} - -test('every bundled runtime reads the profile fields declared under its provider id', () => { - const host = { - env: {}, - clientVersion: 'test', - runHostCommand: async () => { - throw new Error('declarations need no host command'); - }, - }; - for (const bundled of BUNDLED_CLOUD_WEBDRIVER_PROVIDERS) { - const { webDriver } = bundled.create(host); - assert.equal(webDriver.provider, bundled.declaration.provider); - assert.equal(webDriver.profileFields.provider, bundled.declaration.provider); - } -}); - -// A consumed device feature with no capability row would be accepted and then dropped at the hub. -test('BrowserStack consumes exactly the fields its capability builder reads', () => { - assert.deepEqual( - consumedFields(BROWSERSTACK_PROFILE_FIELDS), - [...HUB_SESSION_FIELDS, ...BROWSERSTACK_DEVICE_FEATURE_SPECS.map((spec) => spec.field)].sort(), - ); -}); - -test('AWS Device Farm consumes only its own fields and the session name', () => { - assert.deepEqual(consumedFields(AWS_DEVICE_FARM_PROFILE_FIELDS), [ - 'awsAppArn', - 'awsDeviceArn', - 'awsInteractionMode', - 'awsProjectArn', - 'awsRegion', - 'providerSessionName', - ]); -}); From c330d5be46c72d0d1360317f83212838cfa42e02 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Micha=C5=82=20Pierzcha=C5=82a?= Date: Thu, 15 Oct 2026 14:06:23 +0200 Subject: [PATCH 3/4] test(web): drop the provider-startup cleanup mock the dispatch-disclosure driver never reaches A temporary spy on the mocked cleanupManagedAgentBrowserOrphansForProviderStartup recorded zero calls across all eight cases, so the mock and its hoisted spy did nothing. Co-Authored-By: Claude Opus 5.5 --- ...t-browser-provider-dispatch-disclosure.test.ts | 15 +-------------- 1 file changed, 1 insertion(+), 14 deletions(-) diff --git a/packages/platform-web/src/__tests__/agent-browser-provider-dispatch-disclosure.test.ts b/packages/platform-web/src/__tests__/agent-browser-provider-dispatch-disclosure.test.ts index a224909872..9fee952f52 100644 --- a/packages/platform-web/src/__tests__/agent-browser-provider-dispatch-disclosure.test.ts +++ b/packages/platform-web/src/__tests__/agent-browser-provider-dispatch-disclosure.test.ts @@ -5,7 +5,7 @@ // produce one for a current provider argv, that row's driver says so. import assert from 'node:assert/strict'; import fs from 'node:fs'; -import { test, vi } from 'vitest'; +import { test } from 'vitest'; import { assertDispatchDisclosureDriversMatchRows, DISPATCH_DISCLOSURE_TABLE_PATH, @@ -18,19 +18,6 @@ import { mkdtempForTestSync, withManagedAgentBrowserProvider, } from './test-utils.ts'; - -const { providerStartupCleanupMock } = vi.hoisted(() => ({ - providerStartupCleanupMock: vi.fn(async () => undefined), -})); - -vi.mock('../agent-browser-lifecycle.ts', async (importOriginal) => { - const actual = await importOriginal(); - return { - ...actual, - cleanupManagedAgentBrowserOrphansForProviderStartup: providerStartupCleanupMock, - }; -}); - import { createAgentBrowserWebProvider } from '../agent-browser-provider.ts'; import type { WebProvider } from '../provider.ts'; From ab774b6eddf48cf84023b2bf5a4e28186ea62130 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Micha=C5=82=20Pierzcha=C5=82a?= Date: Thu, 15 Oct 2026 14:06:32 +0200 Subject: [PATCH 4/4] refactor(android): name the dispatch-disclosure driver for the package entry The driver exercises input-actions, text-input, touch-helper and the adb executor against the contracts table, so it takes the package entry's name. The owning-path strings in the contracts fixture follow. Co-Authored-By: Claude Opus 5.5 --- packages/contracts/src/dispatch-disclosure.fixtures.ts | 4 ++-- ...h-disclosure.test.ts => index-dispatch-disclosure.test.ts} | 0 2 files changed, 2 insertions(+), 2 deletions(-) rename packages/platform-android/src/__tests__/{dispatch-disclosure.test.ts => index-dispatch-disclosure.test.ts} (100%) diff --git a/packages/contracts/src/dispatch-disclosure.fixtures.ts b/packages/contracts/src/dispatch-disclosure.fixtures.ts index c960f77e0c..0f16b0fe21 100644 --- a/packages/contracts/src/dispatch-disclosure.fixtures.ts +++ b/packages/contracts/src/dispatch-disclosure.fixtures.ts @@ -47,8 +47,8 @@ export const DISPATCH_DISCLOSURE_DRIVER_OWNERS: Readonly> 'packages/platform-apple/src/runner/__tests__/runner-lifecycle-dispatch-disclosure.test.ts', 'ios-runner.transport.': 'packages/platform-apple/src/runner/__tests__/runner-lifecycle-dispatch-disclosure.test.ts', - 'android-adb.': 'packages/platform-android/src/__tests__/dispatch-disclosure.test.ts', - 'android-helper.': 'packages/platform-android/src/__tests__/dispatch-disclosure.test.ts', + 'android-adb.': 'packages/platform-android/src/__tests__/index-dispatch-disclosure.test.ts', + 'android-helper.': 'packages/platform-android/src/__tests__/index-dispatch-disclosure.test.ts', 'android-helper.gesture-session.': 'packages/platform-android/src/__tests__/touch-helper-session.test.ts', 'webdriver.': 'packages/provider-webdriver/src/webdriver-transport.test.ts', diff --git a/packages/platform-android/src/__tests__/dispatch-disclosure.test.ts b/packages/platform-android/src/__tests__/index-dispatch-disclosure.test.ts similarity index 100% rename from packages/platform-android/src/__tests__/dispatch-disclosure.test.ts rename to packages/platform-android/src/__tests__/index-dispatch-disclosure.test.ts