🏡 index : quine-global/webdriverio.git

import { expect, describe, it, afterEach, vi } from 'vitest'

import path from 'node:path'
import archiver from 'archiver'
import { remote } from '../../../src/index.js'

import '../../../src/node.js'

vi.mock('node:fs', () => ({
    default: {
        createReadStream: vi.fn(),
        existsSync: vi.fn()
    }
}))
vi.mock('fetch')
vi.mock('archiver')
vi.mock('@wdio/logger', () => import(path.join(process.cwd(), '__mocks__', '@wdio/logger')))

describe('uploadFile', () => {
    it('should throw if browser does not support it', async function () {
        const browser = await remote({
            baseUrl: 'http://webdriver.io',
            capabilities: {
                browserName: 'firefox'
            }
        })

        await expect(browser.uploadFile('/foo/bar.jpg')).rejects.toEqual(
            new Error('The uploadFile command is not available in mockBrowser'))
    })

    it('should throw if path is not a string', async function () {
        const browser = await remote({
            baseUrl: 'http://webdriver.io',
            capabilities: {
                browserName: 'chrome'
            }
        })

        // @ts-expect-error wrong parameter
        await expect(browser.uploadFile(123)).rejects.toEqual(
            new Error('number or type of arguments don\'t agree with uploadFile command'))
    })

    it('should archive the file and use file command', async () => {
        const browser = await remote({
            baseUrl: 'http://webdriver.io',
            capabilities: {
                browserName: 'chrome'
            }
        })
        browser.file = vi.fn().mockReturnValue(Promise.resolve())

        const archiverMock = archiver('zip')
        browser.uploadFile(path.resolve(__dirname, '..', '__fixtures__', 'toUpload.jpg'))
        expect((archiverMock as any).args).toEqual(['zip'])
        expect(archiverMock.append).toBeCalledWith(undefined, { name: 'toUpload.jpg' })
    })

    it('reject on error', async () => {
        const browser = await remote({
            baseUrl: 'http://webdriver.io',
            capabilities: {
                browserName: 'chrome'
            }
        })
        browser.file = vi.fn().mockReturnValue(Promise.resolve())

        let commandError: Error | null = null
        const archiverMock = archiver('zip')
        const command = browser.uploadFile(path.resolve(__dirname, '..', '__fixtures__', 'toUpload.jpg'))
            .catch((e: Error) => (commandError = e))
        expect(vi.mocked(archiverMock.on).mock.calls[0][0]).toBe('error')
        vi.mocked(archiverMock.on).mock.calls[0][1](new Error('boom'))

        await command
        expect(commandError).toEqual(new Error('boom'))
    })

    it('should push zip data to file command', async () => {
        const browser = await remote({
            baseUrl: 'http://webdriver.io',
            capabilities: {
                browserName: 'chrome'
            }
        })
        browser.file = vi.fn().mockReturnValue(Promise.resolve('/some/local/path'))

        const archiverMock = archiver('zip')
        const command = browser.uploadFile(path.resolve(__dirname, '..', '__fixtures__', 'toUpload.jpg'))
        expect(vi.mocked(archiverMock.on).mock.calls[1][0]).toBe('data')
        expect(vi.mocked(archiverMock.on).mock.calls[2][0]).toBe('end')

        vi.mocked(archiverMock.on).mock.calls[1][1](Buffer.alloc(10))
        vi.mocked(archiverMock.on).mock.calls[1][1](Buffer.alloc(33))
        vi.mocked(archiverMock.on).mock.calls[2][1]()

        const localPath = await command
        expect(browser.file).toBeCalledWith('AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA==')
        expect(localPath).toBe('/some/local/path')
    })

    afterEach(() => {
        const archiverMock = archiver('zip')
        vi.mocked(archiverMock.on).mockClear()
        vi.mocked(archiverMock.append).mockClear()
        vi.mocked(archiverMock.finalize).mockClear()
    })
})