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