using Microsoft.AspNetCore.Hosting; using Microsoft.AspNetCore.Mvc.Testing; using Microsoft.EntityFrameworkCore; using Microsoft.Extensions.Configuration; using Microsoft.Extensions.DependencyInjection; using Microsoft.Extensions.Hosting; using ColaFlow.Modules.Identity.Infrastructure.Persistence; using ColaFlow.Modules.IssueManagement.Infrastructure.Persistence; using ColaFlow.Modules.ProjectManagement.Infrastructure.Persistence; namespace ColaFlow.Modules.IssueManagement.IntegrationTests.Infrastructure; /// /// Custom WebApplicationFactory for Issue Management Integration Tests /// Supports In-Memory database for fast, isolated tests /// public class IssueManagementWebApplicationFactory : WebApplicationFactory { private readonly string _testDatabaseName = $"TestDb_{Guid.NewGuid()}"; protected override void ConfigureWebHost(IWebHostBuilder builder) { // Set environment to Testing builder.UseEnvironment("Testing"); // Configure test-specific settings builder.ConfigureAppConfiguration((context, config) => { // Clear existing connection strings to prevent PostgreSQL registration config.Sources.Clear(); // Add minimal config for testing config.AddInMemoryCollection(new Dictionary { ["ConnectionStrings:DefaultConnection"] = "", ["ConnectionStrings:PMDatabase"] = "", ["ConnectionStrings:IMDatabase"] = "", ["Jwt:SecretKey"] = "test-secret-key-for-integration-tests-minimum-32-characters", ["Jwt:Issuer"] = "ColaFlow.Test", ["Jwt:Audience"] = "ColaFlow.Test", ["Jwt:AccessTokenExpirationMinutes"] = "15", ["Jwt:RefreshTokenExpirationDays"] = "7" }); }); builder.ConfigureServices(services => { // Register test databases with In-Memory provider // Use the same database name for cross-context data consistency services.AddDbContext(options => { options.UseInMemoryDatabase(_testDatabaseName); options.EnableSensitiveDataLogging(); }); services.AddDbContext(options => { options.UseInMemoryDatabase(_testDatabaseName); options.EnableSensitiveDataLogging(); }); services.AddDbContext(options => { options.UseInMemoryDatabase(_testDatabaseName); options.EnableSensitiveDataLogging(); }); }); } protected override IHost CreateHost(IHostBuilder builder) { var host = base.CreateHost(builder); // Initialize databases after host is created using var scope = host.Services.CreateScope(); var services = scope.ServiceProvider; try { // Initialize Identity database var identityDb = services.GetRequiredService(); identityDb.Database.EnsureCreated(); // Initialize ProjectManagement database var pmDb = services.GetRequiredService(); pmDb.Database.EnsureCreated(); // Initialize IssueManagement database var imDb = services.GetRequiredService(); imDb.Database.EnsureCreated(); } catch (Exception ex) { Console.WriteLine($"Error initializing test database: {ex.Message}"); throw; } return host; } }