Focaliza

Relatório de testes (somente leitura)

Executado em 2026-10-01T15:00:27.294Z (UTC) — 18/19 aprovados. Os testes rodam fora do site, com contas de teste separadas.

Aprovado — Cálculos com valores conhecidos (arredondamento, mudança de custo) (real)
  • OK preço 35000 custo 10000 sinal 3000bps → 10500/24500/25000/7143 (esperado 10500/24500/25000/7143)
  • OK preço 33333 custo 0 sinal 3000bps → 10000/23333/33333/10000 (esperado 10000/23333/33333/10000)
  • OK preço 10001 custo 5000 sinal 3333bps → 3333/6668/5001/5000 (esperado 3333/6668/5001/5000)
  • OK preço 33335 custo 0 sinal 1000bps → 3334/30001/33335/10000 (esperado 3334/30001/33335/10000)
  • OK preço 80000 custo 30000 sinal 5000bps → 40000/40000/50000/6250 (esperado 40000/40000/50000/6250)
  • OK preço 80000 custo 32000 sinal 5000bps → 40000/40000/48000/6000 (esperado 40000/40000/48000/6000)
  • OK preço 1000 custo 1500 sinal 0bps → 0/1000/-500/-5000 (esperado 0/1000/-500/-5000)
  • preço 0 rejeitado: price must be > 0
Aprovado — Solicitações simultâneas para horários sobrepostos (real)
  • A 10:00 / B 10:30 em paralelo: vencedor = A (não determinístico; o teste não presume qual)
  • Perdedora: slot unavailable
  • Reservas ativas após a disputa: 1
  • Rajada de 6 idênticas: 1 aceita, 5 recusadas com "slot unavailable": true
Aprovado — Duração + intervalo (buffer 30 min) + expediente (real)
  • Base 10:00–11:00: aceita
  • 11:15 (dentro do buffer): slot unavailable
  • 11:30 (fim do buffer): aceita
  • 20:00: outside availability
  • Domingo: outside availability
Aprovado — Capacidade semanal de sessões (real)
  • 1ª da semana: aceita
  • 2ª na mesma semana: weekly session capacity reached
  • Semana seguinte (controle positivo): aceita
Aprovado — Capacidade semanal de pós-produção (real)
  • 1ª (120/300 min): aceita
  • 2ª (240/300): aceita
  • 3ª (360/300): weekly post-production capacity reached
  • Semana seguinte (controle positivo): aceita
Aprovado — Bloqueio temporário expirado (real+tempo-simulado)
  • Prazo definido pelo servidor: 30 min
  • Mesmo horário com bloqueio válido: slot unavailable
  • Após vencer (prazo recuado 1 min via service role — tempo simulado): aceita; antiga = expired
  • Recebíveis da reserva expirada: cancelled, cancelled
  • Recebíveis contados como contratados (held/confirmed, abertos): 8 linhas — expirada fora
  • Bloqueio vencido COM checkout em andamento: nova tentativa → slot unavailable; status permanece held (reconciliação no lote de pagamentos)
Aprovado — Snapshot completo imutável e sem UPDATE direto (real)
  • Pacote alterado (preço/nome/entregáveis); reserva mantém nome, preço, %, pós, horários, entregáveis: true
  • Fotógrafo tenta UPDATE direto (snapshot, status, pagamento, horário): 42501, 42501, 42501, 42501
  • Mesmo com service role, gatilho bloqueia nome/%/pós/intervalo: true
  • Transição expirada → confirmada: invalid booking status transition expired -> confirmed
Aprovado — Acesso cruzado entre dois fotógrafos autenticados (real)
  • OK bookings: A lê de B = 0; controle B lê o próprio = 2
  • OK services: A lê de B = 0; controle B lê o próprio = 1
  • OK availability_rules: A lê de B = 0; controle B lê o próprio = 5
  • OK receivables: A lê de B = 0; controle B lê o próprio = 4
  • OK photographers: A lê de B = 0; controle B lê o próprio = 1
  • OK payments: A lê de B = 0; controle B lê o próprio = 0 (sem pagamentos ainda)
  • A cancela reserva de B via função: booking not found or not cancellable; status continua held
  • A altera pacote de B: 0 linhas; preço no banco 180000
  • A cria pacote em nome de B: bloqueado
  • Endpoint HTTP real /api/my-booking como A p/ reserva de B: 404; como B (dono, controle positivo): 200
Aprovado — Acesso anônimo bloqueado sem efeitos colaterais (real)
  • OK bookings: anônimo 0 linhas; controle service role vê 19
  • OK services: anônimo 0 linhas; controle service role vê 11
  • OK availability_rules: anônimo 0 linhas; controle service role vê 30
  • OK receivables: anônimo 0 linhas; controle service role vê 38
  • OK payments: anônimo 0 linhas; controle service role vê 2
  • OK photographers: anônimo 0 linhas; controle service role vê 6
  • OK ai_usage: anônimo 0 linhas; controle service role vê 13
  • POST /api/transcribe sem login: 401; com token falso: 401
  • RPC consume_ai_quota / cancel_my_booking / expire_stale_holds anônimo: bloqueado / bloqueado / bloqueado
  • GET /api/my-booking sem login: 401
  • Antigo reset runStage1Tests: removido do código = true; chamada HTTP → 403
  • Efeitos colaterais: uso de IA 13→13, reservas 19→19
Aprovado — Validação de WAV e limite por usuário (real)
  • Unitário (validador puro): 5s ok, 61s recusado, não-WAV recusado, 0,1s recusado → true, true, true, true
  • Endpoint real, autenticado, 61 s: 400 áudio maior que o permitido (60 s)
  • Endpoint real, bytes que não são WAV: 400 formato inválido (esperado WAV)
  • Usuário C com 10 usos na última hora: 429 Limite de transcrições atingido (10/hora, 30/dia). Continue digitando.; uso não incrementou (10)
Falhou — Transcrição real com fala conhecida (sintetizada localmente) (real)
  • Áudio sintético não disponível neste ambiente — teste não executado
Aprovado — Checkout de sinal real (sessão criada e alinhada ao bloqueio) (real)
  • sessão criada; expira em 1790868612 (hold em 1790868612)
  • Dono registra checkout via RPC autenticado: OK
  • Segundo checkout com bloqueio ativo: checkout already active
  • Outro fotógrafo registra checkout na reserva alheia: booking not found
  • Componente embutido na interface: validação interativa no painel (cartão de teste 4242…)
Aprovado — Webhook confirma o pagamento do sinal (reserva confirmada, saldo pendente) (real)
  • POST real no endpoint do webhook com assinatura válida: 200 → confirmed
  • Reserva: confirmed / pagamento: deposit_paid
  • Sinal: paid com data de pagamento; Saldo: open com vencimento na data da sessão
  • Pagamento registrado uma vez: 1 linha(s), status confirmed
Aprovado — Idempotência: webhook duplicado não duplica registros nem saldos (real)
  • Mesmo evento reenviado: HTTP 200, resultado duplicate
  • Linhas de pagamento com o mesmo identificador: 1
  • Recebíveis permanecem: deposit=paid, balance=open
Aprovado — Pagamento após expiração vira exceção e não toma o horário (real)
  • Reserva expirada, pagamento chega depois: HTTP 200 → flagged_review (registrado como exceção, não confirmação)
  • Status da reserva permanece: expired; recebíveis expirados permanecem: cancelled, cancelled
  • Horário ficou livre: nova reserva no mesmo horário aceita
  • Pagamento em exceção no painel: 1 linha(s) com status flagged_review
Aprovado — Assinatura forjada e valor divergente rejeitados (real)
  • Evento com assinatura inválida: HTTP 400 (rejeitado, nada registrado)
  • Evento assinado com valor divergente (sinal + R$ 9,99): 200 → flagged_review; reserva continua held/unpaid
  • Pagamento divergente registrado como exceção: 1 linha(s), status flagged_review
  • Parâmetro de ambiente inválido: ignorado com HTTP 200
Aprovado — Agente: acesso anônimo bloqueado sem gravar nada (real)
  • POST /api/agent sem token: HTTP 401 (esperado 401)
  • Mensagens do fixture A antes/depois da tentativa anônima: 12 → 12 (nada gravado)
Aprovado — Agente: conversa real com resposta e histórico no banco (real)
  • POST /api/agent autenticado: HTTP 200, fluxo com 14986 bytes, texto transmitido: true
  • Mensagens persistidas: 14 (user,assistant,user,assistant,user,assistant,user,assistant,user,assistant,user,assistant,user,assistant)
  • Trecho do assistente: Vamos começar pelo tipo de retrato que você quer oferecer; isso orienta os entregáveis, o tempo de trabalho e o preço do
Aprovado — Agente: conversa de um fotógrafo invisível para outro (real)
  • Fixture A lê a própria conversa: 14 mensagem(s) (controle positivo)
  • Fixture B lendo a conversa de A: 0 linha(s)