Projeto Laravel desenvolvido para o workshop de testes do Beer and Code. Uma aplicação de e-commerce simples com CRUD de produtos e fluxo completo de checkout integrado com Stripe.
Este projeto demonstra práticas modernas de teste em Laravel, incluindo:
- Testes de Feature: Controllers, rotas, autenticação e autorização
- Testes de Unidade: Services, policies e lógica de negócio
- Testes de Integração: Fluxos completos com banco de dados
- Browser Testing: Testes E2E com Pest v4
- Mocking: APIs externas (Stripe, ViaCEP)
- Cobertura de Código: XDebug/PCOV para análise de cobertura
- CRUD de Produtos: Gerenciamento completo de produtos (apenas para admins)
- Fluxo de Checkout: Carrinho, endereço de entrega e pagamento com Stripe
- Sistema de Pedidos: Criação e rastreamento de pedidos
- Autenticação: Login, registro e recuperação de senha (Laravel Breeze)
- Autorização: Policies para controle de acesso (apenas admins podem gerenciar produtos)
- Integração Stripe: Pagamentos via Laravel Cashier v16
- Webhooks: Processamento de eventos de pagamento do Stripe
- Jobs Assíncronos: E-mails de confirmação de pedido
- Consulta CEP: Integração com API ViaCEP
- PHP: 8.4.15
- Laravel: 12.x
- Database: PostgreSQL
- Testing: Pest 4 + PHPUnit 12
- Payment: Laravel Cashier (Stripe) v16
- Frontend: Tailwind CSS v3 + Alpine.js v3
- Environment: Laravel Sail (Docker)
- Docker + Docker Compose (via Laravel Sail)
- Conta Stripe (para testes de pagamento)
IMPORTANTE: Para gerar relatórios de cobertura de código, você precisa ter XDebug 3.0+ ou PCOV instalado.
O Laravel Sail já inclui o XDebug, mas você precisa habilitá-lo:
- Publique o arquivo Docker do Sail (se ainda não fez):
vendor/bin/sail artisan sail:publish- Adicione a variável de ambiente no
.env:
SAIL_XDEBUG_MODE=coverage- Reconstrua os containers:
vendor/bin/sail build --no-cache
vendor/bin/sail up -dPCOV é mais rápido que XDebug para cobertura de código. Para usá-lo com Sail:
- Acesse o container:
vendor/bin/sail shell- Instale o PCOV:
pecl install pcov
docker-php-ext-enable pcov- Reinicie o container
git clone <repository-url>
cd workshop-testsSe você NÃO tem PHP instalado localmente (recomendado para usuários Docker):
docker run --rm \
-u "$(id -u):$(id -g)" \
-v "$(pwd):/var/www/html" \
-w /var/www/html \
laravelsail/php84-composer:latest \
composer install --ignore-platform-reqsSe você JÁ tem PHP 8.4 instalado localmente:
composer installcp .env.example .envEdite o arquivo .env e configure:
APP_NAME="Workshop Tests"
APP_URL=http://localhost
# Database (PostgreSQL via Sail)
DB_CONNECTION=pgsql
DB_HOST=pgsql
DB_PORT=5432
DB_DATABASE=workshop_tests
DB_USERNAME=sail
DB_PASSWORD=password
# Stripe (obtenha em https://dashboard.stripe.com/test/apikeys)
STRIPE_KEY=pk_test_your_key
STRIPE_SECRET=sk_test_your_secret
STRIPE_WEBHOOK_SECRET=whsec_your_webhook_secret
# XDebug para cobertura (opcional)
SAIL_XDEBUG_MODE=coveragevendor/bin/sail artisan key:generatevendor/bin/sail up -dvendor/bin/sail artisan migratevendor/bin/sail artisan db:seedvendor/bin/sail npm install
vendor/bin/sail npm run buildvendor/bin/sail up -dAcesse: http://localhost
vendor/bin/sail openvendor/bin/sail stopvendor/bin/sail artisan testvendor/bin/sail artisan test tests/Feature/ProductsTest.phpvendor/bin/sail artisan test --filter=test_admin_can_create_productvendor/bin/sail artisan test --parallelCom XDebug ou PCOV habilitado:
vendor/bin/sail artisan test --coverage --coverage-html=coverageO relatório será gerado em coverage/index.html.
vendor/bin/sail artisan test --coveragevendor/bin/sail artisan test --coverage --min=80Este comando falhará se a cobertura for menor que 80%.
workshop-tests/
├── app/
│ ├── Http/
│ │ ├── Controllers/
│ │ │ ├── CheckoutController.php # Fluxo de checkout
│ │ │ ├── ProductsController.php # CRUD de produtos
│ │ │ └── CepController.php # Consulta CEP
│ │ └── Requests/
│ │ ├── CheckoutPaymentRequest.php # Validação de pagamento
│ │ └── StoreProductRequest.php # Validação de produto
│ ├── Models/
│ │ ├── User.php # Usuário (com Billable)
│ │ ├── Product.php # Produto
│ │ ├── Order.php # Pedido
│ │ └── OrderItem.php # Item do pedido
│ ├── Policies/
│ │ └── ProductPolicy.php # Autorização de produtos
│ ├── Services/
│ │ ├── CheckoutService.php # Lógica de checkout
│ │ └── CepService.php # Integração ViaCEP
│ ├── Jobs/
│ │ ├── SendOrderPendingEmail.php
│ │ ├── SendOrderPaidEmail.php
│ │ └── SendOrderFailedEmail.php
│ ├── Listeners/
│ │ └── HandleStripeWebhook.php # Processamento de webhooks
│ └── OrderStatus.php # Enum de status do pedido
├── database/
│ ├── factories/
│ │ └── UserFactory.php
│ └── migrations/
├── routes/
│ ├── web.php # Rotas da aplicação
│ └── console.php
├── tests/
│ ├── Feature/ # Testes de integração
│ ├── Unit/ # Testes unitários
│ └── Pest.php # Configuração do Pest
└── resources/
└── views/
├── products/ # Views de produtos
├── checkout/ # Views de checkout
└── emails/ # Templates de e-mail
hasMany(Order)- Um usuário pode ter vários pedidosis_admin- Flag para identificar administradores- Usa trait
Billabledo Laravel Cashier
name(string) - Nome do produtoprice(integer) - Preço em centavos
belongsTo(User)- Pertence a um usuáriohasMany(OrderItem)- Tem vários itenstotal(integer) - Total em centavosstatus(enum) - pending, paid, failedpayment_id(string) - ID do pagamento no Stripe
belongsTo(Order)- Pertence a um pedidobelongsTo(Product)- Referência ao produtoquantity(integer) - Quantidadeprice(integer) - Preço no momento da compra (em centavos)
GET /products → Lista produtos
GET /products/create → Formulário de criação
POST /products → Cria produto
GET /products/{id}/edit → Formulário de edição
PUT /products/{id} → Atualiza produto
DEL /products/{id} → Remove produto
Autorização: Apenas usuários com is_admin = true podem criar/editar/deletar.
1. GET /checkout/{product} → Exibe formulário de checkout
2. POST /checkout/pay → Processa pagamento via Stripe
↓
CheckoutService::processPayment()
↓
Cria Order (status: pending)
↓
Cria OrderItem
↓
Dispara SendOrderPendingEmail
↓
3. Webhook do Stripe recebido
↓
HandleStripeWebhook listener
↓
Atualiza status do Order (paid/failed)
↓
Dispara SendOrderPaidEmail ou SendOrderFailedEmail
↓
4. Redireciona para:
- GET /checkout/success/{payment_id} (sucesso)
- GET /checkout/failed/{payment_id} (falha)
Durante o workshop, abordaremos:
-
Fundamentos de Testing
- Anatomia de um teste Pest
- Arrange, Act, Assert
- RefreshDatabase e DatabaseTransactions
-
Testes de Feature
- Testando rotas e controllers
- Autenticação em testes
- Assertions de resposta
-
Testes de Unidade
- Testando services isoladamente
- Mocking de dependências externas
- Testando policies
-
Factories e Seeders
- Criando factories para testes
- Usando states e sequences
- Relacionamentos em factories
-
Mocking
- Mockando Stripe API
- Mockando HTTP clients (ViaCEP)
- Fake de Jobs e Notifications
-
Cobertura de Código
- Configurando XDebug/PCOV
- Interpretando relatórios
- Definindo metas de cobertura
-
Browser Testing (Pest v4)
- Testes E2E do checkout
- Interagindo com Stripe Elements
- Screenshots e debugging
# Listar comandos disponíveis
vendor/bin/sail artisan list
# Limpar caches
vendor/bin/sail artisan cache:clear
vendor/bin/sail artisan config:clear
vendor/bin/sail artisan route:clear
# Verificar rotas
vendor/bin/sail artisan route:list
# Tinker (REPL)
vendor/bin/sail artisan tinker# Formatar código
vendor/bin/sail bin pint# Modo desenvolvimento (watch)
vendor/bin/sail npm run dev
# Build para produção
vendor/bin/sail npm run buildUse os cartões de teste do Stripe:
- Sucesso:
4242 4242 4242 4242 - Falha:
4000 0000 0000 0002 - Requer 3D Secure:
4000 0027 6000 3184 - CVC: qualquer 3 dígitos
- Data: qualquer data futura
- CEP: qualquer 5 dígitos
Mais cartões: https://docs.stripe.com/testing#cards
Para testar webhooks localmente, use o Stripe CLI:
# Instalar Stripe CLI
# https://stripe.com/docs/stripe-cli
# Fazer login
stripe login
# Encaminhar webhooks para o projeto
stripe listen --forward-to http://localhost/stripe/webhook
# Copie o webhook secret exibido e adicione no .env
STRIPE_WEBHOOK_SECRET=whsec_...Execute:
vendor/bin/sail npm run buildou mantenha rodando:
vendor/bin/sail npm run devVerifique as credenciais do banco no .env e certifique-se que os containers estão rodando:
vendor/bin/sail up -dXDebug não está instalado. Siga as instruções na seção "Para Cobertura de Testes".
Se tiver problemas com permissões:
sudo chown -R $USER:$USER .Este é um projeto educacional. Sinta-se à vontade para:
- Reportar bugs
- Sugerir melhorias
- Adicionar mais testes de exemplo
- Melhorar a documentação
Este projeto é open-source e está disponível sob a licença MIT.
- Laravel Documentation
- Pest Documentation
- Laravel Cashier Documentation
- Stripe Testing Guide
- Laravel Sail Documentation
Beer and Code - Workshop de Testes com Laravel