🏡 index : quine-global/webdriverio.git

import { describe, expect, it, vi, beforeEach } from 'vitest'
import path from 'node:path'
import logger from '@wdio/logger'
import * as utils from '../../src/testHub/utils.js'
import * as bstackLogger from '../../src/bstackLogger.js'
import { BROWSERSTACK_OBSERVABILITY, BROWSERSTACK_ACCESSIBILITY } from '../../src/constants.js'

describe('getProductMap', () => {
    let config = {}

    beforeEach(() => {
        config = {
            testObservability: {
                enabled : true
            },
            accessibility: false,
            percy: false,
            automate: true,
            appAutomate: false
        }
    })

    it('should create a valid product map', () => {
        const productMap = utils.getProductMap(config as any)
        const expectedProductMap = {
            'observability': true,
            'accessibility': false,
            'percy': false,
            'automate': true,
            'app_automate': false
        }
        expect(productMap).toEqual(expectedProductMap)
    })
})

describe('shouldProcessEventForTesthub', () => {
    beforeEach(() => {
        delete process.env['BROWSERSTACK_OBSERVABILITY']
        delete process.env['BROWSERSTACK_ACCESSIBILITY']
        delete process.env['BROWSERSTACK_PERCY']
    })

    it('should return true when only observability is true', () => {
        process.env['BROWSERSTACK_OBSERVABILITY'] = 'true'
        expect(utils.shouldProcessEventForTesthub('')).to.equal(true)
    })

    it('should return true when only accessibility is true', () => {
        process.env['BROWSERSTACK_ACCESSIBILITY'] = 'true'
        expect(utils.shouldProcessEventForTesthub('')).to.equal(true)
    })

    it('should return true when only percy is true', () => {
        process.env['BROWSERSTACK_PERCY'] = 'true'
        expect(utils.shouldProcessEventForTesthub('')).to.equal(true)
    })

    it('should be false for Hook event when accessibility is only true', () => {
        process.env['BROWSERSTACK_ACCESSIBILITY'] = 'true'
        expect(utils.shouldProcessEventForTesthub('HookRunFinished')).to.equal(false)
    })

    it('should be false for Log event when only percy is true', () => {
        process.env['BROWSERSTACK_PERCY'] = 'true'
        expect(utils.shouldProcessEventForTesthub('CBTSessionCreated')).to.equal(false)
    })
})

describe('logBuildError', () => {
    const log = logger('test')
    vi.mock('@wdio/logger', () => import(path.join(process.cwd(), '__mocks__', '@wdio/logger')))
    const bstackLoggerSpy = vi.spyOn(bstackLogger.BStackLogger, 'logToFile')
    bstackLoggerSpy.mockImplementation(() => {})

    it('should log error for ERROR_INVALID_CREDENTIALS', () => {
        vi.mocked(log.error).mockClear()
        const logErrorMock = vi.spyOn(log, 'error')
        const errorJson = {
            errors: [
                {
                    key: 'ERROR_INVALID_CREDENTIALS',
                    message: 'Access to BrowserStack Test Observability denied due to incorrect credentials.'
                }
            ],
        }
        utils.logBuildError(errorJson as any, 'observability')
        expect(logErrorMock.mock.calls[0][0]).toContain('Access to BrowserStack Test Observability denied due to incorrect credentials.')
    })

    it('should log error for ERROR_ACCESS_DENIED', () => {
        vi.mocked(log.error).mockClear()
        const logErrorMock = vi.spyOn(log, 'info')
        const errorJson = {
            errors: [
                {
                    key: 'ERROR_ACCESS_DENIED',
                    message: 'Access to BrowserStack Test Observability denied.'
                }
            ],
        }
        utils.logBuildError(errorJson as any, 'observability')
        expect(logErrorMock.mock.calls[0][0]).toContain('Access to BrowserStack Test Observability denied.')
    })

    it('should log error for ERROR_SDK_DEPRECATED', () => {
        vi.mocked(log.error).mockClear()
        vi.mocked(log.info).mockClear()
        const logErrorMock = vi.spyOn(log, 'error')
        const errorJson = {
            errors: [
                {
                    key: 'ERROR_SDK_DEPRECATED',
                    message: 'Access to BrowserStack Test Observability denied due to SDK deprecation.'
                }
            ],
        }
        utils.logBuildError(errorJson as any, 'observability')
        expect(logErrorMock.mock.calls[0][0]).toContain('Access to BrowserStack Test Observability denied due to SDK deprecation.')
    })

    it('should log error for RANDOM_ERROR_TYPE', () => {
        vi.mocked(log.error).mockClear()
        vi.mocked(log.info).mockClear()
        const logErrorMock = vi.spyOn(log, 'error')
        const errorJson = {
            errors: [
                {
                    key: 'RANDOM_ERROR_TYPE',
                    message: 'Random error message.'
                }
            ],
        }
        utils.logBuildError(errorJson as any, 'observability')
        expect(logErrorMock.mock.calls[0][0]).toContain('Random error message.')
    })

    it('should log error if error is null', () => {
        vi.mocked(log.error).mockClear()
        const logErrorMock = vi.spyOn(log, 'error')
        utils.logBuildError(null, 'product_name')
        expect(logErrorMock.mock.calls[0][0]).toContain('PRODUCT_NAME Build creation failed ')
    })

    it('handleErrorForObservability', () => {
        const errorJson = {
            errors: [
                {
                    key: 'RANDOM_ERROR_TYPE',
                    message: 'Random error message.'
                }
            ],
        }
        utils.handleErrorForObservability(errorJson)
        expect(process.env[BROWSERSTACK_OBSERVABILITY]).toEqual('false')
    })

    it('handleErrorForAccessibility', () => {
        const errorJson = {
            errors: [
                {
                    key: 'RANDOM_ERROR_TYPE',
                    message: 'Random error message.'
                }
            ],
        }
        utils.handleErrorForAccessibility(errorJson)
        expect(process.env[BROWSERSTACK_ACCESSIBILITY]).toEqual('false')
    })
})