diff --git a/package.json b/package.json index f0e926f..6520462 100644 --- a/package.json +++ b/package.json @@ -8,6 +8,9 @@ "test": "jest", "test:watch": "jest --watch", "test:coverage": "jest --coverage", + "test:renderer": "vitest run", + "test:renderer:watch": "vitest", + "test:renderer:coverage": "vitest run --coverage", "lint": "eslint src tests", "lint:fix": "eslint src tests --fix", "format": "prettier --write src tests", diff --git a/src/renderer/test/setup.ts b/src/renderer/test/setup.ts new file mode 100644 index 0000000..9ca14b1 --- /dev/null +++ b/src/renderer/test/setup.ts @@ -0,0 +1,12 @@ +import '@testing-library/jest-dom/vitest'; + +// Mock window.electronAPI for tests +declare global { + interface Window { + electronAPI: any; + } +} + +if (typeof window !== 'undefined' && !window.electronAPI) { + window.electronAPI = {}; +} diff --git a/tests/unit/lib/cn.test.ts b/tests/unit/lib/cn.test.ts new file mode 100644 index 0000000..bac24c6 --- /dev/null +++ b/tests/unit/lib/cn.test.ts @@ -0,0 +1,20 @@ +import { describe, it, expect } from 'vitest'; +import { cn } from '@/lib/utils'; + +describe('cn', () => { + it('merges class names', () => { + expect(cn('a', 'b')).toBe('a b'); + }); + + it('deduplicates conflicting tailwind classes', () => { + expect(cn('p-2', 'p-4')).toBe('p-4'); + }); + + it('ignores falsy values', () => { + expect(cn('a', false, null, undefined, '', 'b')).toBe('a b'); + }); + + it('accepts conditional class objects', () => { + expect(cn('base', { active: true, disabled: false })).toBe('base active'); + }); +}); diff --git a/vitest.config.ts b/vitest.config.ts new file mode 100644 index 0000000..aa3aaec --- /dev/null +++ b/vitest.config.ts @@ -0,0 +1,23 @@ +import { defineConfig } from 'vitest/config'; +import react from '@vitejs/plugin-react'; +import path from 'path'; + +export default defineConfig({ + plugins: [react()], + test: { + environment: 'jsdom', + globals: true, + setupFiles: ['./src/renderer/test/setup.ts'], + include: ['tests/**/*.{test,spec}.{ts,tsx}'], + coverage: { + provider: 'v8', + include: ['src/renderer/**/*.{ts,tsx}'], + exclude: ['src/renderer/test/**', 'src/renderer/**/*.test.*'], + }, + }, + resolve: { + alias: { + '@': path.join(__dirname, 'src/renderer'), + }, + }, +});