using Google.Protobuf; using MxGateway.Client; using MxGateway.Contracts.Proto; namespace MxGateway.Client.Tests; public sealed class MxCommandReplyExtensionsTests { [Fact] public void EnsureSuccess_WithRegisterFixture_ReturnsReply() { MxCommandReply reply = ReadReplyFixture("register.ok.reply.json"); Assert.Same(reply, reply.EnsureProtocolSuccess()); Assert.Same(reply, reply.EnsureMxAccessSuccess()); } [Fact] public void EnsureMxAccessSuccess_WithFailureFixture_PreservesHResultAndStatuses() { MxCommandReply reply = ReadReplyFixture("write.mxaccess-failure.reply.json"); reply.EnsureProtocolSuccess(); MxAccessException exception = Assert.Throws( reply.EnsureMxAccessSuccess); Assert.Equal(-2147220992, exception.HResultCode); Assert.Equal(reply.Statuses.Count, exception.Statuses.Count); Assert.Equal(reply, exception.Reply); Assert.Contains("0x80040200", exception.Message); } [Fact] public void EnsureProtocolSuccess_WithSessionFailure_ThrowsSessionException() { MxCommandReply reply = new() { SessionId = "session-missing", CorrelationId = "correlation", ProtocolStatus = new ProtocolStatus { Code = ProtocolStatusCode.SessionNotFound, Message = "Session was not found.", }, }; MxGatewaySessionException exception = Assert.Throws( reply.EnsureProtocolSuccess); Assert.Equal("session-missing", exception.SessionId); Assert.Equal(ProtocolStatusCode.SessionNotFound, exception.ProtocolStatus?.Code); } private static MxCommandReply ReadReplyFixture(string fileName) { DirectoryInfo directory = new(AppContext.BaseDirectory); while (directory is not null) { string path = Path.Combine( directory.FullName, "clients", "proto", "fixtures", "behavior", "command-replies", fileName); if (File.Exists(path)) { return JsonParser.Default.Parse(File.ReadAllText(path)); } directory = directory.Parent!; } throw new FileNotFoundException(fileName); } }