diff --git a/packages/contracts/src/dispatch-disclosure.fixtures.ts b/packages/contracts/src/dispatch-disclosure.fixtures.ts index bcf8d9ab65..0f16b0fe21 100644 --- a/packages/contracts/src/dispatch-disclosure.fixtures.ts +++ b/packages/contracts/src/dispatch-disclosure.fixtures.ts @@ -47,14 +47,14 @@ 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', '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/__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 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 94% 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 index a224909872..9fee952f52 100644 --- 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 @@ -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'; 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/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', - ]); -}); 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