import { expect, describe, it, afterEach, vi } from 'vitest' import fs from 'node:fs' import path from 'node:path' import JSZip from 'jszip' import { remote } from '../../../src/index.js' import logger from '@wdio/logger' import '../../../src/node.js' vi.mock('node:fs', () => ({ default: { mkdirSync: vi.fn(), readFileSync: vi.fn(), writeFileSync: vi.fn() } })) vi.mock('got') vi.mock('JSZip', () => ({ default: { loadAsync: vi.fn() } })) vi.mock('devtools') vi.mock('@wdio/logger', () => import(path.join(process.cwd(), '__mocks__', '@wdio/logger'))) describe('downloadFile', () => { it('should throw if browser does not support it', async function () { const browser = await remote({ baseUrl: 'http://webdriver.io', capabilities: { browserName: 'safari' } }) await expect(browser.downloadFile('bar.jpg', '/foo/bar')).rejects.toEqual( new Error('The downloadFile command is not available in mockBrowser and only available when using Selenium Grid')) }) 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.downloadFile(123, 456)).rejects.toEqual( new Error('number or type of arguments don\'t agree with downloadFile command')) }) it('should unzip the file and use downloadFile command', async () => { vi.spyOn(JSZip, 'loadAsync').mockReturnValue(Promise.resolve( { files: { 'file_1': { async: vi.fn() } } }) ) const browser = await remote({ baseUrl: 'http://webdriver.io', capabilities: { browserName: 'chrome' } }) browser.download = vi.fn().mockReturnValue({ fileName: 'test', contents: 'AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA==' }) await browser.downloadFile('toDownload.jpg', __dirname) const log = logger('test') expect(log.info).toHaveBeenCalledWith( expect.stringContaining('File extracted: file_1') ) expect(fs.writeFileSync).toHaveBeenCalledTimes(2) }) it('reject on error', async () => { vi.spyOn(JSZip, 'loadAsync').mockRejectedValue('test' ) const browser = await remote({ baseUrl: 'http://webdriver.io', capabilities: { browserName: 'chrome' } }) browser.download = vi.fn().mockReturnValue({ fileName: 'test', contents: 'AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA==' }) await browser.downloadFile('toDownload.jpg', __dirname) const log = logger('test') expect(log.error).toHaveBeenCalledWith('Error unzipping file:', 'test') }) afterEach(() => { const log = logger('test') vi.mocked(log.info).mockClear() vi.mocked(log.error).mockClear() vi.mocked(fs.mkdirSync).mockClear() vi.mocked(fs.readFileSync).mockClear() vi.mocked(fs.writeFileSync).mockClear() }) })