# BCards Integration Tests Este projeto contém testes integrados para o sistema BCards, validando workflows completos desde a criação de páginas até o sistema de moderação. ## Estrutura dos Testes ### Fixtures - **BCardsWebApplicationFactory**: Factory personalizada que configura ambiente de teste com MongoDB container - **MongoDbTestFixture**: Helper para criar e gerenciar dados de teste no MongoDB - **StripeTestFixture**: Mock para integração Stripe (futuro) ### Helpers - **AuthenticationHelper**: Mock para autenticação OAuth (Google/Microsoft) - **PuppeteerTestHelper**: Automação de browser para testes E2E - **TestDataBuilder**: Builders para criar objetos de teste (futuro) ### Tests - **PageCreationTests**: Validação de criação de páginas e limites por plano - **PreviewTokenTests**: Sistema de preview tokens para páginas não-ativas - **ModerationWorkflowTests**: Workflow completo de moderação - **PlanLimitationTests**: Validação de limitações por plano (futuro) - **StripeIntegrationTests**: Testes de upgrade via Stripe (futuro) ## Cenários Testados ### Sistema de Páginas 1. **Criação de páginas** respeitando limites dos planos (Trial: 1, Basic: 3, etc.) 2. **Status de páginas**: Creating → PendingModeration → Active/Rejected 3. **Preview tokens**: Acesso a páginas em desenvolvimento (4h de validade) 4. **Validação de limites**: Links normais vs produto por plano ### Workflow de Moderação 1. **Submissão para moderação**: Creating → PendingModeration 2. **Aprovação**: PendingModeration → Active (page vira pública) 3. **Rejeição**: PendingModeration → Inactive/Rejected 4. **Preview system**: Acesso via token para pages não-Active ### Plan Limitations (Basic vs Professional) - **Basic**: 5 links máximo - **Professional**: 15 links máximo - **Trial**: 1 página, 3 links + 1 produto ## Tecnologias Utilizadas - **xUnit**: Framework de testes - **FluentAssertions**: Assertions expressivas - **WebApplicationFactory**: Testes integrados ASP.NET Core - **Testcontainers**: MongoDB container para isolamento - **PuppeteerSharp**: Automação de browser (Chrome) - **MongoDB.Driver**: Acesso direto ao banco para validações ## Configuração ### Pré-requisitos - .NET 8 SDK - Docker (para MongoDB container) - Chrome/Chromium (baixado automaticamente pelo PuppeteerSharp) ### Executar Testes ```bash # Todos os testes dotnet test src/BCards.IntegrationTests/ # Testes específicos dotnet test src/BCards.IntegrationTests/ --filter "PageCreationTests" dotnet test src/BCards.IntegrationTests/ --filter "PreviewTokenTests" ``` ### Configuração Manual (MongoDB local) Se preferir usar MongoDB local em vez do container: ```json // appsettings.Testing.json { "MongoDb": { "ConnectionString": "mongodb://localhost:27017", "DatabaseName": "BCardsDB_Test" } } ``` ## Estrutura de Dados de Teste ### User - **Trial**: 1 página máx, links limitados - **Basic**: 3 páginas, 5 links por página - **Professional**: 5 páginas, 15 links por página ### UserPage - **Status**: Creating, PendingModeration, Active, Rejected - **Preview Tokens**: 4h de validade para access não-Active - **Links**: Normal vs Product (limites diferentes por plano) ### Categories - **tecnologia**: Empresas de tech - **negocios**: Empresas e empreendedores - **pessoal**: Freelancers e páginas pessoais - **saude**: Profissionais da área da saúde ## Padrões de Teste ### Arrange-Act-Assert Todos os testes seguem o padrão AAA: ```csharp // Arrange var user = await _dbFixture.CreateTestUserAsync(PlanType.Basic); var page = await _dbFixture.CreateTestUserPageAsync(user.Id, PageStatus.Creating); // Act var response = await client.PostAsync($"/Admin/SubmitForModeration/{page.Id}", null); // Assert response.IsSuccessStatusCode.Should().BeTrue(); ``` ### Cleanup Automático - Cada teste usa database isolada (GUID no nome) - Container MongoDB é destruído após os testes - Sem interferência entre testes ### Mocks - **EmailService**: Mockado para evitar envios reais - **StripeService**: Mockado para evitar cobrança real - **OAuth**: Mockado para evitar dependência externa ## Debug e Troubleshooting ### PuppeteerSharp Para debug visual dos testes de browser: ```csharp _browser = await Puppeteer.LaunchAsync(new LaunchOptions { Headless = false, // Mostra o browser SlowMo = 100 // Delay entre ações }); ``` ### MongoDB Para inspecionar dados durante testes, conecte no container: ```bash docker exec -it mongosh BCardsDB_Test ``` ### Logs Logs são configurados para mostrar apenas warnings/errors durante testes. Para debug detalhado, altere em `BCardsWebApplicationFactory`: ```csharp logging.SetMinimumLevel(LogLevel.Information); ``` ## Próximos Passos 1. **PlanLimitationTests**: Validar todas as limitações por plano 2. **StripeIntegrationTests**: Testar upgrades via webhook 3. **PerformanceTests**: Testar carga no sistema de moderação 4. **E2E Tests**: Testes completos com PuppeteerSharp 5. **TrialExpirationTests**: Validar exclusão automática após 7 dias