@@ -223,6 +223,193 @@ describe('sessionEnvironmentDetector', () => {
223223 const { isAndroid } = sessionEnvironmentDetector ( { capabilities, requestedCapabilities } )
224224 expect ( isAndroid ) . toEqual ( true )
225225 } )
226+
227+ it ( 'should detect Android by device name in bstack:options using sessionEnvironmentDetector' , ( ) => {
228+ expect ( sessionEnvironmentDetector ( {
229+ capabilities : { 'bstack:options' : { deviceName : 'Samsung Galaxy S21' } } ,
230+ requestedCapabilities : { }
231+ } ) . isAndroid ) . toBe ( true )
232+
233+ expect ( sessionEnvironmentDetector ( {
234+ capabilities : { 'bstack:options' : { deviceName : 'Google Pixel 7' } } ,
235+ requestedCapabilities : { }
236+ } ) . isAndroid ) . toBe ( true )
237+
238+ expect ( sessionEnvironmentDetector ( {
239+ capabilities : { 'bstack:options' : { deviceName : 'OnePlus 9 Pro' } } ,
240+ requestedCapabilities : { }
241+ } ) . isAndroid ) . toBe ( true )
242+
243+ expect ( sessionEnvironmentDetector ( {
244+ capabilities : { 'bstack:options' : { deviceName : 'Nexus 5X' } } ,
245+ requestedCapabilities : { }
246+ } ) . isAndroid ) . toBe ( true )
247+ } )
248+
249+ it ( 'should detect Android by device name in bstack:options using capabilitiesEnvironmentDetector' , ( ) => {
250+ expect ( capabilitiesEnvironmentDetector ( {
251+ 'bstack:options' : { deviceName : 'Samsung Galaxy S21' }
252+ } ) . isAndroid ) . toBe ( true )
253+
254+ expect ( capabilitiesEnvironmentDetector ( {
255+ 'bstack:options' : { deviceName : 'Google Pixel 7' }
256+ } ) . isAndroid ) . toBe ( true )
257+
258+ expect ( capabilitiesEnvironmentDetector ( {
259+ 'bstack:options' : { deviceName : 'OnePlus 9 Pro' }
260+ } ) . isAndroid ) . toBe ( true )
261+
262+ expect ( capabilitiesEnvironmentDetector ( {
263+ 'bstack:options' : { deviceName : 'Nexus 5X' }
264+ } ) . isAndroid ) . toBe ( true )
265+ } )
266+
267+ it ( 'should detect Android by various manufacturer device names with sessionEnvironmentDetector' , ( ) => {
268+ const androidDevices = [
269+ 'LG G8' ,
270+ 'HTC One' ,
271+ 'Motorola Edge' ,
272+ 'Sony Xperia' ,
273+ 'Huawei P30' ,
274+ 'Vivo V21' ,
275+ 'Oppo Find X3' ,
276+ 'Xiaomi Mi 11' ,
277+ 'Redmi Note 10' ,
278+ 'Realme GT' ,
279+ 'Samsung Galaxy Note'
280+ ]
281+
282+ androidDevices . forEach ( deviceName => {
283+ expect ( sessionEnvironmentDetector ( {
284+ capabilities : { 'bstack:options' : { deviceName } } ,
285+ requestedCapabilities : { }
286+ } ) . isAndroid ) . toBe ( true )
287+ } )
288+ } )
289+
290+ it ( 'should detect Android by various manufacturer device names with capabilitiesEnvironmentDetector' , ( ) => {
291+ const androidDevices = [
292+ 'LG G8' ,
293+ 'HTC One' ,
294+ 'Motorola Edge' ,
295+ 'Sony Xperia' ,
296+ 'Huawei P30' ,
297+ 'Vivo V21' ,
298+ 'Oppo Find X3' ,
299+ 'Xiaomi Mi 11' ,
300+ 'Redmi Note 10' ,
301+ 'Realme GT' ,
302+ 'Samsung Galaxy Note'
303+ ]
304+
305+ androidDevices . forEach ( deviceName => {
306+ expect ( capabilitiesEnvironmentDetector ( {
307+ 'bstack:options' : { deviceName }
308+ } ) . isAndroid ) . toBe ( true )
309+ } )
310+ } )
311+
312+ it ( 'should not detect Android for non-Android device names with sessionEnvironmentDetector' , ( ) => {
313+ const nonAndroidDevices = [
314+ 'iPhone 13' ,
315+ 'iPad Pro' ,
316+ 'iPhone SE' ,
317+ 'iPad Mini' ,
318+ 'Desktop Chrome' ,
319+ 'MacBook Pro'
320+ ]
321+
322+ nonAndroidDevices . forEach ( deviceName => {
323+ expect ( sessionEnvironmentDetector ( {
324+ capabilities : { 'bstack:options' : { deviceName } } ,
325+ requestedCapabilities : { }
326+ } ) . isAndroid ) . toBe ( false )
327+ } )
328+ } )
329+
330+ it ( 'should not detect Android for non-Android device names with capabilitiesEnvironmentDetector' , ( ) => {
331+ const nonAndroidDevices = [
332+ 'iPhone 13' ,
333+ 'iPad Pro' ,
334+ 'iPhone SE' ,
335+ 'iPad Mini' ,
336+ 'Desktop Chrome' ,
337+ 'MacBook Pro'
338+ ]
339+
340+ nonAndroidDevices . forEach ( deviceName => {
341+ expect ( capabilitiesEnvironmentDetector ( {
342+ 'bstack:options' : { deviceName }
343+ } ) . isAndroid ) . toBe ( false )
344+ } )
345+ } )
346+
347+ it ( 'should detect Android case-insensitively by device name with both detectors' , ( ) => {
348+ expect ( sessionEnvironmentDetector ( {
349+ capabilities : { 'bstack:options' : { deviceName : 'SAMSUNG GALAXY S21' } } ,
350+ requestedCapabilities : { }
351+ } ) . isAndroid ) . toBe ( true )
352+
353+ expect ( capabilitiesEnvironmentDetector ( {
354+ 'bstack:options' : { deviceName : 'google pixel 7' }
355+ } ) . isAndroid ) . toBe ( true )
356+
357+ expect ( sessionEnvironmentDetector ( {
358+ capabilities : { 'bstack:options' : { deviceName : 'Galaxy S22' } } ,
359+ requestedCapabilities : { }
360+ } ) . isAndroid ) . toBe ( true )
361+
362+ expect ( capabilitiesEnvironmentDetector ( {
363+ 'bstack:options' : { deviceName : 'ONEPLUS 10' }
364+ } ) . isAndroid ) . toBe ( true )
365+ } )
366+
367+ it ( 'should detect Android when both platform and device name are present' , ( ) => {
368+ const capabilities = {
369+ platformName : 'Android' ,
370+ 'bstack:options' : { deviceName : 'Samsung Galaxy S21' }
371+ }
372+
373+ expect ( sessionEnvironmentDetector ( {
374+ capabilities,
375+ requestedCapabilities : { }
376+ } ) . isAndroid ) . toBe ( true )
377+
378+ expect ( capabilitiesEnvironmentDetector ( capabilities ) . isAndroid ) . toBe ( true )
379+ } )
380+
381+ it ( 'should detect Android when only device name is present without platform' , ( ) => {
382+ const capabilities = { 'bstack:options' : { deviceName : 'Pixel 7' } }
383+
384+ expect ( sessionEnvironmentDetector ( {
385+ capabilities,
386+ requestedCapabilities : { }
387+ } ) . isAndroid ) . toBe ( true )
388+
389+ expect ( capabilitiesEnvironmentDetector ( capabilities ) . isAndroid ) . toBe ( true )
390+ } )
391+
392+ it ( 'should handle empty deviceName in bstack:options' , ( ) => {
393+ const capabilities = { 'bstack:options' : { deviceName : '' } }
394+
395+ expect ( sessionEnvironmentDetector ( {
396+ capabilities,
397+ requestedCapabilities : { }
398+ } ) . isAndroid ) . toBe ( false )
399+
400+ expect ( capabilitiesEnvironmentDetector ( capabilities ) . isAndroid ) . toBe ( false )
401+ } )
402+
403+ it ( 'should handle missing deviceName in bstack:options' , ( ) => {
404+ const capabilities = { 'bstack:options' : { } }
405+
406+ expect ( sessionEnvironmentDetector ( {
407+ capabilities,
408+ requestedCapabilities : { }
409+ } ) . isAndroid ) . toBe ( false )
410+
411+ expect ( capabilitiesEnvironmentDetector ( capabilities ) . isAndroid ) . toBe ( false )
412+ } )
226413 } )
227414
228415 it ( 'isSeleniumStandalone' , ( ) => {
0 commit comments