🏡 index : quine-global/webdriverio.git

import path from 'node:path'

import { deepmerge } from 'deepmerge-ts'
import { expect, describe, it, vi, beforeEach } from 'vitest'

import { makeHeadless, getCoverageByFactor, adjustWindowInWatchMode } from '../src/utils.js'

vi.mock('@wdio/logger', () => import(path.join(process.cwd(), '__mocks__', '@wdio/logger')))

vi.mock('deepmerge-ts', () => ({
    deepmerge: vi.fn()
}))

beforeEach(() => {
    vi.mocked(deepmerge).mockClear()
    delete process.env.CI
})

describe('makeHeadless', () => {
    it('throws if browser name is not used in caps', () => {
        expect(() => makeHeadless({}, {})).toThrow()
        expect(deepmerge).toBeCalledTimes(0)
    })

    it('makes chrome, firefox and edge caps headless', () => {
        process.env.CI = '1'
        makeHeadless({}, { browserName: 'chrome' })
        expect(deepmerge).toBeCalledTimes(1)
        delete process.env.CI
        makeHeadless({ headless: true }, { browserName: 'firefox' })
        expect(deepmerge).toBeCalledTimes(2)
        makeHeadless({}, { browserName: 'edge' })
        expect(deepmerge).toBeCalledTimes(2)
        process.env.CI = '1'
        makeHeadless({}, { browserName: 'edge' })
        expect(deepmerge).toBeCalledTimes(3)
        makeHeadless({}, { browserName: 'msedge' })
        expect(deepmerge).toBeCalledTimes(4)
        makeHeadless({}, { browserName: 'safari' })
        expect(deepmerge).toBeCalledTimes(4)
    })
})

describe('adjustWindowInWatchMode', () => {
    it('does not adjust window size if not in watch mode', () => {
        const caps: any = { foo: 'bar' }
        expect(adjustWindowInWatchMode({} as any, caps)).toEqual(caps)
    })

    it('adjusts window size if in watch mode', () => {
        adjustWindowInWatchMode({ watch: true } as any, { browserName: 'chrome' })
        expect(deepmerge).toBeCalledTimes(1)
    })
})

it('getCoverageByFactor', () => {
    expect(getCoverageByFactor(
        {
            statements: 55,
            lines: 88,
            functions: 44
        },
        {
            statements: { pct: 33 } as any,
            lines: { pct: 93 } as any,
            functions: { pct: 23 } as any,
            branches: { pct: 100 } as any
        }
    )).toEqual([
        'ERROR: Coverage for functions (23%) does not meet global threshold (44%)',
        'ERROR: Coverage for statements (33%) does not meet global threshold (55%)'
    ])

    expect(getCoverageByFactor(
        {
            statements: 55,
            lines: 88,
            functions: 44
        },
        {
            statements: { pct: 33 } as any,
            lines: { pct: 88 } as any,
            functions: { pct: 23 } as any,
            branches: { pct: 100 } as any
        },
        '/path/to/file.js'
    )).toEqual([
        'ERROR: Coverage for functions (23%) does not meet threshold (44%) for /path/to/file.js',
        'ERROR: Coverage for statements (33%) does not meet threshold (55%) for /path/to/file.js'
    ])
})