From 825341d356905b594a4d2230456a941c67d37dbd Mon Sep 17 00:00:00 2001 From: Bo Mortensen <4115553+Boz0r@users.noreply.github.com> Date: Tue, 7 Mar 2023 16:03:32 +0100 Subject: [PATCH 1/4] Update MessageRequestBuilderTests.cs --- .../Builder/MessageRequestBuilderTests.cs | 21 ++++++++++++++++++- 1 file changed, 20 insertions(+), 1 deletion(-) diff --git a/test/Atc.Rest.Client.Tests/Builder/MessageRequestBuilderTests.cs b/test/Atc.Rest.Client.Tests/Builder/MessageRequestBuilderTests.cs index a8f7aa6..7e538e1 100644 --- a/test/Atc.Rest.Client.Tests/Builder/MessageRequestBuilderTests.cs +++ b/test/Atc.Rest.Client.Tests/Builder/MessageRequestBuilderTests.cs @@ -163,6 +163,25 @@ public void Should_Replace_Query_Parameters_WithNull( .Be($"/api?foo={fooValue}&bar={barValue}"); } + [Theory] + [InlineAutoNSubstituteData("/api")] + public void Should_Omit_Query_Parameters_With_Empty_Array( + string template) + { + var sut = CreateSut(template); + + var values = Array.Empty(); + + sut.WithQueryParameter("foo", values); + var message = sut.Build(HttpMethod.Get); + + message! + .RequestUri! + .ToString() + .Should() + .Be($"/api"); + } + [Theory] [InlineAutoNSubstituteData("/api")] public void Should_Replace_Query_Parameters_With_ArrayOfItems1( @@ -259,4 +278,4 @@ public async Task Should_Include_Body(string content) .Be(content); } } -} \ No newline at end of file +} From 089c88004015df861d4dfbd042642a065bb3c22a Mon Sep 17 00:00:00 2001 From: Bo Mortensen <4115553+Boz0r@users.noreply.github.com> Date: Tue, 7 Mar 2023 16:04:16 +0100 Subject: [PATCH 2/4] Update MessageRequestBuilder.cs --- src/Atc.Rest.Client/Builder/MessageRequestBuilder.cs | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/src/Atc.Rest.Client/Builder/MessageRequestBuilder.cs b/src/Atc.Rest.Client/Builder/MessageRequestBuilder.cs index 96887be..558345d 100644 --- a/src/Atc.Rest.Client/Builder/MessageRequestBuilder.cs +++ b/src/Atc.Rest.Client/Builder/MessageRequestBuilder.cs @@ -149,6 +149,12 @@ public IMessageRequestBuilder WithQueryParameter(string name, object? value) if (valueType.IsArray || valueType.IsGenericType) { var objects = ((IEnumerable)value).Cast().ToArray(); + + if (objects.Length == 0) + { + return this; + } + var sb = new StringBuilder(); for (int i = 0; i < objects.Length; i++) { @@ -193,4 +199,4 @@ private string BuildQueryKeyEqualValue(KeyValuePair pair) : $"{pair.Key}={Uri.EscapeDataString(pair.Value)}"; } } -} \ No newline at end of file +} From c9c108747f9ac385f8ddad3163c5c98b64722e70 Mon Sep 17 00:00:00 2001 From: Boz0r Date: Tue, 7 Mar 2023 21:02:13 +0100 Subject: [PATCH 3/4] Removed whitespace --- src/Atc.Rest.Client/Builder/MessageRequestBuilder.cs | 2 +- .../Atc.Rest.Client.Tests/Builder/MessageRequestBuilderTests.cs | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/src/Atc.Rest.Client/Builder/MessageRequestBuilder.cs b/src/Atc.Rest.Client/Builder/MessageRequestBuilder.cs index 558345d..0f131a4 100644 --- a/src/Atc.Rest.Client/Builder/MessageRequestBuilder.cs +++ b/src/Atc.Rest.Client/Builder/MessageRequestBuilder.cs @@ -199,4 +199,4 @@ private string BuildQueryKeyEqualValue(KeyValuePair pair) : $"{pair.Key}={Uri.EscapeDataString(pair.Value)}"; } } -} +} \ No newline at end of file diff --git a/test/Atc.Rest.Client.Tests/Builder/MessageRequestBuilderTests.cs b/test/Atc.Rest.Client.Tests/Builder/MessageRequestBuilderTests.cs index 7e538e1..f5b132e 100644 --- a/test/Atc.Rest.Client.Tests/Builder/MessageRequestBuilderTests.cs +++ b/test/Atc.Rest.Client.Tests/Builder/MessageRequestBuilderTests.cs @@ -278,4 +278,4 @@ public async Task Should_Include_Body(string content) .Be(content); } } -} +} \ No newline at end of file From e8f327a923659d78d9b9eede937595815a953b82 Mon Sep 17 00:00:00 2001 From: Bo Mortensen Date: Mon, 13 Mar 2023 09:58:08 +0100 Subject: [PATCH 4/4] Split WithQueryParameter up for lists --- .../Builder/MessageRequestBuilder.cs | 32 +++++++-------- .../Builder/MessageRequestBuilderTests.cs | 39 +++++++++++++++++++ 2 files changed, 54 insertions(+), 17 deletions(-) diff --git a/src/Atc.Rest.Client/Builder/MessageRequestBuilder.cs b/src/Atc.Rest.Client/Builder/MessageRequestBuilder.cs index 0f131a4..0c69d67 100644 --- a/src/Atc.Rest.Client/Builder/MessageRequestBuilder.cs +++ b/src/Atc.Rest.Client/Builder/MessageRequestBuilder.cs @@ -140,35 +140,33 @@ public IMessageRequestBuilder WithQueryParameter(string name, object? value) throw new ArgumentException($"'{nameof(name)}' cannot be null or whitespace", nameof(name)); } - if (value is null) + if (value is not null) { - return this; + queryMapper[name] = value.ToString(); } - var valueType = value.GetType(); - if (valueType.IsArray || valueType.IsGenericType) - { - var objects = ((IEnumerable)value).Cast().ToArray(); + return this; + } - if (objects.Length == 0) - { - return this; - } + public IMessageRequestBuilder WithQueryParameter(string name, IList? value) + { + if (string.IsNullOrWhiteSpace(name)) + { + throw new ArgumentException($"'{nameof(name)}' cannot be null or whitespace", nameof(name)); + } + if (value is { Count: not 0 }) + { var sb = new StringBuilder(); - for (int i = 0; i < objects.Length; i++) + for (var i = 0; i < value.Count; i++) { sb.Append(i == 0 - ? Uri.EscapeDataString(objects[i].ToString()) - : $"&{name}={Uri.EscapeDataString(objects[i].ToString())}"); + ? Uri.EscapeDataString(value[i].ToString()) + : $"&{name}={Uri.EscapeDataString(value[i].ToString())}"); } queryMapper["#" + name] = sb.ToString(); } - else - { - queryMapper[name] = value.ToString(); - } return this; } diff --git a/test/Atc.Rest.Client.Tests/Builder/MessageRequestBuilderTests.cs b/test/Atc.Rest.Client.Tests/Builder/MessageRequestBuilderTests.cs index f5b132e..4c5ef4e 100644 --- a/test/Atc.Rest.Client.Tests/Builder/MessageRequestBuilderTests.cs +++ b/test/Atc.Rest.Client.Tests/Builder/MessageRequestBuilderTests.cs @@ -2,7 +2,9 @@ using System.Collections.Generic; using System.Net.Http; using System.Net.Http.Headers; +using System.Numerics; using System.Threading.Tasks; +using System.Web; using Atc.Rest.Client.Builder; using Atc.Rest.Client.Serialization; using Atc.Test; @@ -163,6 +165,43 @@ public void Should_Replace_Query_Parameters_WithNull( .Be($"/api?foo={fooValue}&bar={barValue}"); } + [Theory] + [InlineAutoNSubstituteData("/api")] + public void Should_Omit_Query_Parameters_With_DateTime_List( + string template, + IEnumerable values) + { + var sut = CreateSut(template); + + sut.WithQueryParameter("foo", values); + var message = sut.Build(HttpMethod.Get); + + message! + .RequestUri! + .ToString() + .Should() + .BeEquivalentTo($"/api?foo={HttpUtility.UrlEncode(values.ToString())}"); + } + + [Theory] + [InlineAutoNSubstituteData("/api")] + public void Should_Omit_Query_Parameters_With_Empty_List( + string template) + { + var sut = CreateSut(template); + + var values = new List(); + + sut.WithQueryParameter("foo", values); + var message = sut.Build(HttpMethod.Get); + + message! + .RequestUri! + .ToString() + .Should() + .Be($"/api"); + } + [Theory] [InlineAutoNSubstituteData("/api")] public void Should_Omit_Query_Parameters_With_Empty_Array(