Contexto
A API do Dev Garage hoje não tem nenhuma cobertura de testes — não há framework configurado no package.json. A lógica é simples mas crítica: validação de payloads (lib/http.ts), o store em memória (lib/store.ts) e os route handlers em app/api/**. Esta issue propõe um plano para introduzir testes unitários.
Objetivo
Configurar uma suíte de testes unitários rápida e estabelecer cobertura para a camada de validação, o store e os route handlers da API.
Stack proposta
- Vitest — rápido, ESM-first (o projeto é
"type": "module") e integra bem com o setup de TS/Next.
- Resolver o alias
@/* no config do Vitest (espelhando o tsconfig.json).
- Adicionar scripts ao
package.json: test e test:watch.
Plano de implementação
1. Setup
2. lib/http.ts — validação (maior prioridade, lógica pura, sem mocks)
3. lib/store.ts — CRUD em memória
4. Route handlers (app/api/**)
Critérios de aceite
Fora de escopo
- Testes E2E / de integração com servidor real.
- Testes de componentes React / UI.
Contexto
A API do Dev Garage hoje não tem nenhuma cobertura de testes — não há framework configurado no
package.json. A lógica é simples mas crítica: validação de payloads (lib/http.ts), o store em memória (lib/store.ts) e os route handlers emapp/api/**. Esta issue propõe um plano para introduzir testes unitários.Objetivo
Configurar uma suíte de testes unitários rápida e estabelecer cobertura para a camada de validação, o store e os route handlers da API.
Stack proposta
"type": "module") e integra bem com o setup de TS/Next.@/*no config do Vitest (espelhando otsconfig.json).package.json:testetest:watch.Plano de implementação
1. Setup
vitestcomo devDependency.vitest.config.tscom o alias@/apontando para a raiz e ambientenode.test/test:watchaopackage.json.2.
lib/http.ts— validação (maior prioridade, lógica pura, sem mocks)parseCreateProject: nome obrigatório, trim, limite de 80 chars;descriptionopcional (tipo + limite 500);statusdefaultideae rejeição de status inválido;tags(lista de strings, trim, dedupe, corte em 10).parseUpdateProject: patch parcial; rejeitarnamevazio; validar tipos/limites de cada campo.parseCreateTask:titleobrigatório, trim, limite 140.parseUpdateTask: patch parcial detitle/done; erro "Nada para atualizar" quando vazio;doneprecisa ser booleano.badRequest/notFoundretornam status e corpo corretos.3.
lib/store.ts— CRUD em memórialistProjectsretorna summaries comtaskCount/doneCountcorretos e ordenados porcreatedAtdesc.getProjectinclui tasks ordenadas; retornaundefinedpara id inexistente.createProject/updateProject(patch parcial) /deleteProject(cascata nas tasks).addTaskretornaundefinedpara projeto inexistente;updateTask/deleteTask.globalThis.__devGarageDb).4. Route handlers (
app/api/**)GET/POST/PATCH/DELETE) passandoRequeste oparams(lembrar queparamsé umaPromise).Critérios de aceite
pnpm testroda verde localmente.lib/http.tselib/store.tscom cobertura alta dos ramos.Fora de escopo