diff --git a/tests/ScadaLink.CentralUI.Tests/Forms/OpcUaEndpointEditorTests.cs b/tests/ScadaLink.CentralUI.Tests/Forms/OpcUaEndpointEditorTests.cs new file mode 100644 index 0000000..e6b1da0 --- /dev/null +++ b/tests/ScadaLink.CentralUI.Tests/Forms/OpcUaEndpointEditorTests.cs @@ -0,0 +1,85 @@ +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); + } +}