using Grpc.Net.Client; using Robotico.Result.Errors; using Xunit; namespace Robotico.Nexus.Client.Tests; public class NexusGrpcChannelFactoryTests { [Fact] public void ResolveAddress_UsesHttps_WhenRequested() { NexusConnectionUriParts parsed = new(NexusUriSchemes.Graph, "myhost", 50051, null); Assert.Equal("https://myhost:50051", NexusGrpcChannelFactory.ResolveAddress(parsed, useHttps: true)); } [Fact] public void ResolveAddress_UsesHttp_WhenPlaintext() { NexusConnectionUriParts parsed = new(NexusUriSchemes.Graph, "myhost", 50051, null); Assert.Equal("http://myhost:50051", NexusGrpcChannelFactory.ResolveAddress(parsed, useHttps: false)); } [Fact] public void CreateChannel_Succeeds_ForPlaintextLoopback() { NexusConnectionUriParts parsed = new(NexusUriSchemes.Graph, "127.0.0.1", 50051, null); Robotico.Result.Result result = NexusGrpcChannelFactory.CreateChannel(parsed, material: null, useHttps: false); Assert.True(result.IsSuccess(out GrpcChannel? channel, out _)); channel!.Dispose(); } [Fact] public void CreateChannel_Fails_WhenTlsMaterialFilesAreMissing() { NexusConnectionUriParts parsed = new(NexusUriSchemes.Graph, "127.0.0.1", 50051, null); NexusTlsMaterial material = new("/nonexistent/ca.pem", "/nonexistent/cert.pem", "/nonexistent/key.pem"); Robotico.Result.Result result = NexusGrpcChannelFactory.CreateChannel(parsed, material, useHttps: true); Assert.True(result.IsError(out IError? error)); Assert.Equal(NexusErrors.TlsRejected, error!.Code); } }