using ZB.MOM.WW.Audit; using ZB.MOM.WW.ScadaBridge.Commons.Messages.InboundApi; using ZB.MOM.WW.ScadaBridge.Commons.Messages.Instance; using ZB.MOM.WW.ScadaBridge.Commons.Messages.ScriptExecution; using ZB.MOM.WW.ScadaBridge.Commons.Messages.Streaming; namespace ZB.MOM.WW.ScadaBridge.Commons.Tests.Messages; /// /// Flow Debugger (design 2026-09-05 §5.2/§5.4): the trace flag and trace payload are additive /// trailing optional members — every pre-existing positional construction stays untraced. /// public class TraceFlagDefaultsTests { [Fact] public void ExistingPositionalConstructions_DefaultToUntraced() { var now = DateTimeOffset.UtcNow; Assert.False(new RouteToCallRequest("c", "i", "s", null, now).Trace); Assert.False(new RouteToSetAttributesRequest("c", "i", new Dictionary(), now).Trace); Assert.False(new ScriptCallRequest("s", null, 0, "c").Trace); Assert.False(new SetStaticAttributeCommand("c", "i", "a", "v", now).Trace); Assert.False(new AttributeValueChanged("i", "p", "a", 1, "Good", now).Trace); var reply = new RouteToCallResponse("c", true, null, null, now); Assert.Null(reply.ChildExecutionId); Assert.Null(reply.TraceEvents); var result = new ScriptCallResult("c", true, null, null); Assert.Null(result.ExecutionId); Assert.Null(result.TraceEvents); } [Fact] public void TraceEvents_AreAuditEvents() { var evt = new AuditEvent { EventId = Guid.NewGuid(), OccurredAtUtc = DateTimeOffset.UtcNow, Actor = "a", Action = "ScriptTrace.ScriptRun", Outcome = AuditOutcome.Success }; var result = new ScriptCallResult("c", true, null, null, Guid.NewGuid(), [evt]); Assert.Single(result.TraceEvents!); Assert.NotNull(result.ExecutionId); var reply = new RouteToCallResponse("c", true, null, null, DateTimeOffset.UtcNow, result.ExecutionId, result.TraceEvents); Assert.Equal(result.ExecutionId, reply.ChildExecutionId); Assert.Same(evt, reply.TraceEvents![0]); } }