# Run all tests
npm test
# Watch mode
npm run test:watch
# With coverage report
npm run test:coverage
# Unit tests only
npm run test:unit
# Integration tests (matches src/**/*.integration.{test,spec}.{ts,tsx})
npm run test:integration
# E2E tests (requires build)
npm run test:e2eCoverage reports are generated in coverage/:
coverage/index.html— browsable HTMLcoverage/lcov.info— LCOV for IDE integration
The suite is run by Vitest 4 (123 test files, 1603 tests, all passing). Coverage uses the v8 provider.
| Area | Files (tests) | What's Covered |
|---|---|---|
| Shared | errors.test.ts, constants.test.ts, codec-containers.test.ts, validation.test.ts, types.test.ts, logger.test.ts, ipc-channels.test.ts, estimate.test.ts |
Error normalization, all shared constants, codec/container mapping, validation helpers, type contracts, logger, IPC channel registry, estimation |
| Main | cli.test.ts, index.test.ts, capabilities.test.ts, job-queue.test.ts, process-utils.test.ts, image-file-info.test.ts, image-info.test.ts, image-preview.test.ts, video-preview.test.ts, cli-logo.test.ts, media-binaries.test.ts, power-actions.test.ts, preview-cache.test.ts |
CLI entry, window lifecycle, encoder probing, queue semantics, process utilities, image/video preview generation, media binary resolution, power actions, preview cache |
| Main CLI | cli/cli-cli.test.ts, cli/cli-options.test.ts, cli/cli-convert.test.ts, cli/cli-compress.test.ts, cli/cli-util.test.ts, cli/cli-integration.integration.test.ts |
CLI subcommand parsing, option handling, conversion/compress subcommands, utility functions, integration tests |
| Main IPC | ipc/player.test.ts, ipc/image.test.ts, ipc/dialogs.test.ts, ipc/conversion.test.ts, ipc/window.test.ts, ipc/queue.test.ts, ipc/timeline.test.ts, ipc/send.test.ts, ipc/handlers.test.ts, ipc/system.test.ts, ipc/capabilities.test.ts |
Per-channel IPC handlers, event broadcasting, error wrapping, system handlers |
| Main transcoders | transcoders/ffmpeg-core.test.ts, transcoders/hwaccel.test.ts, transcoders/ffmpeg-utils.test.ts, transcoders/fftool-core.test.ts, transcoders/bmf-core.test.ts, transcoders/ffprobe-mapper.test.ts, transcoders/factory.test.ts, transcoders/interface.test.ts, transcoders/integration-audio.test.ts |
All three cores, hardware-acceleration flag building, ffprobe mapping, factory dispatch, transcoder interface contract |
| Main player / queue / timeline | player/frame-decoder.test.ts, queue/queue-transfer.test.ts, timeline/timeline-media.test.ts |
Rawvideo frame decoding, audio pipe, buffering, queue transfer, waveform extraction, thumbnail montage generation |
| Preload | preload/index.test.ts |
Full electronAPI bridge surface, every IPC method |
| Renderer components | VideoTimeline.test.tsx, MediaPlayer.test.tsx, CodecSelect.test.tsx, StreamDetails.test.tsx, ErrorBanner.test.tsx, AppDrawer.test.tsx, FileSummary.test.tsx, QueueJobCard.test.tsx, FileDropZone.test.tsx, BatchControls.test.tsx, ErrorSnackbar.test.tsx, ExifSection.test.tsx, FilePathField.test.tsx, TimeField.test.tsx, TitleBar.test.tsx, ConfirmDialog.test.tsx, ErrorBoundary.test.tsx, GroupedSelect.test.tsx, ProgressBar.test.tsx, ToastContainer.test.tsx, LanguageMenu.test.tsx, PageContainer.test.tsx, EllipsisTooltip.test.tsx, Footer.test.tsx, CloseConfirmDialog.test.tsx, BatchEncodingPanel.test.tsx, FormField.test.tsx, NavJobPopover.test.tsx, MediaPreview.test.tsx, ShortcutsHelpDialog.test.tsx, QueueDropArea.test.tsx, QueueAddReviewDialog.test.tsx, QueueJobOptionsDialog.test.tsx |
Rendering, interactions, error states, accessibility for all shared UI components |
| Renderer hooks | useConversion.test.tsx, useErrorHandler.test.ts, useFormErrors.test.ts, useMediaTask.test.ts, useLanguageDirection.test.tsx, useHotkeys.test.tsx |
Conversion orchestration, error handling, form validation, media task lifecycle, RTL direction, keyboard shortcuts |
| Renderer pages | VideoCut.test.tsx, Convert.test.tsx, ImageCompress.test.tsx, AudioExtract.test.tsx, Settings.test.tsx, BatchQueue.test.tsx, Logs.test.tsx, MediaInfo.test.tsx, Dashboard.test.tsx, About.test.tsx |
Full page flows: form state, validation, IPC invocation, settings persistence, about/update |
| Renderer stores | conversionStore.test.ts, audioExtractStore.test.ts, settingsStore.test.ts, errorStore.test.ts, queueStore.test.ts, toastStore.test.ts, logStore.test.ts, videoCutStore.test.ts, taskStore.test.ts, batchConfig.test.ts, dismissedAlertsStore.test.ts |
Zustand store state transitions and persistence |
| Renderer utils | formatters.test.ts, preview-cache.test.ts, lunar-calendar.test.ts, easter-egg-dates.test.ts, batch-options.test.ts, queue-reorder.test.ts |
Formatting helpers, preview cache, easter egg dates, batch options, queue reorder logic |
| Renderer app / misc | App.test.tsx, colors.test.ts, sessionCleanup.test.ts, constants/shortcuts.test.ts |
App shell routing, color palette, session cleanup, keyboard shortcuts |
| Integration | error-flow.test.ts |
Full pipeline: Error → formatError → store → display → clear |
The test environment (src/test-setup.ts) provides:
- Mocked
useTranslationfromreact-i18nextwith English key mapping and interpolation - Mocked
electronAPIonglobalThiscovering all IPC methods - Registers
@testing-library/jest-dom/vitestmatchers
Playwright-based end-to-end tests live in e2e/ (node environment, 60s timeouts) and are gated behind the E2E env var or CI:
| File | What's Covered |
|---|---|
e2e/cli.spec.ts |
CLI mode: --help/-h, subcommands (convert, info, capabilities, compress, extract-audio, batch), legacy flat syntax, global flags (--quiet, --no-color, --theme) |
e2e/specs/shell.spec.ts |
App shell: window title, electronAPI presence, all nav routes, drawer navigation, window controls, language menu |
e2e/specs/convert.spec.ts |
Convert page: file selection, output auto-suggestion, codec/bitrate/scale/pixel/transcoder options, lossless copy, conversion with progress, pause/resume, cancel |
e2e/specs/batch.spec.ts |
Batch queue: empty state, add files via review dialog, queue events, live progress, cancel all, status filter, remove job, drag reorder, window close confirmation |
e2e/specs/audio-extract.spec.ts |
Audio extraction: disabled button, video selection with audio streams, codec/bitrate changes, extraction with success toast |
e2e/specs/image-compress.spec.ts |
Image compression: dropzone, image selection with preview, format/quality/scale changes, compression with success toast |
e2e/specs/media-info.spec.ts |
Media info: video analysis (streams, codec details), image analysis (EXIF data) |
e2e/specs/settings.spec.ts |
Settings: theme cards, theme switching, always-on-top, launch-at-login, hwaccel mode persistence |
e2e/specs/logs.spec.ts |
Logs: emit entries, level filtering, clear all, download with toast |
e2e/specs/video-cut.spec.ts |
Video cut: disabled button, timeline + waveform + thumbnails, duration/end-time toggle, playhead scrubbing, cut with progress, cancel, clear form |
e2e/specs/real-convert.spec.ts |
Tier B (real): actual FFmpeg conversion without mocks (gated behind E2E_REAL=1) |