create-genia-os 2.1.1 → 2.3.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +117 -11
- package/bin/index.js +92 -0
- package/package.json +4 -2
- package/template/.claude/CLAUDE.md +215 -215
- package/template/.claude/agent-memory/analyst/MEMORY.md +20 -20
- package/template/.claude/agent-memory/architect/MEMORY.md +20 -20
- package/template/.claude/agent-memory/dev/MEMORY.md +20 -20
- package/template/.claude/agent-memory/devops/MEMORY.md +20 -20
- package/template/.claude/agent-memory/pm/MEMORY.md +20 -20
- package/template/.claude/agent-memory/po/MEMORY.md +20 -20
- package/template/.claude/agent-memory/qa/MEMORY.md +20 -20
- package/template/.claude/agent-memory/reviewer/MEMORY.md +20 -20
- package/template/.claude/agent-memory/sm/MEMORY.md +20 -20
- package/template/.claude/hooks/enforce-git-push-authority.py +70 -70
- package/template/.claude/hooks/metrics-tracker.cjs +65 -0
- package/template/.claude/hooks/precompact-session-digest.cjs +87 -87
- package/template/.claude/hooks/sql-governance.py +65 -65
- package/template/.claude/hooks/synapse-engine.cjs +122 -122
- package/template/.claude/hooks/write-path-validation.py +59 -59
- package/template/.claude/rules/agent-authority.md +39 -39
- package/template/.claude/rules/agent-handoff.md +71 -71
- package/template/.claude/rules/agent-memory.md +61 -61
- package/template/.claude/rules/ids-principles.md +52 -52
- package/template/.claude/rules/mcp-usage.md +49 -49
- package/template/.claude/rules/new-project.md +157 -0
- package/template/.claude/rules/story-lifecycle.md +87 -87
- package/template/.claude/rules/workflow-execution.md +68 -68
- package/template/.claude/settings.json +58 -58
- package/template/.claude/settings.local.json +14 -14
- package/template/.genia/CONSTITUTION.md +129 -129
- package/template/.genia/contexts/api-patterns.md +134 -134
- package/template/.genia/contexts/nextjs-react.md +210 -210
- package/template/.genia/contexts/projeto.md +18 -18
- package/template/.genia/contexts/supabase.md +152 -152
- package/template/.genia/contexts/whatsapp-cloud.md +176 -176
- package/template/.genia/core-config.yaml +192 -192
- package/template/.genia/development/agents/analyst.md +138 -138
- package/template/.genia/development/agents/architect.md +171 -171
- package/template/.genia/development/agents/dev.md +160 -160
- package/template/.genia/development/agents/devops.md +200 -200
- package/template/.genia/development/agents/pm.md +142 -142
- package/template/.genia/development/agents/po.md +165 -165
- package/template/.genia/development/agents/qa.md +183 -183
- package/template/.genia/development/agents/reviewer.md +198 -198
- package/template/.genia/development/agents/sm.md +230 -230
- package/template/.genia/development/checklists/architecture-review.md +189 -189
- package/template/.genia/development/checklists/pre-commit.md +205 -205
- package/template/.genia/development/checklists/pre-deploy.md +230 -230
- package/template/.genia/development/checklists/qa-gate.md +216 -216
- package/template/.genia/development/checklists/story-dod.md +155 -155
- package/template/.genia/development/tasks/code-review.md +197 -197
- package/template/.genia/development/tasks/criar-prd.md +170 -170
- package/template/.genia/development/tasks/criar-spec.md +188 -188
- package/template/.genia/development/tasks/criar-story.md +185 -185
- package/template/.genia/development/tasks/debug-sistematico.md +230 -230
- package/template/.genia/development/tasks/dev-implement.md +199 -199
- package/template/.genia/development/tasks/qa-review.md +224 -224
- package/template/.genia/development/workflows/brownfield.md +178 -178
- package/template/.genia/development/workflows/delivery.md +208 -208
- package/template/.genia/development/workflows/development.md +189 -189
- package/template/.genia/development/workflows/greenfield.md +166 -166
- package/template/.genia/development/workflows/planning.md +167 -167
- package/template/.genia/development/workflows/qa-loop.md +179 -179
- package/template/.genia/development/workflows/spec-pipeline.md +192 -192
- package/template/.genia/development/workflows/story-development-cycle.md +252 -252
- package/template/.genia/guidelines/clean-code.md +98 -98
- package/template/.genia/guidelines/testing.md +176 -176
- package/template/.genia/skills/design/canvas-design.md +109 -109
- package/template/.genia/skills/design/frontend-design.md +140 -140
- package/template/.genia/skills/dev/mcp-builder.md +172 -172
- package/template/.genia/skills/dev/webapp-testing.md +150 -150
- package/template/.genia/skills/documents/docx.md +153 -153
- package/template/.genia/skills/documents/pdf.md +134 -134
- package/template/.genia/skills/documents/pptx.md +118 -118
- package/template/.genia/skills/documents/xlsx.md +140 -140
- package/template/.synapse/agent-analyst +8 -8
- package/template/.synapse/agent-architect +8 -8
- package/template/.synapse/agent-dev +8 -8
- package/template/.synapse/agent-devops +8 -8
- package/template/.synapse/agent-pm +8 -8
- package/template/.synapse/agent-po +7 -7
- package/template/.synapse/agent-qa +8 -8
- package/template/.synapse/agent-reviewer +7 -7
- package/template/.synapse/agent-sm +7 -7
- package/template/.synapse/constitution +7 -7
- package/template/.synapse/context +8 -8
- package/template/.synapse/global +8 -8
- package/template/.synapse/manifest +14 -14
- package/template/README.md +53 -53
|
@@ -1,98 +1,98 @@
|
|
|
1
|
-
# Guideline: Clean Code
|
|
2
|
-
|
|
3
|
-
> Padroes de codigo pragmaticos - conciso, direto, sem over-engineering.
|
|
4
|
-
|
|
5
|
-
## Principios Core
|
|
6
|
-
|
|
7
|
-
| Principio | Regra |
|
|
8
|
-
|-----------|-------|
|
|
9
|
-
| **SRP** | Single Responsibility - cada funcao/classe faz UMA coisa |
|
|
10
|
-
| **DRY** | Don't Repeat Yourself - extrair duplicatas, reusar |
|
|
11
|
-
| **KISS** | Keep It Simple - solucao mais simples que funciona |
|
|
12
|
-
| **YAGNI** | You Aren't Gonna Need It - nao construir features nao usadas |
|
|
13
|
-
| **Boy Scout** | Deixar codigo mais limpo do que encontrou |
|
|
14
|
-
|
|
15
|
-
## Regras de Naming
|
|
16
|
-
|
|
17
|
-
| Elemento | Convencao |
|
|
18
|
-
|----------|-----------|
|
|
19
|
-
| **Variaveis** | Revelar intencao: `userCount` nao `n` |
|
|
20
|
-
| **Funcoes** | Verbo + substantivo: `getUserById()` nao `user()` |
|
|
21
|
-
| **Booleans** | Forma de pergunta: `isActive`, `hasPermission`, `canEdit` |
|
|
22
|
-
| **Constantes** | SCREAMING_SNAKE: `MAX_RETRY_COUNT` |
|
|
23
|
-
|
|
24
|
-
> **Regra:** Se voce precisa de um comentario para explicar o nome, renomeie.
|
|
25
|
-
|
|
26
|
-
## Regras de Funcao
|
|
27
|
-
|
|
28
|
-
| Regra | Descricao |
|
|
29
|
-
|-------|-----------|
|
|
30
|
-
| **Pequena** | Max 20 linhas, idealmente 5-10 |
|
|
31
|
-
| **Uma Coisa** | Faz uma coisa, faz bem |
|
|
32
|
-
| **Um Nivel** | Um nivel de abstracao por funcao |
|
|
33
|
-
| **Poucos Args** | Max 3 argumentos, preferir 0-2 |
|
|
34
|
-
| **Sem Side Effects** | Nao mutar inputs inesperadamente |
|
|
35
|
-
|
|
36
|
-
## Estrutura de Codigo
|
|
37
|
-
|
|
38
|
-
| Padrao | Aplicar |
|
|
39
|
-
|--------|---------|
|
|
40
|
-
| **Guard Clauses** | Early returns para edge cases |
|
|
41
|
-
| **Flat > Nested** | Evitar nesting profundo (max 2 niveis) |
|
|
42
|
-
| **Composicao** | Funcoes pequenas compostas |
|
|
43
|
-
| **Colocacao** | Manter codigo relacionado proximo |
|
|
44
|
-
|
|
45
|
-
## Estilo de Codigo AI
|
|
46
|
-
|
|
47
|
-
| Situacao | Acao |
|
|
48
|
-
|----------|------|
|
|
49
|
-
| Usuario pede feature | Escrever diretamente |
|
|
50
|
-
| Usuario reporta bug | Corrigir, nao explicar |
|
|
51
|
-
| Requisito nao claro | Perguntar, nao assumir |
|
|
52
|
-
|
|
53
|
-
## Anti-Patterns
|
|
54
|
-
|
|
55
|
-
| NAO Fazer | Fazer |
|
|
56
|
-
|-----------|-------|
|
|
57
|
-
| Comentar cada linha | Deletar comentarios obvios |
|
|
58
|
-
| Helper para one-liner | Inline o codigo |
|
|
59
|
-
| Factory para 2 objetos | Instanciacao direta |
|
|
60
|
-
| utils.ts com 1 funcao | Colocar onde usado |
|
|
61
|
-
| "First we import..." | Apenas escrever codigo |
|
|
62
|
-
| Deep nesting | Guard clauses |
|
|
63
|
-
| Magic numbers | Named constants |
|
|
64
|
-
| God functions | Dividir por responsabilidade |
|
|
65
|
-
|
|
66
|
-
## Antes de Editar Qualquer Arquivo
|
|
67
|
-
|
|
68
|
-
| Pergunta | Por que |
|
|
69
|
-
|----------|---------|
|
|
70
|
-
| **O que importa este arquivo?** | Pode quebrar |
|
|
71
|
-
| **O que este arquivo importa?** | Mudanca de interface |
|
|
72
|
-
| **Quais testes cobrem isso?** | Testes podem falhar |
|
|
73
|
-
| **E um componente compartilhado?** | Multiplos lugares afetados |
|
|
74
|
-
|
|
75
|
-
> **Regra:** Editar arquivo + todos dependentes na MESMA tarefa.
|
|
76
|
-
|
|
77
|
-
## Self-Check Antes de Completar
|
|
78
|
-
|
|
79
|
-
| Check | Pergunta |
|
|
80
|
-
|-------|----------|
|
|
81
|
-
| **Objetivo alcancado?** | Fiz exatamente o que usuario pediu? |
|
|
82
|
-
| **Arquivos editados?** | Modifiquei todos arquivos necessarios? |
|
|
83
|
-
| **Codigo funciona?** | Testei/verifiquei a mudanca? |
|
|
84
|
-
| **Sem erros?** | Lint e TypeScript passam? |
|
|
85
|
-
| **Nada esquecido?** | Algum edge case perdido? |
|
|
86
|
-
|
|
87
|
-
## Resumo
|
|
88
|
-
|
|
89
|
-
| Fazer | Nao Fazer |
|
|
90
|
-
|-------|-----------|
|
|
91
|
-
| Escrever codigo direto | Escrever tutoriais |
|
|
92
|
-
| Deixar codigo se auto-documentar | Adicionar comentarios obvios |
|
|
93
|
-
| Corrigir bugs imediatamente | Explicar o fix primeiro |
|
|
94
|
-
| Inline coisas pequenas | Criar arquivos desnecessarios |
|
|
95
|
-
| Nomear coisas claramente | Usar abreviacoes |
|
|
96
|
-
| Manter funcoes pequenas | Escrever funcoes 100+ linhas |
|
|
97
|
-
|
|
98
|
-
> **Lembrar: O usuario quer codigo funcionando, nao uma aula de programacao.**
|
|
1
|
+
# Guideline: Clean Code
|
|
2
|
+
|
|
3
|
+
> Padroes de codigo pragmaticos - conciso, direto, sem over-engineering.
|
|
4
|
+
|
|
5
|
+
## Principios Core
|
|
6
|
+
|
|
7
|
+
| Principio | Regra |
|
|
8
|
+
|-----------|-------|
|
|
9
|
+
| **SRP** | Single Responsibility - cada funcao/classe faz UMA coisa |
|
|
10
|
+
| **DRY** | Don't Repeat Yourself - extrair duplicatas, reusar |
|
|
11
|
+
| **KISS** | Keep It Simple - solucao mais simples que funciona |
|
|
12
|
+
| **YAGNI** | You Aren't Gonna Need It - nao construir features nao usadas |
|
|
13
|
+
| **Boy Scout** | Deixar codigo mais limpo do que encontrou |
|
|
14
|
+
|
|
15
|
+
## Regras de Naming
|
|
16
|
+
|
|
17
|
+
| Elemento | Convencao |
|
|
18
|
+
|----------|-----------|
|
|
19
|
+
| **Variaveis** | Revelar intencao: `userCount` nao `n` |
|
|
20
|
+
| **Funcoes** | Verbo + substantivo: `getUserById()` nao `user()` |
|
|
21
|
+
| **Booleans** | Forma de pergunta: `isActive`, `hasPermission`, `canEdit` |
|
|
22
|
+
| **Constantes** | SCREAMING_SNAKE: `MAX_RETRY_COUNT` |
|
|
23
|
+
|
|
24
|
+
> **Regra:** Se voce precisa de um comentario para explicar o nome, renomeie.
|
|
25
|
+
|
|
26
|
+
## Regras de Funcao
|
|
27
|
+
|
|
28
|
+
| Regra | Descricao |
|
|
29
|
+
|-------|-----------|
|
|
30
|
+
| **Pequena** | Max 20 linhas, idealmente 5-10 |
|
|
31
|
+
| **Uma Coisa** | Faz uma coisa, faz bem |
|
|
32
|
+
| **Um Nivel** | Um nivel de abstracao por funcao |
|
|
33
|
+
| **Poucos Args** | Max 3 argumentos, preferir 0-2 |
|
|
34
|
+
| **Sem Side Effects** | Nao mutar inputs inesperadamente |
|
|
35
|
+
|
|
36
|
+
## Estrutura de Codigo
|
|
37
|
+
|
|
38
|
+
| Padrao | Aplicar |
|
|
39
|
+
|--------|---------|
|
|
40
|
+
| **Guard Clauses** | Early returns para edge cases |
|
|
41
|
+
| **Flat > Nested** | Evitar nesting profundo (max 2 niveis) |
|
|
42
|
+
| **Composicao** | Funcoes pequenas compostas |
|
|
43
|
+
| **Colocacao** | Manter codigo relacionado proximo |
|
|
44
|
+
|
|
45
|
+
## Estilo de Codigo AI
|
|
46
|
+
|
|
47
|
+
| Situacao | Acao |
|
|
48
|
+
|----------|------|
|
|
49
|
+
| Usuario pede feature | Escrever diretamente |
|
|
50
|
+
| Usuario reporta bug | Corrigir, nao explicar |
|
|
51
|
+
| Requisito nao claro | Perguntar, nao assumir |
|
|
52
|
+
|
|
53
|
+
## Anti-Patterns
|
|
54
|
+
|
|
55
|
+
| NAO Fazer | Fazer |
|
|
56
|
+
|-----------|-------|
|
|
57
|
+
| Comentar cada linha | Deletar comentarios obvios |
|
|
58
|
+
| Helper para one-liner | Inline o codigo |
|
|
59
|
+
| Factory para 2 objetos | Instanciacao direta |
|
|
60
|
+
| utils.ts com 1 funcao | Colocar onde usado |
|
|
61
|
+
| "First we import..." | Apenas escrever codigo |
|
|
62
|
+
| Deep nesting | Guard clauses |
|
|
63
|
+
| Magic numbers | Named constants |
|
|
64
|
+
| God functions | Dividir por responsabilidade |
|
|
65
|
+
|
|
66
|
+
## Antes de Editar Qualquer Arquivo
|
|
67
|
+
|
|
68
|
+
| Pergunta | Por que |
|
|
69
|
+
|----------|---------|
|
|
70
|
+
| **O que importa este arquivo?** | Pode quebrar |
|
|
71
|
+
| **O que este arquivo importa?** | Mudanca de interface |
|
|
72
|
+
| **Quais testes cobrem isso?** | Testes podem falhar |
|
|
73
|
+
| **E um componente compartilhado?** | Multiplos lugares afetados |
|
|
74
|
+
|
|
75
|
+
> **Regra:** Editar arquivo + todos dependentes na MESMA tarefa.
|
|
76
|
+
|
|
77
|
+
## Self-Check Antes de Completar
|
|
78
|
+
|
|
79
|
+
| Check | Pergunta |
|
|
80
|
+
|-------|----------|
|
|
81
|
+
| **Objetivo alcancado?** | Fiz exatamente o que usuario pediu? |
|
|
82
|
+
| **Arquivos editados?** | Modifiquei todos arquivos necessarios? |
|
|
83
|
+
| **Codigo funciona?** | Testei/verifiquei a mudanca? |
|
|
84
|
+
| **Sem erros?** | Lint e TypeScript passam? |
|
|
85
|
+
| **Nada esquecido?** | Algum edge case perdido? |
|
|
86
|
+
|
|
87
|
+
## Resumo
|
|
88
|
+
|
|
89
|
+
| Fazer | Nao Fazer |
|
|
90
|
+
|-------|-----------|
|
|
91
|
+
| Escrever codigo direto | Escrever tutoriais |
|
|
92
|
+
| Deixar codigo se auto-documentar | Adicionar comentarios obvios |
|
|
93
|
+
| Corrigir bugs imediatamente | Explicar o fix primeiro |
|
|
94
|
+
| Inline coisas pequenas | Criar arquivos desnecessarios |
|
|
95
|
+
| Nomear coisas claramente | Usar abreviacoes |
|
|
96
|
+
| Manter funcoes pequenas | Escrever funcoes 100+ linhas |
|
|
97
|
+
|
|
98
|
+
> **Lembrar: O usuario quer codigo funcionando, nao uma aula de programacao.**
|
|
@@ -1,176 +1,176 @@
|
|
|
1
|
-
# Guideline: Testing Patterns
|
|
2
|
-
|
|
3
|
-
> Principios para suites de teste confiaveis.
|
|
4
|
-
|
|
5
|
-
## Piramide de Testes
|
|
6
|
-
|
|
7
|
-
```
|
|
8
|
-
/\ E2E (Poucos)
|
|
9
|
-
/ \ Fluxos criticos
|
|
10
|
-
/----\
|
|
11
|
-
/ \ Integration (Alguns)
|
|
12
|
-
/--------\ API, DB queries
|
|
13
|
-
/ \
|
|
14
|
-
/------------\ Unit (Muitos)
|
|
15
|
-
Funcoes, classes
|
|
16
|
-
```
|
|
17
|
-
|
|
18
|
-
## Padrao AAA
|
|
19
|
-
|
|
20
|
-
| Etapa | Proposito |
|
|
21
|
-
|-------|-----------|
|
|
22
|
-
| **Arrange** | Configurar dados de teste |
|
|
23
|
-
| **Act** | Executar codigo sob teste |
|
|
24
|
-
| **Assert** | Verificar resultado |
|
|
25
|
-
|
|
26
|
-
## Selecao de Tipo de Teste
|
|
27
|
-
|
|
28
|
-
| Tipo | Melhor Para | Velocidade |
|
|
29
|
-
|------|-------------|------------|
|
|
30
|
-
| **Unit** | Funcoes puras, logica | Rapido (<50ms) |
|
|
31
|
-
| **Integration** | API, DB, servicos | Medio |
|
|
32
|
-
| **E2E** | Fluxos criticos do usuario | Lento |
|
|
33
|
-
|
|
34
|
-
## Principios de Unit Test
|
|
35
|
-
|
|
36
|
-
### Bons Unit Tests (FIRST)
|
|
37
|
-
|
|
38
|
-
| Principio | Significado |
|
|
39
|
-
|-----------|-------------|
|
|
40
|
-
| Fast | < 100ms cada |
|
|
41
|
-
| Isolated | Sem deps externos |
|
|
42
|
-
| Repeatable | Mesmo resultado sempre |
|
|
43
|
-
| Self-checking | Sem verificacao manual |
|
|
44
|
-
| Timely | Escritos com o codigo |
|
|
45
|
-
|
|
46
|
-
### O Que Testar
|
|
47
|
-
|
|
48
|
-
| Testar | Nao Testar |
|
|
49
|
-
|--------|------------|
|
|
50
|
-
| Business logic | Codigo do framework |
|
|
51
|
-
| Edge cases | Libs de terceiros |
|
|
52
|
-
| Error handling | Getters simples |
|
|
53
|
-
|
|
54
|
-
## Principios de Integration Test
|
|
55
|
-
|
|
56
|
-
### O Que Testar
|
|
57
|
-
|
|
58
|
-
| Area | Foco |
|
|
59
|
-
|------|------|
|
|
60
|
-
| API endpoints | Request/response |
|
|
61
|
-
| Database | Queries, transactions |
|
|
62
|
-
| External services | Contratos |
|
|
63
|
-
|
|
64
|
-
### Setup/Teardown
|
|
65
|
-
|
|
66
|
-
| Fase | Acao |
|
|
67
|
-
|------|------|
|
|
68
|
-
| Before All | Conectar recursos |
|
|
69
|
-
| Before Each | Resetar estado |
|
|
70
|
-
| After Each | Limpar |
|
|
71
|
-
| After All | Desconectar |
|
|
72
|
-
|
|
73
|
-
## Principios de Mocking
|
|
74
|
-
|
|
75
|
-
### Quando Fazer Mock
|
|
76
|
-
|
|
77
|
-
| Mock | Nao Mock |
|
|
78
|
-
|------|----------|
|
|
79
|
-
| External APIs | Codigo sob teste |
|
|
80
|
-
| Database (unit) | Dependencias simples |
|
|
81
|
-
| Time/random | Funcoes puras |
|
|
82
|
-
| Network | Stores in-memory |
|
|
83
|
-
|
|
84
|
-
### Tipos de Mock
|
|
85
|
-
|
|
86
|
-
| Tipo | Uso |
|
|
87
|
-
|------|-----|
|
|
88
|
-
| Stub | Retornar valores fixos |
|
|
89
|
-
| Spy | Rastrear chamadas |
|
|
90
|
-
| Mock | Definir expectativas |
|
|
91
|
-
| Fake | Implementacao simplificada |
|
|
92
|
-
|
|
93
|
-
## Organizacao de Testes
|
|
94
|
-
|
|
95
|
-
### Naming
|
|
96
|
-
|
|
97
|
-
| Padrao | Exemplo |
|
|
98
|
-
|--------|---------|
|
|
99
|
-
| Should behavior | "should return error when..." |
|
|
100
|
-
| When condition | "when user not found..." |
|
|
101
|
-
| Given-when-then | "given X, when Y, then Z" |
|
|
102
|
-
|
|
103
|
-
### Agrupamento
|
|
104
|
-
|
|
105
|
-
| Nivel | Uso |
|
|
106
|
-
|-------|-----|
|
|
107
|
-
| describe | Agrupar testes relacionados |
|
|
108
|
-
| it/test | Caso individual |
|
|
109
|
-
| beforeEach | Setup comum |
|
|
110
|
-
|
|
111
|
-
## Dados de Teste
|
|
112
|
-
|
|
113
|
-
### Estrategias
|
|
114
|
-
|
|
115
|
-
| Abordagem | Uso |
|
|
116
|
-
|-----------|-----|
|
|
117
|
-
| Factories | Gerar dados de teste |
|
|
118
|
-
| Fixtures | Datasets predefinidos |
|
|
119
|
-
| Builders | Criacao fluente de objetos |
|
|
120
|
-
|
|
121
|
-
### Principios
|
|
122
|
-
- Usar dados realistas
|
|
123
|
-
- Randomizar valores nao essenciais (faker)
|
|
124
|
-
- Compartilhar fixtures comuns
|
|
125
|
-
- Manter dados minimos
|
|
126
|
-
|
|
127
|
-
## Best Practices
|
|
128
|
-
|
|
129
|
-
| Pratica | Por que |
|
|
130
|
-
|---------|---------|
|
|
131
|
-
| Um assert por teste | Razao clara de falha |
|
|
132
|
-
| Testes independentes | Sem dependencia de ordem |
|
|
133
|
-
| Testes rapidos | Rodar frequentemente |
|
|
134
|
-
| Nomes descritivos | Auto-documentacao |
|
|
135
|
-
| Limpar | Evitar side effects |
|
|
136
|
-
|
|
137
|
-
## Anti-Patterns
|
|
138
|
-
|
|
139
|
-
| NAO Fazer | Fazer |
|
|
140
|
-
|-----------|-------|
|
|
141
|
-
| Testar implementacao | Testar comportamento |
|
|
142
|
-
| Duplicar codigo de teste | Usar factories |
|
|
143
|
-
| Setup complexo | Simplificar ou dividir |
|
|
144
|
-
| Ignorar testes flaky | Corrigir causa raiz |
|
|
145
|
-
| Pular cleanup | Resetar estado |
|
|
146
|
-
|
|
147
|
-
## Exemplo de Teste
|
|
148
|
-
|
|
149
|
-
```typescript
|
|
150
|
-
describe('UserService', () => {
|
|
151
|
-
describe('createUser', () => {
|
|
152
|
-
it('should create user with valid data', async () => {
|
|
153
|
-
// Arrange
|
|
154
|
-
const userData = { name: 'John', email: 'john@test.com' };
|
|
155
|
-
|
|
156
|
-
// Act
|
|
157
|
-
const user = await userService.createUser(userData);
|
|
158
|
-
|
|
159
|
-
// Assert
|
|
160
|
-
expect(user.id).toBeDefined();
|
|
161
|
-
expect(user.name).toBe('John');
|
|
162
|
-
});
|
|
163
|
-
|
|
164
|
-
it('should throw error when email is invalid', async () => {
|
|
165
|
-
// Arrange
|
|
166
|
-
const userData = { name: 'John', email: 'invalid' };
|
|
167
|
-
|
|
168
|
-
// Act & Assert
|
|
169
|
-
await expect(userService.createUser(userData))
|
|
170
|
-
.rejects.toThrow('Invalid email');
|
|
171
|
-
});
|
|
172
|
-
});
|
|
173
|
-
});
|
|
174
|
-
```
|
|
175
|
-
|
|
176
|
-
> **Lembrar:** Testes sao documentacao. Se alguem nao consegue entender o que o codigo faz pelos testes, reescreva-os.
|
|
1
|
+
# Guideline: Testing Patterns
|
|
2
|
+
|
|
3
|
+
> Principios para suites de teste confiaveis.
|
|
4
|
+
|
|
5
|
+
## Piramide de Testes
|
|
6
|
+
|
|
7
|
+
```
|
|
8
|
+
/\ E2E (Poucos)
|
|
9
|
+
/ \ Fluxos criticos
|
|
10
|
+
/----\
|
|
11
|
+
/ \ Integration (Alguns)
|
|
12
|
+
/--------\ API, DB queries
|
|
13
|
+
/ \
|
|
14
|
+
/------------\ Unit (Muitos)
|
|
15
|
+
Funcoes, classes
|
|
16
|
+
```
|
|
17
|
+
|
|
18
|
+
## Padrao AAA
|
|
19
|
+
|
|
20
|
+
| Etapa | Proposito |
|
|
21
|
+
|-------|-----------|
|
|
22
|
+
| **Arrange** | Configurar dados de teste |
|
|
23
|
+
| **Act** | Executar codigo sob teste |
|
|
24
|
+
| **Assert** | Verificar resultado |
|
|
25
|
+
|
|
26
|
+
## Selecao de Tipo de Teste
|
|
27
|
+
|
|
28
|
+
| Tipo | Melhor Para | Velocidade |
|
|
29
|
+
|------|-------------|------------|
|
|
30
|
+
| **Unit** | Funcoes puras, logica | Rapido (<50ms) |
|
|
31
|
+
| **Integration** | API, DB, servicos | Medio |
|
|
32
|
+
| **E2E** | Fluxos criticos do usuario | Lento |
|
|
33
|
+
|
|
34
|
+
## Principios de Unit Test
|
|
35
|
+
|
|
36
|
+
### Bons Unit Tests (FIRST)
|
|
37
|
+
|
|
38
|
+
| Principio | Significado |
|
|
39
|
+
|-----------|-------------|
|
|
40
|
+
| Fast | < 100ms cada |
|
|
41
|
+
| Isolated | Sem deps externos |
|
|
42
|
+
| Repeatable | Mesmo resultado sempre |
|
|
43
|
+
| Self-checking | Sem verificacao manual |
|
|
44
|
+
| Timely | Escritos com o codigo |
|
|
45
|
+
|
|
46
|
+
### O Que Testar
|
|
47
|
+
|
|
48
|
+
| Testar | Nao Testar |
|
|
49
|
+
|--------|------------|
|
|
50
|
+
| Business logic | Codigo do framework |
|
|
51
|
+
| Edge cases | Libs de terceiros |
|
|
52
|
+
| Error handling | Getters simples |
|
|
53
|
+
|
|
54
|
+
## Principios de Integration Test
|
|
55
|
+
|
|
56
|
+
### O Que Testar
|
|
57
|
+
|
|
58
|
+
| Area | Foco |
|
|
59
|
+
|------|------|
|
|
60
|
+
| API endpoints | Request/response |
|
|
61
|
+
| Database | Queries, transactions |
|
|
62
|
+
| External services | Contratos |
|
|
63
|
+
|
|
64
|
+
### Setup/Teardown
|
|
65
|
+
|
|
66
|
+
| Fase | Acao |
|
|
67
|
+
|------|------|
|
|
68
|
+
| Before All | Conectar recursos |
|
|
69
|
+
| Before Each | Resetar estado |
|
|
70
|
+
| After Each | Limpar |
|
|
71
|
+
| After All | Desconectar |
|
|
72
|
+
|
|
73
|
+
## Principios de Mocking
|
|
74
|
+
|
|
75
|
+
### Quando Fazer Mock
|
|
76
|
+
|
|
77
|
+
| Mock | Nao Mock |
|
|
78
|
+
|------|----------|
|
|
79
|
+
| External APIs | Codigo sob teste |
|
|
80
|
+
| Database (unit) | Dependencias simples |
|
|
81
|
+
| Time/random | Funcoes puras |
|
|
82
|
+
| Network | Stores in-memory |
|
|
83
|
+
|
|
84
|
+
### Tipos de Mock
|
|
85
|
+
|
|
86
|
+
| Tipo | Uso |
|
|
87
|
+
|------|-----|
|
|
88
|
+
| Stub | Retornar valores fixos |
|
|
89
|
+
| Spy | Rastrear chamadas |
|
|
90
|
+
| Mock | Definir expectativas |
|
|
91
|
+
| Fake | Implementacao simplificada |
|
|
92
|
+
|
|
93
|
+
## Organizacao de Testes
|
|
94
|
+
|
|
95
|
+
### Naming
|
|
96
|
+
|
|
97
|
+
| Padrao | Exemplo |
|
|
98
|
+
|--------|---------|
|
|
99
|
+
| Should behavior | "should return error when..." |
|
|
100
|
+
| When condition | "when user not found..." |
|
|
101
|
+
| Given-when-then | "given X, when Y, then Z" |
|
|
102
|
+
|
|
103
|
+
### Agrupamento
|
|
104
|
+
|
|
105
|
+
| Nivel | Uso |
|
|
106
|
+
|-------|-----|
|
|
107
|
+
| describe | Agrupar testes relacionados |
|
|
108
|
+
| it/test | Caso individual |
|
|
109
|
+
| beforeEach | Setup comum |
|
|
110
|
+
|
|
111
|
+
## Dados de Teste
|
|
112
|
+
|
|
113
|
+
### Estrategias
|
|
114
|
+
|
|
115
|
+
| Abordagem | Uso |
|
|
116
|
+
|-----------|-----|
|
|
117
|
+
| Factories | Gerar dados de teste |
|
|
118
|
+
| Fixtures | Datasets predefinidos |
|
|
119
|
+
| Builders | Criacao fluente de objetos |
|
|
120
|
+
|
|
121
|
+
### Principios
|
|
122
|
+
- Usar dados realistas
|
|
123
|
+
- Randomizar valores nao essenciais (faker)
|
|
124
|
+
- Compartilhar fixtures comuns
|
|
125
|
+
- Manter dados minimos
|
|
126
|
+
|
|
127
|
+
## Best Practices
|
|
128
|
+
|
|
129
|
+
| Pratica | Por que |
|
|
130
|
+
|---------|---------|
|
|
131
|
+
| Um assert por teste | Razao clara de falha |
|
|
132
|
+
| Testes independentes | Sem dependencia de ordem |
|
|
133
|
+
| Testes rapidos | Rodar frequentemente |
|
|
134
|
+
| Nomes descritivos | Auto-documentacao |
|
|
135
|
+
| Limpar | Evitar side effects |
|
|
136
|
+
|
|
137
|
+
## Anti-Patterns
|
|
138
|
+
|
|
139
|
+
| NAO Fazer | Fazer |
|
|
140
|
+
|-----------|-------|
|
|
141
|
+
| Testar implementacao | Testar comportamento |
|
|
142
|
+
| Duplicar codigo de teste | Usar factories |
|
|
143
|
+
| Setup complexo | Simplificar ou dividir |
|
|
144
|
+
| Ignorar testes flaky | Corrigir causa raiz |
|
|
145
|
+
| Pular cleanup | Resetar estado |
|
|
146
|
+
|
|
147
|
+
## Exemplo de Teste
|
|
148
|
+
|
|
149
|
+
```typescript
|
|
150
|
+
describe('UserService', () => {
|
|
151
|
+
describe('createUser', () => {
|
|
152
|
+
it('should create user with valid data', async () => {
|
|
153
|
+
// Arrange
|
|
154
|
+
const userData = { name: 'John', email: 'john@test.com' };
|
|
155
|
+
|
|
156
|
+
// Act
|
|
157
|
+
const user = await userService.createUser(userData);
|
|
158
|
+
|
|
159
|
+
// Assert
|
|
160
|
+
expect(user.id).toBeDefined();
|
|
161
|
+
expect(user.name).toBe('John');
|
|
162
|
+
});
|
|
163
|
+
|
|
164
|
+
it('should throw error when email is invalid', async () => {
|
|
165
|
+
// Arrange
|
|
166
|
+
const userData = { name: 'John', email: 'invalid' };
|
|
167
|
+
|
|
168
|
+
// Act & Assert
|
|
169
|
+
await expect(userService.createUser(userData))
|
|
170
|
+
.rejects.toThrow('Invalid email');
|
|
171
|
+
});
|
|
172
|
+
});
|
|
173
|
+
});
|
|
174
|
+
```
|
|
175
|
+
|
|
176
|
+
> **Lembrar:** Testes sao documentacao. Se alguem nao consegue entender o que o codigo faz pelos testes, reescreva-os.
|