diff --git a/src/Atc.Rest.Client/Builder/MessageRequestBuilder.cs b/src/Atc.Rest.Client/Builder/MessageRequestBuilder.cs index 96887be..0c69d67 100644 --- a/src/Atc.Rest.Client/Builder/MessageRequestBuilder.cs +++ b/src/Atc.Rest.Client/Builder/MessageRequestBuilder.cs @@ -140,29 +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) + 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 objects = ((IEnumerable)value).Cast().ToArray(); 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 a8f7aa6..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,62 @@ 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( + 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(