diff --git a/EstateReportingAPI.Client/EstateReportingApiClient.cs b/EstateReportingAPI.Client/EstateReportingApiClient.cs index 593efb8..5c9ed3a 100644 --- a/EstateReportingAPI.Client/EstateReportingApiClient.cs +++ b/EstateReportingAPI.Client/EstateReportingApiClient.cs @@ -514,8 +514,7 @@ public async Task> GetTodaysSalesValueByHour(String public async Task GetTodaysSettlement(String accessToken, Guid estateId, Guid? merchantId, Guid? operatorId, DateTime comparisonDate, CancellationToken cancellationToken){ TodaysSettlement response = null; - - + QueryStringBuilder builder = new QueryStringBuilder(); builder.AddParameter("comparisonDate", $"{comparisonDate.Date:yyyy-MM-dd}"); builder.AddParameter("merchantId", merchantId); @@ -648,33 +647,62 @@ private String BuildRequestUrl(String route){ public class QueryStringBuilder { - private Dictionary parameters; + private Dictionary parameters = new Dictionary(); - public QueryStringBuilder() + public QueryStringBuilder AddParameter(string key, Object value) { - parameters = new Dictionary(); + this.parameters.Add(key, value); + return this; } - public QueryStringBuilder AddParameter(string key, object value) + static Dictionary FilterDictionary(Dictionary inputDictionary) { - // Check for null values, excluding value types like Guid - if (value != null && !(value is ValueType && Nullable.GetUnderlyingType(value.GetType()) == null)) + Dictionary result = new Dictionary(); + + foreach (KeyValuePair entry in inputDictionary) { - parameters[key] = value; + if (entry.Value != null && !IsDefaultValue(entry.Value)) + { + result.Add(entry.Key, entry.Value); + } } - return this; + + return result; } - public string BuildQueryString() + static bool IsDefaultValue(T value) { - if (parameters.Count == 0) + Object? defaultValue = GetDefault(value.GetType()); + + if (defaultValue == null && value.GetType() == typeof(String)) { - return string.Empty; + defaultValue = String.Empty; } + return defaultValue.Equals(value); + } + + public static object GetDefault(Type t) + { + Func f = GetDefault; + return f.Method.GetGenericMethodDefinition().MakeGenericMethod(t).Invoke(null, null); + } - var queryString = new StringBuilder(); + private static T GetDefault() + { + return default(T); + } + + public string BuildQueryString(){ + Dictionary filtered = FilterDictionary(this.parameters); + + if (filtered.Count == 0) + { + return string.Empty; + } - foreach (var kvp in parameters) + StringBuilder queryString = new StringBuilder(); + + foreach (KeyValuePair kvp in filtered) { if (queryString.Length > 0) { diff --git a/EstateReportingAPI.Tests/EstateReportingAPI.Tests.csproj b/EstateReportingAPI.Tests/EstateReportingAPI.Tests.csproj index ed28f61..fa5e109 100644 --- a/EstateReportingAPI.Tests/EstateReportingAPI.Tests.csproj +++ b/EstateReportingAPI.Tests/EstateReportingAPI.Tests.csproj @@ -2,7 +2,7 @@ net7.0 - None + Full false @@ -32,6 +32,7 @@ + diff --git a/EstateReportingAPI.Tests/General/BootstrapperTests.cs b/EstateReportingAPI.Tests/General/BootstrapperTests.cs index 28f9855..0b3b14e 100644 --- a/EstateReportingAPI.Tests/General/BootstrapperTests.cs +++ b/EstateReportingAPI.Tests/General/BootstrapperTests.cs @@ -3,6 +3,9 @@ using System; using System.Collections.Generic; using System.Diagnostics; + using System.Net.Http; + using System.Threading; + using Client; using EstateReportingAPI; using Lamar; using Microsoft.AspNetCore.Hosting; @@ -10,14 +13,15 @@ using Microsoft.Extensions.DependencyInjection; using Microsoft.Extensions.Hosting; using Moq; + using Shouldly; using Xunit; [Collection("TestCollection")] public class BootstrapperTests { [Fact] - public void VerifyBootstrapperIsValid() - { + public void VerifyBootstrapperIsValid(){ + Mock hostingEnvironment = new Mock(); hostingEnvironment.Setup(he => he.EnvironmentName).Returns("Development"); hostingEnvironment.Setup(he => he.ContentRootPath).Returns("/home"); @@ -67,4 +71,32 @@ private void AddTestRegistrations(ServiceRegistry services, services.AddSingleton(Startup.Configuration); } } + + public class QueryStringBuilderTests + { + [Theory] + [InlineData("StringTest", "value",true)] + [InlineData("IntegerTest", 10, true)] + [InlineData("DecimalTest1", 1.00, true)] + [InlineData("DecimalTest2", 0.01, true)] + [InlineData("GuidTest", "69F35754-EB7D-441B-A62F-F50633AFBE91", true)] + [InlineData("NullTest", null, false)] + [InlineData("EmptyStringTest", "", false)] + [InlineData("ZeroIntegerTest", 0, false)] + [InlineData("ZeroDecimalTest1", 0, false)] + [InlineData("ZeroDecimalTest2", 0.00, false)] + [InlineData("EmptyGuidTest", "00000000-0000-0000-0000-000000000000", false)] + public void QueryStringBuilderTests_BuildQueryString_ValuesAddedAsExpected(String keyname, Object value, Boolean isAdded){ + if (keyname == "GuidTest" || keyname == "EmptyGuidTest") + value = Guid.Parse(value.ToString()); + + QueryStringBuilder builder = new QueryStringBuilder(); + builder.AddParameter(keyname, value); + + String queryString = builder.BuildQueryString(); + + queryString.Contains(keyname).ShouldBe(isAdded); + + } + } }