using Data.SeaHavenIndustries; using Microsoft.EntityFrameworkCore; using SeaHaven.DataServices.Implementation; using SeaHaven.Services.Constants; using SeaHaven.Services.Implementation; using SeaHaven.Services.Interfaces; namespace SeaHavenIndustries.Tests; public class WorkOrderAuditServiceTests { private static ApplicationDbContext CreateContext() { var options = new DbContextOptionsBuilder() .UseInMemoryDatabase(Guid.NewGuid().ToString()) .Options; return new ApplicationDbContext(options); } private static (WorkOrderAuditService audit, ApplicationDbContext context) CreateAudit(ApplicationDbContext context) { var lockData = new WorkOrderFieldLockDataService(context); var locks = new WorkOrderFieldLockService(lockData); var auditData = new WorkOrderAuditDataService(context); var audit = new WorkOrderAuditService(auditData, locks); return (audit, context); } [Fact] public async Task LogStatusChanged_CreatesSingleAuditWithManualEventType() { await using var context = CreateContext(); context.workOrders.Add(new WorkOrder { Id = 1, Status = "Open" }); await context.SaveChangesAsync(); var (audit, _) = CreateAudit(context); await audit.LogStatusChangedAsync(1, "Open", "In Progress", "user-1"); var logs = await context.WorkOrderAuditLogs.ToListAsync(); Assert.Single(logs); Assert.Equal("StatusChanged", logs[0].Action); Assert.Equal("Manual", logs[0].EventType); Assert.Equal("Dispatcher", logs[0].ActorType); Assert.Equal(WorkOrderFieldNames.LifecycleStatus, logs[0].FieldName); } [Fact] public async Task LogStatusChanged_CreatesFieldLock() { await using var context = CreateContext(); context.workOrders.Add(new WorkOrder { Id = 2, Status = "Open" }); await context.SaveChangesAsync(); var (audit, _) = CreateAudit(context); await audit.LogStatusChangedAsync(2, "Open", "Scheduled", "user-1"); var fieldLocks = await context.WorkOrderFieldLocks.ToListAsync(); Assert.Single(fieldLocks); Assert.Equal(WorkOrderFieldNames.LifecycleStatus, fieldLocks[0].FieldName); } }