feat(audit): ScriptTrace channel + RouteCall/ScriptRun/AttributeWrite/AttributeWait kinds
Flow Debugger (design 2026-09-05 §5.1): trace steps are audit rows. New AuditChannel.ScriptTrace appended after Cluster and four kinds appended after ManualFailover so stored ordinals never move; lock-in tests + alog.md §4 updated. Claude-Session: https://claude.ai/code/session_01GSLkkHKz9JrAtmJjmQK3cP
This commit is contained in:
@@ -0,0 +1,31 @@
|
||||
using ZB.MOM.WW.ScadaBridge.Commons.Types.Audit;
|
||||
using ZB.MOM.WW.ScadaBridge.Commons.Types.Enums;
|
||||
|
||||
namespace ZB.MOM.WW.ScadaBridge.Commons.Tests.Audit;
|
||||
|
||||
/// <summary>
|
||||
/// Flow Debugger (design 2026-09-05): the <c>ScriptTrace</c> channel and its four kinds must
|
||||
/// fit the central <c>AuditLog.Category</c>/<c>Kind</c> columns and never move existing ordinals.
|
||||
/// </summary>
|
||||
public class ScriptTraceEnumTests
|
||||
{
|
||||
[Theory]
|
||||
[InlineData(AuditKind.RouteCall)]
|
||||
[InlineData(AuditKind.ScriptRun)]
|
||||
[InlineData(AuditKind.AttributeWrite)]
|
||||
[InlineData(AuditKind.AttributeWait)]
|
||||
public void ScriptTraceKinds_FitTheCentralColumns(AuditKind kind)
|
||||
{
|
||||
// AuditLog.Category / Kind are nvarchar(32) (AuditLogEntityTypeConfiguration).
|
||||
Assert.True(kind.ToString().Length <= 32);
|
||||
Assert.True(AuditChannel.ScriptTrace.ToString().Length <= 32);
|
||||
Assert.Equal($"ScriptTrace.{kind}", AuditFieldBuilders.BuildAction(AuditChannel.ScriptTrace, kind));
|
||||
}
|
||||
|
||||
[Fact]
|
||||
public void ScriptTrace_IsAppendedAfterCluster_SoExistingOrdinalsAreStable()
|
||||
{
|
||||
Assert.True((int)AuditChannel.ScriptTrace > (int)AuditChannel.Cluster);
|
||||
Assert.True((int)AuditKind.RouteCall > (int)AuditKind.ManualFailover);
|
||||
}
|
||||
}
|
||||
@@ -12,7 +12,7 @@ public class AuditEnumTests
|
||||
[Fact]
|
||||
public void AuditChannel_HasExactlyExpectedMembers()
|
||||
{
|
||||
var expected = new[] { "ApiOutbound", "DbOutbound", "Notification", "ApiInbound", "SecuredWrite", "Cluster" };
|
||||
var expected = new[] { "ApiOutbound", "DbOutbound", "Notification", "ApiInbound", "SecuredWrite", "Cluster", "ScriptTrace" };
|
||||
var actual = Enum.GetValues(typeof(AuditChannel))
|
||||
.Cast<AuditChannel>()
|
||||
.Select(x => x.ToString())
|
||||
@@ -23,7 +23,7 @@ public class AuditEnumTests
|
||||
}
|
||||
|
||||
[Fact]
|
||||
public void AuditKind_HasExactlySeventeenExpectedMembers()
|
||||
public void AuditKind_HasExactlyTwentyOneExpectedMembers()
|
||||
{
|
||||
var expected = new[]
|
||||
{
|
||||
@@ -34,13 +34,14 @@ public class AuditEnumTests
|
||||
"SecuredWriteExpire",
|
||||
"ReconciliationAbandoned",
|
||||
"ManualFailover",
|
||||
"RouteCall", "ScriptRun", "AttributeWrite", "AttributeWait",
|
||||
};
|
||||
var actual = Enum.GetValues(typeof(AuditKind))
|
||||
.Cast<AuditKind>()
|
||||
.Select(x => x.ToString())
|
||||
.ToArray();
|
||||
|
||||
Assert.Equal(17, actual.Length);
|
||||
Assert.Equal(21, actual.Length);
|
||||
Assert.Equal(expected, actual);
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user