Skip to content

Updates .NET packages to latest versions#65

Merged
jldsilva merged 5 commits into
developmentfrom
Packages-Update
Dec 19, 2025
Merged

Updates .NET packages to latest versions#65
jldsilva merged 5 commits into
developmentfrom
Packages-Update

Conversation

@jldsilva

@jldsilva jldsilva commented Dec 18, 2025

Copy link
Copy Markdown
Owner

Updates .NET packages to their latest versions, including
essential libraries and testing dependencies.

This ensures the project benefits from the newest features,
security patches, and performance improvements.

Includes updates to bulk extensions library.

Adds global.json to define the .NET SDK version, also
adds bogus package to mock data for unit tests and improve
testing data generation.

Removes MaxCpuCount setting from CodeCoverage.runsettings.

Summary by CodeRabbit

  • Chores

    • Atualizado .NET SDK para 10.0.100; reorganização de pacotes NuGet com novo grupo "Essentials" e várias versões ajustadas; troca de alguns pacotes de EF Core/bulk.
    • Removida limitação de CPU na configuração de cobertura de código.
    • Adicionado global.json e ajuste no workflow CI para garantir locale UTF-8.
  • Refactor

    • Centralização e modularização do registro de endpoints via helpers privados, mantendo rotas e respostas públicas.
  • Tests

    • Migração ampla dos testes para geração de dados com Bogus e inclusão da dependência Bogus nos projetos de teste.

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

Updates .NET packages to their latest versions, including
essential libraries and testing dependencies.

This ensures the project benefits from the newest features,
security patches, and performance improvements.

Includes updates to bulk extensions library.

Adds global.json to define the .NET SDK version, also
adds bogus package to mock data for unit tests and improve
testing data generation.

Removes `MaxCpuCount` setting from `CodeCoverage.runsettings`.
@jldsilva jldsilva self-assigned this Dec 18, 2025
@jldsilva jldsilva added .NET Pull requests that update .NET code dependencies Pull requests that update a dependency file labels Dec 18, 2025
@coderabbitai

coderabbitai Bot commented Dec 18, 2025

Copy link
Copy Markdown

Walkthrough

Removeu MaxCpuCount=1 de CodeCoverage.runsettings; adicionou global.json; reorganizou e atualizou versões em Directory.Packages.props (incl. grupo "Essentials" e EFCore.BulkExtensions); introduziu Bogus/Faker em muitos testes; refatorou mapeamento de endpoints em helpers privados com constantes basepath; ajustou BulkInsertAsync; adicionou step de locale no CI.

Changes

Cohort / File(s) Resumo
Configuração de Execução & CI
CodeCoverage.runsettings, global.json, .github/workflows/workflow-ci.yml, InvoiceReminder.sln
Removeu MaxCpuCount=1 do runsettings; adicionou global.json (sdk 10.0.100, test.runner Microsoft.Testing.Platform); adicionou passo "Set UTF-8 locale" no workflow; atualizou itens da solução.
Gerenciamento de Pacotes Central
Directory.Packages.props
Criou grupo ".Net Packages: Essentials", atualizou/reenviou várias versões para 10.0.1 e outras; adicionou entradas EFCore.BulkExtensions.Dotnet10*; reorganizou e substituiu versões antigas.
Projetos — Dependências de Teste
*UnitTests/*.csproj
InvoiceReminder.Application.UnitTests/InvoiceReminder.Application.UnitTests.csproj, InvoiceReminder.Infrastructure.UnitTests/InvoiceReminder.Infrastructure.UnitTests.csproj, InvoiceReminder.JobScheduler.UnitTests/InvoiceReminder.JobScheduler.UnitTests.csproj, InvoiceReminder.API.UnitTests/InvoiceReminder.API.UnitTests.csproj, InvoiceReminder.DomainEntities.UnitTests/InvoiceReminder.DomainEntities.UnitTests.csproj
Adicionou PackageReference para Bogus nos projetos de teste.
Projetos — Data
InvoiceReminder.Data/InvoiceReminder.Data.csproj
Removeu Z.EntityFramework.Extensions.EFCore; adicionou EFCore.BulkExtensions.Dotnet10 e EFCore.BulkExtensions.Dotnet10.PostgreSql.
Repositório — Bulk Insert
InvoiceReminder.Data/Repository/BaseRepository.cs
Importou EFCore.BulkExtensions e alterou chamada para BulkInsertAsync(entities, cancellationToken: cancellationToken) (uso de argumento nomeado).
Refatoração de Endpoints — basepath & MapXxx
InvoiceReminder.API/Endpoints/...
InvoiceReminder.API/Endpoints/GoogleOAuthEndpoints.cs, InvoiceReminder.API/Endpoints/InvoiceEndpoints.cs, InvoiceReminder.API/Endpoints/JobScheduleEndpoints.cs, InvoiceReminder.API/Endpoints/LoginEndpoints.cs, InvoiceReminder.API/Endpoints/ScanEmailDefinitionEndpoints.cs, InvoiceReminder.API/Endpoints/SendMessageEndpoints.cs, InvoiceReminder.API/Endpoints/UserEndpoints.cs
Moveu mapeamentos inline para helpers privados MapXxx, introduziu constantes privadas basepath, centralizou metadata/nomes e padronizou respostas (Ok/NotFound/Created/NoContent/Problem); alguns handlers agora recebem CancellationToken.
Tratamento Global de Exceções
InvoiceReminder.API/Exceptions/GlobalExceptionHandler.cs
Guardou a chamada de log com if (_logger.IsEnabled(LogLevel.Error)) antes de LogError.
Testes — Adoção de Bogus/Faker
Vários arquivos sob InvoiceReminder.*.UnitTests/...
(ex.: InvoiceReminder.API.UnitTests/..., InvoiceReminder.Application.UnitTests/AppServices/..., InvoiceReminder.DomainEntities.UnitTests/..., InvoiceReminder.Infrastructure.UnitTests/..., InvoiceReminder.JobScheduler.UnitTests/...)
Adicionou using Bogus; e Faker<T> em muitos testes; substituiu dados hard-coded por geradores Faker e helpers privados; ajustou inicializações e setups por teste; em um caso tornou classes de teste sealed e adicionou campos Id/CreatedAt/UpdatedAt.

Estimated code review effort

🎯 4 (Complex) | ⏱️ ~45 minutes

Áreas a revisar com atenção:

  • Refatoração de endpoints: verificar preservação de contratos (autorização, nomes OpenAPI, URIs criadas usando basepath, códigos HTTP) e assinaturas com CancellationToken.
  • Mudança de EF bulk: compatibilidade entre novas bibliotecas EFCore.BulkExtensions.* e remoção de Z.EntityFramework.Extensions.EFCore; ver uso de parâmetro nomeado.
  • Fakers nos testes: determinismo, inicialização por teste e impacto em execução paralela.
  • Directory.Packages.props: impactos de versões centralizadas e reorganização em projetos dependentes.

Possibly related PRs

Poem

🐰
Pulo leve entre rotas e pacotes,
Bogus semeia dados pra cada teste,
SDK dez prepara o build a cantar,
Endpoints em trilhas, criados com gosto,
O coelho celebra — hop, código pronto ✨

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 descreve com precisão a mudança principal do conjunto de alterações: atualização de pacotes .NET para versões mais recentes.
✨ 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 Packages-Update

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: 4

Caution

Some comments are outside the diff and can’t be posted inline due to platform limitations.

⚠️ Outside diff range comments (2)
InvoiceReminder.API/Endpoints/InvoiceEndpoints.cs (2)

40-55: Metadados de resposta inconsistentes com o comportamento real.

O endpoint retorna Results.NotFound quando falha (linha 48), mas os metadados .Produces() não incluem Status404NotFound. Compare com MapGetJobSchedule em JobScheduleEndpoints.cs que inclui corretamente .Produces(StatusCodes.Status404NotFound).

🔎 Sugestão de correção
         .WithName("GetInvoice")
         .RequireAuthorization()
         .Produces(StatusCodes.Status200OK)
+        .Produces(StatusCodes.Status404NotFound)
         .Produces(StatusCodes.Status400BadRequest)
         .Produces(StatusCodes.Status500InternalServerError);

57-73: Mesmo problema: falta .Produces(StatusCodes.Status404NotFound).

O endpoint GetInvoiceByBarcode também retorna Results.NotFound mas não declara esse status nos metadados.

🔎 Sugestão de correção
         .WithName("GetInvoiceByBarcode")
         .RequireAuthorization()
         .Produces(StatusCodes.Status200OK)
+        .Produces(StatusCodes.Status404NotFound)
         .Produces(StatusCodes.Status400BadRequest)
         .Produces(StatusCodes.Status500InternalServerError);
🧹 Nitpick comments (21)
InvoiceReminder.API/Exceptions/GlobalExceptionHandler.cs (1)

19-22: A verificação explícita de IsEnabled é redundante no .NET moderno.

No .NET 6+ (e especialmente no .NET 8/10), os métodos de logging estruturado como LogError já realizam verificações internas de IsEnabled, tornando esta verificação explícita desnecessária. A otimização de desempenho pretendida já é aplicada automaticamente pelo framework.

🔎 Simplificação sugerida
-        if (_logger.IsEnabled(LogLevel.Error))
-        {
-            _logger.LogError(exception, "An Exception occurred: {Message}", exception.Message);
-        }
+        _logger.LogError(exception, "An Exception occurred: {Message}", exception.Message);
InvoiceReminder.API/Endpoints/SendMessageEndpoints.cs (1)

16-32: Método auxiliar bem estruturado. Considere revisar a lógica de tratamento de resultado.

O método MapSendMessage está bem estruturado e segue as convenções do projeto. A refatoração está correta e preserva o comportamento existente.

No entanto, vale revisar a lógica nas linhas 23-25: quando result é nulo ou vazio, o código retorna Results.Problem(result), passando uma string vazia ou nula para o método Problem, o que não fornece informações de erro significativas ao cliente. Considere retornar uma mensagem de erro mais descritiva nesses casos.

💡 Sugestão de melhoria para tratamento de erros
-return !string.IsNullOrEmpty(result)
-    ? Results.Ok(result)
-    : Results.Problem(result);
+return !string.IsNullOrEmpty(result)
+    ? Results.Ok(result)
+    : Results.Problem(
+        statusCode: StatusCodes.Status500InternalServerError,
+        title: "Erro ao enviar mensagem",
+        detail: "O serviço não retornou um resultado válido.");
InvoiceReminder.Application.UnitTests/AppServices/JobScheduleAppServiceTests.cs (1)

51-66: Considere extrair as expressões cron duplicadas.

O array de expressões cron nas linhas 56-63 é idêntico ao das linhas 39-46. Embora seja código de teste, você pode extrair essas expressões para uma constante privada para melhor manutenibilidade.

🔎 Refatoração sugerida para eliminar duplicação
+    private static readonly string[] ValidCronExpressions =
+    [
+        "0 0/5 * * * ?",      // Every 5 minutes
+        "0 0 * * * ?",        // Every hour
+        "0 0 0 * * ?",        // Every day at midnight
+        "0 0 0 ? * MON",      // Every Monday
+        "0 0 0 1 * ?",        // First day of month
+        "0 0 0 1 1 ?",        // Every January 1st
+        "0 0 12 * * ?"        // Every noon
+    ];
+
     private static Faker<JobSchedule> CreateJobScheduleFaker()
     {
         return new Faker<JobSchedule>()
             .RuleFor(j => j.Id, faker => faker.Random.Guid())
             .RuleFor(j => j.UserId, faker => faker.Random.Guid())
-            .RuleFor(j => j.CronExpression, faker => faker.PickRandom(
-                "0 0/5 * * * ?",      // Every 5 minutes
-                "0 0 * * * ?",        // Every hour
-                "0 0 0 * * ?",        // Every day at midnight
-                "0 0 0 ? * MON",      // Every Monday
-                "0 0 0 1 * ?",        // First day of month
-                "0 0 0 1 1 ?",        // Every January 1st
-                "0 0 12 * * ?"))      // Every noon
+            .RuleFor(j => j.CronExpression, faker => faker.PickRandom(ValidCronExpressions))
             .RuleFor(j => j.CreatedAt, faker => faker.Date.Past().ToUniversalTime())
             .RuleFor(j => j.UpdatedAt, faker => faker.Date.Recent().ToUniversalTime());
     }

     private static Faker<JobScheduleViewModel> CreateJobScheduleViewModelFaker()
     {
         return new Faker<JobScheduleViewModel>()
             .RuleFor(j => j.Id, faker => faker.Random.Guid())
             .RuleFor(j => j.UserId, faker => faker.Random.Guid())
-            .RuleFor(j => j.CronExpression, faker => faker.PickRandom(
-                "0 0/5 * * * ?",
-                "0 0 * * * ?",
-                "0 0 0 * * ?",
-                "0 0 0 ? * MON",
-                "0 0 0 1 * ?",
-                "0 0 0 1 1 ?",
-                "0 0 12 * * ?"))
+            .RuleFor(j => j.CronExpression, faker => faker.PickRandom(ValidCronExpressions))
             .RuleFor(j => j.CreatedAt, faker => faker.Date.Past().ToUniversalTime())
             .RuleFor(j => j.UpdatedAt, faker => faker.Date.Recent().ToUniversalTime());
     }
InvoiceReminder.Infrastructure.UnitTests/Data/Repository/BaseRepositoryTests.cs (2)

210-211: Considere usar o faker existente para consistência.

A criação de uma nova instância Faker() para gerar nomes atualizados funciona, mas seria mais consistente usar o faker existente: _testEntityFaker.Generate().Name ou criar um método auxiliar.

🔎 Refatoração sugerida para maior consistência
-        var updatedName = new Faker().Lorem.Word();
+        var updatedName = _testEntityFaker.Generate().Name;

Also applies to: 242-243


266-268: Evite mutação do faker compartilhado.

Chamar RuleFor no _testEntityFaker compartilhado modifica sua configuração permanentemente, o que pode causar testes instáveis se executados em paralelo ou em ordens diferentes. Cada chamada a RuleFor substitui a regra anterior.

🔎 Refatoração recomendada para isolamento de testes

Crie instâncias de faker locais com as regras específicas em vez de mutar o faker compartilhado:

         // Arrange
+        var customFaker = new Faker<TestEntity>()
+            .RuleFor(e => e.Id, _ => Guid.NewGuid());
+        
         var entities = new List<TestEntity>
         {
-            _testEntityFaker.RuleFor(e => e.Name, _ => "Test1").Generate(),
-            _testEntityFaker.RuleFor(e => e.Name, _ => "AnotherTest").Generate(),
-            _testEntityFaker.RuleFor(e => e.Name, _ => "Test2").Generate()
+            customFaker.RuleFor(e => e.Name, _ => "Test1").Generate(),
+            customFaker.Clone().RuleFor(e => e.Name, _ => "AnotherTest").Generate(),
+            customFaker.Clone().RuleFor(e => e.Name, _ => "Test2").Generate()
         };

Ou de forma ainda mais simples:

         var entities = new List<TestEntity>
         {
-            _testEntityFaker.RuleFor(e => e.Name, _ => "Test1").Generate(),
-            _testEntityFaker.RuleFor(e => e.Name, _ => "AnotherTest").Generate(),
-            _testEntityFaker.RuleFor(e => e.Name, _ => "Test2").Generate()
+            new TestEntity { Id = Guid.NewGuid(), Name = "Test1" },
+            new TestEntity { Id = Guid.NewGuid(), Name = "AnotherTest" },
+            new TestEntity { Id = Guid.NewGuid(), Name = "Test2" }
         };
InvoiceReminder.Infrastructure.UnitTests/Data/Repository/UserRepositoryTests.cs (3)

34-48: Considere alinhar com o padrão de método usado em outros testes.

A implementação funciona corretamente com [TestInitialize]. Porém, outros arquivos de teste no projeto (como UserAppServiceTests.cs e UserExtensionsTests.cs) utilizam um padrão de método que retorna um novo Faker<User> (ex: CreateUserFaker()), em vez de armazenar em um campo.

Para consistência com o restante da codebase, considere refatorar para o padrão de método:

🔎 Sugestão de refatoração
-    private Faker<User> _userFaker;
-
-    [TestInitialize]
-    public void Setup()
-    {
-        InitializeFaker();
-    }
-
-    private void InitializeFaker()
-    {
-        _userFaker = new Faker<User>()
+    private static Faker<User> CreateUserFaker() =>
+        new Faker<User>()
             .RuleFor(u => u.Id, _ => Guid.NewGuid())
             .RuleFor(u => u.TelegramChatId, f => f.Random.Long(100000000, long.MaxValue))
             .RuleFor(u => u.Name, f => f.Person.FullName)
             .RuleFor(u => u.Email, f => f.Internet.Email())
             .RuleFor(u => u.Password, f => f.Internet.Password(length: 16, memorable: false));
-    }

72-75: Criação redundante de Faker e mutação do faker compartilhado.

Linha 72 cria um novo Faker() apenas para gerar o email, quando _userFaker já possui essa capacidade. Além disso, encadear .RuleFor() diretamente em _userFaker modifica a instância compartilhada. Embora funcione devido ao [TestInitialize], usar .Clone() torna a intenção mais clara:

🔎 Sugestão de refatoração
-        var email = new Faker().Internet.Email();
-        var user = _userFaker
+        var user = _userFaker.Clone()
             .RuleFor(u => u.Email, _ => email)
             .Generate();
+        var email = user.Email;

Ou, de forma mais idiomática:

-        var email = new Faker().Internet.Email();
-        var user = _userFaker
-            .RuleFor(u => u.Email, _ => email)
-            .Generate();
+        var user = _userFaker.Generate();
+        var email = user.Email;

98-100: Mesmo padrão de mutação do faker compartilhado.

Similar ao teste anterior, considere usar .Clone() antes de encadear .RuleFor() para evitar mutação da instância compartilhada:

🔎 Sugestão de refatoração
-        var user = _userFaker
+        var user = _userFaker.Clone()
             .RuleFor(u => u.Id, _ => userId)
             .Generate();
InvoiceReminder.API/Endpoints/ScanEmailDefinitionEndpoints.cs (1)

24-155: Métodos Map implementados de forma consistente e correta!*

Todos os sete métodos seguem um padrão uniforme e mantêm o comportamento original dos endpoints:

  • Assinaturas consistentes recebendo RouteGroupBuilder
  • Autorização adequadamente configurada em todos os endpoints
  • Tratamento de erros uniforme com verificação de IsSuccess
  • Nomenclatura clara e descritiva
  • Configurações OpenAPI apropriadas

A modularização facilita a manutenção futura e torna o código mais testável. A formatação dos parâmetros no método MapDeleteScanEmailDefinition (linha 141) também está adequada para melhor legibilidade.

💡 Sugestão opcional: Consistência na documentação OpenAPI

Alguns endpoints GET que retornam Results.NotFound() (como MapGetScanEmailDefinition e MapGetByUserId) não incluem Status404NotFound nos atributos .Produces(). Para maior consistência na documentação OpenAPI, considere adicionar:

 .Produces(StatusCodes.Status200OK)
+.Produces(StatusCodes.Status404NotFound)
 .Produces(StatusCodes.Status400BadRequest)
 .Produces(StatusCodes.Status500InternalServerError);

Nota: Esta é uma observação sobre código pré-existente, não introduzida por esta refatoração.

InvoiceReminder.Application.UnitTests/AppServices/UserAppServiceTests.cs (2)

29-39: Considere inicializar coleções de navegação para consistência.

O método CreateUserFaker() configura propriedades básicas do User, mas não inicializa propriedades de coleção. O arquivo UserExtensionsTests.cs mostra um padrão onde coleções como Invoices, JobSchedules, EmailAuthTokens e ScanEmailDefinitions são inicializadas como arrays vazios.

Embora os testes atuais possam funcionar sem essas inicializações (se o mapeamento UserViewModel não incluir essas propriedades), inicializá-las evita possíveis exceções de referência nula e mantém consistência com outros testes no projeto.

🔎 Sugestão para alinhar com o padrão de UserExtensionsTests.cs
 private static Faker<User> CreateUserFaker()
 {
     return new Faker<User>()
         .RuleFor(u => u.Id, faker => faker.Random.Guid())
         .RuleFor(u => u.Name, faker => faker.Person.FullName)
         .RuleFor(u => u.Email, faker => faker.Internet.Email())
         .RuleFor(u => u.Password, faker => faker.Random.AlphaNumeric(32))
         .RuleFor(u => u.TelegramChatId, faker => faker.Random.Long(1000000, 9999999999))
         .RuleFor(u => u.CreatedAt, faker => faker.Date.Past().ToUniversalTime())
-        .RuleFor(u => u.UpdatedAt, faker => faker.Date.Recent().ToUniversalTime());
+        .RuleFor(u => u.UpdatedAt, faker => faker.Date.Recent().ToUniversalTime())
+        .RuleFor(u => u.Invoices, _ => [])
+        .RuleFor(u => u.JobSchedules, _ => [])
+        .RuleFor(u => u.EmailAuthTokens, _ => [])
+        .RuleFor(u => u.ScanEmailDefinitions, _ => []);
 }

61-64: Considere simplificar a geração de dados do teste.

O código gera um email separadamente e depois sobrescreve o email do usuário com esse valor. Uma abordagem mais simples seria gerar o usuário primeiro e usar o email gerado automaticamente pelo CreateUserFaker().

🔎 Sugestão de simplificação
-var email = _faker.Internet.Email();
-var user = CreateUserFaker()
-    .RuleFor(u => u.Email, email)
-    .Generate();
+var user = CreateUserFaker().Generate();
+var email = user.Email;

Isso elimina a redundância e torna o código mais direto, já que o faker já gera um email válido.

InvoiceReminder.Application.UnitTests/AppServices/BaseAppServiceTests.cs (1)

279-279: Modificadores de classe apropriados para entidades de teste.

A mudança para public sealed class é uma boa prática, prevenindo herança não intencional e garantindo que as classes de teste permaneçam simples e focadas. A visibilidade pública permite que o Bogus e o Mapster trabalhem corretamente com essas entidades.

💡 Sugestão opcional: Considere adicionar mais propriedades para testes mais realistas

Embora a implementação atual esteja correta para os testes existentes, considere adicionar propriedades como Id, CreatedAt e UpdatedAt às classes de teste para torná-las mais alinhadas com entidades reais e permitir testes mais abrangentes no futuro. Isso seguiria o padrão observado em JobScheduleAppServiceTests.cs.

 public sealed class TestEntity
 {
+    public Guid Id { get; set; }
     public string Name { get; set; }
+    public DateTime CreatedAt { get; set; }
+    public DateTime UpdatedAt { get; set; }
 }

 public sealed class TestEntityViewModel
 {
+    public Guid Id { get; set; }
     public string Name { get; set; }
+    public DateTime CreatedAt { get; set; }
+    public DateTime UpdatedAt { get; set; }
 }

E atualize os fakers:

 _entityFaker = new Faker<TestEntity>()
+    .RuleFor(e => e.Id, faker => faker.Random.Guid())
-    .RuleFor(e => e.Name, faker => faker.Person.FullName);
+    .RuleFor(e => e.Name, faker => faker.Person.FullName)
+    .RuleFor(e => e.CreatedAt, faker => faker.Date.Past().ToUniversalTime())
+    .RuleFor(e => e.UpdatedAt, faker => faker.Date.Recent().ToUniversalTime());

 _entityViewModelFaker = new Faker<TestEntityViewModel>()
+    .RuleFor(e => e.Id, faker => faker.Random.Guid())
-    .RuleFor(e => e.Name, faker => faker.Person.FullName);
+    .RuleFor(e => e.Name, faker => faker.Person.FullName)
+    .RuleFor(e => e.CreatedAt, faker => faker.Date.Past().ToUniversalTime())
+    .RuleFor(e => e.UpdatedAt, faker => faker.Date.Recent().ToUniversalTime());

Nota: Esta é apenas uma sugestão opcional para melhorar o realismo dos testes. A implementação atual está funcional e adequada.

Also applies to: 284-284

InvoiceReminder.Infrastructure.UnitTests/Data/Repository/ScanEmailDefinitionRepositoryTests.cs (2)

76-80: Considere evitar mutação do campo Faker compartilhado.

O teste funciona corretamente e a asserção adicional em Beneficiary (linha 94) melhora a cobertura. Porém, chamar .RuleFor() diretamente no campo _scanEmailDefinitionFaker mutá-lo. Embora o [TestInitialize] redefina o Faker antes de cada teste, um padrão mais claro seria criar uma instância local ou usar um método auxiliar:

var scanEmailDefinition = new Faker<ScanEmailDefinition>()
    .RuleFor(s => s.Id, _ => Guid.NewGuid())
    .RuleFor(s => s.UserId, _ => userId)
    .RuleFor(s => s.Beneficiary, _ => beneficiary)
    // ... outras regras conforme necessário
    .Generate();

Isso torna explícito que você está criando uma configuração específica para este teste.

Also applies to: 94-94


103-107: Refatoração consistente com asserções aprimoradas.

Os testes foram consistentemente refatorados para usar Bogus, e as asserções adicionais (linha 121 para SenderEmailAddress e linha 147 para contagem) melhoram a validação. A mesma sugestão sobre evitar mutação do campo _scanEmailDefinitionFaker se aplica aqui.

Alternativamente, você poderia criar um método auxiliar:

private Faker<ScanEmailDefinition> CreateFaker(Action<Faker<ScanEmailDefinition>> configure = null)
{
    var faker = new Faker<ScanEmailDefinition>()
        .RuleFor(s => s.Id, _ => Guid.NewGuid())
        .RuleFor(s => s.InvoiceType, f => f.PickRandom<InvoiceType>())
        // ... outras regras padrão
        ;
    
    configure?.Invoke(faker);
    return faker;
}

// Uso:
var scanEmailDefinition = CreateFaker(f => f
    .RuleFor(s => s.UserId, _ => userId)
    .RuleFor(s => s.SenderEmailAddress, _ => senderEmail))
    .Generate();

Also applies to: 121-121, 130-132, 147-147

InvoiceReminder.DomainEntities.UnitTests/Extensions/UserExtensionsTests.cs (1)

40-43: Parâmetro faker não utilizado nas regras de coleção.

As regras para as coleções (Invoices, JobSchedules, EmailAuthTokens, ScanEmailDefinitions) incluem o parâmetro faker mas não o utilizam. Considere usar _ em vez de faker para indicar claramente que o parâmetro não é usado.

🔎 Refatoração sugerida
-            .RuleFor(u => u.Invoices, faker => invoices ?? new HashSet<Invoice>())
-            .RuleFor(u => u.JobSchedules, faker => jobSchedules ?? new HashSet<JobSchedule>())
-            .RuleFor(u => u.EmailAuthTokens, faker => emailAuthTokens ?? new HashSet<EmailAuthToken>())
-            .RuleFor(u => u.ScanEmailDefinitions, faker => scanEmailDefinitions ?? new HashSet<ScanEmailDefinition>());
+            .RuleFor(u => u.Invoices, _ => invoices ?? new HashSet<Invoice>())
+            .RuleFor(u => u.JobSchedules, _ => jobSchedules ?? new HashSet<JobSchedule>())
+            .RuleFor(u => u.EmailAuthTokens, _ => emailAuthTokens ?? new HashSet<EmailAuthToken>())
+            .RuleFor(u => u.ScanEmailDefinitions, _ => scanEmailDefinitions ?? new HashSet<ScanEmailDefinition>());
InvoiceReminder.API/Endpoints/InvoiceEndpoints.cs (1)

9-9: Considere usar PascalCase para constantes.

A convenção de nomenclatura em C# recomenda PascalCase para constantes. Sugiro renomear basepath para BasePath.

🔎 Sugestão de correção
-    private const string basepath = "/api/invoice";
+    private const string BasePath = "/api/invoice";
InvoiceReminder.API/Endpoints/LoginEndpoints.cs (2)

11-11: Considere usar PascalCase para constantes.

Assim como em InvoiceEndpoints.cs, a convenção C# recomenda PascalCase para constantes.


20-20: Tipo de parâmetro inconsistente com outros arquivos de endpoints.

O método MapLogin recebe IEndpointRouteBuilder, mas todos os outros arquivos de endpoints (como InvoiceEndpoints.cs, JobScheduleEndpoints.cs) usam RouteGroupBuilder para os métodos MapXxx. Isso funciona, mas é inconsistente.

🔎 Sugestão de correção para consistência
-    private static void MapLogin(IEndpointRouteBuilder endpoints)
+    private static void MapLogin(RouteGroupBuilder endpoint)
     {
-        _ = endpoints.MapPost("/",
+        _ = endpoint.MapPost("/",
InvoiceReminder.API/Endpoints/JobScheduleEndpoints.cs (1)

9-9: Considere usar PascalCase para constantes.

Assim como nos outros arquivos de endpoints, a convenção C# recomenda PascalCase para constantes (BasePath).

InvoiceReminder.API/Endpoints/UserEndpoints.cs (2)

77-95: Considere usar ID em vez de email na URL do recurso criado.

A linha 87 usa o email na URL do recurso criado ($"{basepath}/{result.Value.Email}"), mas isso apresenta alguns desafios:

  • Emails podem conter caracteres especiais que requerem encoding de URL
  • O endpoint GetUser (linha 44) usa /{id}, criando inconsistência
  • A convenção REST tipicamente usa IDs de recursos em URLs
🔎 Sugestão de correção
                 return result.IsSuccess
-                    ? Results.Created($"{basepath}/{result.Value.Email}", result.Value)
+                    ? Results.Created($"{basepath}/{result.Value.Id}", result.Value)
                     : Results.Problem(result.Error);

97-118: Considere ajustar a URL do recurso criado para operações em lote.

A linha 110 retorna $"{basepath}/" como URL do recurso criado, que inclui uma barra final mas não aponta para um recurso específico. Para operações em lote, considere:

  • Remover a barra final: Results.Created(basepath, result.Value)
  • Ou usar uma URL mais específica: Results.Created($"{basepath}/bulk-insert", result.Value)
📜 Review details

Configuration used: Organization UI

Review profile: CHILL

Plan: Pro

📥 Commits

Reviewing files that changed from the base of the PR and between 5ebd98a and cd609d3.

📒 Files selected for processing (33)
  • CodeCoverage.runsettings (0 hunks)
  • Directory.Packages.props (1 hunks)
  • InvoiceReminder.API.UnitTests/Endpoints/InvoiceEndpointsTests.cs (14 hunks)
  • InvoiceReminder.API.UnitTests/Endpoints/JobScheduleEndPointsTests.cs (11 hunks)
  • InvoiceReminder.API.UnitTests/InvoiceReminder.API.UnitTests.csproj (1 hunks)
  • InvoiceReminder.API/Endpoints/GoogleOAuthEndpoints.cs (3 hunks)
  • InvoiceReminder.API/Endpoints/InvoiceEndpoints.cs (6 hunks)
  • InvoiceReminder.API/Endpoints/JobScheduleEndpoints.cs (6 hunks)
  • InvoiceReminder.API/Endpoints/LoginEndpoints.cs (1 hunks)
  • InvoiceReminder.API/Endpoints/ScanEmailDefinitionEndpoints.cs (7 hunks)
  • InvoiceReminder.API/Endpoints/SendMessageEndpoints.cs (1 hunks)
  • InvoiceReminder.API/Endpoints/UserEndpoints.cs (6 hunks)
  • InvoiceReminder.API/Exceptions/GlobalExceptionHandler.cs (1 hunks)
  • InvoiceReminder.Application.UnitTests/AppServices/BaseAppServiceTests.cs (9 hunks)
  • InvoiceReminder.Application.UnitTests/AppServices/EmailAuthTokenAppServiceTests.cs (4 hunks)
  • InvoiceReminder.Application.UnitTests/AppServices/InvoiceAppServiceTests.cs (4 hunks)
  • InvoiceReminder.Application.UnitTests/AppServices/JobScheduleAppServiceTests.cs (6 hunks)
  • InvoiceReminder.Application.UnitTests/AppServices/ScanEmailDefinitionAppServiceTests.cs (8 hunks)
  • InvoiceReminder.Application.UnitTests/AppServices/UserAppServiceTests.cs (4 hunks)
  • InvoiceReminder.Application.UnitTests/InvoiceReminder.Application.UnitTests.csproj (1 hunks)
  • InvoiceReminder.Data/InvoiceReminder.Data.csproj (1 hunks)
  • InvoiceReminder.Data/Repository/BaseRepository.cs (2 hunks)
  • InvoiceReminder.DomainEntities.UnitTests/Extensions/EntityExtensionsTests.cs (12 hunks)
  • InvoiceReminder.DomainEntities.UnitTests/Extensions/UserExtensionsTests.cs (28 hunks)
  • InvoiceReminder.DomainEntities.UnitTests/InvoiceReminder.DomainEntities.UnitTests.csproj (1 hunks)
  • InvoiceReminder.Infrastructure.UnitTests/Data/Repository/BaseRepositoryTests.cs (15 hunks)
  • InvoiceReminder.Infrastructure.UnitTests/Data/Repository/ScanEmailDefinitionRepositoryTests.cs (7 hunks)
  • InvoiceReminder.Infrastructure.UnitTests/Data/Repository/UserRepositoryTests.cs (6 hunks)
  • InvoiceReminder.Infrastructure.UnitTests/InvoiceReminder.Infrastructure.UnitTests.csproj (1 hunks)
  • InvoiceReminder.JobScheduler.UnitTests/HostedService/QuartzHostedServiceTests.cs (9 hunks)
  • InvoiceReminder.JobScheduler.UnitTests/InvoiceReminder.JobScheduler.UnitTests.csproj (1 hunks)
  • InvoiceReminder.sln (1 hunks)
  • global.json (1 hunks)
💤 Files with no reviewable changes (1)
  • CodeCoverage.runsettings
🧰 Additional context used
🧬 Code graph analysis (12)
InvoiceReminder.API/Endpoints/GoogleOAuthEndpoints.cs (6)
InvoiceReminder.API/Endpoints/InvoiceEndpoints.cs (1)
  • RegisterEndpoints (11-21)
InvoiceReminder.API/Endpoints/JobScheduleEndpoints.cs (1)
  • RegisterEndpoints (11-21)
InvoiceReminder.API/Endpoints/LoginEndpoints.cs (1)
  • RegisterEndpoints (13-18)
InvoiceReminder.API/Endpoints/ScanEmailDefinitionEndpoints.cs (1)
  • RegisterEndpoints (11-22)
InvoiceReminder.API/Endpoints/SendMessageEndpoints.cs (1)
  • RegisterEndpoints (9-14)
InvoiceReminder.API/Endpoints/UserEndpoints.cs (1)
  • RegisterEndpoints (12-23)
InvoiceReminder.Application.UnitTests/AppServices/EmailAuthTokenAppServiceTests.cs (3)
InvoiceReminder.Application.UnitTests/AppServices/UserAppServiceTests.cs (1)
  • Faker (29-39)
InvoiceReminder.Domain/Entities/EmailAuthToken.cs (1)
  • EmailAuthToken (3-12)
InvoiceReminder.Domain/Extensions/EntityExtensions.cs (1)
  • Guid (41-52)
InvoiceReminder.Application.UnitTests/AppServices/JobScheduleAppServiceTests.cs (3)
InvoiceReminder.Application.UnitTests/AppServices/ScanEmailDefinitionAppServiceTests.cs (1)
  • Faker (30-42)
InvoiceReminder.Application.UnitTests/AppServices/UserAppServiceTests.cs (1)
  • Faker (29-39)
InvoiceReminder.Domain/Entities/JobSchedule.cs (1)
  • JobSchedule (3-7)
InvoiceReminder.DomainEntities.UnitTests/Extensions/EntityExtensionsTests.cs (1)
InvoiceReminder.Infrastructure.UnitTests/Data/Repository/BaseRepositoryTests.cs (1)
  • TestEntity (341-347)
InvoiceReminder.API/Endpoints/LoginEndpoints.cs (6)
InvoiceReminder.API/Endpoints/GoogleOAuthEndpoints.cs (1)
  • RegisterEndpoints (9-16)
InvoiceReminder.API/Endpoints/InvoiceEndpoints.cs (1)
  • RegisterEndpoints (11-21)
InvoiceReminder.API/Endpoints/JobScheduleEndpoints.cs (1)
  • RegisterEndpoints (11-21)
InvoiceReminder.API/Endpoints/ScanEmailDefinitionEndpoints.cs (1)
  • RegisterEndpoints (11-22)
InvoiceReminder.API/Endpoints/SendMessageEndpoints.cs (1)
  • RegisterEndpoints (9-14)
InvoiceReminder.API/Endpoints/UserEndpoints.cs (1)
  • RegisterEndpoints (12-23)
InvoiceReminder.Application.UnitTests/AppServices/BaseAppServiceTests.cs (2)
InvoiceReminder.Application.UnitTests/AppServices/JobScheduleAppServiceTests.cs (2)
  • Faker (34-49)
  • Faker (51-66)
InvoiceReminder.Data/Repository/BaseRepository.cs (3)
  • Task (22-27)
  • Task (29-40)
  • Task (52-55)
InvoiceReminder.Infrastructure.UnitTests/Data/Repository/UserRepositoryTests.cs (4)
InvoiceReminder.Application.UnitTests/AppServices/InvoiceAppServiceTests.cs (1)
  • Faker (28-48)
InvoiceReminder.Application.UnitTests/AppServices/JobScheduleAppServiceTests.cs (2)
  • Faker (34-49)
  • Faker (51-66)
InvoiceReminder.Application.UnitTests/AppServices/UserAppServiceTests.cs (1)
  • Faker (29-39)
InvoiceReminder.DomainEntities.UnitTests/Extensions/UserExtensionsTests.cs (1)
  • Faker (31-44)
InvoiceReminder.Infrastructure.UnitTests/Data/Repository/ScanEmailDefinitionRepositoryTests.cs (1)
InvoiceReminder.Data/Repository/ScanEmailDefinitionRepository.cs (3)
  • Task (24-65)
  • Task (67-108)
  • Task (110-150)
InvoiceReminder.Application.UnitTests/AppServices/UserAppServiceTests.cs (3)
InvoiceReminder.Application.UnitTests/AppServices/InvoiceAppServiceTests.cs (1)
  • Faker (28-48)
InvoiceReminder.DomainEntities.UnitTests/Extensions/UserExtensionsTests.cs (1)
  • Faker (31-44)
InvoiceReminder.Domain/Extensions/EntityExtensions.cs (1)
  • Guid (41-52)
InvoiceReminder.API/Endpoints/UserEndpoints.cs (6)
InvoiceReminder.API/Endpoints/GoogleOAuthEndpoints.cs (1)
  • RegisterEndpoints (9-16)
InvoiceReminder.API/Endpoints/InvoiceEndpoints.cs (1)
  • RegisterEndpoints (11-21)
InvoiceReminder.API/Endpoints/JobScheduleEndpoints.cs (1)
  • RegisterEndpoints (11-21)
InvoiceReminder.API/Endpoints/LoginEndpoints.cs (1)
  • RegisterEndpoints (13-18)
InvoiceReminder.API/Endpoints/ScanEmailDefinitionEndpoints.cs (1)
  • RegisterEndpoints (11-22)
InvoiceReminder.API/Endpoints/SendMessageEndpoints.cs (1)
  • RegisterEndpoints (9-14)
InvoiceReminder.API/Endpoints/JobScheduleEndpoints.cs (6)
InvoiceReminder.API/Endpoints/GoogleOAuthEndpoints.cs (1)
  • RegisterEndpoints (9-16)
InvoiceReminder.API/Endpoints/InvoiceEndpoints.cs (1)
  • RegisterEndpoints (11-21)
InvoiceReminder.API/Endpoints/LoginEndpoints.cs (1)
  • RegisterEndpoints (13-18)
InvoiceReminder.API/Endpoints/ScanEmailDefinitionEndpoints.cs (1)
  • RegisterEndpoints (11-22)
InvoiceReminder.API/Endpoints/SendMessageEndpoints.cs (1)
  • RegisterEndpoints (9-14)
InvoiceReminder.API/Endpoints/UserEndpoints.cs (1)
  • RegisterEndpoints (12-23)
InvoiceReminder.API/Endpoints/SendMessageEndpoints.cs (6)
InvoiceReminder.API/Endpoints/GoogleOAuthEndpoints.cs (1)
  • RegisterEndpoints (9-16)
InvoiceReminder.API/Endpoints/InvoiceEndpoints.cs (1)
  • RegisterEndpoints (11-21)
InvoiceReminder.API/Endpoints/JobScheduleEndpoints.cs (1)
  • RegisterEndpoints (11-21)
InvoiceReminder.API/Endpoints/LoginEndpoints.cs (1)
  • RegisterEndpoints (13-18)
InvoiceReminder.API/Endpoints/ScanEmailDefinitionEndpoints.cs (1)
  • RegisterEndpoints (11-22)
InvoiceReminder.API/Endpoints/UserEndpoints.cs (1)
  • RegisterEndpoints (12-23)
⏰ 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 (76)
InvoiceReminder.API/Endpoints/GoogleOAuthEndpoints.cs (4)

7-16: Refatoração limpa e consistente com padrões do projeto.

A extração dos mapeamentos de endpoints para métodos auxiliares privados melhora a organização e manutenibilidade do código. O padrão é consistente com outros arquivos de endpoints no projeto (InvoiceEndpoints, UserEndpoints, LoginEndpoints, etc.).


18-33: Implementação correta do endpoint GetAuthUrl.

O método implementa corretamente o mapeamento do endpoint com:

  • Requisito de autorização apropriado (usuário precisa estar autenticado)
  • Tratamento de erros adequado usando o padrão Result
  • Documentação completa dos códigos de status HTTP

35-51: Endpoint de callback OAuth configurado corretamente.

A implementação está correta para um endpoint de callback OAuth:

  • AllowAnonymous() é apropriado, pois o Google redireciona para este endpoint
  • Parâmetros state e code seguem o padrão OAuth 2.0
  • Implementação assíncrona com CancellationToken está adequada

53-68: Endpoint de revogação implementado adequadamente.

O endpoint de revogação está bem implementado com:

  • Verbo HTTP DELETE apropriado para a operação de revogação
  • Requisito de autorização correto (usuário precisa estar autenticado)
  • Tratamento assíncrono adequado com suporte a cancelamento
InvoiceReminder.Infrastructure.UnitTests/InvoiceReminder.Infrastructure.UnitTests.csproj (1)

20-20: Adição apropriada da biblioteca Bogus para geração de dados de teste.

O pacote Bogus não possui dependências, reduzindo a superfície de ataque. A versão mais recente é 35.6.5, que é estável e ativamente mantida. A ausência de número de versão é consistente com o padrão de Gerenciamento Central de Pacotes utilizado no projeto.

InvoiceReminder.Application.UnitTests/AppServices/ScanEmailDefinitionAppServiceTests.cs (4)

1-1: Ótima adição da biblioteca Bogus para geração de dados de teste!

A introdução do Bogus é uma prática recomendada que melhora a manutenibilidade dos testes ao substituir valores hard-coded por dados gerados dinamicamente.

Also applies to: 7-7


19-19: Implementação correta do campo Faker!

O campo _faker está adequadamente declarado como readonly e inicializado no construtor, seguindo boas práticas de teste.

Also applies to: 27-28


30-42: Excelente implementação do método helper para geração de dados!

O método CreateScanEmailDefinitionFaker() está bem estruturado:

  • Configura todas as propriedades da entidade com geradores apropriados
  • Utiliza ToUniversalTime() para datas, garantindo consistência de fuso horário
  • Permite sobrescrever regras específicas quando necessário (padrão builder)
  • Usa PickRandom<InvoiceType>() para valores do enum de domínio

64-69: Refatoração consistente e bem executada nos testes!

Todas as modificações nos métodos de teste seguem um padrão consistente:

  • Valores primitivos (GUIDs, emails, nomes) são gerados através do _faker
  • Entidades complexas utilizam CreateScanEmailDefinitionFaker() com sobrescrita de propriedades específicas quando necessário
  • A geração de múltiplas entidades (linha 185) usa .Generate(3) adequadamente
  • Os testes mantêm sua cobertura e assertivas originais

A mudança melhora significativamente a manutenibilidade sem alterar o comportamento dos testes.

Also applies to: 96-97, 123-128, 155-156, 182-186, 211-211

InvoiceReminder.API/Endpoints/SendMessageEndpoints.cs (2)

7-8: Excelente! Constante de rota base centralizada.

A definição da constante basepath está consistente com o padrão utilizado em todos os outros arquivos de endpoints (LoginEndpoints, GoogleOAuthEndpoints, InvoiceEndpoints, etc.). Isso centraliza a configuração da rota e facilita manutenções futuras.


9-14: Refatoração consistente com o padrão estabelecido.

A refatoração do método RegisterEndpoints para usar MapGroup e um método auxiliar está alinhada com o padrão utilizado em todos os outros endpoints do projeto. Isso melhora a consistência e manutenibilidade do código.

InvoiceReminder.Application.UnitTests/AppServices/JobScheduleAppServiceTests.cs (4)

1-1: Importação apropriada do Bogus.

A adição da biblioteca Bogus para geração de dados de teste está alinhada com os objetivos da PR e é consistente com outros arquivos de teste no projeto.


21-32: Inicialização do Faker corretamente implementada.

O campo _faker está adequadamente declarado como readonly e inicializado no construtor, seguindo boas práticas para fixtures de teste.


34-49: Método helper bem estruturado e consistente.

O método CreateJobScheduleFaker() configura corretamente todas as propriedades da entidade JobSchedule e segue o mesmo padrão utilizado em outros testes do projeto (como UserAppServiceTests e ScanEmailDefinitionAppServiceTests). As expressões cron estão no formato válido para Quartz.


110-110: Uso apropriado dos fakers nos testes.

A integração do Bogus nos testes está implementada corretamente:

  • Geração de view models com CreateJobScheduleViewModelFaker().Generate()
  • Geração de valores simples com _faker.Random.Guid()
  • Uso de RuleFor para sobrescrever propriedades específicas ao gerar múltiplas instâncias

Essas mudanças melhoram a variabilidade dos dados de teste e reduzem a dependência de valores hardcoded.

Also applies to: 136-140, 165-165

InvoiceReminder.Infrastructure.UnitTests/Data/Repository/BaseRepositoryTests.cs (3)

1-16: Ótima adição do Bogus para geração de dados de teste.

A introdução da biblioteca Bogus e o campo _testEntityFaker melhoram significativamente a manutenibilidade dos testes ao centralizar a geração de dados.


33-33: Inicialização bem estruturada do Faker.

A configuração do faker no método Setup garante que cada teste tenha uma instância limpa e configurada adequadamente.

Also applies to: 44-49


60-60: Uso consistente do Faker em todos os testes.

A substituição da criação manual de entidades por _testEntityFaker.Generate() torna os testes mais limpos e consistentes.

Also applies to: 77-77, 101-101, 119-119, 141-141, 179-179, 203-203, 232-232

InvoiceReminder.Infrastructure.UnitTests/Data/Repository/UserRepositoryTests.cs (2)

1-1: LGTM! Integração do Bogus para geração de dados de teste.

A adição da biblioteca Bogus e do campo _userFaker segue o padrão já estabelecido em outros testes do projeto.

Also applies to: 19-19


89-89: Boa adição de asserção!

Verificar que result.Id não é Guid.Empty melhora a cobertura do teste e valida que a geração de dados está funcionando corretamente.

InvoiceReminder.API/Endpoints/ScanEmailDefinitionEndpoints.cs (2)

9-10: Excelente adição da constante basepath!

A centralização do caminho base em uma constante melhora a manutenibilidade e facilita futuras alterações. A constante é utilizada de forma consistente tanto no MapGroup quanto na construção do URI de resposta Created.


11-22: Refatoração bem executada do método RegisterEndpoints!

A extração dos registros de endpoints para métodos privados dedicados melhora significativamente a legibilidade e organização do código. O método RegisterEndpoints agora fornece uma visão clara de todos os endpoints disponíveis sem sobrecarregar com detalhes de implementação.

InvoiceReminder.Application.UnitTests/AppServices/EmailAuthTokenAppServiceTests.cs (5)

1-1: Excelente adoção do Bogus para geração de dados de teste!

A introdução da biblioteca Bogus está alinhada com o padrão adotado em outros testes do projeto (como visto em UserAppServiceTests.cs), melhorando a manutenibilidade e proporcionando dados de teste mais realistas e variados.


16-16: Inicialização adequada da instância Faker.

A instância _faker é corretamente declarada como readonly e inicializada no construtor, permitindo seu reúso em todos os métodos de teste. O padrão está consistente com outras classes de teste no projeto.

Also applies to: 24-25


27-39: Implementação robusta do helper de geração de dados.

O método CreateEmailAuthTokenFaker está muito bem estruturado:

  • Cobre todas as propriedades da entidade EmailAuthToken
  • Utiliza valores realistas (ex: provedores "Google", "Microsoft", "GitHub")
  • Aplica .ToUniversalTime() em todas as datas para garantir consistência UTC
  • Define AccessTokenExpiry com Date.Future(), garantindo que tokens gerados não estejam expirados por padrão
  • Segue o mesmo padrão observado em UserAppServiceTests.cs

61-61: Refatoração correta do teste com dados gerados.

A substituição de valores codificados manualmente pela geração via Faker está implementada corretamente:

  • userId gerado dinamicamente com _faker.Random.Guid()
  • emailAuthToken criado através do helper com sobrescritas apropriadas de UserId e TokenProvider
  • A lógica do teste permanece intacta, apenas o método de geração de dados foi aprimorado

Also applies to: 63-66


91-91: Consistência na geração de dados de teste.

O uso de _faker.Random.Guid() para gerar userId está consistente com as modificações no primeiro teste, mantendo o padrão uniforme em toda a classe.

InvoiceReminder.Application.UnitTests/AppServices/BaseAppServiceTests.cs (7)

1-1: Excelente integração do Bogus para geração de dados de teste!

A introdução da biblioteca Bogus melhora significativamente a manutenibilidade dos testes ao substituir dados codificados por dados gerados dinamicamente. A configuração dos fakers está correta e apropriada para as entidades de teste simples utilizadas.

Also applies to: 17-18, 28-32


39-39: Ótima substituição de dados codificados por dados gerados!

O uso de _entityViewModelFaker.Generate() melhora a qualidade dos testes ao fornecer dados variados em cada execução, tornando os testes mais robustos.


95-95: Geração de coleção implementada corretamente.

O uso de Generate(2) gera adequadamente uma coleção de 2 view models, mantendo a lógica do teste intacta enquanto melhora a variabilidade dos dados.


140-140: Dados gerados apropriadamente para o teste GetAll.

A geração de múltiplas entidades com _entityFaker.Generate(2) mantém a cobertura do teste enquanto adiciona variabilidade aos dados.


162-162: Melhorias na geração de dados e identificadores únicos.

O uso de _entityFaker.Generate() combinado com Guid.NewGuid() garante dados de teste únicos e variados em cada execução, melhorando o isolamento entre testes.

Also applies to: 167-167


184-185: GUID dinâmico melhora a qualidade do teste.

A substituição do GUID codificado por Guid.NewGuid() garante identificadores únicos em cada execução do teste, tornando-o mais realista e robusto.


207-207: Uso consistente de dados gerados nos testes de remoção e atualização.

A geração de view models com _entityViewModelFaker.Generate() está correta e alinhada com as assinaturas dos métodos testados, mantendo a consistência em toda a suite de testes.

Also applies to: 244-244

InvoiceReminder.Infrastructure.UnitTests/Data/Repository/ScanEmailDefinitionRepositoryTests.cs (3)

1-1: Importações corretas para suporte ao Bogus.

As importações estão adequadas: Bogus para geração de dados de teste e InvoiceReminder.Domain.Enums para o tipo InvoiceType usado na configuração do Faker.

Also applies to: 6-6


20-20: Inicialização adequada do Faker com TestInitialize.

A declaração do campo e o método Setup com [TestInitialize] garantem que o Faker seja recriado antes de cada teste, evitando contaminação entre testes. Padrão correto para MSTest.

Also applies to: 35-39


41-51: Configuração completa e apropriada do Faker.

O método InitializeFaker configura corretamente todas as propriedades de ScanEmailDefinition com geradores apropriados do Bogus. A escolha dos métodos (Company.CompanyName, Internet.Email, System.FileName, etc.) está adequada para cada tipo de propriedade.

InvoiceReminder.DomainEntities.UnitTests/Extensions/UserExtensionsTests.cs (1)

1-609: Excelente refatoração para uso da biblioteca Bogus!

A migração de dados de teste codificados manualmente para geração baseada em Faker melhora significativamente a manutenibilidade dos testes. A abordagem é consistente e o método auxiliar UserFaker oferece flexibilidade para diferentes cenários de teste. Os testes mantêm sua lógica e asserções originais enquanto se beneficiam de dados gerados dinamicamente.

InvoiceReminder.DomainEntities.UnitTests/Extensions/EntityExtensionsTests.cs (6)

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

A importação da biblioteca Bogus é apropriada e permite a geração de dados de teste mais realistas e manuteníveis em comparação com valores codificados.


16-18: Configuração adequada do gerador de dados!

A inicialização do _entityFaker com regras para Id e Name está bem estruturada e será reutilizada consistentemente nos testes.

Note que não há uma seed definida, o que significa que os dados gerados serão diferentes a cada execução. Isso é aceitável para estes testes, pois eles comparam as mesmas instâncias geradas dentro de cada método. Se houver necessidade de reproduzibilidade entre execuções, considere adicionar .UseSeed(valor) no futuro.


38-38: Excelente refatoração para usar dados gerados!

A substituição de valores codificados por dados gerados via _entityFaker.Generate() melhora significativamente a manutenibilidade dos testes. O padrão está aplicado consistentemente e as asserções foram corretamente atualizadas para referenciar as propriedades das entidades geradas.

Also applies to: 79-80, 122-122, 124-124, 141-141, 200-201


57-60: Uso intencional e correto de instâncias locais do Faker.

A criação de instâncias locais de Faker nestes testes específicos é apropriada e necessária. Estes testes precisam de controle preciso sobre propriedades específicas:

  • Testes de duplicação (linhas 57-60, 99-104, 219-223): Requerem múltiplas entidades com o mesmo Id para verificar a lógica de detecção de duplicatas
  • Testes de GUID vazio (linhas 161-162, 180-182): Necessitam de Guid.Empty para validar casos extremos

A abordagem mista (_entityFakerpara casos gerais eFaker` local para controle específico) demonstra um bom entendimento dos requisitos de cada teste.

Also applies to: 99-104, 161-162, 180-182, 219-223


197-213: Teste do HashSet está correto!

O teste verifica adequadamente que o método AddIfNotExists funciona com coleções do tipo HashSet. O método utiliza comparação baseada em ID internamente (via reflexão no método GetId), não dependendo da semântica de igualdade da coleção, portanto a ausência de override de Equals/GetHashCode em TestEntity não afeta a validade do teste.


1-1: O pacote Bogus é seguro e não apresenta vulnerabilidades conhecidas.

A análise de segurança do pacote Bogus não detectou riscos relacionados a malware, manipulação de código ou vulnerabilidades conhecidas. A versão atual 35.6.5 (lançada em 25 de outubro de 2025) está atualizada e o pacote não possui dependências externas, reduzindo a superfície de ataque.

InvoiceReminder.Data/Repository/BaseRepository.cs (2)

1-1: Adição do namespace alinhada com a migração de pacote.

A adição do using EFCore.BulkExtensions está correta e alinhada com a migração de Z.EntityFramework.Extensions.EFCore para EFCore.BulkExtensions.Dotnet10.


37-37: Verifique se o parâmetro cancellationToken é aceito pelo método BulkInsertAsync.

A sintaxe de parâmetro nomeado cancellationToken: cancellationToken é válida em C#, porém não foi possível confirmar em documentação pública se a versão do EFCore.BulkExtensions utilizada aceita explicitamente este parâmetro. Outras versões dessa biblioteca usam parâmetros como bulkConfig com sintaxe similar. Confirme a assinatura do método na documentação ou código-fonte da biblioteca em uso.

InvoiceReminder.DomainEntities.UnitTests/InvoiceReminder.DomainEntities.UnitTests.csproj (1)

19-19: Adição adequada do Bogus para geração de dados de teste.

A adição do pacote Bogus é uma melhoria apropriada para facilitar a geração de dados fictícios nos testes unitários, reduzindo a necessidade de dados codificados manualmente.

InvoiceReminder.JobScheduler.UnitTests/InvoiceReminder.JobScheduler.UnitTests.csproj (1)

18-18: Adição do Bogus consistente com melhorias nos testes.

A inclusão do Bogus neste projeto de testes está alinhada com as melhorias de geração de dados de teste aplicadas em outros projetos da solução.

InvoiceReminder.API.UnitTests/InvoiceReminder.API.UnitTests.csproj (1)

19-19: Adição do Bogus para testes de API.

A inclusão do pacote Bogus nos testes de API facilitará a criação de ViewModels e DTOs de teste com dados realistas.

InvoiceReminder.Application.UnitTests/InvoiceReminder.Application.UnitTests.csproj (1)

19-19: Adição do Bogus para testes da camada de aplicação.

A inclusão do Bogus nos testes da camada de aplicação permitirá gerar dados de teste mais robustos e variados para os serviços.

InvoiceReminder.sln (1)

68-68: Adição correta do global.json aos itens da solução.

A inclusão do arquivo global.json nos itens da solução está correta e torna o arquivo de configuração visível e facilmente acessível no Solution Explorer.

global.json (1)

1-9: Atualize para o .NET SDK 10.0.101 (versão mais recente).

A versão "10.0.100" é válida — .NET 10 foi lançado em 9 de dezembro de 2025. No entanto, a versão mais recente disponível atualmente é 10.0.101. Considere atualizar para garantir patches e melhorias mais recentes.

Likely an incorrect or invalid review comment.

InvoiceReminder.Data/InvoiceReminder.Data.csproj (1)

9-10: Confirme a intenção de usar versões pré-lançamento do adaptador de bulk extensions.

A migração do pacote antigo foi completada com sucesso — nenhuma referência a Z.EntityFramework.Extensions.EFCore permanece no código. No entanto, a pesquisa revela que os pacotes em uso (EFCore.BulkExtensions.Dotnet10) estão em status pré-lançamento (RC):

  • A versão estável atual é 9.0.2 (tanto para o pacote principal quanto para o adaptador PostgreSQL)
  • A versão v10 do adaptador PostgreSQL ainda não foi lançada oficialmente como estável
  • O projeto está usando versões de pré-lançamento que podem ser instáveis em produção

Se a escolha de versões pré-lançamento é intencional, documente o motivo. Caso contrário, considere migrar para a versão estável 9.0.2 ou aguardar o lançamento oficial do v10 para PostgreSQL.

InvoiceReminder.API/Endpoints/InvoiceEndpoints.cs (4)

11-21: Boa refatoração para modularidade.

A extração dos mapeamentos de endpoints para métodos privados MapXxx melhora a legibilidade e manutenibilidade do código. O padrão está consistente com os outros arquivos de endpoints no projeto.


23-38: LGTM!

O método MapGetInvoices está corretamente implementado com tratamento de resultado, autorização e metadados OpenAPI.


75-91: LGTM!

O método MapCreateInvoice está corretamente implementado e utiliza a constante basepath para construir a URL de localização no Results.Created.


93-127: LGTM!

Os métodos MapUpdateInvoice e MapDeleteInvoice estão corretamente implementados com os metadados de resposta apropriados.

InvoiceReminder.API/Endpoints/LoginEndpoints.cs (1)

22-48: LGTM!

A lógica de autenticação está correta. O endpoint valida credenciais, usa AllowAnonymous() apropriadamente, e retorna os códigos de status corretos (200, 400, 401, 500).

InvoiceReminder.API.UnitTests/Endpoints/InvoiceEndpointsTests.cs (4)

26-27: Boa adição do Bogus para geração de dados de teste.

A introdução do Faker melhora a qualidade dos testes ao usar dados variados em vez de valores fixos.


42-59: LGTM!

A configuração do Faker<InvoiceViewModel> está bem estruturada com regras apropriadas para cada propriedade.


70-71: LGTM!

O uso de .Generate(2) para criar uma lista de invoices é apropriado e não modifica a instância compartilhada.


407-408: LGTM!

O uso de .Generate() sem modificar regras é seguro.

InvoiceReminder.Application.UnitTests/AppServices/InvoiceAppServiceTests.cs (3)

28-48: Excelente padrão de factory method para o Faker.

O método CreateInvoiceFaker() retorna uma nova instância de Faker<Invoice> a cada chamada, evitando problemas de mutação de estado compartilhado. Este é o padrão correto que deveria ser aplicado também em InvoiceEndpointsTests.cs.


70-73: LGTM!

O uso de CreateInvoiceFaker().RuleFor(...).Generate() é seguro pois cada chamada cria uma nova instância do Faker.


1-26: LGTM!

A integração do Bogus está bem implementada com o campo _faker para geração de dados simples e o factory method para objetos complexos.

Directory.Packages.props (4)

54-54: LGTM!

A adição do Bogus 35.6.5 está alinhada com as mudanças nos testes unitários.


46-50: LGTM!

As atualizações de Scalar.AspNetCore, SonarAnalyzer.CSharp e Telegram.Bot são incrementais e apropriadas.


33-34: Nomes de pacote NuGet incorretos.

Os pacotes EFCore.BulkExtensions.Dotnet10 e EFCore.BulkExtensions.Dotnet10.PostgreSql não existem no NuGet. Os sufixos corretos são: .SqlServer/PostgreSql/MySql/Oracle/Sqlite. Além disso, apenas SqlServer e SQLite estão publicados como 10.0.0 RC, enquanto outros provedores ainda não foram atualizados para .NET 10. Corrija os nomes dos pacotes ou aguarde a disponibilidade da versão .NET 10 para PostgreSQL.

Likely an incorrect or invalid review comment.


7-28: Excelente organização dos pacotes essenciais do .NET.

A criação de um grupo separado para pacotes essenciais com versão consistente (10.0.1) melhora a manutenibilidade. .NET 10.0.1 foi lançado em dezembro de 2025 com correções não relacionadas a segurança incluindo atualizações no Runtime, ASP.NET Core, SDK, WinForms e Entity Framework Core.

InvoiceReminder.API/Endpoints/JobScheduleEndpoints.cs (4)

11-21: LGTM!

A refatoração para usar métodos MapXxx está bem implementada e consistente com os outros arquivos de endpoints.


40-56: Bom exemplo de metadados OpenAPI corretos.

Este endpoint corretamente inclui .Produces(StatusCodes.Status404NotFound) para documentar o status de retorno quando o recurso não é encontrado. InvoiceEndpoints.cs deveria seguir este padrão.


77-94: LGTM!

O método MapCreateJobSchedule está corretamente implementado com CancellationToken no lambda e uso adequado da constante basepath para a URL de criação.


96-132: LGTM!

Os métodos MapUpdateJobSchedule e MapDeleteJobSchedule estão bem implementados com tratamento de resultado apropriado.

InvoiceReminder.API/Endpoints/UserEndpoints.cs (1)

10-23: Excelente refatoração para métodos privados!

A extração das configurações de endpoints para métodos privados melhora a legibilidade e segue o padrão estabelecido em outros arquivos de endpoints do projeto (LoginEndpoints.cs, GoogleOAuthEndpoints.cs, InvoiceEndpoints.cs).

InvoiceReminder.API.UnitTests/Endpoints/JobScheduleEndPointsTests.cs (1)

26-52: Excelente implementação do Bogus para geração de dados de teste!

A configuração do Faker<JobScheduleViewModel> está bem estruturada:

  • Inclui todas as propriedades necessárias (Id, UserId, CronExpression, CreatedAt, UpdatedAt)
  • As expressões cron são realistas e cobrem vários cenários comuns
  • Datas são geradas apropriadamente (passado para CreatedAt, recente para UpdatedAt)

Essa abordagem melhora significativamente a manutenibilidade dos testes ao eliminar dados codificados e permitir geração de dados variados.

InvoiceReminder.JobScheduler.UnitTests/HostedService/QuartzHostedServiceTests.cs (1)

21-50: Excelente isolamento de testes com TestInitialize!

A implementação do [TestInitialize] e do InitializeFaker demonstra práticas exemplares de teste:

  • Limpa _schedules antes de cada teste, prevenindo poluição entre testes
  • Reinicializa o faker para garantir configuração consistente
  • Usa uma expressão cron válida por padrão ("0/5 * * * * ?")
  • Inicializa _schedules como lista vazia no construtor (linha 31)

Essa abordagem melhora significativamente o isolamento e a confiabilidade dos testes.

Comment thread InvoiceReminder.API.UnitTests/Endpoints/InvoiceEndpointsTests.cs Outdated
Comment thread InvoiceReminder.API.UnitTests/Endpoints/InvoiceEndpointsTests.cs Outdated
Comment thread InvoiceReminder.DomainEntities.UnitTests/Extensions/UserExtensionsTests.cs Outdated

@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: 6

🧹 Nitpick comments (4)
InvoiceReminder.DomainEntities.UnitTests/Extensions/UserExtensionsTests.cs (2)

25-25: Considere usar apenas caracteres numéricos para códigos de barras.

Códigos de barras tipicamente contêm apenas dígitos. O uso de faker.Random.AlphaNumeric(44) pode gerar dados que não correspondem às restrições do domínio.

🔎 Sugestão de ajuste
-            .RuleFor(e => e.Barcode, faker => faker.Random.AlphaNumeric(44))
+            .RuleFor(e => e.Barcode, faker => faker.Random.Replace("############################################"))

31-31: Considere adicionar variedade nas expressões cron.

A expressão cron está fixa em "0 9 * * *". Para maior variedade nos testes, considere gerar diferentes expressões válidas.

🔎 Sugestão de ajuste
-            .RuleFor(e => e.CronExpression, faker => "0 9 * * *");
+            .RuleFor(e => e.CronExpression, faker => $"0 {faker.Random.Int(0, 23)} * * *");
InvoiceReminder.Application.UnitTests/AppServices/UserAppServiceTests.cs (1)

35-36: Considere alinhar a geração de dados com outros arquivos de teste para consistência.

Para melhor manutenibilidade, considere:

  • Senha (linha 35): Usar faker.Internet.Password() em vez de faker.Random.AlphaNumeric(32) para consistência com UserExtensionsTests.cs e UserRepositoryTests.cs
  • TelegramChatId (linha 36): O intervalo difere de outros testes (UserRepositoryTests.cs usa Long(100000000, long.MaxValue))

Embora funcionais para testes, essas diferenças podem dificultar a manutenção futura.

🔎 Sugestão de alinhamento com outros testes
-            .RuleFor(u => u.Password, faker => faker.Random.AlphaNumeric(32))
-            .RuleFor(u => u.TelegramChatId, faker => faker.Random.Long(1000000, 9999999999))
+            .RuleFor(u => u.Password, faker => faker.Internet.Password())
+            .RuleFor(u => u.TelegramChatId, faker => faker.Random.Long(1))
InvoiceReminder.Infrastructure.UnitTests/Data/Repository/BaseRepositoryTests.cs (1)

210-211: Considere otimizar a geração do nome atualizado.

O código gera uma entidade completa apenas para extrair a propriedade Name. Embora funcional, uma abordagem mais direta seria usar _testEntityFaker.Generate().Name diretamente ou new Faker().Lorem.Word() para evitar a criação desnecessária de outros campos.

🔎 Sugestão de refatoração
-        var updatedName = _testEntityFaker.Generate().Name;
-        entity.Name = updatedName;
+        entity.Name = _testEntityFaker.Generate().Name;

Also applies to: 242-243

📜 Review details

Configuration used: Organization UI

Review profile: CHILL

Plan: Pro

📥 Commits

Reviewing files that changed from the base of the PR and between cd609d3 and eb91503.

📒 Files selected for processing (13)
  • .github/workflows/workflow-ci.yml (1 hunks)
  • InvoiceReminder.API.UnitTests/Endpoints/InvoiceEndpointsTests.cs (14 hunks)
  • InvoiceReminder.API/Endpoints/InvoiceEndpoints.cs (6 hunks)
  • InvoiceReminder.API/Endpoints/ScanEmailDefinitionEndpoints.cs (7 hunks)
  • InvoiceReminder.API/Endpoints/SendMessageEndpoints.cs (1 hunks)
  • InvoiceReminder.API/Endpoints/UserEndpoints.cs (6 hunks)
  • InvoiceReminder.Application.UnitTests/AppServices/BaseAppServiceTests.cs (9 hunks)
  • InvoiceReminder.Application.UnitTests/AppServices/JobScheduleAppServiceTests.cs (6 hunks)
  • InvoiceReminder.Application.UnitTests/AppServices/UserAppServiceTests.cs (4 hunks)
  • InvoiceReminder.DomainEntities.UnitTests/Extensions/UserExtensionsTests.cs (29 hunks)
  • InvoiceReminder.Infrastructure.UnitTests/Data/Repository/BaseRepositoryTests.cs (15 hunks)
  • InvoiceReminder.Infrastructure.UnitTests/Data/Repository/ScanEmailDefinitionRepositoryTests.cs (6 hunks)
  • InvoiceReminder.Infrastructure.UnitTests/Data/Repository/UserRepositoryTests.cs (5 hunks)
🚧 Files skipped from review as they are similar to previous changes (5)
  • InvoiceReminder.Infrastructure.UnitTests/Data/Repository/ScanEmailDefinitionRepositoryTests.cs
  • InvoiceReminder.API.UnitTests/Endpoints/InvoiceEndpointsTests.cs
  • InvoiceReminder.Infrastructure.UnitTests/Data/Repository/UserRepositoryTests.cs
  • InvoiceReminder.API/Endpoints/SendMessageEndpoints.cs
  • InvoiceReminder.API/Endpoints/InvoiceEndpoints.cs
🧰 Additional context used
🧬 Code graph analysis (6)
InvoiceReminder.Application.UnitTests/AppServices/JobScheduleAppServiceTests.cs (1)
InvoiceReminder.Domain/Entities/JobSchedule.cs (1)
  • JobSchedule (3-7)
InvoiceReminder.Application.UnitTests/AppServices/UserAppServiceTests.cs (3)
InvoiceReminder.DomainEntities.UnitTests/Extensions/UserExtensionsTests.cs (1)
  • Faker (52-68)
InvoiceReminder.Infrastructure.UnitTests/Data/Repository/UserRepositoryTests.cs (1)
  • Faker (33-41)
InvoiceReminder.Domain/Extensions/EntityExtensions.cs (1)
  • Guid (41-52)
InvoiceReminder.Infrastructure.UnitTests/Data/Repository/BaseRepositoryTests.cs (3)
InvoiceReminder.Application.UnitTests/AppServices/BaseAppServiceTests.cs (1)
  • TestEntity (285-291)
InvoiceReminder.Domain/Extensions/EntityExtensions.cs (1)
  • Guid (41-52)
InvoiceReminder.Data/Repository/BaseRepository.cs (5)
  • BaseRepository (8-94)
  • BaseRepository (15-20)
  • Task (22-27)
  • Task (29-40)
  • Task (52-55)
InvoiceReminder.API/Endpoints/UserEndpoints.cs (3)
InvoiceReminder.API/Endpoints/LoginEndpoints.cs (1)
  • RegisterEndpoints (13-18)
InvoiceReminder.API/Endpoints/GoogleOAuthEndpoints.cs (1)
  • RegisterEndpoints (9-16)
InvoiceReminder.Domain/Extensions/EntityExtensions.cs (1)
  • Guid (41-52)
InvoiceReminder.DomainEntities.UnitTests/Extensions/UserExtensionsTests.cs (5)
InvoiceReminder.Domain/Entities/JobSchedule.cs (1)
  • JobSchedule (3-7)
InvoiceReminder.Domain/Entities/EmailAuthToken.cs (1)
  • EmailAuthToken (3-12)
InvoiceReminder.Domain/Entities/ScanEmailDefinition.cs (1)
  • ScanEmailDefinition (5-13)
InvoiceReminder.Domain/Extensions/EntityExtensions.cs (1)
  • Guid (41-52)
InvoiceReminder.Domain/Entities/User.cs (2)
  • User (3-21)
  • User (14-20)
InvoiceReminder.API/Endpoints/ScanEmailDefinitionEndpoints.cs (3)
InvoiceReminder.API/Endpoints/SendMessageEndpoints.cs (1)
  • RegisterEndpoints (9-14)
InvoiceReminder.API/Endpoints/LoginEndpoints.cs (1)
  • RegisterEndpoints (13-18)
InvoiceReminder.API/Endpoints/GoogleOAuthEndpoints.cs (1)
  • RegisterEndpoints (9-16)
⏰ 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 (26)
InvoiceReminder.API/Endpoints/ScanEmailDefinitionEndpoints.cs (3)

9-10: Excelente refatoração com a introdução da constante basepath!

A centralização do caminho base em uma constante melhora a manutenibilidade e segue o princípio DRY. Esta abordagem está consistente com o padrão adotado em outros endpoints do projeto (LoginEndpoints, SendMessageEndpoints, GoogleOAuthEndpoints).


15-22: Ótima modularização dos endpoints!

A extração dos registros de endpoints em métodos privados dedicados (MapGetScanEmailDefinitions, MapGetScanEmailDefinition, etc.) melhora significativamente a legibilidade e organização do código, tornando cada endpoint mais fácil de manter e testar individualmente.


56-56: Melhoria na documentação da API com adição de códigos 404!

A inclusão de .Produces(StatusCodes.Status404NotFound) nos endpoints GET (GetScanEmailDefinition, GetByUserId, GetBySenderEmailAddress) melhora a precisão da documentação OpenAPI/Swagger, refletindo corretamente o comportamento quando recursos não são encontrados.

Also applies to: 75-75, 97-97

InvoiceReminder.API/Endpoints/UserEndpoints.cs (3)

10-11: Consistência na refatoração com introdução do basepath!

A centralização do caminho base segue o mesmo padrão de refatoração aplicado em ScanEmailDefinitionEndpoints e outros endpoints do projeto, garantindo consistência arquitetural em toda a aplicação.


16-23: Modularização dos endpoints bem executada!

A extração dos sete endpoints (MapGetUsers, MapGetUser, MapGetUserByEmail, MapCreateUser, MapCreateUsers, MapUpdateUser, MapDeleteUser) em métodos privados melhora a organização do código e facilita manutenção futura. O padrão está consistente com as demais refatorações no projeto.


87-87: Uso correto do basepath nas respostas Created!

As respostas Created utilizam apropriadamente a constante basepath para gerar as URIs de localização dos recursos:

  • Linha 87: /api/user/{id} para criação individual
  • Linha 110: /api/user para inserção em lote

Isso garante consistência e facilita futuras mudanças no caminho base.

Also applies to: 110-110

InvoiceReminder.DomainEntities.UnitTests/Extensions/UserExtensionsTests.cs (5)

1-3: LGTM!

As importações estão corretas para suportar a geração de dados de teste com Bogus e os enums necessários.


12-50: Excelente progresso na configuração dos fakers!

Os fakers agora incluem todas as propriedades obrigatórias das entidades, resolvendo o problema crítico identificado na revisão anterior. A configuração está abrangente e realista.


52-68: LGTM!

O método helper CreateFaker está bem projetado, permitindo criação flexível de usuários com coleções pré-populadas ou vazias. O padrão de null-coalescing garante que as coleções nunca sejam nulas, alinhando-se com o construtor da entidade User.


70-239: LGTM!

Os métodos de teste utilizam corretamente os fakers para geração de dados. O padrão é consistente e os cenários de teste cobrem adequadamente casos de novos usuários, usuários existentes e manipulação de coleções.


240-633: LGTM!

Os cenários de teste restantes estão bem estruturados e cobrem casos importantes como prevenção de duplicatas, manipulação de coleções nulas e parâmetros nulos. O uso dos fakers é consistente e correto em todos os métodos. O erro de digitação mencionado na revisão anterior foi corrigido.

InvoiceReminder.Application.UnitTests/AppServices/BaseAppServiceTests.cs (3)

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

A importação do Bogus e a declaração dos campos faker estão corretas. Isso melhora significativamente a geração de dados de teste, tornando-os mais realistas e variados.

Also applies to: 17-18


45-45: Excelente refatoração para usar dados gerados!

A substituição de dados hard-coded por dados gerados via Bogus melhora significativamente a robustez dos testes, permitindo maior variedade de cenários. O uso de Guid.NewGuid() nos testes de GetByIdAsync também é apropriado para os cenários onde IDs específicos não são necessários.

Also applies to: 101-101, 146-146, 168-168, 173-173, 190-190, 213-213, 250-250


285-291: Classes de teste bem estruturadas.

As definições de TestEntity e TestEntityViewModel estão corretas e incluem todas as propriedades necessárias para suportar os fakers do Bogus. O uso de sealed é apropriado para classes de teste.

Also applies to: 293-299

InvoiceReminder.Application.UnitTests/AppServices/JobScheduleAppServiceTests.cs (6)

1-1: LGTM!

A importação do Bogus é apropriada para a nova abordagem de geração de dados de teste.


21-22: LGTM!

Boa prática centralizar as expressões cron válidas como campo readonly. Isso facilita a manutenção e reutilização nos testes.


106-106: LGTM!

Ótima melhoria na variabilidade dos dados de teste. A substituição de dados hard-coded por geração via Bogus torna o teste mais robusto e realista.


132-136: LGTM!

Excelente uso do RuleFor para sobrescrever o UserId e garantir que todos os 3 registros gerados compartilhem o mesmo ID de usuário. A implementação está correta e clara.


161-161: LGTM!

Mudança simples e apropriada, consistente com a abordagem de geração de dados via Bogus adotada no arquivo.


32-42: As expressões cron estão válidas para Quartz.

Quartz cron expressions consistem em 6 ou 7 campos separados por espaço, sendo a ordem: segundos, minutos, horas, dia do mês, mês, dia da semana, e ano. Todas as 7 expressões utilizam corretamente 6 campos (o ano é opcional) e seguem a sintaxe válida do Quartz. O caractere '?' é permitido para os campos de dia-do-mês e dia-da-semana e é usado para especificar "nenhum valor específico", o que está correto nas expressões fornecidas. Os nomes de dias da semana em maiúsculas (como "MON") também são suportados.

InvoiceReminder.Application.UnitTests/AppServices/UserAppServiceTests.cs (4)

1-1: Adição do Bogus está correta e alinhada com os objetivos do PR.

A importação da biblioteca Bogus e a declaração do campo _faker seguem as convenções adequadas para geração de dados de teste.

Also applies to: 18-18


26-27: Inicialização do Faker no construtor está correta.

A inicialização da instância Faker no construtor é apropriada para operações simples de geração de dados.


66-67: Excelente uso do Faker para geração de dados de teste.

A substituição de dados codificados por dados gerados via Faker melhora a manutenibilidade dos testes. Derivar o email do usuário gerado garante consistência entre os dados de teste.


92-92: Uso apropriado do Faker para geração de email.

A substituição do email codificado por um valor gerado via Faker está correta e melhora a variedade dos dados de teste.

InvoiceReminder.Infrastructure.UnitTests/Data/Repository/BaseRepositoryTests.cs (2)

1-1: Ótima adoção do Bogus para geração de dados de teste!

A integração do Bogus melhora significativamente a qualidade dos testes ao gerar dados aleatórios e consistentes. A inicialização do faker em InitializeFaker() está correta, definindo regras apropriadas para Id e Name. Note que CreatedAt e UpdatedAt não são definidos no faker, o que está correto, pois são atribuídos pelo método BulkInsertAsync via reflexão.

Also applies to: 16-16, 33-33, 44-49


60-60: Substituição consistente de instanciação manual por geração via Faker.

A substituição de instanciações manuais de TestEntity por _testEntityFaker.Generate() ou _testEntityFaker.Generate(n) está implementada corretamente em todos os testes, proporcionando dados de teste mais variados e realistas.

Also applies to: 77-77, 101-101, 119-119, 141-141, 179-179, 203-203

Comment thread .github/workflows/workflow-ci.yml
Comment thread InvoiceReminder.Application.UnitTests/AppServices/BaseAppServiceTests.cs Outdated
Comment thread InvoiceReminder.Application.UnitTests/AppServices/UserAppServiceTests.cs Outdated
Comment thread InvoiceReminder.Infrastructure.UnitTests/Data/Repository/BaseRepositoryTests.cs Outdated

@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

♻️ Duplicate comments (1)
InvoiceReminder.Application.UnitTests/AppServices/BaseAppServiceTests.cs (1)

28-40: Excelente! A lógica de geração de datas está correta.

A configuração dos fakers garante consistência temporal: UpdatedAt é gerado usando faker.Date.Between(entity.CreatedAt, DateTime.UtcNow), garantindo que UpdatedAt sempre será maior ou igual a CreatedAt. Isso resolve a preocupação levantada no comentário de revisão anterior.

🧹 Nitpick comments (3)
InvoiceReminder.Application.UnitTests/AppServices/BaseAppServiceTests.cs (1)

167-186: Considere usar o ID da entidade gerada para melhorar a clareza do teste.

O teste gera uma entidade na linha 170, mas chama GetByIdAsync com Guid.NewGuid() na linha 175. Embora funcionalmente correto (já que o repositório está mockado para retornar a entidade para qualquer Guid), usar entity.Id tornaria o teste mais explícito e fácil de entender.

🔎 Refatoração sugerida para melhorar a clareza
     // Arrange
     var entity = _entityFaker.Generate();
 
     _ = _repository.GetByIdAsync(Arg.Any<Guid>(), Arg.Any<CancellationToken>()).Returns(entity);
 
     // Act
-    var result = await _appService.GetByIdAsync(Guid.NewGuid(), TestContext.CancellationToken);
+    var result = await _appService.GetByIdAsync(entity.Id, TestContext.CancellationToken);
InvoiceReminder.Infrastructure.UnitTests/Data/Repository/BaseRepositoryTests.cs (2)

210-211: Considere gerar apenas o nome em vez da entidade completa.

Gerar uma entidade completa apenas para obter o valor de Name é desnecessário. Você pode usar diretamente new Faker().Lorem.Word() para maior eficiência.

🔎 Refatoração sugerida
-        var updatedName = _testEntityFaker.Generate().Name;
-        entity.Name = updatedName;
+        entity.Name = new Faker().Lorem.Word();

242-243: Considere gerar apenas o nome em vez da entidade completa.

Gerar uma entidade completa apenas para obter o valor de Name é desnecessário. Você pode usar diretamente new Faker().Lorem.Word() para maior eficiência.

🔎 Refatoração sugerida
-        var updatedName = _testEntityFaker.Generate().Name;
-        entity.Name = updatedName;
+        entity.Name = new Faker().Lorem.Word();
📜 Review details

Configuration used: Organization UI

Review profile: CHILL

Plan: Pro

📥 Commits

Reviewing files that changed from the base of the PR and between eb91503 and 44adadc.

📒 Files selected for processing (6)
  • .github/workflows/workflow-ci.yml (1 hunks)
  • InvoiceReminder.Application.UnitTests/AppServices/BaseAppServiceTests.cs (9 hunks)
  • InvoiceReminder.Application.UnitTests/AppServices/JobScheduleAppServiceTests.cs (6 hunks)
  • InvoiceReminder.Application.UnitTests/AppServices/UserAppServiceTests.cs (4 hunks)
  • InvoiceReminder.DomainEntities.UnitTests/Extensions/UserExtensionsTests.cs (29 hunks)
  • InvoiceReminder.Infrastructure.UnitTests/Data/Repository/BaseRepositoryTests.cs (14 hunks)
🧰 Additional context used
🧬 Code graph analysis (4)
InvoiceReminder.Infrastructure.UnitTests/Data/Repository/BaseRepositoryTests.cs (2)
InvoiceReminder.Application.UnitTests/AppServices/BaseAppServiceTests.cs (1)
  • TestEntity (287-293)
InvoiceReminder.Domain/Extensions/EntityExtensions.cs (1)
  • Guid (41-52)
InvoiceReminder.Application.UnitTests/AppServices/UserAppServiceTests.cs (2)
InvoiceReminder.DomainEntities.UnitTests/Extensions/UserExtensionsTests.cs (1)
  • Faker (52-68)
InvoiceReminder.Infrastructure.UnitTests/Data/Repository/UserRepositoryTests.cs (1)
  • Faker (33-41)
InvoiceReminder.Application.UnitTests/AppServices/JobScheduleAppServiceTests.cs (3)
InvoiceReminder.Application.UnitTests/AppServices/UserAppServiceTests.cs (1)
  • Faker (29-43)
InvoiceReminder.Application.UnitTests/AppServices/ScanEmailDefinitionAppServiceTests.cs (1)
  • Faker (30-42)
InvoiceReminder.Domain/Entities/JobSchedule.cs (1)
  • JobSchedule (3-7)
InvoiceReminder.DomainEntities.UnitTests/Extensions/UserExtensionsTests.cs (4)
InvoiceReminder.Domain/Entities/JobSchedule.cs (1)
  • JobSchedule (3-7)
InvoiceReminder.Domain/Entities/EmailAuthToken.cs (1)
  • EmailAuthToken (3-12)
InvoiceReminder.Domain/Entities/ScanEmailDefinition.cs (1)
  • ScanEmailDefinition (5-13)
InvoiceReminder.Domain/Entities/User.cs (2)
  • User (3-21)
  • User (14-20)
⏰ 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 (21)
.github/workflows/workflow-ci.yml (1)

25-32: Correção aplicada corretamente! A issue crítica anterior foi resolvida.

O uso de $GITHUB_ENV nas linhas 30-31 garante que as variáveis LANG e LC_ALL persistam entre os steps subsequentes (restore, build, testes). Esta é a abordagem correta para o GitHub Actions, resolvendo a issue crítica identificada anteriormente onde export não persistiria as variáveis entre steps.

A implementação está alinhada com as melhores práticas do GitHub Actions.

InvoiceReminder.Application.UnitTests/AppServices/BaseAppServiceTests.cs (1)

1-1: LGTM! Implementação consistente do Bogus para geração de dados de teste.

A introdução do Bogus melhora significativamente a qualidade dos testes ao substituir dados estáticos por dados gerados dinamicamente. A implementação está consistente em todos os métodos de teste, e as entidades de teste foram adequadamente atualizadas com as propriedades necessárias (Id, CreatedAt, UpdatedAt).

Also applies to: 17-18, 47-47, 103-103, 148-148, 170-170, 215-215, 252-252, 287-301

InvoiceReminder.Application.UnitTests/AppServices/JobScheduleAppServiceTests.cs (7)

21-22: LGTM!

A declaração dos campos _faker e _validCronExpressions como readonly está correta e segue o padrão adotado em outros arquivos de teste do projeto.


33-41: LGTM!

As expressões cron são válidas para o Quartz e os comentários explicativos facilitam a manutenção. Boa prática centralizar essas expressões para reutilização nos testes.


44-52: Correção da geração de datas aplicada corretamente.

A lógica de geração de datas foi corrigida conforme sugerido na revisão anterior. Agora UpdatedAt é garantidamente posterior ou igual a CreatedAt usando faker.Date.Between(j.CreatedAt, DateTime.UtcNow).


54-62: Correção da geração de datas aplicada corretamente.

A mesma correção foi aplicada neste método, garantindo que UpdatedAt >= CreatedAt. A consistência entre CreateJobScheduleFaker e CreateJobScheduleViewModelFaker está adequada.


106-106: LGTM!

Uso correto do helper Faker para gerar dados de teste dinâmicos. Melhora a robustez do teste ao validar com dados variados.


132-136: LGTM!

Boa abordagem sobrescrever o UserId com .RuleFor(j => j.UserId, userId) após criar o Faker base, garantindo que todos os registros gerados compartilhem o mesmo usuário para o teste.


161-161: LGTM!

Uso consistente do _faker.Random.Guid() para geração de IDs de teste.

InvoiceReminder.Infrastructure.UnitTests/Data/Repository/BaseRepositoryTests.cs (3)

44-49: LGTM! Inicialização do Faker segue as melhores práticas.

A configuração do Faker está correta e segue as convenções da biblioteca Bogus. As regras para Id e Name são apropriadas para geração de dados de teste, e a chamada em Setup garante o isolamento entre testes.


60-60: LGTM! Uso consistente do Faker para geração de dados de teste.

A substituição de entidades hard-coded por dados gerados via Faker melhora a manutenibilidade e a qualidade dos testes. A implementação é consistente em todos os métodos de teste e não apresenta problemas de mutação de estado.

Also applies to: 77-77, 101-101, 119-119, 141-141, 179-179, 203-203, 232-232


264-273: LGTM! A questão de mutação de estado foi corrigida.

A implementação agora segue a abordagem recomendada no comentário de revisão anterior: gera as entidades primeiro e depois define a propriedade Name diretamente, evitando a mutação do faker compartilhado. Excelente correção!

InvoiceReminder.Application.UnitTests/AppServices/UserAppServiceTests.cs (5)

1-1: LGTM!

A adição da diretiva using Bogus é apropriada e necessária para suportar a geração de dados de teste com Faker introduzida neste arquivo.


18-18: LGTM!

A declaração e inicialização do campo _faker estão corretas. O uso como readonly é uma boa prática e a instância é apropriada para geração simples de dados de teste.

Also applies to: 26-27


29-43: LGTM!

O método CreateFaker() está bem implementado e segue os padrões estabelecidos em outros arquivos de teste do projeto. A configuração de todas as propriedades do User com regras apropriadas do Faker melhora a qualidade e manutenibilidade dos testes.

Nota: A issue anterior sobre a duplicação da regra UpdatedAt foi resolvida - o código atual define essa propriedade apenas uma vez na linha 38.


65-66: LGTM!

A mudança para usar CreateFaker().Generate() melhora a qualidade do teste ao utilizar dados gerados de forma consistente, em vez de dados codificados manualmente.


91-91: LGTM!

O uso de _faker.Internet.Email() é apropriado para este teste de cenário negativo, gerando um email aleatório que não deve existir no repositório.

InvoiceReminder.DomainEntities.UnitTests/Extensions/UserExtensionsTests.cs (4)

1-3: Importações apropriadas para suporte a Bogus.

As importações de Bogus e InvoiceReminder.Domain.Enums são adequadas para a geração de dados de teste utilizando fakers e para referenciar o enum InvoiceType.


12-50: Excelente implementação dos fakers com todas as propriedades obrigatórias configuradas!

Os fakers agora estão completamente configurados com todas as propriedades obrigatórias das entidades, resolvendo o problema crítico apontado em revisões anteriores. Cada faker inclui:

  • Invoice: UserId, Bank, Beneficiary, Amount, Barcode, DueDate (44 dígitos para código de barras é apropriado)
  • JobSchedule: UserId, CronExpression (formato de cron válido)
  • EmailAuthToken: UserId, AccessToken, RefreshToken, NonceValue, TokenProvider, AccessTokenExpiry
  • ScanEmailDefinition: UserId, InvoiceType, Beneficiary, Description, SenderEmailAddress, AttachmentFileName

A geração de dados é realista e utiliza os métodos apropriados do Bogus (Finance, Company, Internet, System, etc.). O uso de .ToUniversalTime() nas datas garante consistência.


52-68: Helper CreateFaker bem projetado para flexibilidade nos testes.

O método CreateFaker está bem estruturado, permitindo criar usuários com coleções pré-populadas opcionalmente. O uso de parâmetros opcionais com valores padrão e o operador de coalescência nula (??) para inicializar coleções vazias proporcionam flexibilidade aos testes, possibilitando cenários tanto com coleções vazias quanto pré-populadas.


70-634: Cobertura de testes abrangente com uso consistente de fakers.

Os métodos de teste estão bem estruturados e cobrem cenários diversos:

  • Criação de novos usuários com e sem entidades relacionadas
  • Adição de itens a usuários existentes
  • Prevenção de duplicatas
  • Tratamento de coleções vazias e nulas
  • Validação de parâmetros nulos

O uso consistente dos fakers melhora a qualidade dos dados de teste, tornando-os mais realistas e reduzindo a manutenção. O padrão Arrange-Act-Assert é seguido consistentemente.

@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

♻️ Duplicate comments (1)
InvoiceReminder.Infrastructure.UnitTests/Data/Repository/BaseRepositoryTests.cs (1)

241-241: Aplique a mesma otimização sugerida na linha 210.

Esta linha tem o mesmo problema de eficiência da linha 210 ao criar uma nova instância de Faker(). Considere usar uma das alternativas sugeridas anteriormente para manter a consistência.

🧹 Nitpick comments (1)
InvoiceReminder.Infrastructure.UnitTests/Data/Repository/BaseRepositoryTests.cs (1)

210-210: Considere reutilizar o faker compartilhado ou usar string literal.

Criar uma nova instância de Faker() apenas para gerar um nome é ineficiente. Além disso, Name.FullName() gera strings potencialmente mais longas que o Lorem.Word() usado na inicialização, o que pode causar inconsistências se houver restrições de tamanho no campo Name.

🔎 Alternativas sugeridas

Alternativa 1: Usar string literal para maior clareza

-        entity.Name = new Faker().Name.FullName();
+        entity.Name = "UpdatedName";

Alternativa 2: Usar o faker compartilhado

-        entity.Name = new Faker().Name.FullName();
+        entity.Name = _testEntityFaker.Generate().Name;

Alternativa 3: Criar faker estático para nomes

No início da classe:

private static readonly Faker _faker = new();

No teste:

-        entity.Name = new Faker().Name.FullName();
+        entity.Name = _faker.Lorem.Word();
📜 Review details

Configuration used: Organization UI

Review profile: CHILL

Plan: Pro

📥 Commits

Reviewing files that changed from the base of the PR and between 44adadc and 13926b7.

📒 Files selected for processing (2)
  • InvoiceReminder.Application.UnitTests/AppServices/BaseAppServiceTests.cs (9 hunks)
  • InvoiceReminder.Infrastructure.UnitTests/Data/Repository/BaseRepositoryTests.cs (14 hunks)
⏰ 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 (10)
InvoiceReminder.Infrastructure.UnitTests/Data/Repository/BaseRepositoryTests.cs (6)

1-16: Boa adição do Bogus para geração de dados de teste.

A importação do Bogus e a declaração do campo _testEntityFaker seguem o padrão recomendado para geração de dados de teste. A abordagem de usar uma instância compartilhada do faker é apropriada para este cenário.


33-33: Inicialização adequada do faker no setup do teste.

A chamada a InitializeFaker() no método Setup garante que o faker seja configurado corretamente antes de cada teste, evitando contaminação de estado entre testes.


44-49: Método de inicialização bem estruturado.

O método InitializeFaker() centraliza a configuração das regras do Faker, tornando a manutenção mais fácil e garantindo consistência na geração de dados de teste.


60-60: Uso correto do faker para geração de entidade única.

A substituição da criação manual por _testEntityFaker.Generate() melhora a manutenibilidade e consistência dos dados de teste.


77-77: Geração eficiente de múltiplas entidades.

O uso de _testEntityFaker.Generate(2) é uma forma limpa e eficiente de criar múltiplas entidades de teste com dados aleatórios.


262-271: Excelente resolução do problema de mutação do faker compartilhado.

A implementação atual aborda corretamente a preocupação levantada no comentário de revisão anterior. Ao gerar as entidades primeiro com _testEntityFaker.Generate() e depois definir a propriedade Name individualmente, você evita mutar as regras do faker compartilhado, garantindo que outros testes não sejam afetados.

Esta é exatamente a Solução 1 recomendada na revisão anterior.

InvoiceReminder.Application.UnitTests/AppServices/BaseAppServiceTests.cs (4)

1-1: LGTM! Integração do Bogus para geração de dados de teste.

A introdução da biblioteca Bogus melhora significativamente a qualidade dos testes ao substituir dados codificados manualmente por dados gerados dinamicamente, aumentando a cobertura de cenários de teste.

Also applies to: 17-18


28-40: Excelente! Correção da lógica de datas aplicada conforme sugerido.

A configuração dos fakers agora garante consistência temporal: UpdatedAt é gerado usando faker.Date.Between(entity.CreatedAt, DateTime.UtcNow), assegurando que sempre será maior ou igual a CreatedAt. Isso resolve o problema identificado na revisão anterior.


47-47: LGTM! Uso apropriado dos fakers nos métodos de teste.

A substituição de dados codificados manualmente por dados gerados via Bogus está implementada corretamente em todos os testes. Destaque para:

  • Uso adequado de .Generate() e .Generate(count) conforme necessário
  • Linha 175: Uso correto de entity.Id do objeto gerado
  • Linha 192: Uso apropriado de Guid.NewGuid() para o cenário de "entidade não encontrada"

Also applies to: 103-103, 148-148, 170-170, 175-175, 192-193, 215-215, 252-252


287-293: LGTM! Definições das classes de teste atualizadas adequadamente.

As classes TestEntity e TestEntityViewModel foram corretamente atualizadas como public sealed com as propriedades necessárias (Id, CreatedAt, UpdatedAt) para suportar a geração de dados via Bogus. A estrutura espelhada entre entidade e view model mantém consistência nos testes.

Also applies to: 295-301

@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 (1)
InvoiceReminder.Infrastructure.UnitTests/Data/Repository/BaseRepositoryTests.cs (1)

210-210: Considere gerar apenas o nome para melhor eficiência.

O padrão _testEntityFaker.Generate().Name gera uma entidade completa apenas para extrair a propriedade Name. Embora funcional e o overhead seja negligenciável em testes, você poderia criar um método auxiliar ou usar new Faker().Lorem.Word() diretamente para maior clareza de intenção.

🔎 Refatoração opcional

Adicione um método auxiliar na classe ou use Faker diretamente:

-        entity.Name = _testEntityFaker.Generate().Name;
+        entity.Name = new Faker().Lorem.Word();

Ou crie um método auxiliar:

private string GenerateRandomName() => new Faker().Lorem.Word();

E use:

-        entity.Name = _testEntityFaker.Generate().Name;
+        entity.Name = GenerateRandomName();

Also applies to: 241-241

📜 Review details

Configuration used: Organization UI

Review profile: CHILL

Plan: Pro

📥 Commits

Reviewing files that changed from the base of the PR and between 13926b7 and 9426c2d.

📒 Files selected for processing (1)
  • InvoiceReminder.Infrastructure.UnitTests/Data/Repository/BaseRepositoryTests.cs (14 hunks)
🧰 Additional context used
🧬 Code graph analysis (1)
InvoiceReminder.Infrastructure.UnitTests/Data/Repository/BaseRepositoryTests.cs (3)
InvoiceReminder.Application.UnitTests/AppServices/BaseAppServiceTests.cs (1)
  • TestEntity (287-293)
InvoiceReminder.Domain/Extensions/EntityExtensions.cs (1)
  • Guid (41-52)
InvoiceReminder.Data/Repository/BaseRepository.cs (5)
  • BaseRepository (8-94)
  • BaseRepository (15-20)
  • Task (22-27)
  • Task (29-40)
  • Task (52-55)
⏰ 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 (4)
InvoiceReminder.Infrastructure.UnitTests/Data/Repository/BaseRepositoryTests.cs (4)

1-1: LGTM! Integração do Bogus está bem estruturada.

A importação do Bogus e a declaração do campo _testEntityFaker estão corretas. A inicialização por teste garante isolamento entre os testes.

Also applies to: 16-16


33-33: LGTM! Inicialização do Faker está apropriada.

A configuração do Faker com Guid.NewGuid() para Id e Lorem.Word() para Name é adequada para geração de dados de teste. A inicialização no TestInitialize garante que cada teste comece com um Faker limpo.

Also applies to: 44-49


60-60: LGTM! Uso consistente do Faker para geração de entidades.

As chamadas _testEntityFaker.Generate() e _testEntityFaker.Generate(n) substituem adequadamente as inicializações inline anteriores, tornando os testes mais concisos e mantendo a geração de dados centralizada.

Also applies to: 77-77, 101-101, 119-119, 141-141, 179-179, 203-203, 231-231


262-271: Excelente! O problema anterior foi corrigido.

O código agora gera as entidades primeiro com _testEntityFaker.Generate() e depois atribui os valores de Name individualmente, evitando a mutação do faker compartilhado com RuleFor. Esta é exatamente a abordagem recomendada no comentário de revisão anterior.

@jldsilva jldsilva merged commit 01e3730 into development Dec 19, 2025
4 checks passed
@jldsilva jldsilva deleted the Packages-Update branch December 19, 2025 16:34
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

dependencies Pull requests that update a dependency file .NET Pull requests that update .NET code

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant