using Bunit; using ScadaLink.Commons.Types.DataConnections; using ScadaLink.Commons.Types.Flattening; using ScadaLink.Commons.Validators; using OpcUaEndpointEditor = ScadaLink.CentralUI.Components.Forms.OpcUaEndpointEditor; namespace ScadaLink.CentralUI.Tests.Forms; public class OpcUaEndpointEditorTests : BunitContext { [Fact] public void Renders_All_Four_Section_Labels() { var config = new OpcUaEndpointConfig(); var cut = Render(p => p .Add(c => c.Config, config) .Add(c => c.Title, "Primary Endpoint")); Assert.Contains("Primary Endpoint", cut.Markup); Assert.Contains("Timing", cut.Markup); Assert.Contains("Subscription", cut.Markup); Assert.Contains("Heartbeat", cut.Markup); } [Fact] public void Binding_MutatesPassedConfigInstance() { var config = new OpcUaEndpointConfig(); var cut = Render(p => p.Add(c => c.Config, config)); cut.Find("input[type='text']").Change("opc.tcp://new-host:4840"); Assert.Equal("opc.tcp://new-host:4840", config.EndpointUrl); } [Fact] public void EnableHeartbeat_CreatesSubObject() { var config = new OpcUaEndpointConfig(); var cut = Render(p => p.Add(c => c.Config, config)); Assert.Null(config.Heartbeat); cut.FindAll("button").First(b => b.TextContent.Contains("Enable Heartbeat")).Click(); Assert.NotNull(config.Heartbeat); } [Fact] public void RemoveHeartbeat_NullsSubObject() { var config = new OpcUaEndpointConfig { Heartbeat = new OpcUaHeartbeatConfig { TagPath = "Hb", MaxSilenceSeconds = 30 } }; var cut = Render(p => p.Add(c => c.Config, config)); cut.FindAll("button").First(b => b.TextContent.Contains("Remove Heartbeat")).Click(); Assert.Null(config.Heartbeat); } [Fact] public void Errors_Parameter_RendersPerFieldRedText() { var config = new OpcUaEndpointConfig { EndpointUrl = "" }; var errors = OpcUaEndpointConfigValidator.Validate(config, "Primary."); var cut = Render(p => p .Add(c => c.Config, config) .Add(c => c.Errors, errors)); Assert.Contains("Endpoint URL is required.", cut.Markup); Assert.Contains("text-danger", cut.Markup); } [Fact] public void IsLegacy_True_RendersWarningBanner() { var cut = Render(p => p .Add(c => c.Config, new OpcUaEndpointConfig()) .Add(c => c.IsLegacy, true)); Assert.Contains("alert-warning", cut.Markup); Assert.Contains("migrated from a legacy format", cut.Markup); } }