Skip to content

BDD Specifications

Sport Tech Club - Especificações Behavior-Driven Development

Visão Geral

Este documento contém as especificações BDD (Gherkin) para as funcionalidades principais do Sport Tech Club, servindo como documentação executável e base para testes automatizados.


1. Autenticação

Feature: Login de Usuário

gherkin
Feature: Login de Usuário
  Como um usuário registrado
  Eu quero fazer login na plataforma
  Para acessar minhas reservas e funcionalidades

  Background:
    Given o sistema está disponível
    And existe um usuário com email "jogador@email.com" e senha "Senha@123"

  @smoke @auth
  Scenario: Login com credenciais válidas
    Given eu estou na página de login
    When eu preencho o campo email com "jogador@email.com"
    And eu preencho o campo senha com "Senha@123"
    And eu clico no botão "Entrar"
    Then eu devo ser redirecionado para a página inicial
    And eu devo ver uma mensagem "Bem-vindo de volta!"
    And meu nome deve aparecer no menu de perfil

  @auth
  Scenario: Login com email inválido
    Given eu estou na página de login
    When eu preencho o campo email com "email-invalido"
    And eu preencho o campo senha com "Senha@123"
    And eu clico no botão "Entrar"
    Then eu devo ver a mensagem de erro "E-mail inválido"
    And eu devo permanecer na página de login

  @auth
  Scenario: Login com senha incorreta
    Given eu estou na página de login
    When eu preencho o campo email com "jogador@email.com"
    And eu preencho o campo senha com "SenhaErrada"
    And eu clico no botão "Entrar"
    Then eu devo ver a mensagem de erro "E-mail ou senha incorretos"
    And eu devo permanecer na página de login

  @auth @security
  Scenario: Bloqueio após tentativas falhas
    Given eu estou na página de login
    When eu tento fazer login 5 vezes com senha incorreta
    Then eu devo ver a mensagem "Conta bloqueada temporariamente"
    And eu devo aguardar 30 minutos para tentar novamente

  @auth
  Scenario: Login com MFA habilitado
    Given eu sou um usuário com MFA habilitado
    And eu estou na página de login
    When eu preencho minhas credenciais corretamente
    And eu clico no botão "Entrar"
    Then eu devo ser redirecionado para a página de verificação MFA
    When eu insiro o código do meu autenticador
    Then eu devo ser redirecionado para a página inicial

Feature: Recuperação de Senha

gherkin
Feature: Recuperação de Senha
  Como um usuário que esqueceu a senha
  Eu quero poder redefinir minha senha
  Para recuperar o acesso à minha conta

  @auth
  Scenario: Solicitar redefinição de senha
    Given eu estou na página de login
    When eu clico em "Esqueci minha senha"
    And eu preencho o campo email com "jogador@email.com"
    And eu clico no botão "Enviar link"
    Then eu devo ver a mensagem "Link enviado para seu e-mail"
    And um email de redefinição deve ser enviado

  @auth
  Scenario: Redefinir senha com link válido
    Given eu recebi um link de redefinição de senha
    When eu acesso o link dentro do prazo de validade
    And eu preencho a nova senha "NovaSenha@456"
    And eu confirmo a nova senha "NovaSenha@456"
    And eu clico no botão "Redefinir senha"
    Then eu devo ver a mensagem "Senha alterada com sucesso"
    And eu devo conseguir fazer login com a nova senha

2. Busca e Descoberta

Feature: Buscar Arenas

gherkin
Feature: Buscar Arenas
  Como um jogador
  Eu quero buscar arenas de esportes de praia
  Para encontrar um local para jogar

  Background:
    Given eu estou logado como jogador
    And existem arenas cadastradas no sistema

  @search @smoke
  Scenario: Buscar arena por nome
    Given eu estou na página de busca
    When eu digito "Arena Beach" no campo de busca
    And eu clico no botão de buscar
    Then eu devo ver uma lista de arenas que contém "Beach" no nome
    And cada resultado deve mostrar nome, endereço e avaliação

  @search
  Scenario: Filtrar arenas por esporte
    Given eu estou na página de busca
    When eu seleciono o filtro "Beach Tennis"
    Then eu devo ver apenas arenas que oferecem Beach Tennis
    And o filtro "Beach Tennis" deve estar marcado

  @search
  Scenario: Filtrar arenas por localização
    Given eu estou na página de busca
    And minha localização é "São Paulo, SP"
    When eu seleciono "Próximo a mim" com raio de 10km
    Then eu devo ver arenas dentro de 10km da minha localização
    And as arenas devem estar ordenadas por distância

  @search
  Scenario Outline: Filtrar por características
    Given eu estou na página de busca
    When eu aplico o filtro "<filtro>"
    Then eu devo ver apenas arenas com a característica "<caracteristica>"

    Examples:
      | filtro          | caracteristica    |
      | Quadra coberta  | covered: true     |
      | Iluminação      | lighting: true    |
      | Estacionamento  | amenity: parking  |
      | Wi-Fi           | amenity: wifi     |

  @search
  Scenario: Busca sem resultados
    Given eu estou na página de busca
    When eu busco por "ArenaQueNaoExiste12345"
    Then eu devo ver a mensagem "Nenhuma arena encontrada"
    And eu devo ver sugestões de busca alternativa

Feature: Visualizar Arena

gherkin
Feature: Visualizar Detalhes da Arena
  Como um jogador
  Eu quero ver os detalhes de uma arena
  Para decidir se quero reservar

  @arena
  Scenario: Ver informações básicas da arena
    Given eu estou na página de detalhes da arena "Arena Beach Sports"
    Then eu devo ver o nome da arena
    And eu devo ver a avaliação média
    And eu devo ver o endereço completo
    And eu devo ver as fotos da arena
    And eu devo ver os horários de funcionamento
    And eu devo ver os esportes disponíveis

  @arena
  Scenario: Ver lista de quadras disponíveis
    Given eu estou na página de detalhes da arena "Arena Beach Sports"
    When eu rolo até a seção de quadras
    Then eu devo ver todas as quadras da arena
    And cada quadra deve mostrar o esporte, preço e status
    And eu devo ver um botão "Reservar" para quadras disponíveis

  @arena
  Scenario: Ver avaliações da arena
    Given eu estou na página de detalhes da arena "Arena Beach Sports"
    When eu clico na aba "Avaliações"
    Then eu devo ver a média de avaliações
    And eu devo ver avaliações de outros jogadores
    And cada avaliação deve mostrar nota, comentário e data

3. Reservas

Feature: Criar Reserva

gherkin
Feature: Criar Reserva
  Como um jogador
  Eu quero reservar uma quadra
  Para jogar em um horário específico

  Background:
    Given eu estou logado como jogador
    And a arena "Arena Beach Sports" está ativa
    And a quadra "Quadra 1 - Beach Tennis" está disponível

  @booking @smoke
  Scenario: Criar reserva simples
    Given eu estou na página de reserva da quadra "Quadra 1 - Beach Tennis"
    When eu seleciono a data "2024-03-15"
    And eu seleciono o horário "18:00"
    And eu seleciono duração de 1 hora
    Then eu devo ver o resumo da reserva com preço R$ 120,00
    When eu clico no botão "Confirmar reserva"
    And eu seleciono o método de pagamento "PIX"
    And eu confirmo o pagamento
    Then eu devo ver a mensagem "Reserva confirmada!"
    And eu devo receber um e-mail de confirmação

  @booking
  Scenario: Verificar disponibilidade em tempo real
    Given eu estou na página de reserva da quadra "Quadra 1 - Beach Tennis"
    When eu seleciono a data "2024-03-15"
    Then eu devo ver os horários disponíveis em verde
    And eu devo ver os horários ocupados em vermelho
    And os horários ocupados não devem ser clicáveis

  @booking
  Scenario: Reserva com conflito de horário
    Given existe uma reserva para "Quadra 1" em "2024-03-15 18:00"
    When eu tento reservar "Quadra 1" em "2024-03-15 18:00"
    Then eu devo ver a mensagem "Horário não disponível"
    And eu devo ver sugestões de horários alternativos

  @booking
  Scenario: Reserva recorrente semanal
    Given eu estou na página de reserva da quadra "Quadra 1 - Beach Tennis"
    When eu seleciono a data "2024-03-15"
    And eu seleciono o horário "18:00"
    And eu ativo a opção "Reserva recorrente"
    And eu seleciono "Toda semana" por 4 semanas
    Then eu devo ver 4 reservas no resumo
    And o preço total deve ser R$ 480,00
    When eu confirmo a reserva
    Then 4 reservas devem ser criadas

  @booking
  Scenario: Adicionar participantes à reserva
    Given eu estou criando uma reserva
    When eu clico em "Adicionar participantes"
    And eu adiciono o participante "joao@email.com"
    And eu adiciono o participante "maria@email.com"
    And eu confirmo a reserva
    Then os participantes devem receber convites por e-mail
    And a reserva deve mostrar 3 participantes (incluindo eu)

Feature: Gerenciar Reservas

gherkin
Feature: Gerenciar Minhas Reservas
  Como um jogador
  Eu quero gerenciar minhas reservas
  Para acompanhar e modificar meus agendamentos

  Background:
    Given eu estou logado como jogador
    And eu tenho reservas ativas

  @booking
  Scenario: Ver minhas reservas
    Given eu estou na página "Minhas Reservas"
    Then eu devo ver a lista de reservas futuras
    And cada reserva deve mostrar data, hora, quadra e arena
    And eu devo ver o status de cada reserva

  @booking
  Scenario: Cancelar reserva com antecedência
    Given eu tenho uma reserva para daqui a 48 horas
    When eu clico em "Cancelar reserva"
    And eu confirmo o cancelamento
    Then a reserva deve ser cancelada
    And eu devo receber reembolso integral
    And eu devo receber um e-mail de confirmação

  @booking
  Scenario: Cancelar reserva em cima da hora
    Given eu tenho uma reserva para daqui a 2 horas
    When eu clico em "Cancelar reserva"
    Then eu devo ver o aviso "Cancelamento sem reembolso"
    When eu confirmo o cancelamento
    Then a reserva deve ser cancelada
    And eu não devo receber reembolso

  @booking @smoke
  Scenario: Fazer check-in
    Given eu tenho uma reserva para agora
    And eu estou próximo à arena
    When eu clico em "Fazer check-in"
    Then o check-in deve ser registrado
    And eu devo ver a mensagem "Check-in realizado!"
    And minha reserva deve mudar para status "Em andamento"

4. Fila de Espera e Jogos

Feature: Fila de Espera

gherkin
Feature: Fila de Espera para Quadra
  Como um jogador
  Eu quero entrar na fila de espera
  Para jogar quando houver vaga

  Background:
    Given eu estou logado como jogador
    And eu fiz check-in na arena "Arena Beach Sports"
    And a quadra "Quadra 1" está ocupada

  @queue
  Scenario: Entrar na fila de espera
    Given eu estou na página de status da quadra
    When eu clico em "Entrar na fila"
    Then eu devo ser adicionado à fila
    And eu devo ver minha posição na fila
    And eu devo ver o tempo estimado de espera

  @queue
  Scenario: Receber notificação quando chamado
    Given eu estou na fila de espera
    And eu sou o próximo da fila
    When o jogo atual termina
    Then eu devo receber uma notificação push
    And eu devo ter 2 minutos para responder
    When eu aceito a chamada
    Then eu devo ser movido para a quadra

  @queue
  Scenario: Perder a vez por timeout
    Given eu estou na fila de espera
    And eu sou chamado para jogar
    When eu não respondo em 2 minutos
    Then eu devo perder minha posição na fila
    And o próximo da fila deve ser chamado
    And eu devo ver a mensagem "Você perdeu sua vez"

  @queue
  Scenario: Sair da fila voluntariamente
    Given eu estou na fila de espera
    When eu clico em "Sair da fila"
    And eu confirmo a saída
    Then eu devo ser removido da fila
    And minha posição deve ser liberada

Feature: Winner Stays

gherkin
Feature: Sistema Winner Stays
  Como um jogador vencedor
  Eu quero permanecer na quadra
  Para continuar jogando contra novos desafiantes

  Background:
    Given a quadra "Quadra 1" usa o sistema "Winner Stays"
    And o limite de vitórias consecutivas é 3
    And há jogadores na fila de espera

  @winner-stays
  Scenario: Vencedor permanece na quadra
    Given eu estou jogando na quadra "Quadra 1"
    And eu venci a partida
    And esta foi minha 1ª vitória consecutiva
    Then eu devo permanecer na quadra
    And o time perdedor deve ir para o fim da fila
    And o próximo time da fila deve ser chamado

  @winner-stays
  Scenario: Limite de vitórias atingido
    Given eu estou jogando na quadra "Quadra 1"
    And eu já venci 3 partidas consecutivas
    When eu venço mais uma partida
    Then eu devo ir para o fim da fila
    And eu devo ver a mensagem "Limite de vitórias atingido"
    And os próximos dois times da fila devem jogar

  @winner-stays
  Scenario: Placar registrado automaticamente
    Given eu estou jogando na quadra "Quadra 1"
    When o jogo termina com placar 6x4
    Then o placar deve ser registrado automaticamente
    And as estatísticas dos jogadores devem ser atualizadas
    And o rating dos jogadores deve ser recalculado

5. Pagamentos

Feature: Processar Pagamento

gherkin
Feature: Processar Pagamento
  Como um jogador
  Eu quero pagar minha reserva
  Para confirmar meu agendamento

  Background:
    Given eu estou logado como jogador
    And eu tenho uma reserva pendente de pagamento

  @payment @smoke
  Scenario: Pagar com PIX
    Given eu estou na página de pagamento
    When eu seleciono o método "PIX"
    Then eu devo ver o QR Code do PIX
    And eu devo ver a chave PIX copiável
    And eu devo ver o prazo de validade de 30 minutos
    When o pagamento é confirmado pelo banco
    Then minha reserva deve ser confirmada
    And eu devo receber a confirmação por e-mail

  @payment
  Scenario: Pagar com cartão de crédito
    Given eu estou na página de pagamento
    When eu seleciono o método "Cartão de crédito"
    And eu preencho os dados do cartão válido
    And eu seleciono parcelamento em 2x
    And eu clico em "Pagar"
    Then o pagamento deve ser processado
    And minha reserva deve ser confirmada

  @payment
  Scenario: Falha no pagamento com cartão
    Given eu estou na página de pagamento
    When eu seleciono o método "Cartão de crédito"
    And eu preencho um cartão recusado
    And eu clico em "Pagar"
    Then eu devo ver a mensagem "Pagamento recusado"
    And eu devo poder tentar outro método de pagamento
    And minha reserva deve permanecer pendente

  @payment
  Scenario: Aplicar cupom de desconto
    Given eu estou na página de pagamento
    And existe um cupom "PROMO10" com 10% de desconto
    When eu insiro o código "PROMO10"
    And eu clico em "Aplicar"
    Then o desconto de 10% deve ser aplicado
    And eu devo ver o novo valor total

6. Gamificação

Feature: Sistema de XP e Níveis

gherkin
Feature: Sistema de XP e Níveis
  Como um jogador
  Eu quero ganhar XP ao jogar
  Para subir de nível e desbloquear conquistas

  Background:
    Given eu estou logado como jogador
    And meu nível atual é 5 com 450 XP

  @gamification
  Scenario: Ganhar XP ao completar partida
    Given eu joguei uma partida de Beach Tennis
    When a partida é finalizada
    Then eu devo ganhar XP baseado no tempo jogado
    And eu devo ver a animação de XP ganho
    And meu progresso para o próximo nível deve atualizar

  @gamification
  Scenario: Subir de nível
    Given eu preciso de 50 XP para subir de nível
    When eu ganho 60 XP em uma partida
    Then eu devo subir para o nível 6
    And eu devo ver a animação de level up
    And eu devo receber uma notificação de conquista
    And eu devo desbloquear recompensas do nível 6

  @gamification
  Scenario: Desbloquear conquista
    Given existe a conquista "Primeiro Jogo"
    And eu nunca joguei antes
    When eu completo minha primeira partida
    Then eu devo desbloquear a conquista "Primeiro Jogo"
    And eu devo ganhar o XP bônus da conquista
    And eu devo ver a notificação de conquista

  @gamification
  Scenario Outline: Conquistas de marco
    Given eu tenho <jogos_atuais> jogos completados
    When eu completo mais uma partida
    Then eu devo desbloquear a conquista "<conquista>"
    And eu devo ganhar <xp_bonus> XP de bônus

    Examples:
      | jogos_atuais | conquista         | xp_bonus |
      | 9            | 10 Jogos          | 100      |
      | 49           | 50 Jogos          | 500      |
      | 99           | Centenário        | 1000     |
      | 499          | Lenda da Arena    | 5000     |

  @gamification
  Scenario: Manter streak de atividade
    Given eu joguei ontem
    When eu jogo hoje
    Then meu streak deve aumentar para mais 1 dia
    And eu devo ganhar XP bônus de streak
    When eu não jogo por 2 dias
    Then meu streak deve ser resetado para 0

7. Notificações

Feature: Notificações Push

gherkin
Feature: Notificações Push
  Como um jogador
  Eu quero receber notificações
  Para não perder informações importantes

  Background:
    Given eu estou logado como jogador
    And eu habilitei notificações push

  @notifications
  Scenario: Lembrete de reserva
    Given eu tenho uma reserva para daqui a 2 horas
    When falta 1 hora para minha reserva
    Then eu devo receber uma notificação push
    And a notificação deve conter a hora e local
    And a notificação deve ter ação rápida para "Ver detalhes"

  @notifications
  Scenario: Notificação de chamada na fila
    Given eu estou na fila de espera
    When chega minha vez de jogar
    Then eu devo receber uma notificação push imediata
    And a notificação deve conter ações "Aceitar" e "Recusar"
    And eu devo ter 2 minutos para responder

  @notifications
  Scenario: Gerenciar preferências de notificação
    Given eu estou nas configurações de notificações
    When eu desabilito "Promoções e ofertas"
    And eu mantenho "Reservas" habilitado
    Then eu não devo receber notificações promocionais
    And eu devo continuar recebendo notificações de reserva

8. Administração (Arena Owner)

Feature: Gerenciar Arena

gherkin
Feature: Gerenciar Arena
  Como um dono de arena
  Eu quero gerenciar minha arena
  Para controlar reservas e configurações

  Background:
    Given eu estou logado como dono de arena
    And eu possuo a arena "Arena Beach Sports"

  @admin @arena
  Scenario: Adicionar nova quadra
    Given eu estou no painel de administração
    When eu clico em "Adicionar quadra"
    And eu preencho o nome "Quadra 3 - Beach Tennis"
    And eu seleciono o esporte "Beach Tennis"
    And eu defino o preço por hora como R$ 150,00
    And eu clico em "Salvar"
    Then a quadra deve ser criada
    And a quadra deve aparecer na lista de quadras
    And a quadra deve estar disponível para reservas

  @admin @arena
  Scenario: Bloquear horário para manutenção
    Given eu estou gerenciando a quadra "Quadra 1"
    When eu clico em "Bloquear horário"
    And eu seleciono o motivo "Manutenção"
    And eu seleciono a data "2024-03-20"
    And eu seleciono horários de 08:00 a 12:00
    And eu confirmo o bloqueio
    Then os horários devem ser bloqueados
    And reservas existentes devem ser notificadas
    And o período deve aparecer como "Manutenção" no calendário

  @admin @arena
  Scenario: Ver relatório de ocupação
    Given eu estou no painel de administração
    When eu acesso "Relatórios" > "Ocupação"
    And eu seleciono o período "Março 2024"
    Then eu devo ver a taxa de ocupação por quadra
    And eu devo ver os horários mais populares
    And eu devo ver a receita do período
    And eu devo poder exportar o relatório em PDF

9. Step Definitions (Exemplo)

typescript
// features/step_definitions/booking.steps.ts
import { Given, When, Then } from '@cucumber/cucumber';
import { expect } from '@playwright/test';

Given('eu estou logado como jogador', async function() {
  await this.page.goto('/login');
  await this.page.fill('[data-testid="email"]', 'jogador@email.com');
  await this.page.fill('[data-testid="password"]', 'Senha@123');
  await this.page.click('[data-testid="login-button"]');
  await this.page.waitForURL('/');
});

Given('a quadra {string} está disponível', async function(courtName: string) {
  const court = await this.api.getCourt({ name: courtName });
  expect(court.status).toBe('ACTIVE');
});

When('eu seleciono a data {string}', async function(date: string) {
  await this.page.click(`[data-date="${date}"]`);
});

When('eu seleciono o horário {string}', async function(time: string) {
  await this.page.click(`[data-time="${time}"]`);
});

Then('eu devo ver a mensagem {string}', async function(message: string) {
  const toast = this.page.locator('[data-testid="toast"]');
  await expect(toast).toContainText(message);
});

Then('eu devo receber um e-mail de confirmação', async function() {
  const emails = await this.mailtrap.getEmails(this.user.email);
  const confirmationEmail = emails.find(e =>
    e.subject.includes('Reserva confirmada')
  );
  expect(confirmationEmail).toBeDefined();
});

10. Cobertura de Cenários

Resumo por Feature

FeatureCenáriosAutomatizadosCobertura
Autenticação88100%
Busca77100%
Reservas121083%
Fila/Winner Stays8675%
Pagamentos66100%
Gamificação8562%
Notificações4375%
Administração6467%
Total594983%

Tags de Execução

bash
# Rodar apenas smoke tests
npm run test:e2e -- --tags @smoke

# Rodar testes de reserva
npm run test:e2e -- --tags @booking

# Rodar testes exceto os lentos
npm run test:e2e -- --tags "not @slow"

# Rodar testes de segurança
npm run test:e2e -- --tags @security

Este documento é atualizado continuamente conforme novas features são desenvolvidas.