Recap dos principais pontos do material lido — TS, Jest, supertest, TDD top-down.
Setup TS + Jest, RED → GREEN → REFACTOR aplicado a controller, service, repository e helpers.
Pausa para descansar a cabeça e recarregar para o desenvolvimento da tarde.
Aplicar o ciclo TDD na entidade do projeto até obter a casca verde do back-end.
interface User é a verdade compartilhada entre camadas.Sair do dia com um servidor Express em TypeScript respondendo GET /users/:id, com testes verdes em todas as camadas — controller, service, repository, helper.
Runtime: express, pg, dotenv.
Dev: typescript, tsx, @types/*, jest, ts-jest, supertest.
dev — tsx watch src/server.tsbuild — tscstart — node dist/server.jstest — jesttest:watch — jest --watch.ts direto, sem build préviopreset: 'ts-jest' — compila TS em memória.testEnvironment: 'node' — sem JSDOM.testMatch aponta para *.spec.ts ao lado de cada arquivo.supertest dispara HTTP no app sem subir porta.Todo teste tem três blocos: preparar entrada, executar a ação, verificar o resultado. Esse padrão deixa o teste lido como uma especificação.
Falha. Não existe app ainda, nem rota, nem controller. Isso é certo.
Esse spec descreve como o sistema é realmente usado: uma chamada HTTP. Quando ele passar, sabemos que o caminho controller → service → repository está fechado.
jest.fn() — cria a função.mockResolvedValue() — define o que a Promise resolve.null → service lança NotFoundError.Aqui mockamos o pool.query. Quando precisarmos de um banco real (próximas aulas), usaremos um banco efêmero — Postgres em container, criado e derrubado a cada suíte.
$1 (anti-injeção).id recebido.null quando não há linhas.isValidEmailtoBe — igualdade estrita (===).toEqual — igualdade profunda de objetos/arrays.toMatchObject — subset de propriedades.rejects.toThrow — Promise rejeitada.Helpers puros são o caso mais simples de testar — comece por eles para aquecer e termine por eles para refatorar com segurança.
.spec.ts ao lado de cada arquivoO teste do controller ainda falha (falta o service), mas a estrutura está pronta. Agora descemos uma camada.
interface Userexport interface User { id: number; name: string; email: string; }
Os dois testes do service passam. O do controller ainda depende do repository — vamos lá.
$1 sempre · nunca concatenar string com input do usuárioNunca: "SELECT * FROM users WHERE id = " + req.params.id. Sempre: pool.query("... WHERE id = $1", [id]). O driver do pg escapa o valor automaticamente.
Os 4 specs passam. npm test retorna verde. Agora podemos refatorar.
Esta aula: Visão Computational — desenhamos a casca do back-end (controller → service → repository) com TDD top-down.
Expor a casca dos endpoints do recurso central do projeto (controller → service → repository) verificada por testes automatizados.
| CONF Confiabilidade | ✅ Testes automáticos |
| MANT Manutenibilidade | ✅ TS + camadas isoladas |
| DES Desempenho | → pool reusado |
| SEG Segurança | → validação no controller |
| SUP Suportabilidade | → specs documentam |
asyncHandler para tirar o try/catch dos controllers.helpers/ (testáveis isoladamente).RequestHandler.Use cobertura para encontrar buracos, não para perseguir 100%. Um teste sem asserção real não cobre nada — só engana o relatório.
POST/PUT/DELETE com validação, tratamento robusto de erros e o CRUD HTTP completo da entidade do projeto.
DATABASE_URL do Supabase e materialize a modelagem física no PostgresCHANGELOG.mdClone, instale dependências e leia o CHANGELOG.md com calma, ponto a ponto — ele descreve a estrutura do projeto e o que cada migration faz.
git clone https://git.inteli.edu.br/afonso.brandao/modulo2in.git cd modulo2in npm install more CHANGELOG.md # leia entrada por entrada antes de seguir
pgbouncer) na porta 6543 para apps Node.[YOUR-PASSWORD] pela senha real do banco.DATABASE_URL=postgresql://postgres.[REF]:[SENHA]@aws-0-[REGION].pooler.supabase.com:6543/postgres
.envCrie um .env na raiz do projeto com a URL acima. O pool em src/db/pool.ts já lê process.env.DATABASE_URL.
# .env DATABASE_URL=postgresql://postgres.[REF]:[SENHA]@...:6543/postgres
Aplique a modelagem física definida na pasta migrations/ diretamente no Postgres do Supabase.
npm run migrate # verifique no Supabase: Table Editor mostra as tabelas criadas
npm install sem erros..env com DATABASE_URL apontando para o Supabase do seu projeto.