# 08 - PLANO DE TESTES DO UPPI MARKETPLACE

## 1. ESTRATEGIA GERAL

### Tipos de Teste
| Tipo | Ferramenta | Onde roda | O que valida |
|------|-----------|-----------|-------------|
| **Unit** | PHPUnit | CLI | Services, Models, Helpers, StateMachines (sem banco) |
| **Integration** | PHPUnit + MySQL real | CLI | Services + banco, transacoes, locks, triggers |
| **Functional** | PHPUnit HTTP | CLI | Controllers, rotas, middleware, respostas JSON/HTML |
| **E2E** | Browser manual / checklist | Browser | Fluxos completos usuario-a-usuario |

### Convencoes
- Diretorio de testes: `tests/` em cada projeto (mkt, api)
- Nomenclatura: `{Classe}Test.php` -> `OrderServiceTest.php`
- Metodos: `test_{cenario}` -> `test_createFromCheckout_success`
- Banco de testes: `db_erp` (mesmo banco, dados de teste com cleanup)
- Cada teste de integracao usa `beginTransaction()` + `rollback()` para nao poluir

---

## 2. FASE 1 — MVP

### ETAPA 1: Banco de Dados
**Total: 25 testes**

#### T1.1 — DDL db_erp (12 testes)
```
[ ] T1.1.01  Verificar 67 tabelas criadas em db_erp (COUNT = 67 + tabelas Adianti existentes)
[ ] T1.1.02  Verificar tabelas auth: users, roles, permissions, role_permissions, user_roles, user_sessions, audit_log
[ ] T1.1.03  Verificar tabelas catalogo: categories, brands, products, product_variants, product_variant_options, product_images, product_attributes
[ ] T1.1.04  Verificar tabelas OMS: orders, order_items, order_status_history, order_splits
[ ] T1.1.05  Verificar tabelas pagamento: payment_methods, payment_transactions, payment_splits, payment_webhooks
[ ] T1.1.06  Verificar tabelas financeiro: finance_accounts, finance_entries, finance_transactions, finance_settlements
[ ] T1.1.07  Verificar tabelas WMS: warehouses, warehouse_zones, warehouse_locations, wms_stock, wms_stock_movements, wms_receiving, wms_receiving_items, wms_picking_orders, wms_picking_items, wms_inventory_counts, wms_inventory_count_items
[ ] T1.1.08  Verificar tabelas TMS: carriers, shipments, shipment_tracking, tms_vehicles, tms_drivers, tms_routes, tms_route_stops, tms_delivery_proofs, tms_delivery_attempts, tms_delivery_zones
[ ] T1.1.09  Verificar tabelas fiscal: fiscal_documents, fiscal_document_items, fiscal_events, fiscal_certificates
[ ] T1.1.10  Verificar tabelas ads: ads_campaigns, ads_creatives, ads_impressions, ads_clicks, ads_conversions
[ ] T1.1.11  Verificar tabelas apoio: notifications, system_settings, event_store, shipping_quotes, shipping_rules, wishlists, conversations, messages, coupons, coupon_usage, reviews, addresses, sellers, carts, cart_items, returns, return_items
[ ] T1.1.12  Verificar tabelas extras: cd_sync_log, cd_stock_snapshot, rules, rules_execution_log, idempotency_keys, idempotency_cache, stock_consolidated
```

#### T1.2 — Constraints e Indices (8 testes)
```
[ ] T1.2.01  CHECK constraints: orders.status aceita apenas 11 valores validos
[ ] T1.2.02  CHECK constraints: payment_transactions.status aceita apenas 10 valores validos
[ ] T1.2.03  CHECK constraints: reviews.rating entre 1 e 5
[ ] T1.2.04  UNIQUE: users.email, users.uuid, products.sku+seller_id, coupons.code, sellers.slug
[ ] T1.2.05  FK CASCADE: deletar user cascata em user_sessions, user_roles
[ ] T1.2.06  FK SET NULL: deletar user seta NULL em addresses.user_id
[ ] T1.2.07  FULLTEXT index: products(name, description) — MATCH AGAINST funciona
[ ] T1.2.08  GENERATED columns: wms_stock.available = quantity - reserved, wms_inventory_count_items.variance = counted_qty - system_qty
```

#### T1.3 — DDL db_erp_cd01 (2 testes)
```
[ ] T1.3.01  Verificar 20 tabelas criadas em db_erp_cd01
[ ] T1.3.02  Verificar GENERATED columns e constraints no CD
```

#### T1.4 — Seed (3 testes)
```
[ ] T1.4.01  Roles criados: admin, seller, customer, operator, driver (5 registros)
[ ] T1.4.02  Admin padrao criado: admin@uppi.app.br com user_type=admin e status=active
[ ] T1.4.03  System_settings criados: commission_default, pix_timeout, boleto_timeout, free_threshold, fiscal_environment
```

---

### ETAPA 2: Engine MVC
**Total: 32 testes**

#### T2.1 — Core Framework (16 testes)
```
[ ] T2.1.01  App::getInstance() retorna singleton
[ ] T2.1.02  Database::connection('default') retorna PDO valido conectado em db_erp
[ ] T2.1.03  Database — prepared statements reais (EMULATE_PREPARES = false)
[ ] T2.1.04  Router — GET /rota-simples resolve para controller correto
[ ] T2.1.05  Router — GET /produto/{slug} extrai parametro slug corretamente
[ ] T2.1.06  Router — group com prefixo /seller/* aplica middleware corretamente
[ ] T2.1.07  Router — rota nao encontrada retorna 404
[ ] T2.1.08  Router — metodo nao permitido retorna 405
[ ] T2.1.09  Request — parseia query string, body JSON, headers
[ ] T2.1.10  Request — bearerToken() extrai token do header Authorization
[ ] T2.1.11  Response — json() retorna Content-Type application/json
[ ] T2.1.12  Response — redirect() retorna header Location correto
[ ] T2.1.13  Session — set/get com dot notation (user.id = 5 -> get('user.id') = 5)
[ ] T2.1.14  Session — flash message: gravar, ler uma vez, segunda leitura retorna null
[ ] T2.1.15  Session — CSRF token gerado e hash_equals valida corretamente
[ ] T2.1.16  View — render() inclui template PHP e extrai variaveis
```

#### T2.2 — Model Base (10 testes)
```
[ ] T2.2.01  Model::find($id) retorna registro por ID
[ ] T2.2.02  Model::findByUuid($uuid) retorna registro por UUID
[ ] T2.2.03  Model::findBySlug($slug) retorna registro por slug
[ ] T2.2.04  Model::findOrFail($id) lanca excecao se nao encontrado
[ ] T2.2.05  Model::where('status', 'active')->get() filtra corretamente
[ ] T2.2.06  Model::where()->orderBy('price', 'ASC')->get() ordena corretamente
[ ] T2.2.07  Model::where()->paginate(20, 1) retorna dados + metadata paginacao
[ ] T2.2.08  Model::create($data) insere e retorna ID
[ ] T2.2.09  Model::update($id, $data) atualiza campos
[ ] T2.2.10  Model::delete($id) faz soft delete (seta deleted_at)
```

#### T2.3 — Middleware (4 testes)
```
[ ] T2.3.01  AuthMiddleware — sem sessao redireciona para /login
[ ] T2.3.02  AuthMiddleware — com sessao valida permite acesso
[ ] T2.3.03  CsrfMiddleware — POST sem token retorna 403
[ ] T2.3.04  GuestMiddleware — usuario logado redireciona para /
```

#### T2.4 — Helpers (2 testes)
```
[ ] T2.4.01  Helpers: money(199.90) = 'R$ 199,90', e('<script>') = '&lt;script&gt;', url('/teste') contem dominio
[ ] T2.4.02  Helpers: csrf_field() gera input hidden, asset('css/app.css') contem cache buster
```

---

### ETAPA 3: Views & Layout
**Total: 18 testes**

#### T3.1 — Controllers Basicos (10 testes)
```
[ ] T3.1.01  GET / retorna 200 com layout master (navbar + footer)
[ ] T3.1.02  GET /catalogo retorna 200 com grid de produtos
[ ] T3.1.03  GET /catalogo?q=teste retorna busca fulltext
[ ] T3.1.04  GET /catalogo/{categoria-slug} retorna produtos da categoria
[ ] T3.1.05  GET /produto/{slug} retorna 200 com galeria + info + tabs
[ ] T3.1.06  GET /produto/slug-inexistente retorna 404
[ ] T3.1.07  GET /login retorna 200 com formulario
[ ] T3.1.08  POST /login com credenciais invalidas retorna erro
[ ] T3.1.09  POST /login com credenciais validas redireciona para /
[ ] T3.1.10  POST /cadastro com dados validos cria usuario e redireciona
```

#### T3.2 — Models (4 testes)
```
[ ] T3.2.01  User::create() gera uuid automatico, hash Argon2id no password
[ ] T3.2.02  Product — where('is_active', 1)->where('status', 'active') filtra corretamente
[ ] T3.2.03  Category — arvore hierarquica (parent_id) monta corretamente
[ ] T3.2.04  Cart — getOrCreate cria carrinho se nao existe
```

#### T3.3 — Layout e Componentes (4 testes)
```
[ ] T3.3.01  Layout master.php contem: navbar, footer, window.__UPPI__, Bootstrap CSS, Vue ESM
[ ] T3.3.02  Componente product-card renderiza: imagem, nome, preco, rating, botao add-to-cart
[ ] T3.3.03  Componente pagination renderiza: anterior, numeros, proximo, contagem
[ ] T3.3.04  Componente meta-tags renderiza: title, description, og:title, og:image, canonical
```

---

### ETAPA 4: Vue.js Interatividade
**Total: 16 testes**

#### T4.1 — Composables (6 testes)
```
[ ] T4.1.01  useApi — GET /ajax/cart retorna JSON com items
[ ] T4.1.02  useApi — POST envia CSRF token automaticamente
[ ] T4.1.03  useApi — resposta 401 redireciona para /login
[ ] T4.1.04  useCart — addItem atualiza items e totalItems corretamente
[ ] T4.1.05  useCart — estado singleton (duas instancias compartilham mesmo estado)
[ ] T4.1.06  useToast — show() cria toast, auto-dismiss apos timeout
```

#### T4.2 — Controllers AJAX (6 testes)
```
[ ] T4.2.01  POST /ajax/cart/add com product_uuid valido retorna carrinho atualizado
[ ] T4.2.02  POST /ajax/cart/add com estoque insuficiente retorna erro 422
[ ] T4.2.03  PUT /ajax/cart/update atualiza quantidade
[ ] T4.2.04  DELETE /ajax/cart/remove remove item
[ ] T4.2.05  POST /ajax/sugestoes?q=cel retorna produtos, categorias, sellers
[ ] T4.2.06  POST /ajax/frete com CEP valido retorna cotacoes (SEDEX, PAC)
```

#### T4.3 — Componentes Vue (4 testes)
```
[ ] T4.3.01  SearchSuggestions — digitar 2+ chars dispara busca com debounce
[ ] T4.3.02  MiniCart — abrir offcanvas mostra itens do carrinho
[ ] T4.3.03  ProductApp — selecionar variante atualiza preco e PIX com desconto
[ ] T4.3.04  CheckoutApp — wizard navega entre 5 steps corretamente
```

---

### ETAPA 5: Services de Negocio
**Total: 68 testes**

#### T5.1 — StateMachine (6 testes)
```
[ ] T5.1.01  allow(from, to) registra transicao
[ ] T5.1.02  canTransition(from, to) retorna true para transicao registrada
[ ] T5.1.03  canTransition(from, to) retorna false para transicao nao registrada
[ ] T5.1.04  transition(from, to) executa e roda hooks
[ ] T5.1.05  transition invalida lanca RuntimeException
[ ] T5.1.06  getAllowedTransitions(from) retorna lista correta
```

#### T5.2 — OrderStateMachine (5 testes)
```
[ ] T5.2.01  pending -> confirmed permitido
[ ] T5.2.02  pending -> cancelled permitido
[ ] T5.2.03  pending -> delivered bloqueado (lanca excecao)
[ ] T5.2.04  delivered -> disputed permitido
[ ] T5.2.05  completed -> pending bloqueado (lanca excecao)
```

#### T5.3 — EventDispatcher (4 testes)
```
[ ] T5.3.01  dispatch() persiste evento no event_store
[ ] T5.3.02  dispatch() notifica listeners sincronos
[ ] T5.3.03  dispatch() publica na fila Redis
[ ] T5.3.04  listen() registra e executa callback no dispatch
```

#### T5.4 — IdempotencyGuard (3 testes)
```
[ ] T5.4.01  acquire(key) retorna true na primeira chamada
[ ] T5.4.02  acquire(key) retorna false na segunda chamada (mesmo key)
[ ] T5.4.03  release(key) libera e acquire retorna true novamente
```

#### T5.5 — OrderService (10 testes)
```
[ ] T5.5.01  createFromCheckout — sucesso: cria pedido com order_number UPP-*, itens com comissao, marca carrinho convertido
[ ] T5.5.02  createFromCheckout — falha: carrinho vazio lanca BusinessRuleException
[ ] T5.5.03  createFromCheckout — falha: estoque insuficiente lanca BusinessRuleException
[ ] T5.5.04  createFromCheckout — cupom percentage aplica desconto corretamente
[ ] T5.5.05  createFromCheckout — cupom free_shipping zera frete
[ ] T5.5.06  createFromCheckout — dispara evento order.created
[ ] T5.5.07  changeStatus — pending -> confirmed atualiza status e cria historico
[ ] T5.5.08  changeStatus — pending -> delivered lanca excecao (transicao invalida)
[ ] T5.5.09  createSplits — pedido multi-seller cria N splits (1 por seller)
[ ] T5.5.10  createSplits — calcula seller_net = total - commission corretamente
```

#### T5.6 — PaymentService (8 testes)
```
[ ] T5.6.01  processPayment PIX — cria transaction com qr_code e copy_paste
[ ] T5.6.02  processPayment Credito — cria transaction com status authorized
[ ] T5.6.03  processPayment — multi-payment (PIX + cartao) cria 2 transactions
[ ] T5.6.04  processPayment — soma payments != grand_total lanca erro
[ ] T5.6.05  processPayment — cria payment_splits por seller
[ ] T5.6.06  handleWebhook — PIX pago atualiza transaction para paid e pedido para confirmed
[ ] T5.6.07  refund — estorno total reverte payment_splits pendentes
[ ] T5.6.08  refund — estorno parcial cria transaction tipo refund com valor parcial
```

#### T5.7 — StockService (8 testes)
```
[ ] T5.7.01  getAvailable retorna quantity - reserved
[ ] T5.7.02  reserve — incrementa reserved, registra movimento 'reserve'
[ ] T5.7.03  reserve — estoque insuficiente lanca excecao
[ ] T5.7.04  release — decrementa reserved, registra movimento 'release'
[ ] T5.7.05  release — nao permite reserved negativo (GREATEST 0)
[ ] T5.7.06  deduct — decrementa quantity e reserved
[ ] T5.7.07  deduct — estoque <= min_quantity dispara evento stock.low
[ ] T5.7.08  inbound — incrementa quantity, registra movimento 'inbound'
```

#### T5.8 — LedgerService (6 testes)
```
[ ] T5.8.01  record — cria transaction + 2 entries (debit + credit)
[ ] T5.8.02  record — soma de todos entries = 0 (double-entry balanceado)
[ ] T5.8.03  record — atualiza balance das 2 contas corretamente
[ ] T5.8.04  recordSale — cria 2 transacoes (escrow->receivable e receivable->commission)
[ ] T5.8.05  findOrCreateAccount — cria conta se nao existe
[ ] T5.8.06  record — lock pessimista impede race condition (teste concorrencia)
```

#### T5.9 — SettlementService (4 testes)
```
[ ] T5.9.01  generateSettlement — busca splits de pedidos entregues ha +14 dias
[ ] T5.9.02  generateSettlement — ignora splits de pedidos entregues ha -14 dias
[ ] T5.9.03  generateSettlement — calcula gross, commission, fee, net corretamente
[ ] T5.9.04  executeTransfer — atualiza settlement para transferred e splits para settled
```

#### T5.10 — FiscalService (6 testes)
```
[ ] T5.10.01  emitNFe — cria documento fiscal em draft com CFOP 5102 (interna)
[ ] T5.10.02  emitNFe — CFOP 6102 para operacao interestadual
[ ] T5.10.03  emitNFe — Simples Nacional: CSOSN 102, sem impostos
[ ] T5.10.04  emitNFe — Lucro Presumido: ICMS 18%, PIS 0.65%, COFINS 3%
[ ] T5.10.05  cancel — prazo expirado lanca excecao (>24h NF-e)
[ ] T5.10.06  emitCCe — max 20 CCe por documento, lanca excecao na 21a
```

#### T5.11 — ReturnService (4 testes)
```
[ ] T5.11.01  request — pedido delivered dentro de 7 dias: sucesso
[ ] T5.11.02  request — pedido delivered apos 7 dias de arrependimento: lanca excecao
[ ] T5.11.03  request — pedido nao delivered: lanca excecao
[ ] T5.11.04  receiveAndInspect — condition new: faz restock via StockService.inbound
```

#### T5.12 — AdsService (4 testes)
```
[ ] T5.12.01  recordImpression — incrementa impressions, calcula custo CPM
[ ] T5.12.02  recordImpression — frequency cap excedido nao registra
[ ] T5.12.03  recordClick — 3+ clicks mesmo IP em 60s: fraud_score = 0.95
[ ] T5.12.04  getAdsForPlacement — retorna ads ordenados por rank (bid * (1+CTR))
```

---

### ETAPA 6: Checkout + Integracao
**Total: 14 testes**

#### T6.1 — CheckoutController (8 testes)
```
[ ] T6.1.01  POST /ajax/frete — CEP valido retorna cotacoes com preco e prazo
[ ] T6.1.02  POST /ajax/frete — CEP invalido retorna erro 422
[ ] T6.1.03  POST /checkout — sucesso: cria pedido, retorna order_number
[ ] T6.1.04  POST /checkout — carrinho ja convertido retorna erro 409
[ ] T6.1.05  POST /checkout — estoque insuficiente retorna erro 422
[ ] T6.1.06  POST /checkout — frete expirado retorna erro 422
[ ] T6.1.07  POST /checkout — PIX retorna qr_code e copy_paste
[ ] T6.1.08  POST /checkout — idempotency key duplicada retorna mesma resposta
```

#### T6.2 — OrderController (4 testes)
```
[ ] T6.2.01  GET /pedidos retorna lista paginada do usuario
[ ] T6.2.02  GET /pedidos/{uuid} retorna detalhe com items, splits, pagamentos, timeline
[ ] T6.2.03  POST /pedidos/{uuid}/cancelar — status pending: sucesso
[ ] T6.2.04  POST /pedidos/{uuid}/cancelar — status shipped: erro 422
```

#### T6.3 — Integracao Gateway (2 testes)
```
[ ] T6.3.01  MercadoPagoGateway::charge() com PIX retorna qr_code (sandbox)
[ ] T6.3.02  Webhook MercadoPago — payment.approved atualiza transaction para paid
```

---

## 3. FASE 2 — SELLERS + WORKERS

### ETAPA 7: Seller Center
**Total: 22 testes**

#### T7.1 — SellerMiddleware (2 testes)
```
[ ] T7.1.01  Usuario sem seller aprovado: redireciona para /
[ ] T7.1.02  Seller aprovado: acesso permitido, seller_id injetado
```

#### T7.2 — Seller Produtos (8 testes)
```
[ ] T7.2.01  GET /seller/produtos retorna lista do seller (nao mostra de outro seller)
[ ] T7.2.02  POST /seller/produtos cria produto com status draft
[ ] T7.2.03  POST /seller/produtos — SKU duplicado do mesmo seller retorna erro 409
[ ] T7.2.04  PUT /seller/produtos/{uuid} atualiza campos
[ ] T7.2.05  POST /seller/produtos/{uuid}/publicar muda para pending_review
[ ] T7.2.06  POST /seller/produtos/{uuid}/despublicar muda para inactive
[ ] T7.2.07  DELETE /seller/produtos/{uuid} faz soft delete
[ ] T7.2.08  PUT /ajax/seller/estoque/{uuid} atualiza quantidade e registra movimento
```

#### T7.3 — Seller Pedidos (4 testes)
```
[ ] T7.3.01  GET /seller/pedidos retorna splits do seller
[ ] T7.3.02  POST /seller/pedidos/{id}/aceitar muda split para processing
[ ] T7.3.03  POST /seller/pedidos/{id}/rejeitar muda split para cancelled + dispara evento
[ ] T7.3.04  POST /seller/pedidos/{id}/despachar com tracking_code muda para shipped
```

#### T7.4 — Seller Financeiro (4 testes)
```
[ ] T7.4.01  GET /seller/financeiro retorna saldo disponivel + bloqueado
[ ] T7.4.02  GET /seller/financeiro — vendas brutas = soma dos splits do seller
[ ] T7.4.03  GET /seller/extrato retorna lancamentos com saldo apos cada um
[ ] T7.4.04  GET /seller/repasses retorna lista com valores net corretos
```

#### T7.5 — Seller Avaliacoes (2 testes)
```
[ ] T7.5.01  GET /seller/avaliacoes retorna reviews de produtos do seller
[ ] T7.5.02  POST responder avaliacao grava seller_reply
```

#### T7.6 — Seller Dashboard Vue (2 testes)
```
[ ] T7.6.01  SellerDashboardApp carrega KPIs via AJAX
[ ] T7.6.02  Filtro de periodo (hoje/semana/mes) atualiza dados
```

---

### ETAPA 8: Admin
**Total: 16 testes**

#### T8.1 — AdminMiddleware (2 testes)
```
[ ] T8.1.01  Usuario nao admin: redireciona para /
[ ] T8.1.02  Admin: acesso permitido
```

#### T8.2 — Admin Sellers (4 testes)
```
[ ] T8.2.01  GET /admin/sellers retorna lista com status
[ ] T8.2.02  POST /admin/sellers/{id}/aprovar muda para approved
[ ] T8.2.03  POST /admin/sellers/{id}/suspender muda para suspended + motivo
[ ] T8.2.04  Aprovar seller cria contas financeiras (receivable, commission)
```

#### T8.3 — Admin Pedidos (3 testes)
```
[ ] T8.3.01  GET /admin/pedidos retorna todos pedidos
[ ] T8.3.02  POST forcar-status com motivo funciona
[ ] T8.3.03  Forcar status cria historico com prefixo [ADMIN FORCE]
```

#### T8.4 — Admin Financeiro (3 testes)
```
[ ] T8.4.01  GET /admin/financeiro retorna saldo marketplace + sellers
[ ] T8.4.02  POST aprovar repasse muda settlement para approved
[ ] T8.4.03  POST executar repasse chama SettlementService.executeTransfer
```

#### T8.5 — Admin Dashboard (2 testes)
```
[ ] T8.5.01  Dashboard retorna GMV, pedidos, ticket medio, comissoes
[ ] T8.5.02  Dashboard retorna top 5 sellers e top 5 produtos
```

#### T8.6 — Admin Produtos (2 testes)
```
[ ] T8.6.01  GET produtos pendentes retorna apenas status pending_review
[ ] T8.6.02  POST aprovar produto muda para active + is_active = 1
```

---

### ETAPA 9: Workers
**Total: 20 testes**

#### T9.1 — QueueManager (4 testes)
```
[ ] T9.1.01  publish() insere job na fila Redis correta
[ ] T9.1.02  consume() retorna job da fila via BRPOP
[ ] T9.1.03  requeueWithDelay() insere no sorted set com score correto
[ ] T9.1.04  moveToDlq() move job para fila dlq:*
```

#### T9.2 — OmsWorker (5 testes)
```
[ ] T9.2.01  order.created — agenda timeout PIX 30min
[ ] T9.2.02  payment.paid — confirma pedido + cria splits
[ ] T9.2.03  order.cancelled — cancela todos splits
[ ] T9.2.04  shipment.delivered (todos splits) — marca pedido delivered
[ ] T9.2.05  shipment.lost — dispara estorno automatico
```

#### T9.3 — PaymentWorker (3 testes)
```
[ ] T9.3.01  order.cancelled com transaction authorized — faz void
[ ] T9.3.02  order.cancelled com transaction paid — faz estorno total
[ ] T9.3.03  return.refunded — estorno parcial + registra no ledger
```

#### T9.4 — StockWorker (3 testes)
```
[ ] T9.4.01  order.splits_created — reserva estoque por CD para cada split
[ ] T9.4.02  order.splits_created — estoque insuficiente dispara stock.insufficient
[ ] T9.4.03  order.cancelled — libera reservas de todos itens
```

#### T9.5 — FulfillmentWorker (3 testes)
```
[ ] T9.5.01  stock.reserved — cria picking order no CD correto
[ ] T9.5.02  picking.completed — cria shipment com status pending
[ ] T9.5.03  picking.completed — gera shipment_number
```

#### T9.6 — BaseWorker (2 testes)
```
[ ] T9.6.01  Retry com backoff exponencial (30s, 120s, 300s)
[ ] T9.6.02  Apos max retries move para DLQ
```

---

## 4. FASE 3 — API + FISCAL + ERP

### ETAPA 10: API REST
**Total: 42 testes**

#### T10.1 — Auth API (8 testes)
```
[ ] T10.1.01  POST /v1/auth/register — sucesso retorna 201 + uuid
[ ] T10.1.02  POST /v1/auth/register — email duplicado retorna 409
[ ] T10.1.03  POST /v1/auth/register — senha fraca retorna 422
[ ] T10.1.04  POST /v1/auth/login — sucesso retorna access_token + refresh_token
[ ] T10.1.05  POST /v1/auth/login — credenciais invalidas retorna 401
[ ] T10.1.06  POST /v1/auth/login — 5+ tentativas retorna 429
[ ] T10.1.07  POST /v1/auth/refresh — token valido retorna novo access_token
[ ] T10.1.08  POST /v1/auth/logout — revoga sessao (revoked_at setado)
```

#### T10.2 — Middleware API (8 testes)
```
[ ] T10.2.01  Sem Authorization header retorna 401
[ ] T10.2.02  JWT expirado retorna 401 com code TOKEN_EXPIRED
[ ] T10.2.03  JWT valido injeta user_id, user_type, roles no request
[ ] T10.2.04  RoleMiddleware — user_type != admin retorna 403
[ ] T10.2.05  SellerMiddleware — seller nao aprovado retorna 403
[ ] T10.2.06  RateLimitMiddleware — exceder 300 req/min retorna 429
[ ] T10.2.07  IdempotencyMiddleware — mesma key retorna resposta cacheada
[ ] T10.2.08  CORS — preflight OPTIONS retorna 204 com headers corretos
```

#### T10.3 — Catalogo API (6 testes)
```
[ ] T10.3.01  GET /v1/products — retorna lista paginada com facets
[ ] T10.3.02  GET /v1/products?q=celular — fulltext search funciona
[ ] T10.3.03  GET /v1/products/{slug} — retorna produto com variantes, imagens, atributos
[ ] T10.3.04  GET /v1/categories — retorna arvore hierarquica
[ ] T10.3.05  GET /v1/products/{slug}/reviews — retorna avaliacoes paginadas
[ ] T10.3.06  GET /v1/search/suggestions?q=ce — retorna produtos, categorias, sellers
```

#### T10.4 — Cart + Checkout API (6 testes)
```
[ ] T10.4.01  POST /v1/cart/items — adiciona item ao carrinho
[ ] T10.4.02  GET /v1/cart — retorna items + summary (subtotal, sellers_count)
[ ] T10.4.03  POST /v1/coupons/validate — cupom valido retorna desconto calculado
[ ] T10.4.04  POST /v1/shipping/quote — retorna cotacoes multi-carrier
[ ] T10.4.05  POST /v1/checkout — sucesso retorna 201 com order + payments
[ ] T10.4.06  POST /v1/checkout — envelope padrao com success, data, meta
```

#### T10.5 — Seller API (6 testes)
```
[ ] T10.5.01  POST /v1/seller/products — cria produto com variantes
[ ] T10.5.02  GET /v1/seller/orders — retorna splits do seller
[ ] T10.5.03  POST /v1/seller/orders/{id}/ship — com tracking_code
[ ] T10.5.04  GET /v1/seller/finance/dashboard — saldo + resumo mensal
[ ] T10.5.05  POST /v1/seller/ads — cria campanha com creatives
[ ] T10.5.06  GET /v1/seller/ads/{uuid}/report — metricas (CTR, ROAS, CPC)
```

#### T10.6 — Admin API (4 testes)
```
[ ] T10.6.01  GET /v1/admin/dashboard — KPIs corretos
[ ] T10.6.02  POST /v1/admin/sellers/{id}/approve — muda status
[ ] T10.6.03  POST /v1/admin/disputes/{uuid}/resolve — favor_buyer: status refunded
[ ] T10.6.04  GET /v1/admin/audit — retorna log com filtros
```

#### T10.7 — Webhooks API (4 testes)
```
[ ] T10.7.01  POST /v1/webhooks/mercadopago — persiste payload + processa
[ ] T10.7.02  POST /v1/webhooks/correios — insere evento tracking
[ ] T10.7.03  Webhook com assinatura invalida retorna 401
[ ] T10.7.04  Webhook duplicado (idempotente) nao reprocessa
```

---

### ETAPA 11: Fiscal
**Total: 8 testes**
```
[ ] T11.01  FiscalWorker — evento payment.paid cria NF-e em draft
[ ] T11.02  FiscalService.signAndSubmit — gera XML assinado
[ ] T11.03  FiscalService.signAndSubmit — SEFAZ homologacao retorna cStat 100 (authorized)
[ ] T11.04  FiscalService.cancel — dentro de 24h: sucesso
[ ] T11.05  FiscalService.cancel — fora de 24h: lanca excecao
[ ] T11.06  FiscalService.emitCCe — max 20 por documento
[ ] T11.07  GET /v1/fiscal/{uuid}/xml — retorna XML autorizado
[ ] T11.08  GET /v1/fiscal/{uuid}/danfe — retorna PDF
```

---

### ETAPA 12: ERP Adianti
**Total: 30 testes**

#### T12.1 — MarketplaceBridge (10 testes)
```
[ ] T12.1.01  approveSellerAction — muda status para approved + cria contas financeiras
[ ] T12.1.02  suspendSellerAction — bloqueia vendas + desativa produtos + congela conta
[ ] T12.1.03  forceOrderStatus — altera status com historico [ADMIN FORCE]
[ ] T12.1.04  cancelOrderAction — cancela + dispara estorno
[ ] T12.1.05  executeSettlementAction — aprova + executa repasse
[ ] T12.1.06  generateDRE — calcula GMV, comissoes, ads, devolucoes, margem %
[ ] T12.1.07  testRule — avalia condicoes individuais da regra
[ ] T12.1.08  createDeliveryRoute — cria rota otimizada via TmsService
[ ] T12.1.09  reconcileCdStock — detecta divergencias central vs CD
[ ] T12.1.10  retryFiscalDocument — reprocessa NF-e rejeitada
```

#### T12.2 — Telas Marketplace (6 testes)
```
[ ] T12.2.01  SellerManagement — lista sellers com filtro por status
[ ] T12.2.02  OrderManagement — lista pedidos, abre detalhe
[ ] T12.2.03  ProductModeration — lista produtos pending_review, aprovar/rejeitar
[ ] T12.2.04  DisputeManagement — resolver disputa favor_buyer/favor_seller
[ ] T12.2.05  CouponManagement — CRUD completo de cupons
[ ] T12.2.06  MarketplaceDashboard — KPIs carregam corretamente
```

#### T12.3 — Telas Financeiro (5 testes)
```
[ ] T12.3.01  FinanceDashboard — saldo marketplace + sellers + graficos
[ ] T12.3.02  SettlementManagement — aprovar/executar repasse
[ ] T12.3.03  LedgerReport — extrato double-entry filtravel por periodo
[ ] T12.3.04  DREReport — demonstrativo resultado com GMV, comissoes, margem
[ ] T12.3.05  ReconciliationReport — gateway vs ledger mostra divergencias
```

#### T12.4 — Telas Logistica (3 testes)
```
[ ] T12.4.01  WarehouseManagement — CRUD warehouses
[ ] T12.4.02  StockOverview — estoque consolidado de todos CDs
[ ] T12.4.03  RouteManagement — visualizar rotas e paradas
```

#### T12.5 — Telas Config (4 testes)
```
[ ] T12.5.01  SystemSettings — listar e atualizar chave-valor
[ ] T12.5.02  RulesManagement — CRUD regras com conditions/actions JSON
[ ] T12.5.03  CategoryManagement — arvore hierarquica com drag-drop
[ ] T12.5.04  CarrierManagement — CRUD transportadoras
```

#### T12.6 — Menu e Navegacao (2 testes)
```
[ ] T12.6.01  menu.xml carrega todos os 7 grupos com icones
[ ] T12.6.02  Todas as 30 telas acessiveis pelo menu (sem erro 500)
```

---

## 5. FASE 4 — CD + TMS + MOBILE

### ETAPA 13: CD-01 Adianti
**Total: 28 testes**

#### T13.1 — WMS Recebimento (4 testes)
```
[ ] T13.1.01  Criar recebimento gera numero RCV-YYYYMMDD-XXXX
[ ] T13.1.02  Conferir item: atualiza received_qty
[ ] T13.1.03  Finalizar recebimento: chama StockService.inbound por item
[ ] T13.1.04  Rejeitar item parcial: rejected_qty registrada
```

#### T13.2 — WMS Picking (6 testes)
```
[ ] T13.2.01  Criar picking order a partir de order_split
[ ] T13.2.02  Iniciar picking: atribui operador, status in_progress
[ ] T13.2.03  Scanear item correto (barcode = EAN): status picked
[ ] T13.2.04  Scanear barcode errado: rejeita (nao marca picked)
[ ] T13.2.05  Finalizar picking: dispara evento picking.completed
[ ] T13.2.06  Picking short: item nao encontrado, marca short
```

#### T13.3 — WMS Estoque (4 testes)
```
[ ] T13.3.01  Consultar estoque por zona/locacao
[ ] T13.3.02  Ajuste manual registra movimento 'adjustment'
[ ] T13.3.03  Transferencia entre locacoes: transfer_out + transfer_in
[ ] T13.3.04  Historico movimentacoes filtravel por tipo
```

#### T13.4 — WMS Inventario (4 testes)
```
[ ] T13.4.01  Criar contagem gera numero CNT-YYYYMMDD-XXXX
[ ] T13.4.02  Registrar contagem: variancia calculada automaticamente
[ ] T13.4.03  Variancia > 5%: exige aprovacao supervisor
[ ] T13.4.04  Aprovar contagem: ajusta wms_stock.quantity
```

#### T13.5 — TMS Local (6 testes)
```
[ ] T13.5.01  Criar shipment a partir de picking concluido
[ ] T13.5.02  Criar rota: agrupa shipments, otimiza paradas
[ ] T13.5.03  Atribuir motorista: valida capacidade veiculo
[ ] T13.5.04  Registrar entrega com POD (foto + nome): status delivered
[ ] T13.5.05  Falha entrega: incrementa attempt_count (max 3)
[ ] T13.5.06  3a falha: shipment muda para returning
```

#### T13.6 — Sync (4 testes)
```
[ ] T13.6.01  Operacao WMS registra evento em sync_outbox
[ ] T13.6.02  SyncService processa outbox e marca sent = 1
[ ] T13.6.03  Operacao offline: sync_outbox acumula (sent = 0)
[ ] T13.6.04  Reconexao: SyncService processa backlog completo
```

---

### ETAPA 14: TMS + Rules + Sync
**Total: 14 testes**

#### T14.1 — TmsService (4 testes)
```
[ ] T14.1.01  createRoute — otimiza nearest neighbor, respeita max 30 paradas
[ ] T14.1.02  assignDriver — peso rota > capacidade veiculo: lanca excecao
[ ] T14.1.03  completeRoute — libera motorista (is_available=1) + veiculo (available)
[ ] T14.1.04  updateDriverLocation — atualiza lat/lng do motorista
```

#### T14.2 — CdSyncService (4 testes)
```
[ ] T14.2.01  syncCatalogToCd — envia produtos com estoque para CD
[ ] T14.2.02  syncStockFromCd — atualiza stock_consolidated no central
[ ] T14.2.03  reconcileStock — detecta divergencias e registra em cd_stock_snapshot
[ ] T14.2.04  routeToWarehouse — retorna CD com estoque + melhor score (prioridade + distancia)
```

#### T14.3 — RulesEngineService (6 testes)
```
[ ] T14.3.01  evaluate — retorna primeira regra que casar (por prioridade)
[ ] T14.3.02  evaluate — nenhuma regra casa: retorna null
[ ] T14.3.03  evaluateAll — retorna todas que casam
[ ] T14.3.04  Operador 'between': order.total entre 100 e 500
[ ] T14.3.05  Operador 'in': shipping.state in ['SP','RJ','MG']
[ ] T14.3.06  Regra expirada (valid_to < now) nao e avaliada
```

---

## 6. TESTES E2E — FLUXOS COMPLETOS

### E2E-01: Jornada Completa do Comprador
```
[ ] E2E-01.01  Navegar catalogo -> filtrar por categoria -> ordenar por preco
[ ] E2E-01.02  Abrir produto -> selecionar variante -> calcular frete
[ ] E2E-01.03  Adicionar ao carrinho -> ver mini-cart
[ ] E2E-01.04  Aplicar cupom -> verificar desconto
[ ] E2E-01.05  Checkout wizard: endereco -> frete -> PIX -> revisao -> confirmar
[ ] E2E-01.06  Receber QR Code PIX -> pagar -> pedido confirmado
[ ] E2E-01.07  Acompanhar pedido -> ver tracking -> receber entrega
[ ] E2E-01.08  Solicitar devolucao dentro de 7 dias -> receber estorno
```

### E2E-02: Jornada Completa do Seller
```
[ ] E2E-02.01  Registrar como seller -> aguardar aprovacao
[ ] E2E-02.02  Admin aprova seller
[ ] E2E-02.03  Cadastrar produto com variantes e imagens -> publicar
[ ] E2E-02.04  Admin aprova produto
[ ] E2E-02.05  Receber pedido -> aceitar -> despachar com tracking
[ ] E2E-02.06  Acompanhar financeiro -> ver comissao descontada
[ ] E2E-02.07  Receber repasse apos D+14
[ ] E2E-02.08  Responder avaliacao de comprador
```

### E2E-03: Jornada Completa do Operador CD
```
[ ] E2E-03.01  Pedido chega no CD -> aparece no dashboard
[ ] E2E-03.02  Receber mercadoria -> conferir com barcode -> dar entrada estoque
[ ] E2E-03.03  Picking guiado: seguir rota -> scanear item -> confirmar quantidade
[ ] E2E-03.04  Expedir: criar shipment -> gerar etiqueta
[ ] E2E-03.05  Inventario: criar contagem -> contar -> aprovar ajuste
```

### E2E-04: Jornada do Admin ERP
```
[ ] E2E-04.01  Dashboard com KPIs atualizados
[ ] E2E-04.02  Aprovar seller -> aprovar produto
[ ] E2E-04.03  Aprovar e executar repasse
[ ] E2E-04.04  Gerar DRE mensal -> conferir margem
[ ] E2E-04.05  Resolver disputa a favor do comprador -> estorno automatico
[ ] E2E-04.06  Configurar regra de frete gratis acima de R$199
```

---

## 7. RESUMO QUANTITATIVO

| Fase | Etapa | Testes |
|------|-------|--------|
| **1 MVP** | 1 - Banco de Dados | 25 |
| | 2 - Engine MVC | 32 |
| | 3 - Views & Layout | 18 |
| | 4 - Vue.js | 16 |
| | 5 - Services | 68 |
| | 6 - Checkout | 14 |
| **2 Sellers** | 7 - Seller Center | 22 |
| | 8 - Admin | 16 |
| | 9 - Workers | 20 |
| **3 API+ERP** | 10 - API REST | 42 |
| | 11 - Fiscal | 8 |
| | 12 - ERP Adianti | 30 |
| **4 CD+TMS** | 13 - CD-01 | 28 |
| | 14 - TMS+Rules | 14 |
| **E2E** | Fluxos completos | 26 |
| **TOTAL** | | **379 testes** |
