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"; } } }