Estratégia de testes
Ferramentas
- Vitest (
npm run test/test:watch/test:coverage) - Testing Library + jsdom
- Helpers em
src/test/e testes colocalizados*.test.ts
CI corre npm run test:coverage e envia coverage/lcov.info ao Sonar (sonar-project.properties). Exclusões Sonar: **/*.test.*, src/test/**.
Pirâmide neste repo
| Tipo | O que cobrimos | O que não é este repo |
|---|---|---|
| Unitário / mapper | domain/, parsers de services, types (User.test.ts, Company.test.ts) | — |
| Service HTTP | fetch mockado (Auth, Roles, CompanySlug, Tenant*, Governance*, IntegrationCatalog) | contrato real da API |
| Componente | pontual (quando o risco é UI de form) | E2E Playwright (não configurado) |
| E2E / contrato | — | backends Central/Default |
Não há suíte de integração contra API real no CI do front.
Como rodar
npm run test
npm run test:watch
npm run test:coverage
O que é obrigatório num PR
- Novo mapper/normalizer → teste de casos felizes + payload incompleto
- Novo service → pelo menos URL/método e tratamento
!res.ok - Regra de role/admin (
domain/roles) → testes de equivalência A1/A2/A3/N0 - Não mockar o mundo inteiro para mudar uma className
Cobertura esperada
Não há gate numérico no package.json. Diretriz prática:
- Não baixar cobertura das pastas
domain/emodels/typessem motivo - Preferir testes no código que transforma JSON da API (é onde os bugs de tenant aparecem)
- Views grandes de governança: teste o helper/service, não o JSX de 2k linhas
Sonar é continue-on-error no CI: quality gate vermelho não bloqueia merge hoje — ainda assim trate findings novos.
Convenções
- Nome:
Foo.test.tsao lado deFoo.ts - Não bater em rede: mock
global.fetch - Não gravar JWT real em fixtures
- i18n: prefira
errorKeya snapshot de texto traduzido
Browser
Mudança de UI: validar no Vite (npm run dev) o fluxo do usuário (login se possível, rota, empty/error). Screenshot único não substitui o clique.