diff --git a/Activout.RestClient.Test/ErrorResponseTextPlainTest.cs b/Activout.RestClient.Test/ErrorResponseTextPlainTest.cs new file mode 100644 index 0000000..413bf42 --- /dev/null +++ b/Activout.RestClient.Test/ErrorResponseTextPlainTest.cs @@ -0,0 +1,96 @@ +using System.Net; +using System.Net.Http; +using System.Threading.Tasks; +using Microsoft.Extensions.Logging; +using RichardSzalay.MockHttp; +using Xunit; +using Xunit.Abstractions; + +namespace Activout.RestClient.Test; + +public class ErrorResponseTextPlainTest(ITestOutputHelper outputHelper) +{ + private const string BaseUri = "https://example.com/api"; + + private readonly IRestClientFactory _restClientFactory = Services.CreateRestClientFactory(); + private readonly MockHttpMessageHandler _mockHttp = new(); + private readonly ILoggerFactory _loggerFactory = LoggerFactoryHelpers.CreateLoggerFactory(outputHelper); + + private ITestService CreateTestService() + { + return _restClientFactory.CreateBuilder() + .With(_loggerFactory.CreateLogger()) + .With(_mockHttp.ToHttpClient()) + .BaseUri(BaseUri) + .Build(); + } + + private ITestServiceWithCustomError CreateTestServiceWithCustomError() + { + return _restClientFactory.CreateBuilder() + .With(_loggerFactory.CreateLogger()) + .With(_mockHttp.ToHttpClient()) + .BaseUri(BaseUri) + .Build(); + } + + [Fact] + public async Task TestErrorResponse_TextPlain_BadRequest() + { + // arrange + _mockHttp + .When(HttpMethod.Get, $"{BaseUri}/resource") + .Respond(HttpStatusCode.BadRequest, "text/plain", "Invalid request parameter"); + + var service = CreateTestService(); + + // act + var exception = await Assert.ThrowsAsync(() => service.GetResource()); + + // assert + Assert.Equal(HttpStatusCode.BadRequest, exception.StatusCode); + Assert.NotNull(exception.ErrorResponse); + Assert.IsType(exception.ErrorResponse); + Assert.Equal("Invalid request parameter", exception.GetErrorResponse()); + Assert.Equal("Invalid request parameter", exception.Message); + } + + [Fact] + public async Task TestErrorResponse_TextPlain_BadRequest_CustomErrorMessage() + { + // arrange + _mockHttp + .When(HttpMethod.Get, $"{BaseUri}/resource") + .Respond(HttpStatusCode.BadRequest, "text/plain", "Invalid request parameter"); + + var service = CreateTestServiceWithCustomError(); + + // act + var exception = await Assert.ThrowsAsync(() => service.GetResource()); + + // assert + Assert.Equal(HttpStatusCode.BadRequest, exception.StatusCode); + Assert.NotNull(exception.ErrorResponse); + Assert.IsType(exception.ErrorResponse); + var customError = exception.GetErrorResponse(); + Assert.Equal("Invalid request parameter", customError.Message); + } + + [Path("resource")] + [ErrorResponse(typeof(string))] + public interface ITestService + { + [Get] + Task GetResource(); + } + + [Path("resource")] + [ErrorResponse(typeof(CustomErrorMessage))] + public interface ITestServiceWithCustomError + { + [Get] + Task GetResource(); + } + + public record CustomErrorMessage(string Message); +} diff --git a/Activout.RestClient.Xml.Test/ErrorResponseXmlTest.cs b/Activout.RestClient.Xml.Test/ErrorResponseXmlTest.cs new file mode 100644 index 0000000..d16b369 --- /dev/null +++ b/Activout.RestClient.Xml.Test/ErrorResponseXmlTest.cs @@ -0,0 +1,73 @@ +using System.Net; +using System.Xml.Serialization; +using Microsoft.Extensions.Logging; +using RichardSzalay.MockHttp; +using Xunit.Abstractions; + +namespace Activout.RestClient.Xml.Test; + +public class ErrorResponseXmlTest(ITestOutputHelper outputHelper) +{ + private const string BaseUri = "https://example.com/api"; + + private readonly IRestClientFactory _restClientFactory = Services.CreateRestClientFactory(); + private readonly MockHttpMessageHandler _mockHttp = new(); + private readonly ILoggerFactory _loggerFactory = LoggerFactoryHelpers.CreateLoggerFactory(outputHelper); + + private ITestService CreateTestService() + { + return _restClientFactory.CreateBuilder() + .WithXml() + .With(_loggerFactory.CreateLogger()) + .With(_mockHttp.ToHttpClient()) + .BaseUri(BaseUri) + .Build(); + } + + [Fact] + public async Task TestErrorResponse_Xml_BadRequest() + { + // arrange + const string errorXml = """ + + + 400 + Invalid request parameter + + """; + _mockHttp + .When(HttpMethod.Get, $"{BaseUri}/resource") + .Respond(HttpStatusCode.BadRequest, "text/xml", errorXml); + + var service = CreateTestService(); + + // act + var exception = await Assert.ThrowsAsync(() => service.GetResource()); + + // assert + Assert.Equal(HttpStatusCode.BadRequest, exception.StatusCode); + Assert.NotNull(exception.ErrorResponse); + Assert.IsType(exception.ErrorResponse); + var errorResponse = exception.GetErrorResponse(); + Assert.Equal(400, errorResponse.Code); + Assert.Equal("Invalid request parameter", errorResponse.Message); + } + + [Path("resource")] + [ErrorResponse(typeof(XmlErrorResponse))] + public interface ITestService + { + [Get] + Task GetResource(); + } + + [XmlRoot("error")] + public class XmlErrorResponse + { + [XmlElement("code")] + public int Code { get; set; } + + [XmlElement("message")] + public string Message { get; set; } = ""; + } +}