import path from 'node:path' import { expect, describe, afterEach, it, 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('setTimeout', () => { it('should set timeout', async () => { const browser = await remote({ baseUrl: 'http://foobar.com', capabilities: { browserName: 'foobar' } }) await browser.setTimeout({ implicit: 5000 }) expect(vi.mocked(fetch).mock.calls).toHaveLength(2) expect(vi.mocked(fetch).mock.calls[1][1]?.method).toBe('POST') expect((vi.mocked(fetch).mock.calls[1][0] as any).pathname) .toBe('/session/foobar-123/timeouts') expect(vi.mocked(fetch).mock.calls[1][1]?.body).toEqual(JSON.stringify({ 'implicit': 5000 })) await browser.setTimeout({ pageLoad: 10000 }) expect(vi.mocked(fetch).mock.calls).toHaveLength(3) expect(vi.mocked(fetch).mock.calls[2][1]?.method).toBe('POST') expect((vi.mocked(fetch).mock.calls[2][0] as any).pathname) .toBe('/session/foobar-123/timeouts') expect(vi.mocked(fetch).mock.calls[2][1]?.body).toEqual(JSON.stringify({ 'pageLoad': 10000 })) await browser.setTimeout({ script: 60000 }) expect(vi.mocked(fetch).mock.calls).toHaveLength(4) expect(vi.mocked(fetch).mock.calls[3][1]?.method).toBe('POST') expect((vi.mocked(fetch).mock.calls[3][0] as any).pathname) .toBe('/session/foobar-123/timeouts') expect(vi.mocked(fetch).mock.calls[3][1]?.body).toEqual(JSON.stringify({ 'script': 60000 })) await browser.setTimeout({ implicit: 0, pageLoad: 300000, script: 30000, }) expect(vi.mocked(fetch).mock.calls).toHaveLength(5) expect(vi.mocked(fetch).mock.calls[4][1]?.method).toBe('POST') expect((vi.mocked(fetch).mock.calls[4][0] as any).pathname) .toBe('/session/foobar-123/timeouts') expect(vi.mocked(fetch).mock.calls[4][1]?.body).toEqual(JSON.stringify({ 'implicit': 0, 'pageLoad': 300000, 'script': 30000, })) await browser.setTimeout({}) expect(vi.mocked(fetch).mock.calls).toHaveLength(6) expect(vi.mocked(fetch).mock.calls[5][1]?.method).toBe('POST') expect((vi.mocked(fetch).mock.calls[5][0] as any).pathname) .toBe('/session/foobar-123/timeouts') expect(vi.mocked(fetch).mock.calls[5][1]?.body).toEqual(JSON.stringify({})) }) it('should throw error on setting invalid timeout', async () => { const browser = await remote({ baseUrl: 'http://foobar.com', capabilities: { browserName: 'foobar' } }) const invalidTimeoutParameterError = new Error('Parameter for "setTimeout" command needs to be an object') // @ts-expect-error invalid param await expect(browser.setTimeout('0')) .rejects .toEqual(invalidTimeoutParameterError) // @ts-expect-error invalid param await expect(browser.setTimeout(5000)) .rejects .toEqual(invalidTimeoutParameterError) const invalidTimeoutValueError = new Error('Specified timeout values are not valid integer (see https://webdriver.io/docs/api/browser/setTimeout for documentation).') await expect(browser.setTimeout({ implicit: Number.MAX_SAFE_INTEGER + 1 })) .rejects .toEqual(invalidTimeoutValueError) await expect(browser.setTimeout({ pageLoad: -2000 })) .rejects .toEqual(invalidTimeoutValueError) // @ts-expect-error invalid param await expect(browser.setTimeout({ 'page load': null })) .rejects .toEqual(invalidTimeoutValueError) // @ts-expect-error invalid param await expect(browser.setTimeout({ script: '4000' })) .rejects .toEqual(invalidTimeoutValueError) // @ts-expect-error invalid param await expect(browser.setTimeout({ timeouts: { script: 5000 } })) .rejects .toEqual(invalidTimeoutValueError) }) afterEach(() => { vi.mocked(fetch).mockClear() }) })