using System.ComponentModel.DataAnnotations; using System.ComponentModel.DataAnnotations.Schema; using Microsoft.EntityFrameworkCore; using Microsoft.EntityFrameworkCore.Infrastructure; using Microsoft.Extensions.Configuration; using Microsoft.Extensions.DependencyInjection; using Microsoft.Extensions.Hosting; using Microsoft.Extensions.Logging; using RAIC.Extensions.Configuration.EntityFrameworkCore.Extensions; using RAIC.Extensions.Configuration.EntityFrameworkCore.SqlServer.Extensions; using TUnit.Core.Interfaces; namespace RAIC.Extensions.Configuration.EntityFrameworkCore.SqlServer.Tests; [Table("Settings", Schema = "dbo")] public record Setting : ISetting { [Key] public required string Key { get; set; } [Required] public required string Value { get; set; } } public class FixtureDbContext(DbContextOptions options) : DbContext(options), ISettingsDbContext>, ISettingsDbContextFactory { public DbSet Settings { get; set; } public static FixtureDbContext Create(DbContextOptions options) => new(options); } public class FixtureOptions { public required string SomeOption { get; set; } } public class HostFixture: IAsyncInitializer, IServiceScopeFactory { private IHost? _host; public IServiceScope CreateScope() => _host!.Services.CreateScope(); public async Task InitializeAsync() { var builder = Host.CreateApplicationBuilder(); // build a initial configuration builder.Configuration .AddInMemoryCollection(new Dictionary() { { nameof(FixtureOptions.SomeOption), "Memory value" }, }) .AddUserSecrets() // for connection string .AddEnvironmentVariables(prefix: "ASPNETCORE_"); // add DbContext based configuration using connection string sourced from initial config builder.Configuration.AddDbContext(dbContextOptions => dbContextOptions.UseSqlServer(builder.Configuration.GetConnectionString("Default"))); builder.Services .AddDbContext(opt => opt.UseSqlServer(builder.Configuration.GetConnectionString("Default"))) .AddSqlServerNotificationConfigurationReloadService() .AddOptions().Bind(builder.Configuration); builder.Logging.AddDebug(); _host = builder.Build(); await _host.StartAsync(); _ = _host.WaitForShutdownAsync(); } }