@maestro-ai/cli 1.0.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 +59 -0
- package/content/guides/Cat/303/241logo de Stacks para Cloud Moderna.md" +119 -0
- package/content/guides/Cat/303/241logo de Stacks para Hospedagem Compartilhada.md" +147 -0
- package/content/guides/Checklist Mestre de Entrega.md +68 -0
- package/content/guides/Gates de Qualidade.md +209 -0
- package/content/guides/Guia de Adi/303/247/303/243o de Novas Funcionalidades.md" +355 -0
- package/content/guides/Guia de Chaos Engineering.md +267 -0
- package/content/guides/Guia de Debugging com IA.md +135 -0
- package/content/guides/Guia de Estrat/303/251gias de Cache.md" +352 -0
- package/content/guides/Guia de Migrations Zero-Downtime.md +311 -0
- package/content/guides/Guia de Multi-tenancy.md +368 -0
- package/content/guides/Guia de Otimiza/303/247/303/243o de Custos Cloud.md" +195 -0
- package/content/guides/Guia de Refatora/303/247/303/243o de C/303/263digo Legado com IA.md" +162 -0
- package/content/guides/Guia de SLOs e Error Budgets.md +315 -0
- package/content/guides/M/303/251tricas de Efici/303/252ncia do Desenvolvimento com IA.md" +93 -0
- package/content/guides/Rules base.md +90 -0
- package/content/prompts/README.md +203 -0
- package/content/prompts/acessibilidade/analise-acessibilidade.md +257 -0
- package/content/prompts/apis/design-api-rest.md +303 -0
- package/content/prompts/apis/idempotencia.md +254 -0
- package/content/prompts/apis/versionamento.md +313 -0
- package/content/prompts/arquitetura/arquitetura-c4-completo.md +190 -0
- package/content/prompts/arquitetura/clean-architecture.md +151 -0
- package/content/prompts/arquitetura/ddd-bounded-contexts.md +183 -0
- package/content/prompts/arquitetura/ddd-cqrs.md +176 -0
- package/content/prompts/arquitetura/modelo-dominio.md +207 -0
- package/content/prompts/arquitetura/multi-tenancy.md +235 -0
- package/content/prompts/database/migrations-zero-downtime.md +192 -0
- package/content/prompts/database/otimizacao-queries.md +296 -0
- package/content/prompts/desenvolvimento/code-review.md +301 -0
- package/content/prompts/desenvolvimento/gerar-servico.md +271 -0
- package/content/prompts/devops/docker-compose.md +336 -0
- package/content/prompts/devops/feature-flags.md +374 -0
- package/content/prompts/devops/kubernetes-deploy.md +460 -0
- package/content/prompts/devops/pipeline-cicd.md +358 -0
- package/content/prompts/devops/terraform-iac.md +502 -0
- package/content/prompts/escalabilidade/analise-performance.md +240 -0
- package/content/prompts/escalabilidade/analise-performance.txt +94 -0
- package/content/prompts/escalabilidade/caching.md +255 -0
- package/content/prompts/observabilidade/chaos-testing.md +237 -0
- package/content/prompts/observabilidade/estrategia-observabilidade.md +263 -0
- package/content/prompts/observabilidade/estrategia-observabilidade.txt +134 -0
- package/content/prompts/observabilidade/slos.md +215 -0
- package/content/prompts/produto/discovery-inicial.md +203 -0
- package/content/prompts/produto/discovery-inicial.txt +33 -0
- package/content/prompts/requisitos/refinar-requisitos.md +232 -0
- package/content/prompts/requisitos/refinar-requisitos.txt +40 -0
- package/content/prompts/seguranca/analise-seguranca.md +243 -0
- package/content/prompts/seguranca/pentest-checklist.md +333 -0
- package/content/prompts/seguranca/rate-limiting.md +356 -0
- package/content/prompts/seguranca/revisao-lgpd.md +227 -0
- package/content/prompts/seguranca/threat-modeling.md +224 -0
- package/content/prompts/testes/contract-testing.md +340 -0
- package/content/prompts/testes/gerar-testes-unitarios.md +474 -0
- package/content/prompts/testes/testes-e2e.md +460 -0
- package/content/prompts/testes/testes-integracao.md +418 -0
- package/content/prompts/testes/testes-performance.md +458 -0
- package/content/prompts/ux/gerar-ui-stitch.md +151 -0
- package/content/skills/api-patterns/SKILL.md +81 -0
- package/content/skills/api-patterns/api-style.md +42 -0
- package/content/skills/api-patterns/auth.md +24 -0
- package/content/skills/api-patterns/documentation.md +26 -0
- package/content/skills/api-patterns/graphql.md +41 -0
- package/content/skills/api-patterns/rate-limiting.md +31 -0
- package/content/skills/api-patterns/response.md +37 -0
- package/content/skills/api-patterns/rest.md +40 -0
- package/content/skills/api-patterns/scripts/api_validator.py +211 -0
- package/content/skills/api-patterns/security-testing.md +122 -0
- package/content/skills/api-patterns/trpc.md +41 -0
- package/content/skills/api-patterns/versioning.md +22 -0
- package/content/skills/app-builder/SKILL.md +75 -0
- package/content/skills/app-builder/agent-coordination.md +71 -0
- package/content/skills/app-builder/feature-building.md +53 -0
- package/content/skills/app-builder/project-detection.md +34 -0
- package/content/skills/app-builder/scaffolding.md +118 -0
- package/content/skills/app-builder/tech-stack.md +40 -0
- package/content/skills/app-builder/templates/SKILL.md +39 -0
- package/content/skills/app-builder/templates/astro-static/TEMPLATE.md +76 -0
- package/content/skills/app-builder/templates/chrome-extension/TEMPLATE.md +92 -0
- package/content/skills/app-builder/templates/cli-tool/TEMPLATE.md +88 -0
- package/content/skills/app-builder/templates/electron-desktop/TEMPLATE.md +88 -0
- package/content/skills/app-builder/templates/express-api/TEMPLATE.md +83 -0
- package/content/skills/app-builder/templates/flutter-app/TEMPLATE.md +90 -0
- package/content/skills/app-builder/templates/monorepo-turborepo/TEMPLATE.md +90 -0
- package/content/skills/app-builder/templates/nextjs-fullstack/TEMPLATE.md +82 -0
- package/content/skills/app-builder/templates/nextjs-saas/TEMPLATE.md +100 -0
- package/content/skills/app-builder/templates/nextjs-static/TEMPLATE.md +106 -0
- package/content/skills/app-builder/templates/nuxt-app/TEMPLATE.md +101 -0
- package/content/skills/app-builder/templates/python-fastapi/TEMPLATE.md +83 -0
- package/content/skills/app-builder/templates/react-native-app/TEMPLATE.md +93 -0
- package/content/skills/architecture/SKILL.md +55 -0
- package/content/skills/architecture/context-discovery.md +43 -0
- package/content/skills/architecture/examples.md +94 -0
- package/content/skills/architecture/pattern-selection.md +68 -0
- package/content/skills/architecture/patterns-reference.md +50 -0
- package/content/skills/architecture/trade-off-analysis.md +77 -0
- package/content/skills/bash-linux/SKILL.md +199 -0
- package/content/skills/behavioral-modes/SKILL.md +242 -0
- package/content/skills/brainstorming/SKILL.md +163 -0
- package/content/skills/brainstorming/dynamic-questioning.md +350 -0
- package/content/skills/clean-code/SKILL.md +201 -0
- package/content/skills/code-review-checklist/SKILL.md +109 -0
- package/content/skills/database-design/SKILL.md +52 -0
- package/content/skills/database-design/database-selection.md +43 -0
- package/content/skills/database-design/indexing.md +39 -0
- package/content/skills/database-design/migrations.md +48 -0
- package/content/skills/database-design/optimization.md +36 -0
- package/content/skills/database-design/orm-selection.md +30 -0
- package/content/skills/database-design/schema-design.md +56 -0
- package/content/skills/database-design/scripts/schema_validator.py +172 -0
- package/content/skills/deployment-procedures/SKILL.md +241 -0
- package/content/skills/doc.md +177 -0
- package/content/skills/documentation-templates/SKILL.md +194 -0
- package/content/skills/frontend-design/SKILL.md +396 -0
- package/content/skills/frontend-design/animation-guide.md +331 -0
- package/content/skills/frontend-design/color-system.md +311 -0
- package/content/skills/frontend-design/decision-trees.md +418 -0
- package/content/skills/frontend-design/motion-graphics.md +306 -0
- package/content/skills/frontend-design/scripts/accessibility_checker.py +183 -0
- package/content/skills/frontend-design/scripts/ux_audit.py +722 -0
- package/content/skills/frontend-design/typography-system.md +345 -0
- package/content/skills/frontend-design/ux-psychology.md +541 -0
- package/content/skills/frontend-design/visual-effects.md +383 -0
- package/content/skills/game-development/2d-games/SKILL.md +119 -0
- package/content/skills/game-development/3d-games/SKILL.md +135 -0
- package/content/skills/game-development/SKILL.md +167 -0
- package/content/skills/game-development/game-art/SKILL.md +185 -0
- package/content/skills/game-development/game-audio/SKILL.md +190 -0
- package/content/skills/game-development/game-design/SKILL.md +129 -0
- package/content/skills/game-development/mobile-games/SKILL.md +108 -0
- package/content/skills/game-development/multiplayer/SKILL.md +132 -0
- package/content/skills/game-development/pc-games/SKILL.md +144 -0
- package/content/skills/game-development/vr-ar/SKILL.md +123 -0
- package/content/skills/game-development/web-games/SKILL.md +150 -0
- package/content/skills/geo-fundamentals/SKILL.md +156 -0
- package/content/skills/geo-fundamentals/scripts/geo_checker.py +289 -0
- package/content/skills/i18n-localization/SKILL.md +154 -0
- package/content/skills/i18n-localization/scripts/i18n_checker.py +241 -0
- package/content/skills/intelligent-routing/SKILL.md +334 -0
- package/content/skills/lint-and-validate/SKILL.md +45 -0
- package/content/skills/lint-and-validate/scripts/lint_runner.py +172 -0
- package/content/skills/lint-and-validate/scripts/type_coverage.py +173 -0
- package/content/skills/mcp-builder/SKILL.md +176 -0
- package/content/skills/mobile-design/SKILL.md +394 -0
- package/content/skills/mobile-design/decision-trees.md +516 -0
- package/content/skills/mobile-design/mobile-backend.md +491 -0
- package/content/skills/mobile-design/mobile-color-system.md +420 -0
- package/content/skills/mobile-design/mobile-debugging.md +122 -0
- package/content/skills/mobile-design/mobile-design-thinking.md +357 -0
- package/content/skills/mobile-design/mobile-navigation.md +458 -0
- package/content/skills/mobile-design/mobile-performance.md +767 -0
- package/content/skills/mobile-design/mobile-testing.md +356 -0
- package/content/skills/mobile-design/mobile-typography.md +433 -0
- package/content/skills/mobile-design/platform-android.md +666 -0
- package/content/skills/mobile-design/platform-ios.md +561 -0
- package/content/skills/mobile-design/scripts/mobile_audit.py +670 -0
- package/content/skills/mobile-design/touch-psychology.md +537 -0
- package/content/skills/nextjs-best-practices/SKILL.md +203 -0
- package/content/skills/nodejs-best-practices/SKILL.md +333 -0
- package/content/skills/parallel-agents/SKILL.md +175 -0
- package/content/skills/performance-profiling/SKILL.md +143 -0
- package/content/skills/performance-profiling/scripts/lighthouse_audit.py +76 -0
- package/content/skills/plan-writing/SKILL.md +152 -0
- package/content/skills/powershell-windows/SKILL.md +167 -0
- package/content/skills/python-patterns/SKILL.md +441 -0
- package/content/skills/react-patterns/SKILL.md +198 -0
- package/content/skills/red-team-tactics/SKILL.md +199 -0
- package/content/skills/seo-fundamentals/SKILL.md +129 -0
- package/content/skills/seo-fundamentals/scripts/seo_checker.py +219 -0
- package/content/skills/server-management/SKILL.md +161 -0
- package/content/skills/systematic-debugging/SKILL.md +109 -0
- package/content/skills/tailwind-patterns/SKILL.md +269 -0
- package/content/skills/tdd-workflow/SKILL.md +149 -0
- package/content/skills/testing-patterns/SKILL.md +178 -0
- package/content/skills/testing-patterns/scripts/test_runner.py +219 -0
- package/content/skills/vulnerability-scanner/SKILL.md +276 -0
- package/content/skills/vulnerability-scanner/checklists.md +121 -0
- package/content/skills/vulnerability-scanner/scripts/security_scan.py +458 -0
- package/content/skills/webapp-testing/SKILL.md +187 -0
- package/content/skills/webapp-testing/scripts/playwright_runner.py +173 -0
- package/content/specialists/Especialista em Acessibilidade.md +266 -0
- package/content/specialists/Especialista em An/303/241lise de Testes.md" +434 -0
- package/content/specialists/Especialista em Arquitetura Avan/303/247ada.md" +358 -0
- package/content/specialists/Especialista em Arquitetura de Software.md +177 -0
- package/content/specialists/Especialista em Banco de Dados.md +260 -0
- package/content/specialists/Especialista em Contrato de API.md +172 -0
- package/content/specialists/Especialista em Dados e Analytics com IA.md +246 -0
- package/content/specialists/Especialista em Debugging e Troubleshooting.md +191 -0
- package/content/specialists/Especialista em Desenvolvimento Frontend.md +477 -0
- package/content/specialists/Especialista em Desenvolvimento Mobile.md +241 -0
- package/content/specialists/Especialista em Desenvolvimento e Vibe Coding Estruturado.md +417 -0
- package/content/specialists/Especialista em DevOps e Infraestrutura.md +294 -0
- package/content/specialists/Especialista em Documenta/303/247/303/243o T/303/251cnica.md" +227 -0
- package/content/specialists/Especialista em Engenharia de Requisitos com IA.md +299 -0
- package/content/specialists/Especialista em Explora/303/247/303/243o de Codebase.md" +179 -0
- package/content/specialists/Especialista em Gest/303/243o de Produto.md" +179 -0
- package/content/specialists/Especialista em Migra/303/247/303/243o e Moderniza/303/247/303/243o.md" +410 -0
- package/content/specialists/Especialista em Modelagem e Arquitetura de Dom/303/255nio com IA.md" +248 -0
- package/content/specialists/Especialista em Observabilidade.md +415 -0
- package/content/specialists/Especialista em Performance e Escalabilidade.md +373 -0
- package/content/specialists/Especialista em Plano de Execu/303/247/303/243o com IA.md" +341 -0
- package/content/specialists/Especialista em Prototipagem R/303/241pida com Google Stitch.md" +419 -0
- package/content/specialists/Especialista em Seguran/303/247a da Informa/303/247/303/243o.md" +508 -0
- package/content/specialists/Especialista em UX Design.md +453 -0
- package/content/specialists/INDEX.md +43 -0
- package/content/templates/PRD.md +165 -0
- package/content/templates/README.md +65 -0
- package/content/templates/adr.md +103 -0
- package/content/templates/arquitetura.md +279 -0
- package/content/templates/backlog.md +185 -0
- package/content/templates/checklist-seguranca.md +180 -0
- package/content/templates/contexto.md +120 -0
- package/content/templates/criterios-aceite.md +99 -0
- package/content/templates/design-banco.md +270 -0
- package/content/templates/design-doc.md +240 -0
- package/content/templates/feature.md +88 -0
- package/content/templates/historia-backend.md +84 -0
- package/content/templates/historia-frontend.md +75 -0
- package/content/templates/historia-usuario.md +125 -0
- package/content/templates/mapa-navegacao.md +133 -0
- package/content/templates/matriz-rastreabilidade.md +121 -0
- package/content/templates/modelo-dominio.md +219 -0
- package/content/templates/plano-testes.md +199 -0
- package/content/templates/prototipo-stitch.md +138 -0
- package/content/templates/requisitos.md +162 -0
- package/content/templates/slo-sli.md +197 -0
- package/content/workflows/README-MCP.md +363 -0
- package/content/workflows/brainstorm.md +113 -0
- package/content/workflows/create.md +59 -0
- package/content/workflows/debug.md +103 -0
- package/content/workflows/deploy.md +176 -0
- package/content/workflows/enhance.md +63 -0
- package/content/workflows/mcp-debug.md +506 -0
- package/content/workflows/mcp-feature.md +385 -0
- package/content/workflows/mcp-gate.md +413 -0
- package/content/workflows/mcp-next.md +388 -0
- package/content/workflows/mcp-refactor.md +600 -0
- package/content/workflows/mcp-start.md +304 -0
- package/content/workflows/mcp-status.md +400 -0
- package/content/workflows/orchestrate.md +237 -0
- package/content/workflows/plan.md +89 -0
- package/content/workflows/preview.md +81 -0
- package/content/workflows/status.md +86 -0
- package/content/workflows/test.md +144 -0
- package/content/workflows/ui-ux-pro-max.md +296 -0
- package/dist/commands/init.d.ts +6 -0
- package/dist/commands/init.js +138 -0
- package/dist/commands/update.d.ts +5 -0
- package/dist/commands/update.js +50 -0
- package/dist/index.d.ts +2 -0
- package/dist/index.js +21 -0
- package/package.json +48 -0
|
@@ -0,0 +1,418 @@
|
|
|
1
|
+
# Prompt: Testes de Integração
|
|
2
|
+
|
|
3
|
+
> **Quando usar**: Após testes unitários, para validar interação entre componentes
|
|
4
|
+
> **Especialista**: [Análise de Testes](../../02-especialistas/Especialista%20em%20Análise%20de%20Testes.md)
|
|
5
|
+
> **Nível**: Médio
|
|
6
|
+
|
|
7
|
+
---
|
|
8
|
+
|
|
9
|
+
## Fluxo de Contexto
|
|
10
|
+
|
|
11
|
+
Antes de usar este prompt, tenha em mãos:
|
|
12
|
+
- `docs/CONTEXTO.md` - Entendimento do projeto
|
|
13
|
+
- `docs/05-arquitetura/arquitetura.md` - Componentes e integrações
|
|
14
|
+
- Código dos serviços/repositórios a testar
|
|
15
|
+
|
|
16
|
+
Após gerar, salve os testes em:
|
|
17
|
+
- `tests/integration/` ou similar na estrutura do projeto
|
|
18
|
+
|
|
19
|
+
---
|
|
20
|
+
|
|
21
|
+
## Prompt Completo
|
|
22
|
+
|
|
23
|
+
```text
|
|
24
|
+
Atue como especialista em testes de integração.
|
|
25
|
+
|
|
26
|
+
## Contexto do Projeto
|
|
27
|
+
|
|
28
|
+
[COLE O CONTEÚDO DE docs/CONTEXTO.md]
|
|
29
|
+
|
|
30
|
+
## Stack Tecnológica
|
|
31
|
+
|
|
32
|
+
- Backend: [Framework/Linguagem]
|
|
33
|
+
- Banco de dados: [PostgreSQL/MySQL/MongoDB]
|
|
34
|
+
- ORM: [Prisma/TypeORM/Sequelize/Eloquent]
|
|
35
|
+
- APIs externas: [Liste integrações]
|
|
36
|
+
- Framework de testes: [Jest/Vitest/PHPUnit/JUnit/pytest]
|
|
37
|
+
|
|
38
|
+
## Componentes a Testar
|
|
39
|
+
|
|
40
|
+
- Repositórios/DAOs: [Liste classes de acesso a dados]
|
|
41
|
+
- Serviços: [Liste serviços que interagem com outros]
|
|
42
|
+
- APIs: [Endpoints que precisam de teste de integração]
|
|
43
|
+
- Integrações externas: [Gateways de pagamento, APIs de terceiros]
|
|
44
|
+
|
|
45
|
+
## Código a Testar (opcional)
|
|
46
|
+
|
|
47
|
+
```[LINGUAGEM]
|
|
48
|
+
[COLE O CÓDIGO DO SERVIÇO/REPOSITÓRIO]
|
|
49
|
+
```
|
|
50
|
+
|
|
51
|
+
---
|
|
52
|
+
|
|
53
|
+
## Sua Missão
|
|
54
|
+
|
|
55
|
+
Gere testes de integração completos:
|
|
56
|
+
|
|
57
|
+
### 1. Setup do Ambiente de Testes
|
|
58
|
+
|
|
59
|
+
#### Banco de Dados de Teste
|
|
60
|
+
```[LINGUAGEM]
|
|
61
|
+
// Opção 1: Banco em memória (rápido, menos realista)
|
|
62
|
+
// SQLite in-memory, H2, etc
|
|
63
|
+
|
|
64
|
+
// Opção 2: Testcontainers (mais realista)
|
|
65
|
+
// Container Docker com PostgreSQL/MySQL real
|
|
66
|
+
|
|
67
|
+
// Opção 3: Banco dedicado de teste
|
|
68
|
+
// Mesmo tipo de produção, dados isolados
|
|
69
|
+
```
|
|
70
|
+
|
|
71
|
+
#### Configuração do Framework
|
|
72
|
+
```[LINGUAGEM]
|
|
73
|
+
// Setup e teardown global
|
|
74
|
+
// Exemplo: Jest config, pytest fixtures, etc
|
|
75
|
+
```
|
|
76
|
+
|
|
77
|
+
### 2. Testes de Repositório/DAO
|
|
78
|
+
|
|
79
|
+
```[LINGUAGEM]
|
|
80
|
+
describe('UserRepository Integration', () => {
|
|
81
|
+
// Setup: conectar ao banco de teste
|
|
82
|
+
beforeAll(async () => {
|
|
83
|
+
// Inicializar conexão
|
|
84
|
+
// Rodar migrations
|
|
85
|
+
});
|
|
86
|
+
|
|
87
|
+
// Teardown: limpar dados entre testes
|
|
88
|
+
beforeEach(async () => {
|
|
89
|
+
// Truncar tabelas ou usar transação
|
|
90
|
+
});
|
|
91
|
+
|
|
92
|
+
afterAll(async () => {
|
|
93
|
+
// Fechar conexão
|
|
94
|
+
});
|
|
95
|
+
|
|
96
|
+
describe('create', () => {
|
|
97
|
+
it('should persist user to database', async () => {
|
|
98
|
+
// Arrange
|
|
99
|
+
const userData = { email: 'test@example.com', name: 'Test' };
|
|
100
|
+
|
|
101
|
+
// Act
|
|
102
|
+
const user = await repository.create(userData);
|
|
103
|
+
|
|
104
|
+
// Assert
|
|
105
|
+
expect(user.id).toBeDefined();
|
|
106
|
+
|
|
107
|
+
// Verificar no banco diretamente
|
|
108
|
+
const persisted = await db.query('SELECT * FROM users WHERE id = ?', [user.id]);
|
|
109
|
+
expect(persisted.email).toBe(userData.email);
|
|
110
|
+
});
|
|
111
|
+
});
|
|
112
|
+
|
|
113
|
+
describe('findByEmail', () => {
|
|
114
|
+
it('should return null for non-existent email', async () => {});
|
|
115
|
+
it('should return user for existing email', async () => {});
|
|
116
|
+
});
|
|
117
|
+
|
|
118
|
+
describe('update', () => {
|
|
119
|
+
it('should update and persist changes', async () => {});
|
|
120
|
+
it('should throw for non-existent user', async () => {});
|
|
121
|
+
});
|
|
122
|
+
|
|
123
|
+
describe('delete', () => {
|
|
124
|
+
it('should remove from database', async () => {});
|
|
125
|
+
it('should cascade delete related records', async () => {});
|
|
126
|
+
});
|
|
127
|
+
});
|
|
128
|
+
```
|
|
129
|
+
|
|
130
|
+
### 3. Testes de Serviço com Dependências
|
|
131
|
+
|
|
132
|
+
```[LINGUAGEM]
|
|
133
|
+
describe('OrderService Integration', () => {
|
|
134
|
+
// Dependências reais (banco) + mocks (APIs externas)
|
|
135
|
+
let orderService: OrderService;
|
|
136
|
+
let orderRepository: OrderRepository; // Real
|
|
137
|
+
let paymentGateway: PaymentGateway; // Mock
|
|
138
|
+
let emailService: EmailService; // Mock ou real
|
|
139
|
+
|
|
140
|
+
beforeAll(async () => {
|
|
141
|
+
// Injetar dependências reais onde possível
|
|
142
|
+
orderRepository = new OrderRepository(testDatabase);
|
|
143
|
+
|
|
144
|
+
// Mock apenas integrações externas
|
|
145
|
+
paymentGateway = mockPaymentGateway();
|
|
146
|
+
|
|
147
|
+
orderService = new OrderService(orderRepository, paymentGateway);
|
|
148
|
+
});
|
|
149
|
+
|
|
150
|
+
describe('createOrder', () => {
|
|
151
|
+
it('should create order and process payment', async () => {
|
|
152
|
+
// Arrange
|
|
153
|
+
const orderData = { items: [...], userId: 1 };
|
|
154
|
+
paymentGateway.charge.mockResolvedValue({ success: true });
|
|
155
|
+
|
|
156
|
+
// Act
|
|
157
|
+
const order = await orderService.createOrder(orderData);
|
|
158
|
+
|
|
159
|
+
// Assert
|
|
160
|
+
expect(order.status).toBe('PAID');
|
|
161
|
+
expect(paymentGateway.charge).toHaveBeenCalledWith(/* ... */);
|
|
162
|
+
|
|
163
|
+
// Verificar persistência
|
|
164
|
+
const persisted = await orderRepository.findById(order.id);
|
|
165
|
+
expect(persisted).toBeDefined();
|
|
166
|
+
});
|
|
167
|
+
|
|
168
|
+
it('should rollback on payment failure', async () => {
|
|
169
|
+
paymentGateway.charge.mockResolvedValue({ success: false });
|
|
170
|
+
|
|
171
|
+
await expect(orderService.createOrder(orderData))
|
|
172
|
+
.rejects.toThrow('Payment failed');
|
|
173
|
+
|
|
174
|
+
// Verificar que não persistiu
|
|
175
|
+
const orders = await orderRepository.findByUserId(userId);
|
|
176
|
+
expect(orders).toHaveLength(0);
|
|
177
|
+
});
|
|
178
|
+
});
|
|
179
|
+
});
|
|
180
|
+
```
|
|
181
|
+
|
|
182
|
+
### 4. Testes de API (HTTP)
|
|
183
|
+
|
|
184
|
+
```[LINGUAGEM]
|
|
185
|
+
describe('POST /api/users', () => {
|
|
186
|
+
// Usar supertest, httpx, ou similar
|
|
187
|
+
let app;
|
|
188
|
+
|
|
189
|
+
beforeAll(async () => {
|
|
190
|
+
app = await createTestApp(); // App com banco de teste
|
|
191
|
+
});
|
|
192
|
+
|
|
193
|
+
it('should create user and return 201', async () => {
|
|
194
|
+
const response = await request(app)
|
|
195
|
+
.post('/api/users')
|
|
196
|
+
.send({ email: 'test@example.com', password: 'secure123' })
|
|
197
|
+
.expect(201);
|
|
198
|
+
|
|
199
|
+
expect(response.body.user.email).toBe('test@example.com');
|
|
200
|
+
expect(response.body.user.password).toBeUndefined(); // Não expor senha
|
|
201
|
+
|
|
202
|
+
// Verificar persistência
|
|
203
|
+
const user = await db.query('SELECT * FROM users WHERE email = ?', ['test@example.com']);
|
|
204
|
+
expect(user).toBeDefined();
|
|
205
|
+
});
|
|
206
|
+
|
|
207
|
+
it('should return 409 for duplicate email', async () => {
|
|
208
|
+
// Arrange: criar usuário
|
|
209
|
+
await createUser({ email: 'existing@example.com' });
|
|
210
|
+
|
|
211
|
+
// Act & Assert
|
|
212
|
+
await request(app)
|
|
213
|
+
.post('/api/users')
|
|
214
|
+
.send({ email: 'existing@example.com', password: 'test123' })
|
|
215
|
+
.expect(409);
|
|
216
|
+
});
|
|
217
|
+
|
|
218
|
+
it('should validate request body', async () => {
|
|
219
|
+
await request(app)
|
|
220
|
+
.post('/api/users')
|
|
221
|
+
.send({ email: 'invalid-email' })
|
|
222
|
+
.expect(400)
|
|
223
|
+
.expect((res) => {
|
|
224
|
+
expect(res.body.errors).toContainEqual(
|
|
225
|
+
expect.objectContaining({ field: 'email' })
|
|
226
|
+
);
|
|
227
|
+
});
|
|
228
|
+
});
|
|
229
|
+
});
|
|
230
|
+
```
|
|
231
|
+
|
|
232
|
+
### 5. Testcontainers (Recomendado)
|
|
233
|
+
|
|
234
|
+
```[LINGUAGEM]
|
|
235
|
+
// Exemplo com PostgreSQL
|
|
236
|
+
import { PostgreSqlContainer } from '@testcontainers/postgresql';
|
|
237
|
+
|
|
238
|
+
describe('Database Integration with Testcontainers', () => {
|
|
239
|
+
let container;
|
|
240
|
+
let db;
|
|
241
|
+
|
|
242
|
+
beforeAll(async () => {
|
|
243
|
+
// Iniciar container PostgreSQL
|
|
244
|
+
container = await new PostgreSqlContainer()
|
|
245
|
+
.withDatabase('testdb')
|
|
246
|
+
.withUsername('test')
|
|
247
|
+
.withPassword('test')
|
|
248
|
+
.start();
|
|
249
|
+
|
|
250
|
+
// Conectar ao container
|
|
251
|
+
db = await createConnection({
|
|
252
|
+
host: container.getHost(),
|
|
253
|
+
port: container.getMappedPort(5432),
|
|
254
|
+
database: 'testdb',
|
|
255
|
+
username: 'test',
|
|
256
|
+
password: 'test',
|
|
257
|
+
});
|
|
258
|
+
|
|
259
|
+
// Rodar migrations
|
|
260
|
+
await runMigrations(db);
|
|
261
|
+
});
|
|
262
|
+
|
|
263
|
+
afterAll(async () => {
|
|
264
|
+
await db.close();
|
|
265
|
+
await container.stop();
|
|
266
|
+
});
|
|
267
|
+
|
|
268
|
+
it('should work with real PostgreSQL', async () => {
|
|
269
|
+
// Teste com banco PostgreSQL real rodando em container
|
|
270
|
+
});
|
|
271
|
+
});
|
|
272
|
+
```
|
|
273
|
+
|
|
274
|
+
### 6. Mocking de APIs Externas
|
|
275
|
+
|
|
276
|
+
```[LINGUAGEM]
|
|
277
|
+
// Usar nock, WireMock, ou mock-service-worker
|
|
278
|
+
import nock from 'nock';
|
|
279
|
+
|
|
280
|
+
describe('StripePaymentGateway Integration', () => {
|
|
281
|
+
beforeEach(() => {
|
|
282
|
+
// Mock da API do Stripe
|
|
283
|
+
nock('https://api.stripe.com')
|
|
284
|
+
.post('/v1/charges')
|
|
285
|
+
.reply(200, {
|
|
286
|
+
id: 'ch_mock123',
|
|
287
|
+
status: 'succeeded',
|
|
288
|
+
amount: 1000,
|
|
289
|
+
});
|
|
290
|
+
});
|
|
291
|
+
|
|
292
|
+
afterEach(() => {
|
|
293
|
+
nock.cleanAll();
|
|
294
|
+
});
|
|
295
|
+
|
|
296
|
+
it('should process charge successfully', async () => {
|
|
297
|
+
const gateway = new StripePaymentGateway(testApiKey);
|
|
298
|
+
|
|
299
|
+
const result = await gateway.charge({
|
|
300
|
+
amount: 1000,
|
|
301
|
+
currency: 'brl',
|
|
302
|
+
source: 'tok_visa',
|
|
303
|
+
});
|
|
304
|
+
|
|
305
|
+
expect(result.success).toBe(true);
|
|
306
|
+
expect(result.transactionId).toBe('ch_mock123');
|
|
307
|
+
});
|
|
308
|
+
|
|
309
|
+
it('should handle Stripe errors', async () => {
|
|
310
|
+
nock.cleanAll();
|
|
311
|
+
nock('https://api.stripe.com')
|
|
312
|
+
.post('/v1/charges')
|
|
313
|
+
.reply(402, {
|
|
314
|
+
error: { code: 'card_declined', message: 'Card declined' }
|
|
315
|
+
});
|
|
316
|
+
|
|
317
|
+
await expect(gateway.charge(chargeData))
|
|
318
|
+
.rejects.toThrow('Card declined');
|
|
319
|
+
});
|
|
320
|
+
});
|
|
321
|
+
```
|
|
322
|
+
|
|
323
|
+
### 7. Padrões e Boas Práticas
|
|
324
|
+
|
|
325
|
+
#### Isolamento
|
|
326
|
+
- Cada teste deve ser independente
|
|
327
|
+
- Usar transações com rollback ou truncar tabelas
|
|
328
|
+
- Não compartilhar estado entre testes
|
|
329
|
+
|
|
330
|
+
#### Dados de Teste
|
|
331
|
+
```[LINGUAGEM]
|
|
332
|
+
// Factory pattern para criar dados
|
|
333
|
+
const userFactory = {
|
|
334
|
+
build: (overrides = {}) => ({
|
|
335
|
+
email: faker.internet.email(),
|
|
336
|
+
name: faker.person.fullName(),
|
|
337
|
+
...overrides,
|
|
338
|
+
}),
|
|
339
|
+
create: async (overrides = {}) => {
|
|
340
|
+
return repository.create(userFactory.build(overrides));
|
|
341
|
+
},
|
|
342
|
+
};
|
|
343
|
+
|
|
344
|
+
// Uso
|
|
345
|
+
const user = await userFactory.create({ role: 'admin' });
|
|
346
|
+
```
|
|
347
|
+
|
|
348
|
+
#### Assertions Específicas
|
|
349
|
+
```[LINGUAGEM]
|
|
350
|
+
// Verificar estado do banco
|
|
351
|
+
expect(await countUsers()).toBe(1);
|
|
352
|
+
|
|
353
|
+
// Verificar side effects
|
|
354
|
+
expect(emailService.send).toHaveBeenCalledWith(
|
|
355
|
+
expect.objectContaining({ to: 'user@example.com' })
|
|
356
|
+
);
|
|
357
|
+
|
|
358
|
+
// Verificar timestamps
|
|
359
|
+
expect(user.createdAt).toBeInstanceOf(Date);
|
|
360
|
+
expect(user.updatedAt).toBeAfter(user.createdAt);
|
|
361
|
+
```
|
|
362
|
+
```
|
|
363
|
+
|
|
364
|
+
---
|
|
365
|
+
|
|
366
|
+
## Exemplo de Uso
|
|
367
|
+
|
|
368
|
+
```text
|
|
369
|
+
Atue como especialista em testes de integração.
|
|
370
|
+
|
|
371
|
+
## Contexto
|
|
372
|
+
|
|
373
|
+
API de e-commerce com NestJS.
|
|
374
|
+
|
|
375
|
+
## Stack
|
|
376
|
+
|
|
377
|
+
- Backend: NestJS + TypeScript
|
|
378
|
+
- Banco: PostgreSQL
|
|
379
|
+
- ORM: Prisma
|
|
380
|
+
- Framework: Jest
|
|
381
|
+
- Integrações: Stripe, SendGrid
|
|
382
|
+
|
|
383
|
+
## Componentes
|
|
384
|
+
|
|
385
|
+
- OrderRepository
|
|
386
|
+
- OrderService (usa OrderRepository + PaymentGateway)
|
|
387
|
+
- POST /api/orders endpoint
|
|
388
|
+
|
|
389
|
+
## Código
|
|
390
|
+
|
|
391
|
+
@Injectable()
|
|
392
|
+
export class OrderService {
|
|
393
|
+
constructor(
|
|
394
|
+
private orderRepo: OrderRepository,
|
|
395
|
+
private paymentGateway: PaymentGateway,
|
|
396
|
+
) {}
|
|
397
|
+
|
|
398
|
+
async createOrder(dto: CreateOrderDto): Promise<Order> {
|
|
399
|
+
const order = await this.orderRepo.create(dto);
|
|
400
|
+
const payment = await this.paymentGateway.charge(order.total);
|
|
401
|
+
return this.orderRepo.updateStatus(order.id, payment.success ? 'PAID' : 'FAILED');
|
|
402
|
+
}
|
|
403
|
+
}
|
|
404
|
+
```
|
|
405
|
+
|
|
406
|
+
---
|
|
407
|
+
|
|
408
|
+
## Checklist Pós-Geração
|
|
409
|
+
|
|
410
|
+
- [ ] Setup de banco de teste configurado
|
|
411
|
+
- [ ] Testcontainers ou banco em memória funcionando
|
|
412
|
+
- [ ] Testes de repositório com CRUD completo
|
|
413
|
+
- [ ] Testes de serviço com mocks de APIs externas
|
|
414
|
+
- [ ] Testes de API HTTP (endpoints)
|
|
415
|
+
- [ ] Factories para geração de dados
|
|
416
|
+
- [ ] Isolamento entre testes garantido
|
|
417
|
+
- [ ] Cleanup após testes
|
|
418
|
+
- [ ] CI configurado para rodar testes de integração
|