🏡 index : quine-global/webdriverio.git

import path from 'node:path'
import { expect, describe, it, afterEach, vi } from 'vitest'
import { remote } from '../../../src/index.js'

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

describe('longPress test', () => {
    it('should call click with correct arguments for valid longPress', async () => {
        const browser = await remote({
            baseUrl: 'http://foobar.com',
            capabilities: {
                browserName: 'foobar',
                mobileMode: true,
            } as any
        })
        const elem = await browser.$('#foo')
        const clickSpy = vi.spyOn(elem, 'click').mockResolvedValue(undefined)

        await elem.longPress({ duration: 2000, x: 50, y: 30 })

        expect(clickSpy).toHaveBeenCalledWith({
            duration: 2000,
            x: 50,
            y: 30,
        })

        clickSpy.mockRestore()
    })

    it('should throw an error if command is called from a desktop session', async () => {
        const browser = await remote({
            baseUrl: 'http://foobar.com',
            capabilities: {
                browserName: 'foobar',
            } as any
        })
        const elem = await browser.$('#foo')

        await expect(elem.longPress()).rejects.toThrow('The longPress command is only available for mobile platforms.')
    })

    it('should throw an error if the passed argument is not an options object', async () => {
        const browser = await remote({
            baseUrl: 'http://foobar.com',
            capabilities: {
                browserName: 'foobar',
                mobileMode: true,
            } as any
        })
        const elem = await browser.$('#foo')

        // @ts-expect-error invalid param
        await expect(elem.longPress([])).rejects.toThrow('Options must be an object')
    })

    it('should use execute command for iOS web context (non-native)', async () => {
        const browser = await remote({
            baseUrl: 'http://foobar.com',
            capabilities: {
                mobileMode: true,
                platformName: 'iOS',
                browserName: 'Safari',
            } as any
        })
        const elem = await browser.$('#foo')
        const executeSpy = vi.spyOn(browser, 'execute').mockResolvedValue(undefined)

        await elem.longPress({ duration: 2000 })

        expect(executeSpy).toHaveBeenCalledWith(
            expect.any(Function),
            elem,
            2000
        )

        executeSpy.mockRestore()
    })

    it('should use execute command for iOS web context with default duration', async () => {
        const browser = await remote({
            baseUrl: 'http://foobar.com',
            capabilities: {
                mobileMode: true,
                platformName: 'iOS',
                browserName: 'Safari',
            } as any
        })
        const elem = await browser.$('#foo')

        const executeSpy = vi.spyOn(browser, 'execute').mockResolvedValue(undefined)

        await elem.longPress()

        expect(executeSpy).toHaveBeenCalledWith(
            expect.any(Function),
            elem,
            1500
        )

        executeSpy.mockRestore()
    })

    it('should not use execute command for iOS native context', async () => {
        const browser = await remote({
            baseUrl: 'http://foobar.com',
            capabilities: {
                platformName: 'iOS',
                app: 'app',
                mobileMode: true,
                nativeAppMode: true,
            } as any
        })
        const elem = await browser.$('#foo')

        const executeSpy = vi.spyOn(browser, 'execute').mockResolvedValue(undefined)
        const clickSpy = vi.spyOn(elem, 'click').mockResolvedValue(undefined)

        await elem.longPress({ duration: 2000 })

        expect(executeSpy).not.toHaveBeenCalled()
        expect(clickSpy).toHaveBeenCalledWith({
            duration: 2000,
            x: 0,
            y: 0,
        })

        executeSpy.mockRestore()
        clickSpy.mockRestore()
    })

    it('should not use execute command for non-iOS mobile platforms', async () => {
        const browser = await remote({
            baseUrl: 'http://foobar.com',
            capabilities: {
                browserName: 'foobar',
                mobileMode: true,
                platformName: 'Android',
            } as any
        })
        const elem = await browser.$('#foo')

        const executeSpy = vi.spyOn(browser, 'execute').mockResolvedValue(undefined)
        const clickSpy = vi.spyOn(elem, 'click').mockResolvedValue(undefined)

        await elem.longPress({ duration: 2000 })

        expect(executeSpy).not.toHaveBeenCalled()
        expect(clickSpy).toHaveBeenCalledWith({
            duration: 2000,
            x: 0,
            y: 0,
        })

        executeSpy.mockRestore()
        clickSpy.mockRestore()
    })

    afterEach(() => {
        vi.mocked(fetch).mockClear()
    })
})