using ZB.MOM.WW.ScadaBridge.SiteRuntime.Scripts; namespace ZB.MOM.WW.ScadaBridge.SiteRuntime.Tests.Scripts; /// /// Site-events volume policy (docs/plans/2026-08-15-site-events-policy-design.md): /// pure unit tests for /// , isolated from any actor or DI /// plumbing — the actor-level wiring (hot toggle, hosted-service registration) is covered by /// ScriptRunLauncherParityTests. /// public class ScriptRunEventPolicyTests { private static SiteRuntimeOptions Options( bool perRunScriptEvents = false, string[]? perRunScriptEventScripts = null) => new() { PerRunScriptEvents = perRunScriptEvents, PerRunScriptEventScripts = (perRunScriptEventScripts ?? []).ToList() }; /// Verifies that the default options emit no per-run events. [Fact] public void DefaultOptions_EmitsNothing() { Assert.False(ScriptRunEventPolicy.ShouldEmitPerRun(Options(), "Inst1", "Runner")); } /// Verifies that turning the global switch on emits for every script. [Fact] public void GlobalSwitchOn_EmitsForEveryScript() { var options = Options(perRunScriptEvents: true); Assert.True(ScriptRunEventPolicy.ShouldEmitPerRun(options, "Inst1", "Runner")); Assert.True(ScriptRunEventPolicy.ShouldEmitPerRun(options, "AnyOtherInstance", "AnyOtherScript")); } /// Verifies that an exact per-script match emits. [Fact] public void ExactPerScriptMatch_Emits() { var options = Options(perRunScriptEventScripts: ["Inst1/Runner"]); Assert.True(ScriptRunEventPolicy.ShouldEmitPerRun(options, "Inst1", "Runner")); } /// Verifies that an exact per-script match does not match a different script on the same instance. [Fact] public void ExactPerScriptMatch_DoesNotMatchADifferentScriptOnTheSameInstance() { var options = Options(perRunScriptEventScripts: ["Inst1/Runner"]); Assert.False(ScriptRunEventPolicy.ShouldEmitPerRun(options, "Inst1", "OtherScript")); } /// Verifies that an exact per-script match does not match the same script name on a different instance. [Fact] public void ExactPerScriptMatch_DoesNotMatchTheSameScriptNameOnADifferentInstance() { var options = Options(perRunScriptEventScripts: ["Inst1/Runner"]); Assert.False(ScriptRunEventPolicy.ShouldEmitPerRun(options, "Inst2", "Runner")); } /// Verifies that an instance wildcard emits for every script on that instance only. [Fact] public void InstanceWildcard_EmitsForEveryScriptOnThatInstanceOnly() { var options = Options(perRunScriptEventScripts: ["Inst1/*"]); Assert.True(ScriptRunEventPolicy.ShouldEmitPerRun(options, "Inst1", "Runner")); Assert.True(ScriptRunEventPolicy.ShouldEmitPerRun(options, "Inst1", "AnotherScript")); Assert.False(ScriptRunEventPolicy.ShouldEmitPerRun(options, "Inst2", "Runner")); } /// Verifies that a script that does not match the opt-in list stays silent. [Fact] public void NonMatchingScript_StaysSilent() { var options = Options(perRunScriptEventScripts: ["Inst1/Runner", "Inst2/*"]); Assert.False(ScriptRunEventPolicy.ShouldEmitPerRun(options, "Inst3", "Runner")); } /// Verifies that an empty opt-in list stays silent. [Fact] public void EmptyOptInList_StaysSilent() { Assert.False(ScriptRunEventPolicy.ShouldEmitPerRun(Options(), "Inst1", "Runner")); } }