Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
69 changes: 55 additions & 14 deletions src/tests/tools/session/session.test.ts
Original file line number Diff line number Diff line change
Expand Up @@ -10,22 +10,26 @@ const mockAttachToSession = jest.fn<
}));

let mockSelectedDevicePlatform: 'android' | 'ios' | null = 'ios';
let mockSelectedDevice: string | null = 'device-udid';

jest.unstable_mockModule('../../../tools/session/select-device', () => ({
getSelectedLocalDevice: () => ({
get udid() {
return 'device-udid';
},
get platform() {
return mockSelectedDevicePlatform;
},
get type() {
return mockSelectedDevicePlatform === 'ios' ? 'simulator' : null;
},
get info() {
return { name: 'iPhone 12', platform: '16.0' };
},
}),
getSelectedLocalDevice: () =>
mockSelectedDevice
? {
get udid() {
return mockSelectedDevice;
},
get platform() {
return mockSelectedDevicePlatform;
},
get type() {
return mockSelectedDevicePlatform === 'ios' ? 'simulator' : null;
},
get info() {
return { name: 'iPhone 12', platform: '16.0' };
},
}
: null,
clearSelectedDevice: () => {},
}));

Expand Down Expand Up @@ -134,6 +138,7 @@ let mockFetch: jest.MockedFunction<typeof fetch>;
beforeEach(() => {
jest.clearAllMocks();
mockSelectedDevicePlatform = 'ios';
mockSelectedDevice = 'device-udid';
mockGetSessionOwnership.mockReturnValue(null);
mockAttachToSession.mockResolvedValue({
sessionId: 'attached-session-id',
Expand Down Expand Up @@ -589,6 +594,30 @@ describe('buildAndroidCapabilities', () => {
expect(caps['appium:settings[waitForSelectorTimeout]']).toBe(0);
});

test('does not override explicit appium:udid from capabilities', () => {
mockSelectedDevicePlatform = 'android';

const caps = buildAndroidCapabilities(
{},
{ 'appium:udid': 'explicit-udid' },
false
);

expect(caps['appium:udid']).toBe('explicit-udid');
});

test('does not override appium:udid from config capabilities', () => {
mockSelectedDevicePlatform = 'android';

const caps = buildAndroidCapabilities(
{ 'appium:udid': 'config-udid' },
undefined,
false
);

expect(caps['appium:udid']).toBe('config-udid');
});

test('ignores selected iOS device for local server', () => {
mockSelectedDevicePlatform = 'ios';

Expand Down Expand Up @@ -623,6 +652,18 @@ describe('buildIOSCapabilities', () => {
expect(caps['appium:bundleId']).toBe('com.example.app');
});

test('does not override explicit appium:udid from capabilities', async () => {
mockSelectedDevicePlatform = 'ios';

const caps = await buildIOSCapabilities(
{},
{ 'appium:udid': 'explicit-udid' },
false
);

expect(caps['appium:udid']).toBe('explicit-udid');
});

test('ignores selected Android device for local server', async () => {
mockSelectedDevicePlatform = 'android';

Expand Down
24 changes: 16 additions & 8 deletions src/tools/session/create-session.ts
Original file line number Diff line number Diff line change
Expand Up @@ -67,18 +67,21 @@ export function buildAndroidCapabilities(
customCaps: Record<string, any> | undefined,
isRemoteServer: boolean
): Capabilities {
const givenCaps = { ...configCaps, ...customCaps };
const selectedLocalDevice = getSelectedLocalDevice();
const selectedDeviceUdid =
!isRemoteServer &&
!givenCaps['appium:udid'] &&
selectedLocalDevice?.platform === 'android'
? selectedLocalDevice.udid
: undefined;

const defaultCaps: Capabilities = {
platformName: 'Android',
'appium:automationName': 'UiAutomator2',
'appium:deviceName': 'Android Device',
};

const selectedLocalDevice = getSelectedLocalDevice();
const selectedDeviceUdid =
!isRemoteServer && selectedLocalDevice?.platform === 'android'
? selectedLocalDevice?.udid
: undefined;

const additionalCaps = {
'appium:settings[actionAcknowledgmentTimeout]': 0,
'appium:settings[waitForIdleTimeout]': 0,
Expand Down Expand Up @@ -146,8 +149,13 @@ export async function buildIOSCapabilities(
const deviceType = selectedIOSDevice?.type || null;
await validateIOSDeviceSelection(deviceType);

// Get selected device info BEFORE constructing defaultCaps so we can use the actual device name
const selectedDeviceUdid = selectedIOSDevice?.udid;
const givenCaps = { ...configCaps, ...customCaps };
const selectedDeviceUdid =
!isRemoteServer &&
!givenCaps['appium:udid'] &&
selectedIOSDevice?.platform === 'ios'
? selectedIOSDevice.udid
: undefined;
const selectedDeviceInfo = selectedIOSDevice?.info;

log.debug('Selected device info:', selectedDeviceInfo);
Expand Down
Loading