using Microsoft.Extensions.Configuration; using Microsoft.Extensions.DependencyInjection; using Microsoft.Extensions.Logging; using Microsoft.Extensions.Logging.Abstractions; using Microsoft.Extensions.Options; using ZB.MOM.WW.ScadaBridge.DataConnectionLayer.Adapters; namespace ZB.MOM.WW.ScadaBridge.DataConnectionLayer.Tests; public class GlobalOptionsValidationTests { /// Verifies that startup rejects blank identity. /// Test case input. [Theory] [InlineData("ScadaBridge:OpcUa:ApplicationName")] [InlineData("ScadaBridge:MxGateway:ClientNamePrefix")] public void StartupRejectsBlankIdentity(string key) { var services = new ServiceCollection(); services.AddSingleton(new ConfigurationBuilder().AddInMemoryCollection( new Dictionary { [key] = " " }).Build()); services.AddDataConnectionLayer(); using var provider = services.BuildServiceProvider(); var exception = Assert.Throws(() => provider.GetRequiredService().Validate()); Assert.Contains(key, exception.Message); } /// Verifies that defaults validate at startup. [Fact] public void DefaultsValidateAtStartup() { var services = new ServiceCollection(); services.AddSingleton(new ConfigurationBuilder().Build()); services.AddDataConnectionLayer(); using var provider = services.BuildServiceProvider(); provider.GetRequiredService().Validate(); } /// /// Review 2026-10-21 02/U1: the bound ScadaBridge:MxGateway:ClientNamePrefix actually /// reaches the MxGateway adapters the DI-built factory creates. /// [Fact] public void ClientNamePrefix_FlowsIntoTheMxGatewayAdapter() { var services = new ServiceCollection(); services.AddSingleton(new ConfigurationBuilder().AddInMemoryCollection( new Dictionary { ["ScadaBridge:MxGateway:ClientNamePrefix"] = "plant7" }).Build()); services.AddSingleton(NullLoggerFactory.Instance); services.AddDataConnectionLayer(); using var provider = services.BuildServiceProvider(); var adapter = provider.GetRequiredService() .Create("MxGateway", new Dictionary()); var prefix = typeof(MxGatewayDataConnection) .GetField("_clientNamePrefix", System.Reflection.BindingFlags.Instance | System.Reflection.BindingFlags.NonPublic)! .GetValue(adapter); Assert.Equal("plant7", prefix); } }