website/Website.Tests/Data/ApiClientTests.cs

83 lines
2.8 KiB
C#

using System;
using System.Net.Http;
using System.Threading.Tasks;
using FluentAssertions;
using RichardSzalay.MockHttp;
using Website.Data;
using Xunit;
namespace Website.Tests.Data {
public class ApiClientTests {
private class TestApiClient : ApiClient {
public TestApiClient(HttpClient client) : base(client) {
}
public async Task<T> Post<T>(string url, object value, object query = null) => await base.Post<T>(url, value, query);
public async Task<T> Get<T>(string url, object query = null) => await base.Get<T>(url, query);
}
private class TestObject {
public int TestProperty { get; set; }
}
private static HttpClient MakeHttpClient(HttpMethod method, string url, string response) {
var httpMessageHandler = new MockHttpMessageHandler();
httpMessageHandler.When(method, url).Respond("application/json", response);
var httpClient = httpMessageHandler.ToHttpClient();
httpClient.BaseAddress = new Uri("http://example.com");
return httpClient;
}
[Fact]
public async Task Get_WithUrl_ReturnsResult() {
var httpClient = MakeHttpClient(HttpMethod.Get, "/test", @"{""TestProperty"":1}");
var expected = new TestObject {TestProperty = 1};
var client = new TestApiClient(httpClient);
(await client.Get<TestObject>("/test")).Should().BeEquivalentTo(expected);
}
[Fact]
public async Task Get_WithUrlAndQuery_ReturnsResult() {
var httpClient = MakeHttpClient(HttpMethod.Get, "/test?query1=1&query2=2", @"{""TestProperty"":1}");
var expected = new TestObject {TestProperty = 1};
var client = new TestApiClient(httpClient);
(await client.Get<TestObject>("/test", new {query1 = 1, query2 = 2})).Should().BeEquivalentTo(expected);
}
[Fact]
public void Get_WithUrlThatReturns404_ThrowsException() {
var httpClient = MakeHttpClient(HttpMethod.Get, "/test", "");
var client = new TestApiClient(httpClient);
client.Invoking(apiClient => apiClient.Get<TestObject>("/404")).Should().Throw<ApiCallException>()
.WithMessage("Error calling API http://example.com/404: 404, No matching mock handler for \"GET http://example.com/404\"");
}
[Fact]
public async Task Post_WithUrlAndValue_ReturnsResult() {
var httpClient = MakeHttpClient(HttpMethod.Post, "/test", @"{""TestProperty"":1}");
var expected = new TestObject {TestProperty = 1};
var client = new TestApiClient(httpClient);
(await client.Post<TestObject>("/test", "value")).Should().BeEquivalentTo(expected);
}
[Fact]
public async Task Post_WithUrlAndValueAndQuery_ReturnsResult() {
var httpClient = MakeHttpClient(HttpMethod.Post, "/test?query1=1&query2=2", @"{""TestProperty"":1}");
var expected = new TestObject {TestProperty = 1};
var client = new TestApiClient(httpClient);
(await client.Post<TestObject>("/test", "value", new {query1 = 1, query2 = 2})).Should().BeEquivalentTo(expected);
}
}
}