Skip to main content
Glama
vitest.test.ts7.95 kB
import { describe, it, expect, beforeEach, afterEach, vi } from 'vitest'; import request from 'supertest'; // ============================================ // Unit Test Examples // ============================================ // Math Utilities Tests describe('Math Utilities', () => { describe('add', () => { it('adds two positive numbers', () => { expect(add(2, 3)).toBe(5); }); it('adds negative numbers', () => { expect(add(-1, -1)).toBe(-2); }); it('handles zero', () => { expect(add(0, 5)).toBe(5); }); }); describe('divide', () => { it('divides two numbers', () => { expect(divide(10, 2)).toBe(5); }); it('throws error on division by zero', () => { expect(() => divide(10, 0)).toThrow('Cannot divide by zero'); }); }); }); // Async Function Tests describe('Async Operations', () => { it('fetches data successfully', async () => { const result = await fetchData('123'); expect(result).toHaveProperty('id', '123'); }); it('handles errors gracefully', async () => { await expect(fetchData('invalid')).rejects.toThrow('Not found'); }); }); // ============================================ // Mock Examples // ============================================ describe('User Service with Mocks', () => { const mockUserRepo = { findById: vi.fn(), create: vi.fn(), update: vi.fn(), delete: vi.fn(), }; beforeEach(() => { vi.clearAllMocks(); }); it('finds user by id', async () => { const mockUser = { id: 1, name: 'John' }; mockUserRepo.findById.mockResolvedValue(mockUser); const userService = new UserService(mockUserRepo); const result = await userService.getUser(1); expect(mockUserRepo.findById).toHaveBeenCalledWith(1); expect(result).toEqual(mockUser); }); it('creates user with hashed password', async () => { const input = { email: 'test@example.com', password: 'secret123' }; mockUserRepo.create.mockResolvedValue({ id: 1, email: input.email }); const userService = new UserService(mockUserRepo); const result = await userService.createUser(input); expect(mockUserRepo.create).toHaveBeenCalled(); expect(result.email).toBe(input.email); expect(mockUserRepo.create.mock.calls[0][0].password).not.toBe(input.password); }); }); // ============================================ // Integration Test Examples // ============================================ describe('API Integration Tests', () => { let app: Express; beforeEach(async () => { app = createApp(); await setupTestDatabase(); }); afterEach(async () => { await cleanupTestDatabase(); }); describe('POST /api/users', () => { it('creates a new user', async () => { const response = await request(app) .post('/api/users') .send({ email: 'new@example.com', name: 'New User', password: 'password123', }) .expect(201); expect(response.body.success).toBe(true); expect(response.body.data).toHaveProperty('id'); expect(response.body.data.email).toBe('new@example.com'); }); it('rejects duplicate email', async () => { // Create first user await request(app) .post('/api/users') .send({ email: 'test@example.com', name: 'Test', password: 'pass' }); // Try to create duplicate const response = await request(app) .post('/api/users') .send({ email: 'test@example.com', name: 'Test2', password: 'pass' }) .expect(400); expect(response.body.error).toContain('already exists'); }); it('validates required fields', async () => { const response = await request(app) .post('/api/users') .send({ email: 'test@example.com' }) .expect(400); expect(response.body.error).toBeDefined(); }); }); describe('GET /api/users/:id', () => { it('returns user by id', async () => { const createRes = await request(app) .post('/api/users') .send({ email: 'test@example.com', name: 'Test', password: 'pass' }); const response = await request(app) .get(`/api/users/${createRes.body.data.id}`) .expect(200); expect(response.body.data.email).toBe('test@example.com'); }); it('returns 404 for non-existent user', async () => { await request(app) .get('/api/users/99999') .expect(404); }); }); }); // ============================================ // E2E Test Examples // ============================================ describe('Authentication Flow E2E', () => { let app: Express; let authToken: string; beforeAll(async () => { app = createApp(); await setupTestDatabase(); }); afterAll(async () => { await cleanupTestDatabase(); }); it('registers a new user', async () => { const response = await request(app) .post('/api/auth/register') .send({ email: 'e2e@example.com', name: 'E2E User', password: 'securePassword123', }) .expect(201); expect(response.body.user.email).toBe('e2e@example.com'); }); it('logs in with credentials', async () => { const response = await request(app) .post('/api/auth/login') .send({ email: 'e2e@example.com', password: 'securePassword123', }) .expect(200); expect(response.body.token).toBeDefined(); authToken = response.body.token; }); it('accesses protected route with token', async () => { const response = await request(app) .get('/api/profile') .set('Authorization', `Bearer ${authToken}`) .expect(200); expect(response.body.email).toBe('e2e@example.com'); }); it('rejects access without token', async () => { await request(app) .get('/api/profile') .expect(401); }); }); // ============================================ // Test Utilities // ============================================ export function createTestUser(overrides = {}) { return { email: `test-${Date.now()}@example.com`, name: 'Test User', password: 'testPassword123', ...overrides, }; } export async function authenticateAs(app: Express, role: 'user' | 'admin' = 'user') { const user = createTestUser({ role }); await request(app).post('/api/auth/register').send(user); const response = await request(app) .post('/api/auth/login') .send({ email: user.email, password: user.password }); return response.body.token; } // Stubs for examples (would be real implementations) function add(a: number, b: number) { return a + b; } function divide(a: number, b: number) { if (b === 0) throw new Error('Cannot divide by zero'); return a / b; } async function fetchData(id: string) { if (id === 'invalid') throw new Error('Not found'); return { id }; } class UserService { constructor(private repo: any) { } async getUser(id: number) { return this.repo.findById(id); } async createUser(data: any) { return this.repo.create({ ...data, password: 'hashed' }); } } function createApp(): any { return {}; } async function setupTestDatabase() { } async function cleanupTestDatabase() { } type Express = any;

Latest Blog Posts

MCP directory API

We provide all the information about MCP servers via our MCP API.

curl -X GET 'https://glama.ai/api/mcp/v1/servers/millsydotdev/Code-MCP'

If you have feedback or need assistance with the MCP directory API, please join our Discord server