using System; using System.Runtime.InteropServices; using MxGateway.Contracts.Proto; using MxGateway.Worker.Conversion; namespace MxGateway.Worker.Tests.Conversion; public sealed class HResultConverterTests { private readonly HResultConverter _converter = new(); [Fact] public void Convert_WithComException_CapturesExceptionHResult() { COMException exception = new("Sensitive provider text should not be copied.", unchecked((int)0x80070057)); HResultConversion converted = _converter.Convert(exception); Assert.Equal(unchecked((int)0x80070057), converted.HResult); Assert.Equal(ProtocolStatusCode.MxaccessFailure, converted.ProtocolStatus.Code); Assert.Contains("0x80070057", converted.ProtocolStatus.Message); Assert.Contains(typeof(COMException).FullName!, converted.DiagnosticMessage); Assert.DoesNotContain("Sensitive provider text", converted.DiagnosticMessage); } [Fact] public void CreateProtocolStatus_WithSuccessHResult_ReturnsOk() { ProtocolStatus status = _converter.CreateProtocolStatus(0); Assert.Equal(ProtocolStatusCode.Ok, status.Code); Assert.Equal("HRESULT 0x00000000", status.Message); } [Fact] public void Convert_WithNonComException_CapturesExceptionHResult() { InvalidOperationException exception = new("do not include this"); HResultConversion converted = _converter.Convert(exception); Assert.Equal(exception.HResult, converted.HResult); Assert.Equal(ProtocolStatusCode.MxaccessFailure, converted.ProtocolStatus.Code); Assert.Contains("0x", converted.DiagnosticMessage); Assert.DoesNotContain("do not include this", converted.DiagnosticMessage); } }