Skip to content
Open
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
19 changes: 14 additions & 5 deletions packages/wdio-browserstack-service/src/insights-handler.ts
Original file line number Diff line number Diff line change
@@ -1,12 +1,14 @@
import path from 'node:path'

import type { Frameworks } from '@wdio/types'
import type { Frameworks, Options } from '@wdio/types'
import type { BeforeCommandArgs, AfterCommandArgs } from '@wdio/reporter'

import { v4 as uuidv4 } from 'uuid'
import type { CucumberStore, Feature, Scenario, Step, FeatureChild, CucumberHook, CucumberHookParams, Pickle, ITestCaseHookParameter } from './cucumber-types.js'
import TestReporter from './reporter.js'

import type { BrowserstackConfig } from './types.js'

import {
frameworkSupportsHook,
getCloudProvider, getFailureObject,
Expand All @@ -20,6 +22,7 @@ import {
isUndefined,
o11yClassErrorHandler,
removeAnsiColors,
getObservabilityProduct
} from './util.js'
import type {
TestData,
Expand Down Expand Up @@ -53,24 +56,30 @@ class _InsightsHandler {
private _currentTestId: string | undefined
private _cbtQueue: Array<CBTData> = []

constructor (private _browser: WebdriverIO.Browser | WebdriverIO.MultiRemoteBrowser, isAppAutomate?: boolean, private _framework?: string, _userCaps?: Capabilities.RemoteCapability) {
constructor (private _browser: WebdriverIO.Browser | WebdriverIO.MultiRemoteBrowser, private _framework?: string, _userCaps?: Capabilities.RemoteCapability, _options?: BrowserstackConfig & Options.Testrunner) {
const caps = (this._browser as WebdriverIO.Browser).capabilities as WebdriverIO.Capabilities
const sessionId = (this._browser as WebdriverIO.Browser).sessionId

this._userCaps = _userCaps

this._platformMeta = {
browserName: caps.browserName,
browserVersion: caps?.browserVersion,
platformName: caps?.platformName,
caps: caps,
sessionId,
product: isAppAutomate ? 'app-automate' : 'automate'
product: getObservabilityProduct(_options, this._isAppAutomate())
}

this._userCaps = _userCaps

this.registerListeners()
}

_isAppAutomate(): boolean {
const browserDesiredCapabilities = (this._browser?.capabilities ?? {}) as Capabilities.DesiredCapabilities
const desiredCapabilities = (this._userCaps ?? {}) as Capabilities.DesiredCapabilities
return !!browserDesiredCapabilities['appium:app'] || !!desiredCapabilities['appium:app'] || !!(( desiredCapabilities as any)['appium:options']?.app)
}

registerListeners() {
if (!(this._framework === 'mocha' || this._framework === 'cucumber')) {
return
Expand Down
5 changes: 3 additions & 2 deletions packages/wdio-browserstack-service/src/service.ts
Original file line number Diff line number Diff line change
Expand Up @@ -69,6 +69,7 @@ export default class BrowserstackService implements Services.ServiceInstance {
if (process.env.BROWSERSTACK_TURBOSCALE) {
this._turboScale = process.env.BROWSERSTACK_TURBOSCALE === 'true'
}
process.env.BROWSERSTACK_TURBOSCALE_INTERNAL = String(this._turboScale)

// Cucumber specific
const strict = Boolean(this._config.cucumberOpts && this._config.cucumberOpts.strict)
Expand Down Expand Up @@ -153,9 +154,9 @@ export default class BrowserstackService implements Services.ServiceInstance {

this._insightsHandler = new InsightsHandler(
this._browser,
this._isAppAutomate(),
this._config.framework,
this._caps
this._caps,
this._options
)
await this._insightsHandler.before()
}
Expand Down
10 changes: 10 additions & 0 deletions packages/wdio-browserstack-service/src/util.ts
Original file line number Diff line number Diff line change
Expand Up @@ -1399,6 +1399,16 @@ export const getErrorString = (err: unknown) => {
}
}

export function isTurboScale(options: (BrowserstackConfig & Options.Testrunner) | undefined): boolean {
return Boolean(options?.turboScale)
}

export function getObservabilityProduct(options: (BrowserstackConfig & Options.Testrunner) | undefined, isAppAutomate: boolean | undefined): string {
return isAppAutomate
? 'app-automate'
: (isTurboScale(options) ? 'turboscale' : 'automate')
}

export const hasBrowserName = (cap: Options.Testrunner): boolean => {
if (!cap || !cap.capabilities) {
return false
Expand Down
48 changes: 24 additions & 24 deletions packages/wdio-browserstack-service/tests/insights-handler.test.ts
Original file line number Diff line number Diff line change
Expand Up @@ -62,11 +62,11 @@ beforeEach(() => {
execute: vi.fn(),
on: vi.fn(),
} as any as WebdriverIO.Browser | WebdriverIO.MultiRemoteBrowser
insightsHandler = new InsightsHandler(browser, false, 'framework')
insightsHandler = new InsightsHandler(browser, 'framework')
})

it('should initialize correctly', () => {
insightsHandler = new InsightsHandler(browser, false, 'framework')
insightsHandler = new InsightsHandler(browser, 'framework')
expect(insightsHandler['_tests']).toEqual({})
expect(insightsHandler['_hooks']).toEqual({})
expect(insightsHandler['_commands']).toEqual({})
Expand All @@ -77,7 +77,7 @@ describe('before', () => {
const isBrowserstackSessionSpy = vi.spyOn(utils, 'isBrowserstackSession')

beforeEach(() => {
insightsHandler = new InsightsHandler(browser, false, 'framework')
insightsHandler = new InsightsHandler(browser, 'framework')
isBrowserstackSessionSpy.mockClear()
})

Expand All @@ -97,7 +97,7 @@ describe('beforeScenario', () => {
let insightsHandler: InsightsHandler

beforeEach(() => {
insightsHandler = new InsightsHandler(browser, false, 'framework')
insightsHandler = new InsightsHandler(browser, 'framework')
vi.spyOn(utils, 'getUniqueIdentifierForCucumber').mockReturnValue('test title')
insightsHandler['getTestRunDataForCucumber'] = vi.fn()
insightsHandler['_tests'] = {}
Expand Down Expand Up @@ -125,7 +125,7 @@ describe('afterScenario', () => {
let insightsHandler: InsightsHandler

beforeEach(() => {
insightsHandler = new InsightsHandler(browser, false, 'framework')
insightsHandler = new InsightsHandler(browser, 'framework')
insightsHandler['getTestRunDataForCucumber'] = vi.fn()
insightsHandler['_tests'] = {}
})
Expand All @@ -152,7 +152,7 @@ describe('beforeStep', () => {
let insightsHandler: InsightsHandler

beforeEach(() => {
insightsHandler = new InsightsHandler(browser, false, 'framework')
insightsHandler = new InsightsHandler(browser, 'framework')
vi.spyOn(utils, 'getUniqueIdentifierForCucumber').mockReturnValue('test title')
insightsHandler['getHierarchy'] = vi.fn().mockImplementation(() => { return [] })
})
Expand Down Expand Up @@ -205,7 +205,7 @@ describe('afterStep', () => {
let insightsHandler: InsightsHandler

beforeEach(() => {
insightsHandler = new InsightsHandler(browser, false, 'framework')
insightsHandler = new InsightsHandler(browser, 'framework')
vi.spyOn(utils, 'getUniqueIdentifierForCucumber').mockReturnValue('test title')
insightsHandler['getHierarchy'] = vi.fn().mockImplementation(() => { return [] })
})
Expand Down Expand Up @@ -328,7 +328,7 @@ describe('attachHookData', () => {
let insightsHandler: InsightsHandler

beforeEach(() => {
insightsHandler = new InsightsHandler(browser, false, 'framework')
insightsHandler = new InsightsHandler(browser, 'framework')
})

it('add hooks data in test', () => {
Expand Down Expand Up @@ -377,7 +377,7 @@ describe('attachHookData', () => {
describe('setHooksFromSuite', () => {
let insightsHandler: InsightsHandler
beforeEach(() => {
insightsHandler = new InsightsHandler(browser, false, 'framework')
insightsHandler = new InsightsHandler(browser, 'framework')
insightsHandler['_hooks'] = {}
})

Expand Down Expand Up @@ -405,7 +405,7 @@ describe('getHierarchy', () => {
let insightsHandler

beforeEach(() => {
insightsHandler = new InsightsHandler(browser, false, 'framework')
insightsHandler = new InsightsHandler(browser, 'framework')
})

it('return array of getHierarchy when context present', () => {
Expand All @@ -431,7 +431,7 @@ describe('getHierarchy', () => {
describe('getTestRunId', function () {
let insightsHandler: InsightsHandler
beforeEach(() => {
insightsHandler = new InsightsHandler(browser, false, 'framework')
insightsHandler = new InsightsHandler(browser, 'framework')
})

it('should return if null context', () => {
Expand Down Expand Up @@ -468,7 +468,7 @@ describe('getTestRunId', function () {
describe('getTestRunIdFromSuite', function () {
let insightsHandler: InsightsHandler
beforeEach(() => {
insightsHandler = new InsightsHandler(browser, false, 'framework')
insightsHandler = new InsightsHandler(browser, 'framework')
})

it('should return null if parent null', function () {
Expand All @@ -494,7 +494,7 @@ describe('beforeTest', () => {

describe('mocha', () => {
beforeEach(() => {
insightsHandler = new InsightsHandler(browser, false, 'mocha')
insightsHandler = new InsightsHandler(browser, 'mocha')
insightsHandler['getRunData'] = vi.fn().mockImplementation(() => { return [] })
vi.spyOn(utils, 'getUniqueIdentifier').mockReturnValue('test title')
insightsHandler['_tests'] = {}
Expand All @@ -512,7 +512,7 @@ describe('beforeTest', () => {

describe('jasmine', () => {
beforeEach(() => {
insightsHandler = new InsightsHandler(browser, false, 'jasmine')
insightsHandler = new InsightsHandler(browser, 'jasmine')
insightsHandler['getRunData'] = vi.fn().mockImplementation(() => { return [] })
insightsHandler['_tests'] = {}
})
Expand All @@ -530,7 +530,7 @@ describe('beforeHook', () => {

describe('mocha', () => {
beforeEach(() => {
insightsHandler = new InsightsHandler(browser, false, 'mocha')
insightsHandler = new InsightsHandler(browser, 'mocha')
insightsHandler['getRunData'] = vi.fn().mockImplementation(() => { return [] })
insightsHandler['attachHookData'] = vi.fn().mockImplementation(() => { return [] })
insightsHandler['_tests'] = {}
Expand All @@ -552,7 +552,7 @@ describe('beforeHook', () => {

describe('cucumber', () => {
beforeEach(() => {
insightsHandler = new InsightsHandler(browser, false, 'cucumber')
insightsHandler = new InsightsHandler(browser, 'cucumber')
insightsHandler['processCucumberHook'] = vi.fn().mockImplementation(() => { return [] })
insightsHandler['_framework'] = 'cucumber'
})
Expand All @@ -569,7 +569,7 @@ describe('afterHook', () => {

describe('mocha', () => {
beforeEach(() => {
insightsHandler = new InsightsHandler(browser, false, 'mocha')
insightsHandler = new InsightsHandler(browser, 'mocha')
insightsHandler['getRunData'] = vi.fn().mockImplementation(() => { return [] })
insightsHandler['attachHookData'] = vi.fn().mockImplementation(() => { return [] })

Expand All @@ -596,7 +596,7 @@ describe('afterHook', () => {

describe('cucumber', () => {
beforeEach(() => {
insightsHandler = new InsightsHandler(browser, false, 'cucumber')
insightsHandler = new InsightsHandler(browser, 'cucumber')
insightsHandler['processCucumberHook'] = vi.fn().mockImplementation(() => { return [] })
})

Expand All @@ -616,7 +616,7 @@ describe('getIntegrationsObject', () => {
})

beforeEach(() => {
insightsHandler = new InsightsHandler(browser, false, 'framework')
insightsHandler = new InsightsHandler(browser, 'framework')
insightsHandler['_platformMeta'] = { caps: {}, sessionId: '', browserName: '', browserVersion: '', platformName: '', product: '' }
})

Expand Down Expand Up @@ -649,7 +649,7 @@ describe('browserCommand', () => {
let commandSpy

beforeEach(() => {
insightsHandler = new InsightsHandler(browser, false, 'framework')
insightsHandler = new InsightsHandler(browser, 'framework')
insightsHandler['getIdentifier'] = vi.fn().mockImplementation(() => { return 'test title' })
insightsHandler['_tests'] = { 'test title': { 'uuid': 'uuid' } }
insightsHandler['_commands'] = { 's_m_e': {} as any }
Expand Down Expand Up @@ -695,7 +695,7 @@ describe('getIdentifier', () => {
let getUniqueIdentifierForCucumberSpy

beforeEach(() => {
insightsHandler = new InsightsHandler(browser, false, 'framework')
insightsHandler = new InsightsHandler(browser, 'framework')
insightsHandler['_tests'] = { 'test title': { 'uuid': 'uuid' } }

getUniqueIdentifierSpy = vi.spyOn(utils, 'getUniqueIdentifier')
Expand Down Expand Up @@ -751,7 +751,7 @@ describe('getCucumberHookType', function () {
describe('getCucumberHookUniqueId', function () {
let insightsHandler: InsightsHandler
beforeEach(() => {
insightsHandler = new InsightsHandler(browser, false, 'framework')
insightsHandler = new InsightsHandler(browser, 'framework')
})

it('should return hookId for each hooks', function () {
Expand Down Expand Up @@ -780,7 +780,7 @@ describe('appendTestItemLog', function () {
}
let testLogObj: StdLog
beforeEach(() => {
insightsHandler = new InsightsHandler(browser, false, 'mocha')
insightsHandler = new InsightsHandler(browser, 'mocha')
sendDataSpy = vi.spyOn(insightsHandler['listener'], 'logCreated').mockImplementation(() => { return [] as any })
testLogObj = { ...logObj }
})
Expand Down Expand Up @@ -812,7 +812,7 @@ describe('processCucumberHook', function () {
let insightsHandler: InsightsHandler
let getHookRunDataForCucumberSpy, cucumberHookTypeSpy, cucumberHookUniqueIdSpy
beforeEach(() => {
insightsHandler = new InsightsHandler(browser, false, 'mocha')
insightsHandler = new InsightsHandler(browser, 'mocha')
getHookRunDataForCucumberSpy = vi.spyOn(insightsHandler, 'getHookRunDataForCucumber').mockImplementation(() => { return [] as any })
cucumberHookTypeSpy = vi.spyOn(insightsHandler, 'getCucumberHookType')
cucumberHookTypeSpy.mockImplementation(() => { return 'hii' })
Expand Down