using Xunit; namespace Robotico.Nexus.Client.Tests; [Collection("NexusTlsEnvironment")] public class NexusClientOptionsTests : IDisposable { public void Dispose() { Environment.SetEnvironmentVariable("NEXUS_TLS_CA_FILE", null); Environment.SetEnvironmentVariable("NEXUS_TLS_CLIENT_CERT_FILE", null); Environment.SetEnvironmentVariable("NEXUS_TLS_CLIENT_KEY_FILE", null); Environment.SetEnvironmentVariable("NEXUS_TLS_MODE", null); Environment.SetEnvironmentVariable("NEXUS_WIRE_BEARER", null); Environment.SetEnvironmentVariable("NEXUS_WIRE_DEFAULT_BEARER", null); } [Fact] public void ResolveTls_PrefersExplicitOption_OverEnvironment() { string dir = Directory.CreateTempSubdirectory("nexus-opts-test-").FullName; try { string ca = Path.Combine(dir, "ca.pem"); File.WriteAllText(ca, "ca"); NexusTlsMaterial explicitMaterial = new(ca, ca, ca); NexusClientOptions options = new() { Tls = explicitMaterial }; Assert.Same(explicitMaterial, options.ResolveTls()); } finally { Directory.Delete(dir, recursive: true); } } [Fact] public void ResolveTls_FallsBackTo_Environment_WhenUnset() { NexusClientOptions options = new(); Assert.Null(options.ResolveTls()); } [Fact] public void ResolveBearerToken_PrefersExplicitOption() { Environment.SetEnvironmentVariable("NEXUS_WIRE_BEARER", "from-env"); NexusClientOptions options = new() { BearerToken = "explicit" }; Assert.Equal("explicit", options.ResolveBearerToken()); } [Fact] public void ResolveBearerToken_FallsBackTo_PrimaryEnvVar_ThenDefaultEnvVar() { NexusClientOptions options = new(); Assert.Null(options.ResolveBearerToken()); Environment.SetEnvironmentVariable("NEXUS_WIRE_DEFAULT_BEARER", "default-env"); Assert.Equal("default-env", options.ResolveBearerToken()); Environment.SetEnvironmentVariable("NEXUS_WIRE_BEARER", "primary-env"); Assert.Equal("primary-env", options.ResolveBearerToken()); } [Fact] public void ResolveUseHttps_UsesTlsMaterialValue_WhenTlsPresent() { string dir = Directory.CreateTempSubdirectory("nexus-opts-test-").FullName; try { string ca = Path.Combine(dir, "ca.pem"); File.WriteAllText(ca, "ca"); NexusTlsMaterial material = new(ca, ca, ca, useHttps: false); NexusClientOptions options = new(); Assert.False(options.ResolveUseHttps(material)); } finally { Directory.Delete(dir, recursive: true); } } [Fact] public void ResolveUseHttps_UsesExplicitOption_WhenNoTlsMaterial() { NexusClientOptions options = new() { UseHttps = true }; Assert.True(options.ResolveUseHttps(null)); } [Fact] public void ResolveUseHttps_FallsBackTo_EnvironmentMode_WhenNothingElseSet() { NexusClientOptions options = new(); Assert.False(options.ResolveUseHttps(null)); Environment.SetEnvironmentVariable("NEXUS_TLS_MODE", "https"); Assert.True(options.ResolveUseHttps(null)); } }