🏡 index : quine-global/webdriverio.git

import url from 'node:url'
import path from 'node:path'
import { describe, it, vi, expect, afterEach, beforeEach } from 'vitest'
import { createServer } from 'vite'

import { ViteServer } from '../../src/vite/server.js'

vi.mock('../../src/vite/plugins/testrunner.js', () => ({
    testrunner: vi.fn().mockReturnValue('testrunner plugin')
}))
vi.mock('../../src/vite/plugins/mockHoisting.js', () => ({
    mockHoisting: vi.fn().mockReturnValue('mock hoisting plugin')
}))
vi.mock('../../src/vite/plugins/worker.js', () => ({
    workerPlugin: vi.fn().mockReturnValue('worker plugin')
}))
vi.mock('../../src/vite/constants.js', () => ({
    DEFAULT_VITE_CONFIG: { someDefault: 'config' },
    PRESET_DEPENDENCIES: { lit: ['foobar', 'default', { bar: 'foo' }] }
}))
vi.mock('@wdio/utils', () => ({
    executeHooksWithArgs: vi.fn().mockResolvedValue('hook result')
}))
vi.mock('../../src/vite/mock.js', () => ({
    MockHandler: class {}
}))
vi.mock('@wdio/logger', () => import(path.join(process.cwd(), '__mocks__', '@wdio/logger')))
vi.mock('foobar', () => ({ default: vi.fn().mockReturnValue('foobar') }))
vi.mock('vite')
vi.mock('get-port', () => ({ default: vi.fn().mockResolvedValue(1234) }))

const __dirname = url.fileURLToPath(new URL('.', import.meta.url))
const consoleLog = console.log.bind(console)
const config: any = { rootDir: '/foo/bar' }

describe('ViteServer', () => {
    beforeEach(() => {
        console.log = vi.fn()
    })

    it('start', async () => {
        const server = new ViteServer({
            viteConfig: { foo: 'bar' } as any
        }, config, {
            some: 'optimizations'
        } as any)
        const viteServer = { listen: vi.fn() }
        vi.mocked(createServer).mockResolvedValue(viteServer as any)
        await server.start()

        expect(viteServer.listen).toBeCalledTimes(1)
        expect(createServer).toBeCalledWith({
            foo: 'bar',
            plugins: ['testrunner plugin', 'mock hoisting plugin', 'worker plugin'],
            root: expect.any(String),
            server: {
                port: 1234
            },
            some: 'optimizations',
            someDefault: 'config'
        })
    })

    it('start with a preset', async () => {
        const server = new ViteServer({
            preset: 'lit'
        }, config, {})
        const viteServer = { listen: vi.fn() }
        vi.mocked(createServer).mockResolvedValue(viteServer as any)
        await server.start()

        expect(viteServer.listen).toBeCalledTimes(1)
        expect(createServer).toBeCalledWith({
            plugins: ['testrunner plugin', 'mock hoisting plugin', 'worker plugin', 'foobar'],
            root: expect.any(String),
            server: {
                port: 1234
            },
            someDefault: 'config'
        })
    })

    it('start with a preset and custom viteConfig as string', async () => {
        const server = new ViteServer({
            preset: 'lit',
            viteConfig: './__fixtures__/vite.conf.ts'
        }, { rootDir: __dirname } as any, {})
        const viteServer = { listen: vi.fn() }
        vi.mocked(createServer).mockResolvedValue(viteServer as any)
        await server.start()

        expect(viteServer.listen).toBeCalledTimes(1)
        expect(createServer).toBeCalledWith({
            plugins: ['testrunner plugin', 'mock hoisting plugin', 'worker plugin', 'foobar'],
            root: expect.any(String),
            server: {
                port: 1234
            },
            someDefault: 'config'
        })
    })

    it('start with a preset and custom viteConfig as object', async () => {
        const server = new ViteServer({
            preset: 'lit',
            viteConfig: { server: { port: 3210 } }
        }, { rootDir: __dirname } as any, {})
        const viteServer = { listen: vi.fn() }
        vi.mocked(createServer).mockResolvedValue(viteServer as any)
        await server.start()

        expect(viteServer.listen).toBeCalledTimes(1)
        expect(createServer).toBeCalledWith({
            plugins: ['testrunner plugin', 'mock hoisting plugin', 'worker plugin', 'foobar'],
            root: expect.any(String),
            server: {
                port: 1234
            },
            someDefault: 'config'
        })
    })

    afterEach(() => {
        vi.mocked(createServer).mockClear()
        console.log = consoleLog
    })
})