using System.Text.Json; using Moq; using ZB.MOM.WW.ScadaBridge.Commons.Entities.Templates; using ZB.MOM.WW.ScadaBridge.Commons.Interfaces.Repositories; using ZB.MOM.WW.ScadaBridge.Commons.Interfaces.Services; namespace ZB.MOM.WW.ScadaBridge.TemplateEngine.Tests; /// /// Review 2026-10-21 08/G1: the configuration audit (indefinitely retained) must /// record a projected summary of a template — ids, names, member counts, changed /// fields — never the whole tracked graph with every script body. /// public class TemplateAuditShapeTests { private const string Body = "return \"BODY_SENTINEL_7f3a\";"; private readonly Mock _repoMock = new(); private readonly Mock _auditMock = new(); private readonly List _afterStates = []; /// Captures every audit after-state the service writes. public TemplateAuditShapeTests() { _repoMock.Setup(r => r.SaveChangesAsync(It.IsAny())).ReturnsAsync(1); _auditMock .Setup(a => a.LogAsync(It.IsAny(), It.IsAny(), It.IsAny(), It.IsAny(), It.IsAny(), It.IsAny(), It.IsAny())) .Callback( (_, _, _, _, _, after, _) => _afterStates.Add(after)) .Returns(Task.CompletedTask); } private Template SeedTemplateWithScripts() { var template = new Template("Pump") { Id = 1 }; template.Scripts.Add(new TemplateScript("Calc", Body) { Id = 10, TemplateId = 1 }); template.Scripts.Add(new TemplateScript("Calc2", Body + "//2") { Id = 11, TemplateId = 1 }); template.Attributes.Add(new TemplateAttribute("Temp") { Id = 20, TemplateId = 1 }); _repoMock.Setup(r => r.GetTemplateByIdAsync(1, It.IsAny())).ReturnsAsync(template); _repoMock.Setup(r => r.GetAllTemplatesForAnalysisAsync(It.IsAny())) .ReturnsAsync(new List