import { describe, it, expect, beforeEach, afterEach, vi } from 'vitest';
// ============================================
// Code to Test
// ============================================
class Calculator {
add(a: number, b: number) {
return a + b;
}
divide(a: number, b: number) {
if (b === 0) throw new Error('Cannot divide by zero');
return a / b;
}
async fetchData(api: () => Promise<any>) {
try {
return await api();
} catch (e) {
return null;
}
}
}
// ============================================
// Unit Tests
// ============================================
describe('Calculator', () => {
let calculator: Calculator;
beforeEach(() => {
calculator = new Calculator();
});
describe('Math Operations', () => {
it('should add two numbers correctly', () => {
const result = calculator.add(2, 3);
expect(result).toBe(5);
});
it('should handle negative numbers', () => {
expect(calculator.add(-1, -1)).toBe(-2);
expect(calculator.add(-1, 1)).toBe(0);
});
it('should divide correctly', () => {
expect(calculator.divide(6, 2)).toBe(3);
});
it('should throw error when dividing by zero', () => {
expect(() => calculator.divide(1, 0)).toThrow('Cannot divide by zero');
});
});
// ============================================
// Mocking Example
// ============================================
describe('Async Operations', () => {
it('should return data from api', async () => {
const mockApi = vi.fn().mockResolvedValue({ id: 1 });
const result = await calculator.fetchData(mockApi);
expect(result).toEqual({ id: 1 });
expect(mockApi).toHaveBeenCalledTimes(1);
});
it('should return null on failure', async () => {
const mockApi = vi.fn().mockRejectedValue(new Error('Fail'));
const result = await calculator.fetchData(mockApi);
expect(result).toBeNull();
});
});
});
// ============================================
// Snapshot Testing Example
// ============================================
describe('Snapshots', () => {
it('should match user config snapshot', () => {
const config = {
theme: 'dark',
version: '1.0.0',
features: ['a', 'b'],
timestamp: new Date('2024-01-01').toISOString(),
};
expect(config).toMatchSnapshot();
// Inline snapshot for simpler values
expect(config.theme).toMatchInlineSnapshot('"dark"');
});
});