@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,460 @@
|
|
|
1
|
+
# Prompt: Testes End-to-End (E2E)
|
|
2
|
+
|
|
3
|
+
> **Quando usar**: Validar fluxos completos do usuário, do início ao fim
|
|
4
|
+
> **Especialista**: [Análise de Testes](../../02-especialistas/Especialista%20em%20Análise%20de%20Testes.md)
|
|
5
|
+
> **Nível**: Médio a Complexo
|
|
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/03-ux/design-doc.md` - Fluxos de usuário
|
|
14
|
+
- URL do ambiente de staging/desenvolvimento
|
|
15
|
+
|
|
16
|
+
Após gerar, salve os testes em:
|
|
17
|
+
- `tests/e2e/` ou `e2e/` na raiz do projeto
|
|
18
|
+
|
|
19
|
+
---
|
|
20
|
+
|
|
21
|
+
## Prompt Completo
|
|
22
|
+
|
|
23
|
+
```text
|
|
24
|
+
Atue como especialista em testes end-to-end (E2E) e automação de browser.
|
|
25
|
+
|
|
26
|
+
## Contexto do Projeto
|
|
27
|
+
|
|
28
|
+
[COLE O CONTEÚDO DE docs/CONTEXTO.md]
|
|
29
|
+
|
|
30
|
+
## Stack Frontend
|
|
31
|
+
|
|
32
|
+
- Framework: [React/Vue/Angular/Next.js]
|
|
33
|
+
- Componentes: [Component library usada]
|
|
34
|
+
- Autenticação: [Como funciona o login]
|
|
35
|
+
|
|
36
|
+
## Ferramenta de E2E
|
|
37
|
+
|
|
38
|
+
- [ ] Cypress
|
|
39
|
+
- [ ] Playwright
|
|
40
|
+
- [ ] Selenium
|
|
41
|
+
- [ ] TestCafe
|
|
42
|
+
|
|
43
|
+
## Fluxos Críticos a Testar
|
|
44
|
+
|
|
45
|
+
1. [Fluxo 1 - ex: Cadastro de usuário]
|
|
46
|
+
2. [Fluxo 2 - ex: Login e acesso ao dashboard]
|
|
47
|
+
3. [Fluxo 3 - ex: Checkout completo]
|
|
48
|
+
4. [Fluxo 4 - ex: ...]
|
|
49
|
+
|
|
50
|
+
## URLs e Ambientes
|
|
51
|
+
|
|
52
|
+
- Desenvolvimento: [http://localhost:3000]
|
|
53
|
+
- Staging: [https://staging.example.com]
|
|
54
|
+
|
|
55
|
+
---
|
|
56
|
+
|
|
57
|
+
## Sua Missão
|
|
58
|
+
|
|
59
|
+
Gere testes E2E completos usando a ferramenta escolhida:
|
|
60
|
+
|
|
61
|
+
### 1. Estrutura do Projeto
|
|
62
|
+
|
|
63
|
+
```
|
|
64
|
+
e2e/
|
|
65
|
+
├── fixtures/
|
|
66
|
+
│ ├── users.json
|
|
67
|
+
│ └── products.json
|
|
68
|
+
├── pages/
|
|
69
|
+
│ ├── LoginPage.ts
|
|
70
|
+
│ ├── DashboardPage.ts
|
|
71
|
+
│ └── CheckoutPage.ts
|
|
72
|
+
├── support/
|
|
73
|
+
│ ├── commands.ts
|
|
74
|
+
│ └── helpers.ts
|
|
75
|
+
├── specs/
|
|
76
|
+
│ ├── auth/
|
|
77
|
+
│ │ ├── login.spec.ts
|
|
78
|
+
│ │ └── register.spec.ts
|
|
79
|
+
│ ├── checkout/
|
|
80
|
+
│ │ └── purchase.spec.ts
|
|
81
|
+
│ └── smoke.spec.ts
|
|
82
|
+
├── playwright.config.ts
|
|
83
|
+
└── package.json
|
|
84
|
+
```
|
|
85
|
+
|
|
86
|
+
### 2. Configuração (Playwright)
|
|
87
|
+
|
|
88
|
+
```typescript
|
|
89
|
+
// playwright.config.ts
|
|
90
|
+
import { defineConfig, devices } from '@playwright/test';
|
|
91
|
+
|
|
92
|
+
export default defineConfig({
|
|
93
|
+
testDir: './specs',
|
|
94
|
+
timeout: 30000,
|
|
95
|
+
expect: {
|
|
96
|
+
timeout: 5000,
|
|
97
|
+
},
|
|
98
|
+
fullyParallel: true,
|
|
99
|
+
forbidOnly: !!process.env.CI,
|
|
100
|
+
retries: process.env.CI ? 2 : 0,
|
|
101
|
+
workers: process.env.CI ? 1 : undefined,
|
|
102
|
+
reporter: [
|
|
103
|
+
['html'],
|
|
104
|
+
['junit', { outputFile: 'results/junit.xml' }],
|
|
105
|
+
],
|
|
106
|
+
use: {
|
|
107
|
+
baseURL: process.env.BASE_URL || 'http://localhost:3000',
|
|
108
|
+
trace: 'on-first-retry',
|
|
109
|
+
screenshot: 'only-on-failure',
|
|
110
|
+
video: 'retain-on-failure',
|
|
111
|
+
},
|
|
112
|
+
projects: [
|
|
113
|
+
{
|
|
114
|
+
name: 'chromium',
|
|
115
|
+
use: { ...devices['Desktop Chrome'] },
|
|
116
|
+
},
|
|
117
|
+
{
|
|
118
|
+
name: 'firefox',
|
|
119
|
+
use: { ...devices['Desktop Firefox'] },
|
|
120
|
+
},
|
|
121
|
+
{
|
|
122
|
+
name: 'mobile',
|
|
123
|
+
use: { ...devices['iPhone 13'] },
|
|
124
|
+
},
|
|
125
|
+
],
|
|
126
|
+
webServer: {
|
|
127
|
+
command: 'npm run dev',
|
|
128
|
+
url: 'http://localhost:3000',
|
|
129
|
+
reuseExistingServer: !process.env.CI,
|
|
130
|
+
},
|
|
131
|
+
});
|
|
132
|
+
```
|
|
133
|
+
|
|
134
|
+
### 3. Page Object Model
|
|
135
|
+
|
|
136
|
+
```typescript
|
|
137
|
+
// pages/LoginPage.ts
|
|
138
|
+
import { Page, Locator } from '@playwright/test';
|
|
139
|
+
|
|
140
|
+
export class LoginPage {
|
|
141
|
+
readonly page: Page;
|
|
142
|
+
readonly emailInput: Locator;
|
|
143
|
+
readonly passwordInput: Locator;
|
|
144
|
+
readonly submitButton: Locator;
|
|
145
|
+
readonly errorMessage: Locator;
|
|
146
|
+
readonly forgotPasswordLink: Locator;
|
|
147
|
+
|
|
148
|
+
constructor(page: Page) {
|
|
149
|
+
this.page = page;
|
|
150
|
+
this.emailInput = page.getByLabel('Email');
|
|
151
|
+
this.passwordInput = page.getByLabel('Senha');
|
|
152
|
+
this.submitButton = page.getByRole('button', { name: 'Entrar' });
|
|
153
|
+
this.errorMessage = page.getByRole('alert');
|
|
154
|
+
this.forgotPasswordLink = page.getByRole('link', { name: 'Esqueci minha senha' });
|
|
155
|
+
}
|
|
156
|
+
|
|
157
|
+
async goto() {
|
|
158
|
+
await this.page.goto('/login');
|
|
159
|
+
}
|
|
160
|
+
|
|
161
|
+
async login(email: string, password: string) {
|
|
162
|
+
await this.emailInput.fill(email);
|
|
163
|
+
await this.passwordInput.fill(password);
|
|
164
|
+
await this.submitButton.click();
|
|
165
|
+
}
|
|
166
|
+
|
|
167
|
+
async expectErrorMessage(message: string) {
|
|
168
|
+
await expect(this.errorMessage).toContainText(message);
|
|
169
|
+
}
|
|
170
|
+
}
|
|
171
|
+
|
|
172
|
+
// pages/DashboardPage.ts
|
|
173
|
+
export class DashboardPage {
|
|
174
|
+
readonly page: Page;
|
|
175
|
+
readonly welcomeMessage: Locator;
|
|
176
|
+
readonly userMenu: Locator;
|
|
177
|
+
readonly logoutButton: Locator;
|
|
178
|
+
|
|
179
|
+
constructor(page: Page) {
|
|
180
|
+
this.page = page;
|
|
181
|
+
this.welcomeMessage = page.getByTestId('welcome-message');
|
|
182
|
+
this.userMenu = page.getByRole('button', { name: /menu do usuário/i });
|
|
183
|
+
this.logoutButton = page.getByRole('menuitem', { name: 'Sair' });
|
|
184
|
+
}
|
|
185
|
+
|
|
186
|
+
async expectWelcome(name: string) {
|
|
187
|
+
await expect(this.welcomeMessage).toContainText(`Olá, ${name}`);
|
|
188
|
+
}
|
|
189
|
+
|
|
190
|
+
async logout() {
|
|
191
|
+
await this.userMenu.click();
|
|
192
|
+
await this.logoutButton.click();
|
|
193
|
+
}
|
|
194
|
+
}
|
|
195
|
+
```
|
|
196
|
+
|
|
197
|
+
### 4. Fixtures e Helpers
|
|
198
|
+
|
|
199
|
+
```typescript
|
|
200
|
+
// support/helpers.ts
|
|
201
|
+
import { Page } from '@playwright/test';
|
|
202
|
+
|
|
203
|
+
export async function loginAsUser(page: Page, email: string, password: string) {
|
|
204
|
+
await page.goto('/login');
|
|
205
|
+
await page.getByLabel('Email').fill(email);
|
|
206
|
+
await page.getByLabel('Senha').fill(password);
|
|
207
|
+
await page.getByRole('button', { name: 'Entrar' }).click();
|
|
208
|
+
await page.waitForURL('/dashboard');
|
|
209
|
+
}
|
|
210
|
+
|
|
211
|
+
export async function createTestUser(page: Page) {
|
|
212
|
+
// Criar usuário via API para evitar depender de UI
|
|
213
|
+
const response = await page.request.post('/api/test/users', {
|
|
214
|
+
data: {
|
|
215
|
+
email: `test-${Date.now()}@example.com`,
|
|
216
|
+
password: 'Test123!',
|
|
217
|
+
name: 'Test User',
|
|
218
|
+
},
|
|
219
|
+
});
|
|
220
|
+
return response.json();
|
|
221
|
+
}
|
|
222
|
+
|
|
223
|
+
// fixtures/users.json
|
|
224
|
+
{
|
|
225
|
+
"validUser": {
|
|
226
|
+
"email": "user@example.com",
|
|
227
|
+
"password": "SecurePass123!"
|
|
228
|
+
},
|
|
229
|
+
"adminUser": {
|
|
230
|
+
"email": "admin@example.com",
|
|
231
|
+
"password": "AdminPass123!"
|
|
232
|
+
}
|
|
233
|
+
}
|
|
234
|
+
```
|
|
235
|
+
|
|
236
|
+
### 5. Testes de Autenticação
|
|
237
|
+
|
|
238
|
+
```typescript
|
|
239
|
+
// specs/auth/login.spec.ts
|
|
240
|
+
import { test, expect } from '@playwright/test';
|
|
241
|
+
import { LoginPage } from '../../pages/LoginPage';
|
|
242
|
+
import { DashboardPage } from '../../pages/DashboardPage';
|
|
243
|
+
import users from '../../fixtures/users.json';
|
|
244
|
+
|
|
245
|
+
test.describe('Login', () => {
|
|
246
|
+
test.beforeEach(async ({ page }) => {
|
|
247
|
+
await page.goto('/login');
|
|
248
|
+
});
|
|
249
|
+
|
|
250
|
+
test('should login with valid credentials', async ({ page }) => {
|
|
251
|
+
const loginPage = new LoginPage(page);
|
|
252
|
+
const dashboardPage = new DashboardPage(page);
|
|
253
|
+
|
|
254
|
+
await loginPage.login(users.validUser.email, users.validUser.password);
|
|
255
|
+
|
|
256
|
+
// Verificar redirecionamento
|
|
257
|
+
await expect(page).toHaveURL('/dashboard');
|
|
258
|
+
await dashboardPage.expectWelcome('Test User');
|
|
259
|
+
});
|
|
260
|
+
|
|
261
|
+
test('should show error for invalid credentials', async ({ page }) => {
|
|
262
|
+
const loginPage = new LoginPage(page);
|
|
263
|
+
|
|
264
|
+
await loginPage.login('invalid@example.com', 'wrongpassword');
|
|
265
|
+
|
|
266
|
+
await loginPage.expectErrorMessage('Email ou senha inválidos');
|
|
267
|
+
await expect(page).toHaveURL('/login');
|
|
268
|
+
});
|
|
269
|
+
|
|
270
|
+
test('should persist session after page reload', async ({ page }) => {
|
|
271
|
+
const loginPage = new LoginPage(page);
|
|
272
|
+
|
|
273
|
+
await loginPage.login(users.validUser.email, users.validUser.password);
|
|
274
|
+
await expect(page).toHaveURL('/dashboard');
|
|
275
|
+
|
|
276
|
+
// Recarregar página
|
|
277
|
+
await page.reload();
|
|
278
|
+
|
|
279
|
+
// Deve continuar logado
|
|
280
|
+
await expect(page).toHaveURL('/dashboard');
|
|
281
|
+
});
|
|
282
|
+
|
|
283
|
+
test('should logout successfully', async ({ page }) => {
|
|
284
|
+
const loginPage = new LoginPage(page);
|
|
285
|
+
const dashboardPage = new DashboardPage(page);
|
|
286
|
+
|
|
287
|
+
await loginPage.login(users.validUser.email, users.validUser.password);
|
|
288
|
+
await dashboardPage.logout();
|
|
289
|
+
|
|
290
|
+
await expect(page).toHaveURL('/login');
|
|
291
|
+
});
|
|
292
|
+
});
|
|
293
|
+
|
|
294
|
+
// specs/auth/register.spec.ts
|
|
295
|
+
test.describe('Registro', () => {
|
|
296
|
+
test('should register new user successfully', async ({ page }) => {
|
|
297
|
+
const uniqueEmail = `user-${Date.now()}@example.com`;
|
|
298
|
+
|
|
299
|
+
await page.goto('/register');
|
|
300
|
+
await page.getByLabel('Nome').fill('Novo Usuario');
|
|
301
|
+
await page.getByLabel('Email').fill(uniqueEmail);
|
|
302
|
+
await page.getByLabel('Senha').fill('SecurePass123!');
|
|
303
|
+
await page.getByLabel('Confirmar senha').fill('SecurePass123!');
|
|
304
|
+
await page.getByRole('checkbox', { name: /termos/i }).check();
|
|
305
|
+
await page.getByRole('button', { name: 'Criar conta' }).click();
|
|
306
|
+
|
|
307
|
+
// Verificar sucesso
|
|
308
|
+
await expect(page).toHaveURL('/dashboard');
|
|
309
|
+
await expect(page.getByText('Conta criada com sucesso')).toBeVisible();
|
|
310
|
+
});
|
|
311
|
+
|
|
312
|
+
test('should validate password requirements', async ({ page }) => {
|
|
313
|
+
await page.goto('/register');
|
|
314
|
+
await page.getByLabel('Senha').fill('weak');
|
|
315
|
+
await page.getByLabel('Senha').blur();
|
|
316
|
+
|
|
317
|
+
await expect(page.getByText(/mínimo 8 caracteres/i)).toBeVisible();
|
|
318
|
+
});
|
|
319
|
+
});
|
|
320
|
+
```
|
|
321
|
+
|
|
322
|
+
### 6. Testes de Fluxo de Compra
|
|
323
|
+
|
|
324
|
+
```typescript
|
|
325
|
+
// specs/checkout/purchase.spec.ts
|
|
326
|
+
import { test, expect } from '@playwright/test';
|
|
327
|
+
import { loginAsUser } from '../../support/helpers';
|
|
328
|
+
|
|
329
|
+
test.describe('Checkout', () => {
|
|
330
|
+
test.beforeEach(async ({ page }) => {
|
|
331
|
+
await loginAsUser(page, 'user@example.com', 'Test123!');
|
|
332
|
+
});
|
|
333
|
+
|
|
334
|
+
test('should complete full purchase flow', async ({ page }) => {
|
|
335
|
+
// 1. Navegar para produtos
|
|
336
|
+
await page.getByRole('link', { name: 'Produtos' }).click();
|
|
337
|
+
|
|
338
|
+
// 2. Adicionar produto ao carrinho
|
|
339
|
+
await page.getByTestId('product-card').first().click();
|
|
340
|
+
await page.getByRole('button', { name: 'Adicionar ao carrinho' }).click();
|
|
341
|
+
await expect(page.getByText('Produto adicionado')).toBeVisible();
|
|
342
|
+
|
|
343
|
+
// 3. Ir para carrinho
|
|
344
|
+
await page.getByRole('link', { name: /carrinho/i }).click();
|
|
345
|
+
await expect(page.getByTestId('cart-item')).toHaveCount(1);
|
|
346
|
+
|
|
347
|
+
// 4. Prosseguir para checkout
|
|
348
|
+
await page.getByRole('button', { name: 'Finalizar compra' }).click();
|
|
349
|
+
|
|
350
|
+
// 5. Preencher endereço
|
|
351
|
+
await page.getByLabel('CEP').fill('01310-100');
|
|
352
|
+
await page.waitForResponse('**/api/address/**'); // Aguardar busca de CEP
|
|
353
|
+
await page.getByLabel('Número').fill('100');
|
|
354
|
+
await page.getByRole('button', { name: 'Continuar' }).click();
|
|
355
|
+
|
|
356
|
+
// 6. Selecionar pagamento
|
|
357
|
+
await page.getByLabel('Cartão de crédito').check();
|
|
358
|
+
await page.getByLabel('Número do cartão').fill('4242424242424242');
|
|
359
|
+
await page.getByLabel('Validade').fill('12/28');
|
|
360
|
+
await page.getByLabel('CVV').fill('123');
|
|
361
|
+
await page.getByRole('button', { name: 'Pagar' }).click();
|
|
362
|
+
|
|
363
|
+
// 7. Verificar confirmação
|
|
364
|
+
await expect(page.getByText('Pedido confirmado')).toBeVisible({ timeout: 10000 });
|
|
365
|
+
await expect(page.getByTestId('order-number')).toBeVisible();
|
|
366
|
+
});
|
|
367
|
+
|
|
368
|
+
test('should handle payment failure gracefully', async ({ page }) => {
|
|
369
|
+
// ... adicionar produto e ir para checkout
|
|
370
|
+
|
|
371
|
+
// Usar cartão que falha
|
|
372
|
+
await page.getByLabel('Número do cartão').fill('4000000000000002');
|
|
373
|
+
await page.getByRole('button', { name: 'Pagar' }).click();
|
|
374
|
+
|
|
375
|
+
await expect(page.getByRole('alert')).toContainText('Pagamento recusado');
|
|
376
|
+
// Usuário deve poder tentar novamente
|
|
377
|
+
await expect(page.getByRole('button', { name: 'Pagar' })).toBeEnabled();
|
|
378
|
+
});
|
|
379
|
+
});
|
|
380
|
+
```
|
|
381
|
+
|
|
382
|
+
### 7. Testes de Smoke (Críticos)
|
|
383
|
+
|
|
384
|
+
```typescript
|
|
385
|
+
// specs/smoke.spec.ts
|
|
386
|
+
import { test, expect } from '@playwright/test';
|
|
387
|
+
|
|
388
|
+
test.describe('Smoke Tests', () => {
|
|
389
|
+
test('homepage loads correctly', async ({ page }) => {
|
|
390
|
+
await page.goto('/');
|
|
391
|
+
await expect(page).toHaveTitle(/Nome do App/);
|
|
392
|
+
await expect(page.getByRole('navigation')).toBeVisible();
|
|
393
|
+
});
|
|
394
|
+
|
|
395
|
+
test('login page is accessible', async ({ page }) => {
|
|
396
|
+
await page.goto('/login');
|
|
397
|
+
await expect(page.getByRole('heading', { name: 'Entrar' })).toBeVisible();
|
|
398
|
+
});
|
|
399
|
+
|
|
400
|
+
test('API health check', async ({ request }) => {
|
|
401
|
+
const response = await request.get('/api/health');
|
|
402
|
+
expect(response.ok()).toBeTruthy();
|
|
403
|
+
});
|
|
404
|
+
});
|
|
405
|
+
```
|
|
406
|
+
|
|
407
|
+
### 8. Scripts e CI
|
|
408
|
+
|
|
409
|
+
```json
|
|
410
|
+
// package.json
|
|
411
|
+
{
|
|
412
|
+
"scripts": {
|
|
413
|
+
"test:e2e": "playwright test",
|
|
414
|
+
"test:e2e:ui": "playwright test --ui",
|
|
415
|
+
"test:e2e:headed": "playwright test --headed",
|
|
416
|
+
"test:e2e:smoke": "playwright test --grep @smoke",
|
|
417
|
+
"test:e2e:report": "playwright show-report"
|
|
418
|
+
}
|
|
419
|
+
}
|
|
420
|
+
```
|
|
421
|
+
|
|
422
|
+
```yaml
|
|
423
|
+
# .github/workflows/e2e.yml
|
|
424
|
+
name: E2E Tests
|
|
425
|
+
|
|
426
|
+
on: [push, pull_request]
|
|
427
|
+
|
|
428
|
+
jobs:
|
|
429
|
+
e2e:
|
|
430
|
+
runs-on: ubuntu-latest
|
|
431
|
+
steps:
|
|
432
|
+
- uses: actions/checkout@v4
|
|
433
|
+
- uses: actions/setup-node@v4
|
|
434
|
+
with:
|
|
435
|
+
node-version: 20
|
|
436
|
+
- run: npm ci
|
|
437
|
+
- run: npx playwright install --with-deps
|
|
438
|
+
- run: npm run test:e2e
|
|
439
|
+
- uses: actions/upload-artifact@v4
|
|
440
|
+
if: failure()
|
|
441
|
+
with:
|
|
442
|
+
name: playwright-report
|
|
443
|
+
path: playwright-report/
|
|
444
|
+
```
|
|
445
|
+
```
|
|
446
|
+
|
|
447
|
+
---
|
|
448
|
+
|
|
449
|
+
## Checklist Pós-Geração
|
|
450
|
+
|
|
451
|
+
- [ ] Page Objects criados para páginas principais
|
|
452
|
+
- [ ] Fixtures de dados configurados
|
|
453
|
+
- [ ] Testes de autenticação (login, registro, logout)
|
|
454
|
+
- [ ] Testes de fluxos críticos de negócio
|
|
455
|
+
- [ ] Smoke tests para verificação rápida
|
|
456
|
+
- [ ] Configuração multi-browser
|
|
457
|
+
- [ ] Screenshots e vídeos em falha
|
|
458
|
+
- [ ] CI configurado com artefatos
|
|
459
|
+
- [ ] Seletores resilientes (role, label, testid)
|
|
460
|
+
- [ ] Timeouts apropriados
|