Skip to content

Testing

Learn how to test your CurisJS applications effectively.

Work in Progress

This feature is currently under development. Documentation will be available soon.

Overview

CurisJS provides excellent testing support with:

  • Built-in test helpers
  • Request/response testing utilities
  • Database testing utilities
  • Easy mocking and stubbing
  • Integration with Vitest, Jest, or Node's test runner

Quick Start

typescript
import { describe, it, expect } from 'vitest';
import { Application } from '@curisjs/core';

describe('Application', () => {
  it('should handle GET requests', async () => {
    const app = new Application();
    
    app.get('/hello', (ctx) => {
      return ctx.json({ message: 'Hello World' });
    });
    
    const response = await app.handle(
      new Request('http://localhost/hello')
    );
    
    expect(response.status).toBe(200);
    const data = await response.json();
    expect(data).toEqual({ message: 'Hello World' });
  });
});

Testing Routes

typescript
import { describe, it, expect } from 'vitest';
import { testRequest } from '@curisjs/testing';
import { app } from '../src/app';

describe('User Routes', () => {
  it('should list users', async () => {
    const response = await testRequest(app).get('/users');
    
    expect(response.status).toBe(200);
    expect(response.body).toHaveProperty('users');
  });
  
  it('should create user', async () => {
    const response = await testRequest(app)
      .post('/users')
      .send({ name: 'John', email: 'john@example.com' });
    
    expect(response.status).toBe(201);
    expect(response.body.user).toHaveProperty('id');
  });
  
  it('should validate input', async () => {
    const response = await testRequest(app)
      .post('/users')
      .send({ name: '' });
    
    expect(response.status).toBe(422);
    expect(response.body).toHaveProperty('errors');
  });
});

Testing with Database

typescript
import { describe, it, beforeEach, afterEach } from 'vitest';
import { db } from '@curisjs/db';

describe('UserService', () => {
  beforeEach(async () => {
    // Run migrations
    await db.migrate.latest();
  });
  
  afterEach(async () => {
    // Rollback migrations
    await db.migrate.rollback();
  });
  
  it('should create user', async () => {
    const user = await UserService.create({
      name: 'John',
      email: 'john@example.com',
    });
    
    expect(user.id).toBeDefined();
    expect(user.name).toBe('John');
  });
});

Mocking Dependencies

typescript
import { describe, it, vi } from 'vitest';
import { UserService } from '../src/services/UserService';

describe('UserService', () => {
  it('should send welcome email', async () => {
    // Mock email service
    const sendEmail = vi.fn();
    const emailService = { send: sendEmail };
    
    const userService = new UserService(emailService);
    await userService.createUser({
      name: 'John',
      email: 'john@example.com',
    });
    
    expect(sendEmail).toHaveBeenCalledWith(
      'john@example.com',
      'Welcome',
      expect.any(String)
    );
  });
});

Test Helpers

typescript
// Create test app
import { createTestApp } from '@curisjs/testing';

const app = createTestApp({
  // Test-specific configuration
});

// Make authenticated request
const response = await testRequest(app)
  .get('/profile')
  .auth('token', { type: 'bearer' });

// Set headers
const response = await testRequest(app)
  .post('/api/users')
  .set('Content-Type', 'application/json')
  .send({ name: 'John' });

// Test file upload
const response = await testRequest(app)
  .post('/upload')
  .attach('file', './test.jpg');

Coming Soon

Full documentation will include:

  • Unit testing strategies
  • Integration testing
  • E2E testing
  • Database testing utilities
  • Mock helpers
  • Test coverage
  • CI/CD integration
  • Performance testing
  • Security testing
  • Best practices

Released under the MIT License.