116 lines
4 KiB
C#
116 lines
4 KiB
C#
using System.Net;
|
|
using System.Net.Http;
|
|
using System.Threading.Tasks;
|
|
using FluentAssertions;
|
|
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; }
|
|
}
|
|
|
|
[Fact]
|
|
public async Task Get_WithUrl_ReturnsResult() {
|
|
var httpClient = new HttpClientBuilder()
|
|
.WithMethod(HttpMethod.Get)
|
|
.WithUrl("/test")
|
|
.WithResponse(@"{""TestProperty"":1}")
|
|
.Build();
|
|
|
|
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 = new HttpClientBuilder()
|
|
.WithMethod(HttpMethod.Get)
|
|
.WithUrl("/test")
|
|
.WithQueryString("query1", "1")
|
|
.WithQueryString("query2", "2")
|
|
.WithResponse(@"{""TestProperty"":1}")
|
|
.Build();
|
|
|
|
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_WithUrlThatReturnsError_ThrowsException() {
|
|
var httpClient = new HttpClientBuilder()
|
|
.WithMethod(HttpMethod.Get)
|
|
.WithUrl("/test")
|
|
.WithResponse("")
|
|
.WithErrorStatus(HttpStatusCode.NotFound)
|
|
.Build();
|
|
|
|
var client = new TestApiClient(httpClient);
|
|
|
|
client.Invoking(apiClient => apiClient.Get<TestObject>("/404")).Should().Throw<ApiCallException>()
|
|
.WithMessage("Error calling API http://example.com/404: 404, Not Found");
|
|
}
|
|
|
|
[Fact]
|
|
public async Task Post_WithUrlAndValue_ReturnsResult() {
|
|
var httpClient = new HttpClientBuilder()
|
|
.WithMethod(HttpMethod.Post)
|
|
.WithUrl("/test")
|
|
.WithResponse(@"{""TestProperty"":1}")
|
|
.WithPostBody("\"value\"")
|
|
.Build();
|
|
|
|
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 = new HttpClientBuilder()
|
|
.WithMethod(HttpMethod.Post)
|
|
.WithUrl("/test")
|
|
.WithQueryString("query1", "1")
|
|
.WithQueryString("query2", "2")
|
|
.WithPostBody("\"value\"")
|
|
.WithResponse(@"{""TestProperty"":1}")
|
|
.Build();
|
|
|
|
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);
|
|
}
|
|
|
|
[Fact]
|
|
public async Task Post_WithUrlAndValueAndQuery_ReturnsNoResult() {
|
|
var httpClient = new HttpClientBuilder()
|
|
.WithMethod(HttpMethod.Post)
|
|
.WithUrl("/test")
|
|
.WithQueryString("query1", "1")
|
|
.WithQueryString("query2", "2")
|
|
.WithPostBody("\"value\"")
|
|
.Build(out var mockHttpMessageHandler);
|
|
|
|
|
|
var client = new TestApiClient(httpClient);
|
|
await client.Post<object>("/test", "value", new {query1 = 1, query2 = 2});
|
|
mockHttpMessageHandler.VerifyNoOutstandingExpectation();
|
|
}
|
|
}
|
|
}
|