Skip to content
Merged
Show file tree
Hide file tree
Changes from 2 commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
96 changes: 96 additions & 0 deletions Activout.RestClient.Test/ErrorResponseTextPlainTest.cs
Original file line number Diff line number Diff line change
@@ -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<ErrorResponseTextPlainTest>())
.With(_mockHttp.ToHttpClient())
.BaseUri(BaseUri)
.Build<ITestService>();
}

private ITestServiceWithCustomError CreateTestServiceWithCustomError()
{
return _restClientFactory.CreateBuilder()
.With(_loggerFactory.CreateLogger<ErrorResponseTextPlainTest>())
.With(_mockHttp.ToHttpClient())
.BaseUri(BaseUri)
.Build<ITestServiceWithCustomError>();
}

[Fact]
public async Task TestErrorResponse_TextPlain_BadRequest_Async()
{
// arrange
_mockHttp
.When(HttpMethod.Get, $"{BaseUri}/resource")
.Respond(HttpStatusCode.BadRequest, "text/plain", "Invalid request parameter");

var service = CreateTestService();

// act
var exception = await Assert.ThrowsAsync<RestClientException>(() => service.GetResourceAsync());

// assert
Assert.Equal(HttpStatusCode.BadRequest, exception.StatusCode);
Assert.NotNull(exception.ErrorResponse);
Assert.IsType<string>(exception.ErrorResponse);
Assert.Equal("Invalid request parameter", exception.GetErrorResponse<string>());
Assert.Equal("Invalid request parameter", exception.Message);
}

[Fact]
public async Task TestErrorResponse_TextPlain_BadRequest_CustomErrorMessage_Async()
{
// arrange
_mockHttp
.When(HttpMethod.Get, $"{BaseUri}/resource")
.Respond(HttpStatusCode.BadRequest, "text/plain", "Invalid request parameter");

var service = CreateTestServiceWithCustomError();

// act
var exception = await Assert.ThrowsAsync<RestClientException>(() => service.GetResourceAsync());

// assert
Assert.Equal(HttpStatusCode.BadRequest, exception.StatusCode);
Assert.NotNull(exception.ErrorResponse);
Assert.IsType<CustomErrorMessage>(exception.ErrorResponse);
var customError = exception.GetErrorResponse<CustomErrorMessage>();
Assert.Equal("Invalid request parameter", customError.Message);
}

[Path("resource")]
[ErrorResponse(typeof(string))]
public interface ITestService
{
[Get]
Task GetResourceAsync();
}

[Path("resource")]
[ErrorResponse(typeof(CustomErrorMessage))]
public interface ITestServiceWithCustomError
{
[Get]
Task GetResourceAsync();
}

public record CustomErrorMessage(string Message);
}
73 changes: 73 additions & 0 deletions Activout.RestClient.Xml.Test/ErrorResponseXmlTest.cs
Original file line number Diff line number Diff line change
@@ -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<ErrorResponseXmlTest>())
.With(_mockHttp.ToHttpClient())
.BaseUri(BaseUri)
.Build<ITestService>();
}

[Fact]
public async Task TestErrorResponse_Xml_BadRequest_Async()
{
// arrange
const string errorXml = """
<?xml version="1.0" encoding="UTF-8"?>
<error>
<code>400</code>
<message>Invalid request parameter</message>
</error>
""";
_mockHttp
.When(HttpMethod.Get, $"{BaseUri}/resource")
.Respond(HttpStatusCode.BadRequest, "text/xml", errorXml);

var service = CreateTestService();

// act
var exception = await Assert.ThrowsAsync<RestClientException>(() => service.GetResourceAsync());

// assert
Assert.Equal(HttpStatusCode.BadRequest, exception.StatusCode);
Assert.NotNull(exception.ErrorResponse);
Assert.IsType<XmlErrorResponse>(exception.ErrorResponse);
var errorResponse = exception.GetErrorResponse<XmlErrorResponse>();
Assert.Equal(400, errorResponse.Code);
Assert.Equal("Invalid request parameter", errorResponse.Message);
}

[Path("resource")]
[ErrorResponse(typeof(XmlErrorResponse))]
public interface ITestService
{
[Get]
Task GetResourceAsync();
}

[XmlRoot("error")]
public class XmlErrorResponse
{
[XmlElement("code")]
public int Code { get; set; }

[XmlElement("message")]
public string Message { get; set; } = "";
}
}
Loading