using System.Runtime.CompilerServices;
using BuildFlow.Shared.Domain.Common;
using File.Infrastructure.Persistence;
using Microsoft.EntityFrameworkCore;
namespace BuildFlow.File.Tests;
///
/// file 模块 InMemory 测试数据库工厂。每个用例使用独立库名,并在保存前自动补齐审计字段
/// (IAuditable / IHasOperatorIP),避免实体因必填审计列缺失而失败。
///
internal static class FileTestDb
{
public static FileDbContext Create([CallerMemberName] string testName = "")
{
var options = new DbContextOptionsBuilder()
.UseInMemoryDatabase($"file-{testName}-{Guid.NewGuid():N}")
.Options;
var db = new FileDbContext(options);
db.SavingChanges += FillAuditFields;
return db;
}
private static void FillAuditFields(object? sender, EventArgs args)
{
if (sender is not FileDbContext 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";
}
}
}