using Microsoft.AspNetCore.Hosting;
using Microsoft.AspNetCore.Mvc.Testing;
using Microsoft.EntityFrameworkCore;
using Microsoft.Extensions.DependencyInjection;
using SocialService.Infrastructure;
namespace SocialService.FunctionalTests;
///
/// EN: Custom WebApplicationFactory for functional tests.
/// VI: WebApplicationFactory tùy chỉnh cho functional tests.
///
public class CustomWebApplicationFactory : WebApplicationFactory
{
protected override void ConfigureWebHost(IWebHostBuilder builder)
{
builder.UseEnvironment("Testing");
builder.ConfigureServices(services =>
{
// EN: Remove ALL database-related services
// VI: Xóa TẤT CẢ các services liên quan đến database
var descriptorsToRemove = services.Where(d =>
d.ServiceType == typeof(DbContextOptions) ||
d.ServiceType == typeof(DbContextOptions) ||
d.ServiceType == typeof(SocialServiceContext) ||
d.ServiceType.Name.Contains("DbContextOptions") ||
d.ImplementationType?.FullName?.Contains("Npgsql") == true ||
d.ImplementationType?.FullName?.Contains("PostgreSql") == true ||
d.ServiceType.FullName?.Contains("Npgsql") == true ||
d.ServiceType.FullName?.Contains("HealthCheck") == true
).ToList();
foreach (var descriptor in descriptorsToRemove)
{
services.Remove(descriptor);
}
// EN: Add in-memory database for testing
// VI: Thêm in-memory database để test
var dbName = $"TestDatabase_{Guid.NewGuid()}";
services.AddDbContext(options =>
{
options.UseInMemoryDatabase(dbName);
});
// EN: Add basic health checks (without database dependency)
// VI: Thêm basic health checks (không phụ thuộc database)
services.AddHealthChecks();
});
}
}