Files
DeskcommCRM/vitest.config.ts
T
melgarafaelandClaude Opus 5.5 99962c534c ci(cercas): i18n e fragmentos de release entram no pnpm cercas
A seleção de cercas descartava todo teste que importasse código do
repositório. i18n-espanhol-cobre-a-tela e fragmentos-de-release importam
só módulos puros (lib/i18n/*, lib/release/fragmento) e ficavam no projeto
produto, onde reprovavam PR aos 5-6 min (#1604, #1587, #1598) e o
`pnpm cercas` local não os via.

- Regra transitiva: teste que lê o repositório (importa fs) entra se toda
  a cadeia de imports do repositório só chega a builtin/vitest/typescript/
  yaml/zod e nenhum módulo cita global do browser.
- Parser do TypeScript no lugar da regex: um import escrito em comentário
  (helpers/chave-dinamica.ts) tirava o teste de i18n da seleção.
- 85 arquivos migram de produto para cercas; a partição continua exata
  (1336 arquivos, 234 + 1102, zero em dobro).

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_019pUk4A1WWHegBZNbHsqDnp
2026-09-24 17:50:48 -03:00

75 lines
3.4 KiB
TypeScript
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
import { defineConfig } from "vitest/config";
import path from "node:path";
import { selecionarCercas } from "./vitest.cercas";
// As guardas estruturais — o arquivo de teste que só lê o repositório (baseline
// × cadeia, MANIFEST, varredura de anon, docs, workflows, i18n, fragmentos) e
// não toca DOM; código do produto, só módulo puro. Quem entra é decidido pelo
// import, em vitest.cercas.ts.
const CERCAS = selecionarCercas(__dirname);
export default defineConfig({
// JSX automático já é o default do transform esbuild no Vite 7+ (vitest 4);
// a opção `esbuild.jsx` saiu do tipo — provado pelos testes de componente.
test: {
environment: "jsdom",
// O padrão do vitest é 5s por teste. Numa suíte jsdom + Testing Library
// isso é apertado: em máquina carregada (CI concorrido, dev rodando outras
// coisas) testes SAUDÁVEIS estouram e a suíte fica vermelha por lentidão.
// Aconteceu três vezes aqui, em testes diferentes a cada vez — inclusive
// derrubando a main num PR que só mexia em documentação. Um gate que
// reprova sem defeito ensina o time a ignorar o gate.
// 15s não mascara travamento (quem trava continua reprovando, dez segundos
// depois); só para de cronometrar a lentidão da máquina como se fosse
// asserção. Caso que precisa de mais (abrir processo filho) declara o seu.
testTimeout: 15_000,
setupFiles: ["./tests/setup/vitest.setup.ts"],
globals: true,
coverage: { provider: "v8", reporter: ["text", "html"] },
// tests/journeys/** roda no Playwright (jornada de baseline dos canais), igual
// a tests/e2e/**: sem excluir, o include default do vitest o pegaria e o
// import de @playwright/test derrubaria a suíte unitária.
exclude: [
"**/node_modules/**",
".next",
"dist",
".claude/**",
"tests/e2e/**",
"tests/invariants/**",
"tests/journeys/**",
// Bancada opcional: usa node:test, PostgreSQL próprio e Playwright com
// configuração dedicada. Não depende do ambiente da suíte do produto.
"experiments/extensoes/**",
],
// Dois projetos, a mesma suíte: `pnpm test:unit` continua rodando TUDO,
// uma vez só. A divisão existe por duas razões medidas em 18/09/2026:
//
// 1. TEMPO. As cercas não tocam DOM, e o jsdom é o custo dominante: as
// mesmas 103 cercas levaram 358 s com jsdom e 35 s em `node`, na mesma
// máquina, no mesmo minuto. Na suíte longa elas pagavam jsdom à toa.
// 2. ORDEM. `pnpm cercas` (`--project cercas`) roda só elas, e o `verify`
// as põe ANTES do typecheck: o vermelho estrutural — o que mais reprova
// PR — chegava no fim da suíte, aos 7–12 min (runs 35341823692 e
// 35331913136), e passa a chegar no primeiro minuto.
projects: [
{
extends: true,
test: { name: "cercas", environment: "node", include: CERCAS },
},
{
extends: true,
test: { name: "produto", exclude: CERCAS },
},
],
},
resolve: {
alias: {
"@": path.resolve(__dirname, "."),
// `server-only` não é dependência do projeto: o Next o resolve para o próprio módulo vazio
// quando o código roda no servidor. Os testes rodam como servidor, então usam o mesmo vazio.
"server-only": path.resolve(__dirname, "node_modules/next/dist/compiled/server-only/empty.js"),
},
},
});