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)