Skip to content

Enhances CI workflow and tests#66

Merged
jldsilva merged 2 commits into
developmentfrom
Update-CI-Workflow
Dec 20, 2025
Merged

Enhances CI workflow and tests#66
jldsilva merged 2 commits into
developmentfrom
Update-CI-Workflow

Conversation

@jldsilva

@jldsilva jldsilva commented Dec 20, 2025

Copy link
Copy Markdown
Owner

Extends CI workflow to include the develop branch and upload test results.
Uses Bogus to generate realistic fake data for unit tests, improving test coverage and reducing reliance on hardcoded values,
thereby enhancing the reliability and maintainability of the tests.

Summary by CodeRabbit

  • Chores
    • Estendido pipeline de CI para acionar também a branch develop em pull request e push, com novo upload de artefatos dos resultados de testes.
    • Modernização da suíte de testes: adoção de geração dinâmica de dados (fakers) em múltiplos testes unitários para maior robustez.
    • Adicionada dependência de suporte para a infraestrutura de testes.

✏️ Tip: You can customize this high-level summary in your review settings.

Extends CI workflow to include the `develop` branch and upload test results.
Uses Bogus to generate realistic fake data for unit tests, improving test coverage and reducing reliance on hardcoded values,
thereby enhancing the reliability and maintainability of the tests.
@jldsilva jldsilva self-assigned this Dec 20, 2025
@jldsilva jldsilva added the .NET Pull requests that update .NET code label Dec 20, 2025
@coderabbitai

coderabbitai Bot commented Dec 20, 2025

Copy link
Copy Markdown

Walkthrough

Estende triggers da CI para incluir a branch develop e adiciona upload de artefato com resultados de teste; refatora vários testes unitários para usar Bogus/Faker gerando dados dinamicamente e adiciona a dependência Bogus ao projeto de testes ExternalServices.

Changes

Cohort / Arquivo(s) Sumário
Configuração de CI
.github/workflows/workflow-ci.yml
Inclui a branch develop nos gatilhos de pull_request e push; adiciona etapa final para fazer upload do artefato test-results coletando arquivos .trx em **/bin/Debug/net10.0/TestResults.
Dependência de Testes
InvoiceReminder.ExternalServices.UnitTests/InvoiceReminder.ExternalServices.UnitTests.csproj
Adiciona PackageReference para a biblioteca Bogus.
Testes Unitários (Faker/Bogus)
InvoiceReminder.API.UnitTests/Endpoints/LoginEndpointTests.cs, InvoiceReminder.API.UnitTests/Endpoints/ScanEmailDefinitionEndpointsTests.cs, InvoiceReminder.API.UnitTests/Endpoints/UserEndpointsTests.cs, InvoiceReminder.ExternalServices.UnitTests/BarcodeReader/BarcodeReaderServiceTests.cs, InvoiceReminder.ExternalServices.UnitTests/SendMessage/SendMessageServiceTests.cs
Substitui dados hard-coded por geradores Bogus/Faker: adiciona campos faker, configura RuleFor para modelos/entidades, inicializa fakers no setup e atualiza entradas/asserções dos testes para usar dados gerados, sem alterar a lógica de execução dos testes.

Estimated code review effort

🎯 3 (Moderado) | ⏱️ ~20 minutos

  • Pontos a revisar com atenção:
    • Validação das regras RuleFor do Faker para garantir dados válidos para todos os testes.
    • Garantir que casos de borda anteriores não foram perdidos ao substituir valores hard-coded.
    • Verificar o upload de artefato na CI (padrões de caminho e nome de arquivo .trx) e se é executado após testes concluídos.

Possibly related PRs

Suggested labels

dependencies

Poem

🐰 Pulinho e um pulo de alegria,
Dados falsos brotam na companhia,
Testes cantam sem ficar presos,
Artefatos sobem em nossos processos,
Um coelho celebra — Bogus em harmonia!

Pre-merge checks and finishing touches

❌ Failed checks (1 warning)
Check name Status Explanation Resolution
Docstring Coverage ⚠️ Warning Docstring coverage is 0.00% which is insufficient. The required threshold is 80.00%. You can run @coderabbitai generate docstrings to improve docstring coverage.
✅ Passed checks (2 passed)
Check name Status Explanation
Description Check ✅ Passed Check skipped - CodeRabbit’s high-level summary is enabled.
Title check ✅ Passed O título refere-se aos principais aspectos da mudança: melhorias no workflow CI e aprimoramentos nos testes com Bogus faker.
✨ Finishing touches
  • 📝 Generate docstrings
🧪 Generate unit tests (beta)
  • Create PR with unit tests
  • Post copyable unit tests in a comment
  • Commit unit tests in branch Update-CI-Workflow

Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out.

❤️ Share

Comment @coderabbitai help to get the list of available commands and usage tips.

@coderabbitai coderabbitai Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Actionable comments posted: 1

🧹 Nitpick comments (1)
InvoiceReminder.ExternalServices.UnitTests/BarcodeReader/BarcodeReaderServiceTests.cs (1)

68-91: Testes unitários com mocks implementados corretamente.

Os testes geram faturas esperadas via faker e configuram o mock do _barcodeHandler para retornar essas faturas (linhas 75, 101). A abordagem de passar expectedInvoice.Beneficiary como parâmetro (linhas 80, 106) garante consistência entre os dados de entrada e as asserções.

💡 Sugestão opcional: unificar comprimento do código de barras

Foi observado que o comprimento do código de barras gerado difere entre os arquivos de teste:

  • BarcodeReaderServiceTests.cs usa 44 caracteres (linha 46)
  • SendMessageServiceTests.cs usa 47 caracteres (linha 64 do outro arquivo)

Embora isso não afete os testes atuais (pois o handler é mockado), considere padronizar o comprimento para 47 caracteres, que parece mais próximo do formato real de códigos de barras brasileiros.

-.RuleFor(i => i.Barcode, faker => faker.Random.AlphaNumeric(44))
+.RuleFor(i => i.Barcode, faker => faker.Random.AlphaNumeric(47))

Also applies to: 94-117

📜 Review details

Configuration used: Organization UI

Review profile: CHILL

Plan: Pro

📥 Commits

Reviewing files that changed from the base of the PR and between 01e3730 and 02c2559.

📒 Files selected for processing (7)
  • .github/workflows/workflow-ci.yml (2 hunks)
  • InvoiceReminder.API.UnitTests/Endpoints/LoginEndpointTests.cs (6 hunks)
  • InvoiceReminder.API.UnitTests/Endpoints/ScanEmailDefinitionEndpointsTests.cs (17 hunks)
  • InvoiceReminder.API.UnitTests/Endpoints/UserEndpointsTests.cs (18 hunks)
  • InvoiceReminder.ExternalServices.UnitTests/BarcodeReader/BarcodeReaderServiceTests.cs (5 hunks)
  • InvoiceReminder.ExternalServices.UnitTests/InvoiceReminder.ExternalServices.UnitTests.csproj (1 hunks)
  • InvoiceReminder.ExternalServices.UnitTests/SendMessage/SendMessageServiceTests.cs (5 hunks)
🧰 Additional context used
🧬 Code graph analysis (4)
InvoiceReminder.ExternalServices.UnitTests/SendMessage/SendMessageServiceTests.cs (2)
InvoiceReminder.Domain/Entities/User.cs (2)
  • User (3-21)
  • User (14-20)
InvoiceReminder.Domain/Entities/EmailAuthToken.cs (1)
  • EmailAuthToken (3-12)
InvoiceReminder.API.UnitTests/Endpoints/LoginEndpointTests.cs (1)
InvoiceReminder.Authentication/Extensions/StringHashExtension.cs (1)
  • ToSHA256 (9-15)
InvoiceReminder.ExternalServices.UnitTests/BarcodeReader/BarcodeReaderServiceTests.cs (4)
InvoiceReminder.ExternalServices/BarcodeReader/BarcodeReaderService.cs (1)
  • Invoice (21-56)
InvoiceReminder.ExternalServices/BarcodeReader/AccountInvoiceBarcodeHandler.cs (1)
  • Invoice (8-22)
InvoiceReminder.ExternalServices/BarcodeReader/BankInvoiceBarcodeHandler.cs (1)
  • Invoice (25-41)
InvoiceReminder.Domain/Extensions/EntityExtensions.cs (1)
  • Guid (41-52)
InvoiceReminder.API.UnitTests/Endpoints/UserEndpointsTests.cs (2)
InvoiceReminder.Application.UnitTests/AppServices/UserAppServiceTests.cs (1)
  • Faker (29-43)
InvoiceReminder.Domain/Abstractions/Result.cs (4)
  • Result (3-25)
  • Result (9-14)
  • Result (16-19)
  • Result (21-24)
⏰ Context from checks skipped due to timeout of 90000ms. You can increase the timeout in your CodeRabbit configuration to a maximum of 15 minutes (900000ms). (1)
  • GitHub Check: Analyze (csharp)
🔇 Additional comments (11)
InvoiceReminder.ExternalServices.UnitTests/InvoiceReminder.ExternalServices.UnitTests.csproj (1)

14-14: A adição do Bogus está alinhada com os objetivos do PR e está devidamente versionada.

O Central Package Management está configurado e habilitado no projeto. A versão do Bogus (35.6.5) está corretamente especificada no Directory.Packages.props, garantindo reproducibilidade das builds e consistência de versão entre ambientes. A omissão de versão explícita na referência do pacote está em conformidade com a estratégia de versionamento centralizado do projeto.

.github/workflows/workflow-ci.yml (1)

11-14: Extensão do CI para a branch develop está correta!

A inclusão da branch develop nos triggers de pull_request e push está alinhada com boas práticas de GitFlow e garante que o CI rode tanto na branch principal quanto na de desenvolvimento.

InvoiceReminder.API.UnitTests/Endpoints/LoginEndpointTests.cs (2)

1-1: LGTM! Integração do Bogus implementada corretamente.

A introdução da biblioteca Bogus para geração de dados de teste está bem estruturada. A configuração dos fakers é abrangente e realista, incluindo a geração adequada de senhas com hash SHA256.

Also applies to: 27-29, 42-56


58-105: Lógica de autenticação com senha está correta.

O teste gera corretamente uma senha em texto plano (linha 63), utiliza essa senha para o LoginRequest (linha 73), e configura o expectedUser com a senha em hash SHA256 (linha 67). Essa separação garante que o teste simula adequadamente o fluxo de autenticação real onde a senha é enviada em texto plano e comparada com o hash armazenado.

InvoiceReminder.ExternalServices.UnitTests/SendMessage/SendMessageServiceTests.cs (2)

1-1: LGTM! Geração de dados de teste bem estruturada.

A configuração dos fakers para múltiplas entidades (Invoice, EmailAuthToken, ScanEmailDefinition, User) está bem implementada com valores realistas e relacionamentos apropriados. A inicialização de coleções vazias para o faker de User (linhas 97-100) é uma boa prática que evita valores nulos inesperados.

Also applies to: 25-28, 50-103


105-145: Teste com relacionamentos de entidades está correto.

O teste gera corretamente entidades relacionadas: um User com EmailAuthToken e ScanEmailDefinition em suas coleções (linhas 111-115), e utiliza o beneficiário da definição de e-mail para criar o dicionário de anexos (linha 118). Essa abordagem simula adequadamente o cenário real de relacionamentos entre entidades.

InvoiceReminder.API.UnitTests/Endpoints/UserEndpointsTests.cs (2)

1-1: LGTM! Configuração do Bogus implementada de forma consistente.

A inicialização dos fakers para UserViewModel está bem estruturada com regras abrangentes para todos os campos relevantes. O uso de ToUniversalTime() nas datas (linhas 48-49) é uma boa prática que garante consistência de fuso horário nos testes.

Also applies to: 26-27, 40-50


127-154: Uso correto do padrão Clone() para customização.

O uso de _userViewModelFaker.Clone().RuleFor(u => u.Id, id).Generate() (linha 135) é uma excelente prática que permite customizar campos específicos (neste caso, o Id) mantendo os valores gerados pelo faker para os demais campos. Esse padrão é reutilizado consistentemente em outros testes.

InvoiceReminder.ExternalServices.UnitTests/BarcodeReader/BarcodeReaderServiceTests.cs (1)

1-1: LGTM! Geração de dados de teste bem implementada.

A configuração do faker para Invoice está completa e realista, incluindo a lista de bancos brasileiros conhecidos (linhas 35-43) e valores apropriados para campos monetários e de datas.

Also applies to: 20-21, 30-50

InvoiceReminder.API.UnitTests/Endpoints/ScanEmailDefinitionEndpointsTests.cs (2)

1-1: LGTM! Configuração do Bogus abrangente e realista.

A inicialização do faker para ScanEmailDefinitionViewModel está excelente, incluindo:

  • Uso de PickRandom para o enum InvoiceType (linha 45)
  • Geração de nomes de empresas para beneficiários (linha 46)
  • Geração de nomes de arquivos do sistema (linha 49)
  • Datas em UTC para consistência (linhas 50-51)

Also applies to: 6-6, 26-27, 40-52


396-427: Geração de e-mail para testes implementada corretamente.

O teste usa _faker.Internet.Email() para gerar um e-mail (linha 400) e depois customiza o ScanEmailDefinitionViewModel com esse mesmo e-mail usando Clone().RuleFor() (linha 405). Essa abordagem garante que o e-mail usado na URL da requisição corresponde ao e-mail no objeto esperado, mantendo a consistência do teste.

Comment thread .github/workflows/workflow-ci.yml

@coderabbitai coderabbitai Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Actionable comments posted: 0

🧹 Nitpick comments (2)
InvoiceReminder.ExternalServices.UnitTests/BarcodeReader/BarcodeReaderServiceTests.cs (2)

30-49: Considere simplificar a configuração do Faker para as necessidades atuais dos testes.

A configuração do _invoiceFaker é bastante detalhada, mas a maioria dos campos gerados (Id, UserId, Bank, Barcode, DueDate, CreatedAt, UpdatedAt) não são validados nas asserções dos testes atuais. As asserções verificam apenas Beneficiary, se Barcode não é nulo/vazio, e se Amount > 0.

Se a intenção é preparar para testes futuros mais abrangentes, a configuração atual está adequada. Caso contrário, você poderia simplificar gerando apenas os campos realmente necessários, melhorando a legibilidade e manutenibilidade.

💡 Sugestão de simplificação (se aplicável)

Se apenas alguns campos são necessários, considere uma abordagem mais enxuta:

-        _invoiceFaker = new Faker<Invoice>()
-            .RuleFor(i => i.Id, faker => faker.Random.Guid())
-            .RuleFor(i => i.UserId, faker => faker.Random.Guid())
-            .RuleFor(i => i.Bank, faker => faker.PickRandom(
-                "Banco do Brasil",
-                "Bradesco",
-                "Itaú",
-                "Caixa Econômica Federal",
-                "Santander",
-                "Safra",
-                "Citibank",
-                "BTG Pactual"))
-            .RuleFor(i => i.Beneficiary, faker => faker.Company.CompanyName())
-            .RuleFor(i => i.Amount, faker => faker.Finance.Amount(10, 10000))
-            .RuleFor(i => i.Barcode, faker => faker.Random.AlphaNumeric(47))
-            .RuleFor(i => i.DueDate, faker => faker.Date.Future().ToUniversalTime())
-            .RuleFor(i => i.CreatedAt, faker => faker.Date.Past().ToUniversalTime())
-            .RuleFor(i => i.UpdatedAt, faker => faker.Date.Recent().ToUniversalTime());
+        _invoiceFaker = new Faker<Invoice>()
+            .RuleFor(i => i.Beneficiary, faker => faker.Company.CompanyName())
+            .RuleFor(i => i.Amount, faker => faker.Finance.Amount(10, 10000))
+            .RuleFor(i => i.Barcode, faker => faker.Random.AlphaNumeric(47));

Alternativamente, mantenha a configuração completa se você planeja expandir as validações dos testes no futuro.


56-65: Simplificação opcional para teste de exceção.

Neste teste, o valor do beneficiary é irrelevante, pois a exceção é lançada antes de ser utilizado (quando o byteStream está vazio). Usar o Faker aqui adiciona complexidade desnecessária.

Para testes de exceção focados em validações de entrada, um valor simples e direto (como uma string literal) pode ser mais claro e manter o foco no que está sendo testado.

💡 Simplificação sugerida
-        var beneficiary = _faker.Company.CompanyName();
+        var beneficiary = "Any Beneficiary";

Obs: Esta é apenas uma sugestão de estilo. A implementação atual está funcionalmente correta.

📜 Review details

Configuration used: Organization UI

Review profile: CHILL

Plan: Pro

📥 Commits

Reviewing files that changed from the base of the PR and between 02c2559 and dc85c31.

📒 Files selected for processing (2)
  • .github/workflows/workflow-ci.yml (2 hunks)
  • InvoiceReminder.ExternalServices.UnitTests/BarcodeReader/BarcodeReaderServiceTests.cs (5 hunks)
🚧 Files skipped from review as they are similar to previous changes (1)
  • .github/workflows/workflow-ci.yml
🧰 Additional context used
🧬 Code graph analysis (1)
InvoiceReminder.ExternalServices.UnitTests/BarcodeReader/BarcodeReaderServiceTests.cs (3)
InvoiceReminder.ExternalServices/BarcodeReader/BarcodeReaderService.cs (1)
  • Invoice (21-56)
InvoiceReminder.ExternalServices/BarcodeReader/AccountInvoiceBarcodeHandler.cs (1)
  • Invoice (8-22)
InvoiceReminder.ExternalServices/BarcodeReader/BankInvoiceBarcodeHandler.cs (1)
  • Invoice (25-41)
⏰ Context from checks skipped due to timeout of 90000ms. You can increase the timeout in your CodeRabbit configuration to a maximum of 15 minutes (900000ms). (1)
  • GitHub Check: Analyze (csharp)
🔇 Additional comments (3)
InvoiceReminder.ExternalServices.UnitTests/BarcodeReader/BarcodeReaderServiceTests.cs (3)

1-1: Ótima adição da biblioteca Bogus!

A integração do Bogus para geração de dados de teste dinâmicos é uma melhoria significativa em relação aos valores hard-coded, aumentando a manutenibilidade dos testes.

Also applies to: 20-21


68-91: Teste bem estruturado com uso adequado do Bogus.

O teste utiliza corretamente os dados gerados pelo Faker e valida que o serviço lê o PDF, invoca o handler e retorna o resultado esperado. A estrutura Arrange/Act/Assert está clara e as asserções cobrem os pontos essenciais.


94-117: Teste consistente com a abordagem anterior.

O teste para BankInvoice segue o mesmo padrão bem-estruturado do teste de AccountInvoice, garantindo cobertura consistente para ambos os tipos de fatura.

@jldsilva jldsilva merged commit 5bdfe8e into development Dec 20, 2025
4 checks passed
@jldsilva jldsilva deleted the Update-CI-Workflow branch December 20, 2025 18:13
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

.NET Pull requests that update .NET code

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant