namespace ZB.MOM.WW.ScadaBridge.CentralUI.Tests.Deployment; /// /// Design 2026-08-20: the Connection Bindings panel renders one collapsible group /// per module with a header-level connection + Object apply, unbound/mixed pills and /// a show-only-unbound filter. Structural pins over the page source. /// public class InstanceConfigureBindingGroupsTests { private static string Markup => InstanceConfigureBindingRowsTests.ReadMarkup(); [Fact] public void GroupHeader_HasConnectionObjectAndApply() { var m = Markup; Assert.Contains("data-test=\"binding-group-header\"", m); Assert.Contains("data-test=\"binding-group-connection\"", m); Assert.Contains("data-test=\"binding-group-object\"", m); Assert.Contains("data-test=\"binding-group-apply\"", m); Assert.Contains("ApplyGroupObject(", m); Assert.Contains("BindingGroupBuilder.ApplyObject(", m); } [Fact] public void GroupHeader_ShowsUnboundAndMixedPills() { var m = Markup; Assert.Contains("data-test=\"binding-group-unbound\"", m); Assert.Contains("data-test=\"binding-group-mixed\"", m); Assert.Contains("data-test=\"binding-total-unbound\"", m); } [Fact] public void Toolbar_HasUnboundFilterAndExpandAll() { var m = Markup; Assert.Contains("_showOnlyUnbound", m); Assert.Contains("data-test=\"binding-expand-all\"", m); Assert.Contains("data-test=\"binding-bulk-select\"", m); // existing all-groups connection select retained } [Fact] public void ComposedBareDefault_IsFlagged() { Assert.Contains("data-test=\"binding-bare-default\"", Markup); } [Fact] public void OldFlatTable_IsGone() { Assert.DoesNotContain("_bindingDataSourceAttrs", Markup); } [Fact] public void PerRowBrowseButton_IsRetained() { // The OPC UA / MxGateway tag browser per row predates the grouped panel and must survive it. var m = Markup; Assert.Contains("OpenBrowser(name)", m); Assert.Contains("IsBrowsable(", m); } }