import { describe, expect, vi, it, afterAll, afterEach } from 'vitest' import { EventEmitter } from 'node:events' import type { WriteStream } from 'node:fs' import fs from 'node:fs' import WDIOReporter from '../src/index.js' vi.mock('node:fs', () => ({ default: { createWriteStream: vi.fn().mockReturnValue({ write: vi.fn(), end: vi.fn((cb) => cb()) }), mkdirSync: vi.fn() } })) describe('WDIOReporter', () => { const eventsOnSpy = vi.spyOn(EventEmitter.prototype, 'on') it('constructor', () => { new WDIOReporter({ logFile: '/some/logpath' }) expect(eventsOnSpy.mock.calls).toHaveLength(20) expect(eventsOnSpy).toBeCalledWith('client:beforeCommand', expect.any(Function)) expect(eventsOnSpy).toBeCalledWith('client:afterCommand', expect.any(Function)) expect(eventsOnSpy).toBeCalledWith('client:beforeAssertion', expect.any(Function)) expect(eventsOnSpy).toBeCalledWith('client:afterAssertion', expect.any(Function)) expect(eventsOnSpy).toBeCalledWith('runner:start', expect.any(Function)) expect(eventsOnSpy).toBeCalledWith('suite:start', expect.any(Function)) expect(eventsOnSpy).toBeCalledWith('suite:retry', expect.any(Function)) expect(eventsOnSpy).toBeCalledWith('hook:start', expect.any(Function)) expect(eventsOnSpy).toBeCalledWith('hook:end', expect.any(Function)) expect(eventsOnSpy).toBeCalledWith('test:start', expect.any(Function)) expect(eventsOnSpy).toBeCalledWith('test:pass', expect.any(Function)) expect(eventsOnSpy).toBeCalledWith('test:skip', expect.any(Function)) expect(eventsOnSpy).toBeCalledWith('test:fail', expect.any(Function)) expect(eventsOnSpy).toBeCalledWith('test:pending', expect.any(Function)) expect(eventsOnSpy).toBeCalledWith('test:retry', expect.any(Function)) expect(eventsOnSpy).toBeCalledWith('test:end', expect.any(Function)) expect(eventsOnSpy).toBeCalledWith('suite:end', expect.any(Function)) expect(eventsOnSpy).toBeCalledWith('runner:end', expect.any(Function)) expect(eventsOnSpy).toBeCalledWith('client:beforeCommand', expect.any(Function)) expect(eventsOnSpy).toBeCalledWith('client:afterCommand', expect.any(Function)) }) it('should be by default synchronised', () => { const reporter = new WDIOReporter({ logFile: '/some/log/path' }) expect(reporter.isSynchronised).toBe(true) }) it('should provide a function to write to output stream', () => { const reporter = new WDIOReporter({ logFile: '/some/log/path' }) reporter.write('foobar') expect(reporter.outputStream.write).toBeCalledWith('foobar') }) it('should allow an own writeable stream', () => { const customLogStream = fs.createWriteStream('/foo/bar') const reporter = new WDIOReporter({ stdout: true, writeStream: customLogStream }) reporter.write('foobar') expect(customLogStream.write).toBeCalledWith('foobar') }) it('should not create log file if no file name is given', () => { const options = { stdout: true, writeStream: { write: vi.fn() } as unknown as WriteStream } const reporter = new WDIOReporter(options) reporter.write('foobar') expect(options.writeStream.write).toBeCalledWith('foobar') }) it('should set isContentPresent to true when content is passed to write()', () => { const options = { stdout: true, writeStream: { write: vi.fn() } as unknown as WriteStream } const reporter = new WDIOReporter(options) expect(reporter.isContentPresent).toBe(false) reporter.write('foobar') expect(reporter.isContentPresent).toBe(true) }) describe('outputDir options', () => { it('should create directory if outputDir given and not existing', () => { const options = { outputDir: './tempDir', logFile: '' } new WDIOReporter(options) expect(fs.mkdirSync).toHaveBeenCalled() expect(fs.mkdirSync).toHaveBeenCalledWith('./tempDir', { recursive: true }) }) afterEach(() => { vi.mocked(fs.mkdirSync).mockClear() }) }) afterAll(() => { eventsOnSpy.mockRestore() }) })