import { describe, it, expect, vi, beforeEach, Mock, afterEach, } from 'vitest'; import { spawnSync } from 'child_process'; import { readFileSync, unlinkSync } from 'fs'; import * as webVideoClipCore from '../src'; vi.mock('child_process'); vi.mock('fs'); describe('createVideoClipper', () => { beforeEach(() => { (readFileSync as Mock).mockReturnValueOnce(Buffer.from('')); }); describe('without postprocessing', () => { let clipper: webVideoClipCore.VideoClipEventEmitter; beforeEach(() => { clipper = webVideoClipCore.createVideoClipper({ downloaderExecutablePath: 'yt-dlp', type: webVideoClipCore.VideoType.YOUTUBE, url: 'https://www.youtube.com/watch?v=BaW_jenozKc', start: 0, end: 0, }); }); afterEach(() => { (spawnSync as Mock).mockReset(); }); it('calls the downloader function', () => new Promise((done) => { (spawnSync as Mock) .mockReturnValueOnce({ stdout: Buffer.from('mkv') }) .mockReturnValueOnce({ stdout: Buffer.from('') }); clipper.on('end', done); clipper.process(); expect(spawnSync).toBeCalledTimes(2); expect(spawnSync).nthCalledWith(1, 'yt-dlp', expect.arrayContaining(['--print'])); expect(spawnSync).nthCalledWith(2, 'yt-dlp', expect.anything()); })); it('emits downloader errors', () => new Promise((done) => { const causeError = new Error('generic downloader message'); (spawnSync as Mock) .mockReturnValueOnce({ stdout: Buffer.from('mkv') }) .mockReturnValueOnce({ error: causeError }); clipper.on('error', (err: Error) => { expect(err).toHaveProperty('message', causeError.message); }); clipper.on('end', done); clipper.process(); })); it('calls the buffer extract function', () => new Promise((done) => { (spawnSync as Mock) .mockReturnValueOnce({ stdout: Buffer.from('mkv') }) .mockReturnValueOnce({ stdout: Buffer.from('') }); clipper.on('end', done); clipper.process(); expect(readFileSync).toBeCalled(); })); it('calls the cleanup function', () => new Promise((done) => { (spawnSync as Mock) .mockReturnValueOnce({ stdout: Buffer.from('mkv') }) .mockReturnValueOnce({ stdout: Buffer.from('') }); clipper.on('end', done); clipper.process(); expect(unlinkSync).toBeCalled(); })); }); });