From 9587cb6e606d1984869a3e7274b62b880ffce090 Mon Sep 17 00:00:00 2001 From: David Garton Date: Thu, 9 Apr 2026 00:04:47 -0400 Subject: [PATCH] Align Sqlite enrich behavior Make EnrichSqliteDatabaseDbContext follow the Aspire enrich pattern by requiring the DbContext to already be registered instead of registering it itself. Update the tests to reflect the new contract, including coverage for missing DbContext registration and successful enrichment of an existing registration. --- .../AspireEFSqliteExtensions.cs | 8 ++-- .../EnrichSqliteDatabaseDbContextTests.cs | 37 +++++++++++-------- 2 files changed, 26 insertions(+), 19 deletions(-) diff --git a/src/CommunityToolkit.Aspire.Microsoft.EntityFrameworkCore.Sqlite/AspireEFSqliteExtensions.cs b/src/CommunityToolkit.Aspire.Microsoft.EntityFrameworkCore.Sqlite/AspireEFSqliteExtensions.cs index 52bd18e8f..daff5560b 100644 --- a/src/CommunityToolkit.Aspire.Microsoft.EntityFrameworkCore.Sqlite/AspireEFSqliteExtensions.cs +++ b/src/CommunityToolkit.Aspire.Microsoft.EntityFrameworkCore.Sqlite/AspireEFSqliteExtensions.cs @@ -71,13 +71,13 @@ void ConfigureDbContext(DbContextOptionsBuilder dbContextOptionsBuilder) } /// - /// Enriches a to register the as a scoped service - /// with simplified configuration and optional OpenTelemetry instrumentation. + /// Configures retries, health check, logging and telemetry for the . /// /// The type of the . /// The to read config from and add services to. /// An optional delegate that can be used for customizing options. It's invoked after the settings are read from the configuration. /// Thrown if mandatory is null. + /// Thrown when mandatory is not registered in DI. public static void EnrichSqliteDatabaseDbContext<[DynamicallyAccessedMembers(RequiredByEF)] TDbContext>( this IHostApplicationBuilder builder, Action? configureSettings = null) @@ -93,8 +93,8 @@ void ConfigureDbContext(DbContextOptionsBuilder dbContextOptionsBuilder) configureSettings?.Invoke(settings); - builder.Services.AddDbContext(options => - options.UseSqlite(settings.ConnectionString)); + builder.CheckDbContextRegistered(); + ConfigureInstrumentation(builder, settings); } diff --git a/tests/CommunityToolkit.Aspire.Microsoft.EntityFrameworkCore.Sqlite.Tests/EnrichSqliteDatabaseDbContextTests.cs b/tests/CommunityToolkit.Aspire.Microsoft.EntityFrameworkCore.Sqlite.Tests/EnrichSqliteDatabaseDbContextTests.cs index 29d6ea46f..e7737fd29 100644 --- a/tests/CommunityToolkit.Aspire.Microsoft.EntityFrameworkCore.Sqlite.Tests/EnrichSqliteDatabaseDbContextTests.cs +++ b/tests/CommunityToolkit.Aspire.Microsoft.EntityFrameworkCore.Sqlite.Tests/EnrichSqliteDatabaseDbContextTests.cs @@ -1,7 +1,6 @@ using Microsoft.AspNetCore.Builder; using Microsoft.EntityFrameworkCore; -using Microsoft.Extensions.Configuration; -using Microsoft.Extensions.DependencyInjection; +using Microsoft.Extensions.Diagnostics.HealthChecks; using Microsoft.Extensions.Hosting; namespace CommunityToolkit.Aspire.Microsoft.EntityFrameworkCore.Sqlite.Tests; @@ -9,13 +8,12 @@ namespace CommunityToolkit.Aspire.Microsoft.EntityFrameworkCore.Sqlite.Tests; public class EnrichSqliteDatabaseDbContextTests { [Fact] - public void EnrichSqliteDatabaseDbContext_RegistersDbContext() + public void EnrichSqliteDatabaseDbContext_UsesAlreadyRegisteredDbContext() { // Arrange var builder = WebApplication.CreateBuilder(); - builder.Configuration.AddInMemoryCollection([ - new KeyValuePair("ConnectionStrings:DefaultConnection", "Data Source=:memory:") - ]); + builder.Services.AddDbContext(options => + options.UseSqlite("Data Source=:memory:")); // Act builder.EnrichSqliteDatabaseDbContext(); @@ -26,6 +24,17 @@ public void EnrichSqliteDatabaseDbContext_RegistersDbContext() Assert.NotNull(dbContext); } + [Fact] + public void EnrichSqliteDatabaseDbContext_ThrowsWhenDbContextIsNotRegistered() + { + // Arrange + var builder = WebApplication.CreateBuilder(); + + // Act & Assert + Assert.Throws(() => + builder.EnrichSqliteDatabaseDbContext()); + } + [Fact] public void EnrichSqliteDatabaseDbContext_ThrowsWhenBuilderIsNull() { @@ -35,13 +44,12 @@ public void EnrichSqliteDatabaseDbContext_ThrowsWhenBuilderIsNull() } [Fact] - public void EnrichSqliteDatabaseDbContext_DisablesOpenTelemetryWhenFalse() + public void EnrichSqliteDatabaseDbContext_DisablesOpenTelemetryWhenConfigured() { // Arrange var builder = WebApplication.CreateBuilder(); - builder.Configuration.AddInMemoryCollection([ - new KeyValuePair("ConnectionStrings:DefaultConnection", "Data Source=:memory:") - ]); + builder.Services.AddDbContextPool(options => + options.UseSqlite("Data Source=:memory:")); // Act builder.EnrichSqliteDatabaseDbContext(settings => settings.DisableTracing = true); @@ -57,9 +65,8 @@ public void EnrichSqliteDatabaseDbContext_EnablesOpenTelemetryByDefault() { // Arrange var builder = WebApplication.CreateBuilder(); - builder.Configuration.AddInMemoryCollection([ - new KeyValuePair("ConnectionStrings:DefaultConnection", "Data Source=:memory:") - ]); + builder.Services.AddDbContext(options => + options.UseSqlite("Data Source=:memory:")); // Act builder.EnrichSqliteDatabaseDbContext(settings => settings.DisableTracing = false); @@ -70,7 +77,7 @@ public void EnrichSqliteDatabaseDbContext_EnablesOpenTelemetryByDefault() Assert.NotNull(dbContext); // Verify OpenTelemetry services are registered (basic smoke test) - var services = app.Services.GetServices().ToList(); - Assert.True(services.Count > 0, "Services should be registered"); + var healthCheckService = app.Services.GetService(); + Assert.NotNull(healthCheckService); } } \ No newline at end of file