Passo-a-passo detalhado do skill, referenciando as fases cognitivas:
1SENSE — Mapear endpoints
Ler OpenAPI spec ou rodar `curl -s localhost:3000/api/docs/json | jq '.paths | keys'`
Identificar quais endpoints têm autenticação (Bearer, API key, session)
2RECOMMEND — Setup de testes de integração (Vitest + Supertest)
```typescript
// tests/api/setup.ts
import { app } from '../../src/app';
import { db } from '../../src/lib/db';
import request from 'supertest';
export const api = request(app);
export async function createTestUser() {
return db.user.create({
data: { name: 'Test User', email: `test+${Date.now()}@test.com`, role: 'user' },
});
}
export async function getAuthToken(userId: string): Promise<string> {
return signJWT({ sub: userId, role: 'user' }, { expiresIn: '1h' });
}
```
3RECOMMEND — Gerar testes de endpoint
```typescript
// tests/api/users.test.ts
describe('GET /api/v1/users/:id', () => {
let user: User;
let token: string;
beforeEach(async () => {
user = await createTestUser();
token = await getAuthToken(user.id);
});
afterEach(async () => {
await db.user.delete({ where: { id: user.id } });
});
it('returns user data for valid ID', async () => {
const res = await api.get(`/api/v1/users/${user.id}`)
.set('Authorization', `Bearer ${token}`)
.expect(200);
expect(res.body).toMatchObject({
id: user.id, name: user.name, email: user.email,
});
expect(res.body.password).toBeUndefined(); // nunca expor senha
});
it('returns 401 without authentication', () => {
return api.get(`/api/v1/users/${user.id}`).expect(401);
});
it('returns 403 for other user ID', async () => {
const otherUser = await createTestUser();
await api.get(`/api/v1/users/${otherUser.id}`)
.set('Authorization', `Bearer ${token}`)
.expect(403);
await db.user.delete({ where: { id: otherUser.id } });
});
it('returns 404 for non-existent ID', () => {
return api.get('/api/v1/users/00000000-0000-0000-0000-000000000000')
.set('Authorization', `Bearer ${token}`)
.expect(404);
});
});
```
4EVALUATE — Rodar e verificar cobertura
```bash
vitest run --coverage tests/api/
# Verificar que todos os endpoints têm cobertura > 80%
```
5REFLECT — Integrar no CI
```yaml
# .github/workflows/ci.yml
test-api:
services:
postgres: { image: postgres:16, env: { POSTGRES_PASSWORD: test } }
steps:
run: npm test:api -- --coverage
```
Reportar telemetria via mcp-skillschain