Testes E2E (front-tests-e2e)
cactus-agents/front-tests-e2e (package cactus-front-e2e) é a suíte end-to-end
em Playwright do front-web-base. Roda contra um ambiente já publicado (dev,
stage ou prod), não contra um dev server local.
:::caution Não roda no CI
O único workflow do repo é delete-merged-branch.yml. Não existe workflow que
execute a suíte. Ela é rodada manualmente, tipicamente via feca test. Não
assuma cobertura E2E como gate de merge.
:::
O repo é clonado pelo setup default (tag initial).
Rodando via feca test (recomendado)
feca test # seleção interativa de brand + ambiente
feca test --headed # flags do Playwright passam direto
feca test tests/casino # roda só um diretório
O comando:
-
Confirma que
front-tests-e2eefront-web-baseestão clonados. -
Seleciona a brand varrendo os
.dev.vars.*do base (excluindo.dev.vars.example). Zero arquivos → usa o.dev.varsdefault; um → auto-seleciona; vários → pergunta. -
Lê
ORIGIN_DOMAINdo.dev.vars.<brand>escolhido (fallback no.dev.varssimples). Se ficar vazio, erra. -
Pergunta o ambiente —
dev,stageouprod— e monta aBASE_URL:Escolha BASE_URLdevhttps://dev.<ORIGIN_DOMAIN>stagehttps://stage.<ORIGIN_DOMAIN>prodhttps://<ORIGIN_DOMAIN> -
Faz bootstrap das dependências se necessário:
pnpm install, epnpm run install:browsersse não houver chromium em cache. -
Roda
BASE_URL=<url> pnpm --dir <e2e> test, repassando seus argumentos ao Playwright.
Rodando direto no repo
cd repos/front-tests-e2e
pnpm install
pnpm install:browsers # playwright install chromium
pnpm test # playwright test
pnpm test:ui # modo UI
pnpm test:headed
pnpm test:debug
pnpm report # playwright show-report
# por área
pnpm test:smoke # tests/smoke
pnpm test:auth # tests/auth
pnpm test:casino # tests/casino
pnpm test:nav # tests/navigation
pnpm test:profile # tests/user
pnpm test:skeleton-parity # tests/skeleton
Configuração
playwright.config.ts carrega um .env via dotenv (gitignored; o template é
.env.example).
| Item | Valor |
|---|---|
testDir | ./tests |
| Projects | Desktop Chrome (devices["Desktop Chrome"]) e Mobile Chrome (devices["Pixel 5"]) |
baseURL | process.env.BASE_URL, com fallback embutido |
| Reporters | html (pasta playwright-report, open: "never") + line |
| Paralelismo | fullyParallel: true; workers: 1 em CI |
| Retries | 2 em CI, 0 local |
| Artefatos em falha | trace: on-first-retry, screenshot: only-on-failure, video: on-first-retry |
| Timeouts | teste 60s, expect 10s, action 10s, navigation 30s |
Só chromium é instalado — não há projects de Firefox/WebKit.
Variáveis de ambiente
| Variável | Uso |
|---|---|
BASE_URL | Origem alvo. Setada pelo feca test; se você roda direto, precisa setar |
E2E_USERNAME / E2E_PASSWORD | Credenciais usadas nos testes de login e de perfil |
CI | Ativa forbidOnly, retries e workers: 1 |
:::caution Credenciais
E2E_USERNAME / E2E_PASSWORD vão no .env local (gitignored). Não commite
credenciais e não as coloque em .env.example além dos placeholders.
:::
O que a suíte cobre
tests/auth/login.spec.ts
tests/casino/browse.spec.ts
tests/navigation/main-nav.spec.ts
tests/skeleton/skeleton-parity.spec.ts
tests/smoke/pages.spec.ts
tests/user/profile.spec.ts
fixtures/base.ts
fixtures/i18n.ts
fixtures/pages/{AppPage,AuthModal,GamesPage,HomePage,UserProfilePage}.ts
| Área | Cobertura |
|---|---|
| smoke | Saúde das páginas públicas em dois níveis. CORE (tem que carregar em toda brand): /, /games, /games/live, /sports, /search. EXTRA (404 aceitável se a brand desliga): /vip, /vip/missions, /vip/levels, /promotions, /ajuda, /blog. Mais um teste da página 404. Assertivas: status < 500, ausência de texto de error boundary de BFF/brand-config (pt-br/es/en), e header visível |
| auth | Modal de login (botões visíveis, modal abre com email+senha, Escape fecha, erro de credencial inválida) e login real (login some após sucesso, navegação pro hub de cassino, sessão sobrevive à navegação SPA) |
| casino | Página de cassino, cassino ao vivo e busca: cards renderizam, clique abre detalhe/modal, página de detalhe renderiza, input de busca com query e slug conhecido |
| navigation | Header desktop (logo→home, Casino, Sports, busca) e bottom nav mobile |
| user | Perfil: aba de dados pessoais (email/telefone/documento/banco-Pix), navegação entre abas, aba de carteira (depósito/saque), histórico, prêmios e recompensas |
| skeleton | Auditoria de paridade de skeleton com o freeze dev-only ?__skeleton=1, parametrizada por rota — o skeleton congelado tem que casar com a geometria resolvida |
Os page objects em fixtures/pages/ são o ponto de extensão: adicione locators lá
em vez de espalhar seletores pelos specs. O alias ~fixtures/* aponta para
./fixtures/*.
Escrevendo teste novo
- Multi-brand por construção. A mesma suíte roda contra qualquer brand, então não assuma rota, texto ou feature que só uma brand tem. Se a rota é opcional, trate 404 como aceitável (padrão do tier EXTRA do smoke).
- i18n. Há um fixture
fixtures/i18n.tsjustamente porque o texto muda por país (pt-br / es / en). Não asserte string literal de UI sem passar por ele. - Sem dados inventados. Os testes batem em ambiente real; use slugs e categorias que existem, ou derive o alvo da própria página.