using Data.SeaHavenIndustries; using Microsoft.EntityFrameworkCore; using SeaHaven.Services.Implementation; using SeaHaven.Services.Interfaces; namespace SeaHavenIndustries.Tests; public class SyncFieldMergePolicyTests { private static ApplicationDbContext CreateContext() { var options = new DbContextOptionsBuilder() .UseInMemoryDatabase(Guid.NewGuid().ToString()) .Options; return new ApplicationDbContext(options); } [Fact] public async Task TryApply_WhenFieldLocked_RejectsAndAudits() { await using var context = CreateContext(); var wo = new WorkOrder { Id = 10, Description = "SHOC edited", Status = "Open" }; context.workOrders.Add(wo); context.WorkOrderFieldLocks.Add(new WorkOrderFieldLock { WorkOrderId = 10, FieldName = "Description", LockedAt = DateTime.UtcNow }); await context.SaveChangesAsync(); var locks = new WorkOrderFieldLockService(context); var audit = new WorkOrderAuditService(context, locks); var policy = new SyncFieldMergePolicy(locks, audit); var syncContext = new WorkOrderSyncContext { WorkOrder = wo, FieldLocks = locks, Audit = audit }; var applied = await policy.TryApplyAsync(syncContext, "Description", "Sync value"); Assert.False(applied); Assert.Equal("SHOC edited", wo.Description); var logs = await context.WorkOrderAuditLogs.ToListAsync(); Assert.Single(logs); Assert.Equal("SyncRejected", logs[0].Action); Assert.Equal("Sync", logs[0].EventType); } [Fact] public async Task TryApply_WhenFieldNotLocked_AppliesValue() { await using var context = CreateContext(); var wo = new WorkOrder { Id = 11, Description = "Original" }; context.workOrders.Add(wo); await context.SaveChangesAsync(); var locks = new WorkOrderFieldLockService(context); var audit = new WorkOrderAuditService(context, locks); var policy = new SyncFieldMergePolicy(locks, audit); var syncContext = new WorkOrderSyncContext { WorkOrder = wo, FieldLocks = locks, Audit = audit }; var applied = await policy.TryApplyAsync(syncContext, "Description", "From sync"); Assert.True(applied); Assert.Equal("From sync", wo.Description); } }