using BuildFlow.Shared.Domain.Common;
using Microsoft.EntityFrameworkCore;
using Microsoft.Extensions.DependencyInjection;
using Monitoring.Infrastructure.Persistence;
namespace BuildFlow.Monitoring.Tests;
/// Monitoring 模块测试数据库工厂,使用独立 InMemory 数据库并自动补齐审计字段。
internal static class MonitoringTestDb
{
public static MonitoringDbContext Create([System.Runtime.CompilerServices.CallerMemberName] string testName = "")
{
var services = new ServiceCollection();
services.AddDbContext(options =>
options.UseInMemoryDatabase($"monitoring-{testName}-{Guid.NewGuid()}"));
var db = services.BuildServiceProvider().GetRequiredService();
db.SavingChanges += FillAuditFields;
return db;
}
private static void FillAuditFields(object? sender, EventArgs args)
{
if (sender is not DbContext db) return;
foreach (var entry in db.ChangeTracker.Entries())
{
if (entry.Entity is IAuditable auditable)
{
auditable.CreatedBy ??= "test";
auditable.UpdatedBy ??= "test";
if (auditable.CreatedAt == default) auditable.CreatedAt = DateTime.UtcNow;
if (auditable.UpdatedAt == default) auditable.UpdatedAt = DateTime.UtcNow;
}
if (entry.Entity is IHasOperatorIP operatorEntity)
operatorEntity.OperatorIP ??= "127.0.0.1";
}
}
}