API HTTP simples com autenticação via JSON Web Token (JWT), construída sem frameworks — apenas módulos nativos do Node.js (node:http, node:test, node:assert).
O foco do projeto é demonstrar testes end-to-end usando o test runner nativo do Node.js.
flowchart TD
A["Cliente envia request"] --> B{"Rota?"}
B -->|"POST /login"| C["Recebe user + password"]
C --> D{"Credenciais válidas?"}
D -->|"Sim"| E["Gera JWT Token"]
E --> F["✅ 200 — Retorna token"]
D -->|"Não"| G["❌ 401 — user or password invalid"]
B -->|"GET /"| H{"Header Authorization?"}
H --> I{"Token JWT válido?"}
I -->|"Sim"| J["✅ 200 — Hey welcome"]
I -->|"Não"| K["❌ 401 — invalid token!"]
style F fill:#22c55e,color:#fff
style J fill:#22c55e,color:#fff
style G fill:#ef4444,color:#fff
style K fill:#ef4444,color:#fff
| Camada | Tecnologia |
|---|---|
| Runtime | Node.js (ESM) |
| Servidor HTTP | node:http (nativo) |
| Autenticação | JWT (jsonwebtoken) |
| Test Runner | node:test (nativo) |
| Assertions | node:assert (nativo) |
# Instalar dependências
npm install
# Iniciar servidor (com hot-reload)
npm run dev
# Rodar testes E2E
npm test
# Rodar testes em modo watch
npm run test:dev| Método | Rota | Descrição | Auth |
|---|---|---|---|
| POST | /login |
Autenticação — retorna JWT | Não |
| GET | / |
Rota protegida — requer Bearer | Sim (JWT) |
curl -X POST http://localhost:3000/login \
-H "Content-Type: application/json" \
-d '{"user":"leonardojaques","password":"123"}'curl http://localhost:3000/ \
-H "Authorization: Bearer <token>"├── api.js # Servidor HTTP + rotas + autenticação JWT
├── api.test.js # Testes E2E (node:test)
├── package.json
└── readme.md
| Item | Antes | Depois |
|---|---|---|
| Erro de runtime | json.stringify() (minúsculo) |
JSON.stringify() |
| Status HTTP | 400 para token inválido |
401 (Unauthorized) |
| Callback do server | console.log() executado imediatamente |
Arrow function () => console.log() |
| Mensagem de erro | Espaço extra " invalid token!" |
"invalid token!" |
| Header de auth | Token sem prefixo | Bearer ${token} |
| Race condition | before hook aguardava evento já emitido |
Checagem _server.listening antes de aguardar |
- Entender HTTP sem abstração — construir um servidor com
node:httppuro mostra como funciona por baixo do Express, Fastify, etc. - JWT na prática — implementação mínima de autenticação com token, sem bibliotecas extras de middleware.
- Test runner nativo — aprender a testar sem Jest, Mocha ou Vitest, usando apenas o que o Node.js já oferece.
- Modelo de testes E2E — este projeto serve como template para testar qualquer API HTTP com o test runner nativo.
- Fluxo completo — os testes cobrem o ciclo inteiro: login → obter token → usar token → acessar rota protegida.
- Sem dependências de teste — zero pacotes adicionais para rodar os testes, o que simplifica CI/CD.
- Scaffold de API — pode ser expandido com mais rotas, banco de dados, e middleware.
- Padrão de autenticação — a lógica de JWT pode ser reaproveitada em projetos maiores.
- Pipeline de CI — os testes podem ser integrados diretamente a GitHub Actions com
npm test, sem configuração extra.
▶ API Workflow
✔ should received not authorized given wrong user and password (27ms)
✔ should login successfully given user and password (5ms)
✔ should not be allowed to access private data without a token (2ms)
✔ should be allowed to access private data with a valid token (2ms)
✔ API Workflow (94ms)
ℹ tests 4 | pass 4 | fail 0
Baseado no curso de Erick Wendel.