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 inicialFeature: 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 senha2. 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 alternativaFeature: 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 data3. 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 liberadaFeature: 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 recalculado5. 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 total6. 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 07. 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 reserva8. 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 PDF9. 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
| Feature | Cenários | Automatizados | Cobertura |
|---|---|---|---|
| Autenticação | 8 | 8 | 100% |
| Busca | 7 | 7 | 100% |
| Reservas | 12 | 10 | 83% |
| Fila/Winner Stays | 8 | 6 | 75% |
| Pagamentos | 6 | 6 | 100% |
| Gamificação | 8 | 5 | 62% |
| Notificações | 4 | 3 | 75% |
| Administração | 6 | 4 | 67% |
| Total | 59 | 49 | 83% |
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 @securityEste documento é atualizado continuamente conforme novas features são desenvolvidas.