diff --git a/src/Http/Wolverine.Http.Tests/from_query_binding.cs b/src/Http/Wolverine.Http.Tests/from_query_binding.cs index 1d97cfcf5..ec1d34dd0 100644 --- a/src/Http/Wolverine.Http.Tests/from_query_binding.cs +++ b/src/Http/Wolverine.Http.Tests/from_query_binding.cs @@ -184,4 +184,109 @@ public async Task value_with_alias() (await forQuerystring("name=Jones&number=95&Aliased=foo")).ValueWithAlias.ShouldBe("foo"); (await forQuerystring("name=Jones&number=95&valueWithAlias=foo")).ValueWithAlias.ShouldBeNull(); } + + [Fact] + public async Task aliased_string_array_as_property() + { + var result = await Scenario(x => + { + x.Get + .Url("/api/bigquery") + .QueryString("v", "one") + .QueryString("v", "two"); + }); + + var query = result.ReadAsJson(); + query.AliasedValues.ShouldBe(["one", "two"]); + } + + [Fact] + public async Task aliased_int_array_as_property() + { + var result = await Scenario(x => + { + x.Get + .Url("/api/bigquery") + .QueryString("n", "10") + .QueryString("n", "20"); + }); + + var query = result.ReadAsJson(); + query.AliasedNumbers.ShouldBe([10, 20]); + } + + [Fact] + public async Task aliased_enum_list_as_property() + { + var result = await Scenario(x => + { + x.Get + .Url("/api/bigquery") + .QueryString("d", "North") + .QueryString("d", "South"); + }); + + var query = result.ReadAsJson(); + query.AliasedEnumList.ShouldBe([Direction.North, Direction.South]); + } + + [Fact] + public async Task aliased_string_array_in_record_with_fromquery() + { + var result = await Scenario(x => + { + x.Get + .Url("/api/fromquery/aliased-array") + .QueryString("v", "one") + .QueryString("v", "two"); + }); + + var query = result.ReadAsJson(); + query.Values.ShouldBe(["one", "two"]); + } + + [Fact] + public async Task aliased_int_array_in_record_with_fromquery() + { + var result = await Scenario(x => + { + x.Get + .Url("/api/fromquery/aliased-int-array") + .QueryString("n", "5") + .QueryString("n", "10"); + }); + + var query = result.ReadAsJson(); + query.Numbers.ShouldBe([5, 10]); + } + + [Fact] + public async Task aliased_string_array_in_record_with_asparameters() + { + var result = await Scenario(x => + { + x.Get + .Url("/api/asparameters/aliased-array") + .QueryString("v", "one") + .QueryString("v", "two"); + }); + + var query = result.ReadAsJson(); + query.Values.ShouldBe(["one", "two"]); + } + + [Fact] + public async Task aliased_int_array_in_record_with_asparameters() + { + var result = await Scenario(x => + { + x.Get + .Url("/api/asparameters/aliased-int-array") + .QueryString("n", "5") + .QueryString("n", "10"); + }); + + var query = result.ReadAsJson(); + query.Numbers.ShouldBe([5, 10]); + } } \ No newline at end of file diff --git a/src/Http/Wolverine.Http/HttpChain.cs b/src/Http/Wolverine.Http/HttpChain.cs index ad31b3038..681dfedf5 100644 --- a/src/Http/Wolverine.Http/HttpChain.cs +++ b/src/Http/Wolverine.Http/HttpChain.cs @@ -522,7 +522,7 @@ public bool FindQuerystringVariable(Type variableType, string routeOrParameterNa if (parameterType == typeof(string[])) { - variable = new ParsedArrayQueryStringValue(parameterType, parameterName).Variable; + variable = new ParsedArrayQueryStringValue(parameterType, key).Variable; variable.Name = key; _querystringVariables.Add(variable); } @@ -533,22 +533,22 @@ public bool FindQuerystringVariable(Type variableType, string routeOrParameterNa if (RouteParameterStrategy.CanParse(inner)) { //variable = new ParsedNullableQueryStringValue(parameterType, parameterName).Variable; - variable = new ReadHttpFrame(BindingSource.QueryString, parameterType, parameterName).Variable; + variable = new ReadHttpFrame(BindingSource.QueryString, parameterType, key).Variable; variable.Name = key; _querystringVariables.Add(variable); } } - + if (parameterType.IsArray && RouteParameterStrategy.CanParse(parameterType.GetElementType())) { - variable = new ParsedArrayQueryStringValue(parameterType, parameterName).Variable; + variable = new ParsedArrayQueryStringValue(parameterType, key).Variable; variable.Name = key; _querystringVariables.Add(variable); } if (ParsedCollectionQueryStringValue.CanParse(parameterType)) { - variable = new ParsedCollectionQueryStringValue(parameterType, parameterName).Variable; + variable = new ParsedCollectionQueryStringValue(parameterType, key).Variable; variable.Name = key; _querystringVariables.Add(variable); } diff --git a/src/Http/WolverineWebApi/QuerystringEndpoints.cs b/src/Http/WolverineWebApi/QuerystringEndpoints.cs index 247a65fae..7f340df01 100644 --- a/src/Http/WolverineWebApi/QuerystringEndpoints.cs +++ b/src/Http/WolverineWebApi/QuerystringEndpoints.cs @@ -90,6 +90,18 @@ public static class FromQueryEndpoints [WolverineGet("/api/bigquery")] public static BigQuery Get([FromQuery] BigQuery query) => query; + + [WolverineGet("/api/fromquery/aliased-array")] + public static AliasedArrayQuery GetAliasedArray([FromQuery] AliasedArrayQuery query) => query; + + [WolverineGet("/api/fromquery/aliased-int-array")] + public static AliasedIntArrayQuery GetAliasedIntArray([FromQuery] AliasedIntArrayQuery query) => query; + + [WolverineGet("/api/asparameters/aliased-array")] + public static AliasedArrayQuery GetAliasedArrayAsParams([AsParameters] AliasedArrayQuery query) => query; + + [WolverineGet("/api/asparameters/aliased-int-array")] + public static AliasedIntArrayQuery GetAliasedIntArrayAsParams([AsParameters] AliasedIntArrayQuery query) => query; } @@ -99,6 +111,10 @@ public record Query3(Guid Id); public record Query4(string Name, int Number, Direction Direction); +public record AliasedArrayQuery([FromQuery(Name = "v")] string[] Values); + +public record AliasedIntArrayQuery([FromQuery(Name = "n")] int[] Numbers); + public class BigQuery { @@ -122,4 +138,16 @@ public class BigQuery public List EnumListValues { get; set; } = new(); public List IntList { get; set; } + + [FromQuery(Name = "v")] + [FromForm(Name = "v")] + public string[] AliasedValues { get; set; } + + [FromQuery(Name = "n")] + [FromForm(Name = "n")] + public int[] AliasedNumbers { get; set; } + + [FromQuery(Name = "d")] + [FromForm(Name = "d")] + public List AliasedEnumList { get; set; } = new(); } \ No newline at end of file