Files
ScadaBridge/tests/ZB.MOM.WW.ScadaBridge.CentralUI.Tests/Deployment/InstanceConfigureMesReportableTests.cs
T

84 lines
3.8 KiB
C#

using ZB.MOM.WW.ScadaBridge.CentralUI.Components.Pages.Deployment;
namespace ZB.MOM.WW.ScadaBridge.CentralUI.Tests.Deployment;
/// <summary>
/// MES reportable (tri-state) on the Instance Configure alarm-override editor.
///
/// <para>The instance-level override is a <c>bool?</c>: null means "inherit the
/// template alarm's <c>IsMesReportable</c>", true/false pin it. The modal surfaces
/// that as a three-option select (Inherited / Reportable / Not reportable).</para>
///
/// <para><c>InstanceConfigure</c> is a heavyweight page (~7 injected services with
/// their own graphs), so — consistent with the rest of this suite's coverage of it
/// (see <c>InstanceConfigureListOverrideTests</c>) — the markup half is a structural
/// assertion over the component source. The half that carries the real risk is the
/// save-time delta rule, which is extracted as a pure helper and pinned directly:
/// the page DELETES the override when it sees no delta, so a reportable-only
/// override would be silently dropped on save if the new term were missing.</para>
/// </summary>
public class InstanceConfigureMesReportableTests
{
private static string DeploymentComponentsRoot
{
get
{
var dir = AppContext.BaseDirectory;
for (var i = 0; i < 6 && dir is not null; i++)
dir = Directory.GetParent(dir)?.FullName;
return Path.Combine(dir!, "src", "ZB.MOM.WW.ScadaBridge.CentralUI",
"Components", "Pages", "Deployment");
}
}
private static string InstanceConfigureMarkup
=> File.ReadAllText(Path.Combine(DeploymentComponentsRoot, "InstanceConfigure.razor"));
[Fact]
public void OverrideModal_HasTriStateMesReportableSelect()
{
var markup = InstanceConfigureMarkup;
Assert.Contains("data-test=\"alarm-mes-select\"", markup);
// Three options: Inherited (empty value) / Reportable (true) / Not reportable (false).
var selectStart = markup.IndexOf("data-test=\"alarm-mes-select\"", StringComparison.Ordinal);
var selectEnd = markup.IndexOf("</select>", selectStart, StringComparison.Ordinal);
Assert.True(selectEnd > selectStart, "MES reportable select is not closed.");
// Label mirrors the adjacent "Priority override" control.
Assert.Contains("MES reportable override</label>", markup);
var selectBody = markup[selectStart..selectEnd];
var optionCount = selectBody.Split("<option").Length - 1;
Assert.Equal(3, optionCount);
Assert.Contains("value=\"\"", selectBody);
Assert.Contains("value=\"true\"", selectBody);
Assert.Contains("value=\"false\"", selectBody);
}
[Theory]
// The new term: a reportable-only override is a real delta in BOTH directions
// (false is not "no override" — it pins a reportable template alarm off).
[InlineData(null, null, true)]
[InlineData(null, null, false)]
public void HasOverrideDelta_TreatsMesReportableAloneAsADelta(
string? overrideJson, int? priority, bool? mesReportable)
=> Assert.True(InstanceConfigure.HasOverrideDelta(overrideJson, priority, mesReportable));
[Theory]
[InlineData(null, null, null)]
[InlineData("", null, null)]
[InlineData(" ", null, null)]
public void HasOverrideDelta_NothingSet_IsNotADelta(
string? overrideJson, int? priority, bool? mesReportable)
=> Assert.False(InstanceConfigure.HasOverrideDelta(overrideJson, priority, mesReportable));
[Theory]
[InlineData("{\"hi\":70}", null, null)]
[InlineData(null, 750, null)]
public void HasOverrideDelta_ExistingTermsStillCount(
string? overrideJson, int? priority, bool? mesReportable)
=> Assert.True(InstanceConfigure.HasOverrideDelta(overrideJson, priority, mesReportable));
}