Skip to content

LeonardoJaques/test-e2e-only-nodejs

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

6 Commits
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

Test E2E — API com JWT (Node.js Puro)

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.

Diagrama de Fluxo

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
Loading

Stack

Camada Tecnologia
Runtime Node.js (ESM)
Servidor HTTP node:http (nativo)
Autenticação JWT (jsonwebtoken)
Test Runner node:test (nativo)
Assertions node:assert (nativo)

Como rodar

# 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

Endpoints

Método Rota Descrição Auth
POST /login Autenticação — retorna JWT Não
GET / Rota protegida — requer Bearer Sim (JWT)

Login

curl -X POST http://localhost:3000/login \
  -H "Content-Type: application/json" \
  -d '{"user":"leonardojaques","password":"123"}'

Acessar rota protegida

curl http://localhost:3000/ \
  -H "Authorization: Bearer <token>"

Estrutura do projeto

├── api.js          # Servidor HTTP + rotas + autenticação JWT
├── api.test.js     # Testes E2E (node:test)
├── package.json
└── readme.md

O que foi corrigido / atualizado

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

Onde este projeto pode ajudar no desenvolvimento

🎓 Aprendizado

  • Entender HTTP sem abstração — construir um servidor com node:http puro 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.

🧪 Referência para testes E2E

  • 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.

🏗️ Base para projetos reais

  • 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.

Testes

▶ 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

Créditos

Baseado no curso de Erick Wendel.

About

No description, website, or topics provided.

Resources

Stars

Watchers

Forks

Releases

No releases published

Packages

No packages published