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'
}
})
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()
})
})