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 Post(string url, object value, object query = null) => await base.Post(url, value, query); public async Task Get(string url, object query = null) => await base.Get(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("/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("/test", new {query1 = 1, query2 = 2})).Should().BeEquivalentTo(expected); } [Fact] public void Get_WithUrlThatReturns404_ThrowsException() { var httpClient = new HttpClientBuilder() .WithMethod(HttpMethod.Get) .WithUrl("/test") .WithResponse("") .Build(); var client = new TestApiClient(httpClient); client.Invoking(apiClient => apiClient.Get("/404")).Should().Throw() .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 = new HttpClientBuilder() .WithMethod(HttpMethod.Post) .WithUrl("/test") .WithResponse(@"{""TestProperty"":1}") .Build(); var expected = new TestObject {TestProperty = 1}; var client = new TestApiClient(httpClient); (await client.Post("/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("/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(); var client = new TestApiClient(httpClient); (await client.Post("/test", "value", new {query1 = 1, query2 = 2})).Should().BeNull(); } } }