using System; using System.IO; using Microsoft.EntityFrameworkCore; using Microsoft.Extensions.Configuration; using Microsoft.Extensions.DependencyInjection; using ReC.Application; using ReC.Application.Common.Options; using ReC.Infrastructure; namespace ReC.Tests.Application; public abstract class RecApplicationTestBase : IDisposable { protected RecApplicationTestBase() { Configuration = BuildConfiguration(); ServiceProvider = BuildServiceProvider(Configuration); } protected IConfiguration Configuration { get; } protected IServiceProvider ServiceProvider { get; } private static IConfiguration BuildConfiguration() { var appSettingsPath = LocateApiAppSettings(); return new ConfigurationBuilder() .AddJsonFile(appSettingsPath, optional: false, reloadOnChange: false) .Build(); } private static IServiceProvider BuildServiceProvider(IConfiguration configuration) { var services = new ServiceCollection(); services.AddSingleton(configuration); services.AddRecServices(options => { options.LuckyPennySoftwareLicenseKey = configuration["LuckyPennySoftwareLicenseKey"]; options.ConfigureRecActions(configuration.GetSection("RecAction")); options.ConfigureSqlException(configuration.GetSection("SqlException")); }); services.AddRecInfrastructure(opt => { opt.ConfigureDbContext((_, builder) => builder.UseSqlServer(configuration.GetConnectionString("Default"))); }); return services.BuildServiceProvider(); } private static string LocateApiAppSettings() { var current = new DirectoryInfo(AppContext.BaseDirectory); while (current is not null) { var candidate = Path.Combine(current.FullName, "src", "ReC.API", "appsettings.json"); if (File.Exists(candidate)) return candidate; current = current.Parent; } throw new FileNotFoundException("Could not locate src/ReC.API/appsettings.json from test base directory."); } public void Dispose() { if (ServiceProvider is IDisposable disposable) disposable.Dispose(); } }