using System.ComponentModel.DataAnnotations; using System.ComponentModel.DataAnnotations.Schema; using Microsoft.EntityFrameworkCore; 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.PostgreSQL.Extensions; using TUnit.Core.Interfaces; namespace RAIC.Extensions.Configuration.EntityFrameworkCore.PostgreSQL.Tests; [Table("settings")] public record Setting : ISetting { [Key] [Column("key")] public required string Key { get; set; } [Required] [Column("value")] 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 record 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" }, { "ChannelName", "setting_channel" } }) .AddUserSecrets() // for connection string .AddEnvironmentVariables(prefix: "ASPNETCORE_"); // add DbContext based configuration using connection string sourced from initial config builder.Configuration.AddDbContext(dbContextOptions => dbContextOptions.UseNpgsql(builder.Configuration.GetConnectionString("Default"))); builder.Services .AddDbContext(opt => opt.UseNpgsql(builder.Configuration.GetConnectionString("Default"))) .AddPostgreSQLNotificationConfigurationReloadService(opts => opts.Bind(builder.Configuration)) .AddOptions().Bind(builder.Configuration); builder.Logging.AddDebug(); _host = builder.Build(); await _host.StartAsync(); _ = _host.WaitForShutdownAsync(); } }