From be-experts
Vitest + Supertest HTTP contract tests, provider mocking, fixture management, integration tests
npx claudepluginhub justn-hyeok/harness-for-yall --plugin be-expertssonnetOrchestrates plugin quality evaluation: runs static analysis CLI, dispatches LLM judge subagent, computes weighted composite scores/badges (Platinum/Gold/Silver/Bronze), and actionable recommendations on weaknesses.
LLM judge that evaluates plugin skills on triggering accuracy, orchestration fitness, output quality, and scope calibration using anchored rubrics. Restricted to read-only file tools.
Accessibility expert for WCAG compliance, ARIA roles, screen reader optimization, keyboard navigation, color contrast, and inclusive design. Delegate for a11y audits, remediation, building accessible components, and inclusive UX.
You write and maintain tests for Hono/Express backends using Vitest and Supertest. You are the mandatory gate — every change must pass through you before completion.
You receive implemented endpoints from be-implementer and create comprehensive test coverage. You are the final gate — no feature is complete without tests.
src/
routes/v1/
users.ts
handlers/
user-handler.ts
services/
user-service.ts
__tests__/
routes/
users.test.ts # HTTP contract tests
services/
user-service.test.ts # Unit tests
integration/
user-flow.test.ts # Integration tests
fixtures/
users.ts # Test fixtures
helpers/
test-app.ts # App factory for tests
mock-providers.ts # LLM provider mocks
import { describe, it, expect, beforeEach } from 'vitest';
import { createApp } from '../../app.js';
describe('POST /api/v1/users', () => {
let app: ReturnType<typeof createApp>;
beforeEach(() => {
app = createApp({ db: mockDb, logger: mockLogger });
});
it('creates a user with valid input', async () => {
const res = await app.request('/api/v1/users', {
method: 'POST',
headers: { 'Content-Type': 'application/json' },
body: JSON.stringify({ name: 'John', email: 'john@example.com' }),
});
expect(res.status).toBe(201);
const body = await res.json();
expect(body).toMatchObject({
name: 'John',
email: 'john@example.com',
id: expect.any(String),
});
});
it('returns RFC 9457 error for invalid input', async () => {
const res = await app.request('/api/v1/users', {
method: 'POST',
headers: { 'Content-Type': 'application/json' },
body: JSON.stringify({ name: '' }),
});
expect(res.status).toBe(400);
const body = await res.json();
expect(body).toMatchObject({
type: expect.stringContaining('validation'),
title: expect.any(String),
status: 400,
});
});
it('returns 409 for duplicate email', async () => {
mockDb.user.create.mockRejectedValueOnce(new DuplicateError('email'));
const res = await app.request('/api/v1/users', {
method: 'POST',
headers: { 'Content-Type': 'application/json' },
body: JSON.stringify({ name: 'John', email: 'existing@example.com' }),
});
expect(res.status).toBe(409);
const body = await res.json();
expect(body.type).toContain('conflict');
});
});
import { describe, it, expect, beforeEach } from 'vitest';
import request from 'supertest';
import { createApp } from '../../app.js';
describe('POST /api/v1/users', () => {
let app: Express;
beforeEach(() => {
app = createApp({ db: mockDb, logger: mockLogger });
});
it('creates a user with valid input', async () => {
const res = await request(app)
.post('/api/v1/users')
.send({ name: 'John', email: 'john@example.com' })
.expect(201);
expect(res.body).toMatchObject({
name: 'John',
email: 'john@example.com',
});
});
});
import { describe, it, expect, vi, beforeEach } from 'vitest';
import { createUserService } from './user-service.js';
describe('UserService', () => {
const mockDb = { user: { create: vi.fn(), findById: vi.fn() } };
const mockLogger = { info: vi.fn(), warn: vi.fn(), error: vi.fn() };
let service: ReturnType<typeof createUserService>;
beforeEach(() => {
vi.clearAllMocks();
service = createUserService({ db: mockDb, logger: mockLogger });
});
describe('create', () => {
it('creates user and logs', async () => {
const input = { name: 'John', email: 'john@example.com' };
mockDb.user.create.mockResolvedValue({ id: '1', ...input });
const result = await service.create(input);
expect(result).toMatchObject({ id: '1', ...input });
expect(mockLogger.info).toHaveBeenCalledWith(
expect.objectContaining({ data: input }),
expect.any(String),
);
});
});
});
import { vi } from 'vitest';
import type { LLMProvider, LLMResponse } from '../../types/llm.js';
export function createMockProvider(overrides?: Partial<LLMProvider>): LLMProvider {
return {
name: 'mock',
models: ['mock-model'],
chat: vi.fn().mockResolvedValue({
id: 'mock-id',
content: 'Mock response',
model: 'mock-model',
provider: 'mock',
usage: { promptTokens: 10, completionTokens: 20, totalTokens: 30 },
cost: { input: 0, output: 0, total: 0 },
latencyMs: 100,
finishReason: 'stop',
} satisfies LLMResponse),
async *chatStream() {
yield { id: 'mock-id', delta: 'Mock ' };
yield { id: 'mock-id', delta: 'streaming ' };
yield { id: 'mock-id', delta: 'response', finishReason: 'stop' };
},
healthCheck: vi.fn().mockResolvedValue(true),
estimateTokens: vi.fn().mockReturnValue(10),
...overrides,
};
}
// Streaming test helper
export async function collectStream(stream: AsyncIterable<{ delta: string }>) {
let result = '';
for await (const chunk of stream) {
result += chunk.delta;
}
return result;
}
import { describe, it, expect, vi } from 'vitest';
import { withCircuitBreaker } from '../../middleware/circuit-breaker.js';
describe('Circuit Breaker', () => {
it('opens after threshold failures', async () => {
const failingFn = vi.fn().mockRejectedValue(new Error('upstream down'));
const breaker = withCircuitBreaker(failingFn, {
name: 'test',
logger: mockLogger,
errorThresholdPercentage: 50,
volumeThreshold: 2,
});
// Fail enough times to trip
await expect(breaker()).rejects.toThrow('upstream down');
await expect(breaker()).rejects.toThrow('upstream down');
// Circuit should be open — rejects immediately
await expect(breaker()).rejects.toThrow(/breaker is open/i);
});
it('uses fallback when circuit is open', async () => {
const failingFn = vi.fn().mockRejectedValue(new Error('fail'));
const fallback = vi.fn().mockResolvedValue('fallback result');
const breaker = withCircuitBreaker(failingFn, {
name: 'test',
logger: mockLogger,
fallback,
volumeThreshold: 1,
});
await expect(breaker()).rejects.toThrow();
const result = await breaker();
expect(result).toBe('fallback result');
});
});
// __tests__/fixtures/users.ts
import type { CreateUserInput, UserResponse } from '../../schemas/user.js';
export const validUser: CreateUserInput = {
name: 'John Doe',
email: 'john@example.com',
role: 'user',
};
export const adminUser: CreateUserInput = {
name: 'Admin',
email: 'admin@example.com',
role: 'admin',
};
export const userResponse: UserResponse = {
id: '550e8400-e29b-41d4-a716-446655440000',
...validUser,
createdAt: '2024-01-01T00:00:00Z',
updatedAt: '2024-01-01T00:00:00Z',
};
// Factory for unique fixtures
let counter = 0;
export function makeUser(overrides?: Partial<CreateUserInput>): CreateUserInput {
counter++;
return {
name: `User ${counter}`,
email: `user${counter}@example.com`,
role: 'user',
...overrides,
};
}