# belezaki! · Testing Guide

## Stack de testes

| Camada | Stack | Cobertura alvo |
|---|---|---|
| **Unitário** | Vitest + V8 coverage | 70%+ lines |
| **Integração** | Vitest + Prisma test container | fluxos críticos do banco |
| **E2E** | Playwright (chromium + mobile) | jornadas usuário completas |

## Como rodar

```bash
# Instalar
pnpm install
pnpm exec playwright install chromium

# Unit + integração (rápido, ~5s)
pnpm test

# Watch mode (dev)
pnpm test --watch

# Cobertura
pnpm test --coverage
open coverage/index.html

# E2E (precisa banco rodando + seed feito)
docker compose up -d
pnpm --filter @belezaki/db migrate
pnpm --filter @belezaki/db seed
pnpm exec playwright test

# UI mode (debug visual)
pnpm exec playwright test --ui

# CI (já configurado em .github/workflows/ci.yml)
```

## Estrutura

```
packages/*/src/*.test.ts        # Unit tests inline
e2e/*.spec.ts                   # E2E Playwright
vitest.config.ts                # Config Vitest
playwright.config.ts            # Config Playwright
```

## Testes implementados

### Unit
- `packages/invoicing/src/partner-split.test.ts` — Lei do Salão Parceiro split (6 cases)
- `packages/loyalty/src/index.test.ts` — Tier system Bronze→Diamante (6 cases)
- `packages/ai/src/scheduler-optimizer.test.ts` — Dynamic pricing (5 cases)
- `packages/ai/src/churn-prediction.test.ts` — Risk levels (4 cases)
- `packages/verticals/src/registry.test.ts` — 6 verticais + features flags (8 cases)
- `packages/messaging/src/templates.test.ts` — WhatsApp template engine (4 cases)

**Total: 33 testes** cobrindo lógica de negócio crítica.

### E2E
- `e2e/critical-flow.spec.ts` — happy path completo:
  1. Login dono → dashboard com KPIs
  2. Criar agendamento via agenda visual
  3. Buscar cliente
  4. Abrir WhatsApp inbox
  5. Conversar com belezaki! Assistant
  6. Logout
- `e2e/critical-flow.spec.ts` — booking público + portal cliente
- `e2e/critical-flow.spec.ts` — marketplace lista salões

## CI/CD

GitHub Actions roda em cada push:
1. Setup pnpm + Node 22
2. Postgres service container (Postgres 16)
3. `prisma generate` + `prisma migrate deploy`
4. `pnpm typecheck`
5. `pnpm lint`
6. `pnpm test` (Vitest)
7. `pnpm build`
8. `pnpm exec playwright test` (apenas em main + PRs flagged)

Falhar qualquer passo bloqueia merge.

## Adicionar testes novos

**Regra de ouro**: para cada server action ou função de domínio nova, criar pelo menos 1 caso happy + 1 caso de erro.

Template básico:
```ts
import { describe, it, expect } from 'vitest';
import { funcaoNova } from './arquivo';

describe('funcaoNova', () => {
  it('happy path', () => {
    expect(funcaoNova(input)).toEqual(output);
  });
  it('lança erro com input inválido', () => {
    expect(() => funcaoNova(invalido)).toThrow(/mensagem/);
  });
});
```
