using Shouldly;
using Xunit;
using ZB.MOM.WW.OtOpcUa.Host.Configuration;
using ZB.MOM.WW.OtOpcUa.OpcUaServer;
namespace ZB.MOM.WW.OtOpcUa.Host.IntegrationTests;
///
/// Task 4 — verifies the net-new (built on the
/// shared ZB.MOM.WW.Configuration OptionsValidatorBase/ValidationBuilder) that
/// gates the OPC UA host options at startup. The C# defaults are all valid so a host with no
/// explicit "OpcUa" section still passes; the validator exists to reject explicit
/// prod/env overrides. Failure messages carry the real "OpcUa:" section prefix and the
/// exact shared-primitive wording so they read correctly when surfaced via ValidateOnStart.
///
public sealed class OpcUaApplicationHostOptionsValidatorTests
{
private static readonly OpcUaApplicationHostOptionsValidator Sut = new();
/// The C# defaults (the as-bound shape when the section is absent) pass validation.
[Fact]
public void Default_options_succeed()
{
Sut.Validate(null, new OpcUaApplicationHostOptions()).Succeeded.ShouldBeTrue();
}
/// A port of 0 reports the shared port-range failure with the OpcUa prefix.
[Fact]
public void Zero_port_fails()
{
var result = Sut.Validate(null, new OpcUaApplicationHostOptions { OpcUaPort = 0 });
result.Failed.ShouldBeTrue();
result.Failures.ShouldContain("OpcUa:OpcUaPort must be between 1 and 65535 (was 0)");
}
/// A blank public hostname reports the shared required failure with the OpcUa prefix.
[Fact]
public void Blank_public_hostname_fails()
{
var result = Sut.Validate(null, new OpcUaApplicationHostOptions { PublicHostname = "" });
result.Failed.ShouldBeTrue();
result.Failures.ShouldContain("OpcUa:PublicHostname is required");
}
/// An empty security-profile list reports the shared min-count failure with the OpcUa prefix.
[Fact]
public void Empty_security_profiles_fails()
{
var result = Sut.Validate(null, new OpcUaApplicationHostOptions
{
EnabledSecurityProfiles = new List(),
});
result.Failed.ShouldBeTrue();
result.Failures.ShouldContain("OpcUa:EnabledSecurityProfiles must contain at least 1 item(s) (had 0)");
}
}