From 022de696e36e6fa1d7d12b313e3fa24695eb2db2 Mon Sep 17 00:00:00 2001 From: Robert Marshall Date: Sat, 11 Apr 2020 09:01:48 +0100 Subject: [PATCH] Expand builder and tests for query strings and post body --- Website.Tests/Data/ApiClientTests.cs | 50 +++++++++++++++++++++++++--- Website.Tests/HttpClientBuilder.cs | 23 +++++++++++-- 2 files changed, 66 insertions(+), 7 deletions(-) diff --git a/Website.Tests/Data/ApiClientTests.cs b/Website.Tests/Data/ApiClientTests.cs index 959ebef..05e042e 100644 --- a/Website.Tests/Data/ApiClientTests.cs +++ b/Website.Tests/Data/ApiClientTests.cs @@ -21,7 +21,11 @@ namespace Website.Tests.Data { [Fact] public async Task Get_WithUrl_ReturnsResult() { - var httpClient = new HttpClientBuilder().WithMethod(HttpMethod.Get).WithUrl("/test").WithResponse(@"{""TestProperty"":1}").Build(); + var httpClient = new HttpClientBuilder() + .WithMethod(HttpMethod.Get) + .WithUrl("/test") + .WithResponse(@"{""TestProperty"":1}") + .Build(); var expected = new TestObject {TestProperty = 1}; @@ -31,7 +35,13 @@ namespace Website.Tests.Data { [Fact] public async Task Get_WithUrlAndQuery_ReturnsResult() { - var httpClient = new HttpClientBuilder().WithMethod(HttpMethod.Get).WithUrl("/test?query1=1&query2=2").WithResponse(@"{""TestProperty"":1}").Build(); + 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}; @@ -41,7 +51,11 @@ namespace Website.Tests.Data { [Fact] public void Get_WithUrlThatReturns404_ThrowsException() { - var httpClient = new HttpClientBuilder().WithMethod(HttpMethod.Get).WithUrl("/test").WithResponse("").Build(); + var httpClient = new HttpClientBuilder() + .WithMethod(HttpMethod.Get) + .WithUrl("/test") + .WithResponse("") + .Build(); var client = new TestApiClient(httpClient); @@ -51,7 +65,11 @@ namespace Website.Tests.Data { [Fact] public async Task Post_WithUrlAndValue_ReturnsResult() { - var httpClient = new HttpClientBuilder().WithMethod(HttpMethod.Post).WithUrl("/test").WithResponse(@"{""TestProperty"":1}").Build(); + var httpClient = new HttpClientBuilder() + .WithMethod(HttpMethod.Post) + .WithUrl("/test") + .WithResponse(@"{""TestProperty"":1}") + .Build(); var expected = new TestObject {TestProperty = 1}; @@ -61,12 +79,34 @@ namespace Website.Tests.Data { [Fact] public async Task Post_WithUrlAndValueAndQuery_ReturnsResult() { - var httpClient = new HttpClientBuilder().WithMethod(HttpMethod.Post).WithUrl("/test?query1=1&query2=2").WithResponse(@"{""TestProperty"":1}").Build(); + 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(); + } } } diff --git a/Website.Tests/HttpClientBuilder.cs b/Website.Tests/HttpClientBuilder.cs index 21de3c5..4d2998d 100644 --- a/Website.Tests/HttpClientBuilder.cs +++ b/Website.Tests/HttpClientBuilder.cs @@ -1,11 +1,14 @@ using System; +using System.Collections.Generic; +using System.Linq; using System.Net.Http; using RichardSzalay.MockHttp; namespace Website.Tests { public class HttpClientBuilder { - private string _url, _response; + private string _url, _response, _body; private HttpMethod _method; + private readonly Dictionary _queries = new Dictionary(); public HttpClientBuilder WithUrl(string url) { _url = url; @@ -22,9 +25,25 @@ namespace Website.Tests { return this; } + public HttpClientBuilder WithQueryString(string key, string value) { + _queries.Add(key, value); + return this; + } + + public HttpClientBuilder WithPostBody(string body) { + _body = body; + return this; + } + public HttpClient Build() { var httpMessageHandler = new MockHttpMessageHandler(); - httpMessageHandler.When(_method, _url).Respond("application/json", _response); + + var mockedRequest = httpMessageHandler.Expect(_method, _url).Respond("application/json", _response ?? string.Empty); + + if (_queries.Any()) + mockedRequest.WithExactQueryString(_queries); + if (!string.IsNullOrEmpty(_body)) + mockedRequest.WithContent(_body); var httpClient = httpMessageHandler.ToHttpClient(); httpClient.BaseAddress = new Uri("http://example.com");