From ed78c83e69d5e2f4270fd1a1d203bcae8bbe00bc Mon Sep 17 00:00:00 2001 From: Chris Gee Date: Tue, 16 Dec 2025 16:36:44 -0800 Subject: [PATCH 1/7] Add value count support and tests --- .../client/modules/AutocompleteTests.cs | 29 +++++++++++++++ .../client/modules/BrowseTests.cs | 30 ++++++++++++++++ .../client/modules/RecommendationsTests.cs | 35 +++++++++++++++++++ .../client/modules/SearchTests.cs | 30 ++++++++++++++++ 4 files changed, 124 insertions(+) diff --git a/src/Constructorio_NET.Tests/client/modules/AutocompleteTests.cs b/src/Constructorio_NET.Tests/client/modules/AutocompleteTests.cs index 616fe08..0dc9926 100644 --- a/src/Constructorio_NET.Tests/client/modules/AutocompleteTests.cs +++ b/src/Constructorio_NET.Tests/client/modules/AutocompleteTests.cs @@ -90,6 +90,35 @@ public async Task GetAutocompleteResultsShouldReturnResultWithVariationsMap() ); } + [Test] + public async Task GetAutocompleteResultsShouldReturnResultWithVariationsMapValueCount() + { + AutocompleteRequest req = new AutocompleteRequest("item1") + { + UserInfo = UserInfo, + VariationsMap = new VariationsMap() + }; + req.VariationsMap.AddValueRule( + "deactivated", + AggregationTypes.ValueCount, + "data.deactivated", + "true" + ); + ConstructorIO constructorio = new ConstructorIO(this.Config); + AutocompleteResponse res = await constructorio.Autocomplete.GetAutocompleteResults(req); + res.Request.TryGetValue("variations_map", out object reqVariationsMap); + JObject variationMapResult = JObject.Parse( + "{ \"group_by\": [], \"values\": { \"deactivated\": { \"aggregation\": \"value_count\", \"field\": \"data.deactivated\", \"value\": \"true\" }}, \"dtype\": \"object\" }" + ); + + Assert.NotNull(res.ResultId, "Result id exists"); + Assert.AreEqual( + JObject.Parse(reqVariationsMap.ToString()), + variationMapResult, + "Variations Map was passed as parameter" + ); + } + [Test] public async Task GetAutocompleteResultsShouldReturnResultWithSearchSuggestionOnly() { diff --git a/src/Constructorio_NET.Tests/client/modules/BrowseTests.cs b/src/Constructorio_NET.Tests/client/modules/BrowseTests.cs index b51888c..4702692 100644 --- a/src/Constructorio_NET.Tests/client/modules/BrowseTests.cs +++ b/src/Constructorio_NET.Tests/client/modules/BrowseTests.cs @@ -658,6 +658,36 @@ public async Task GetBrowseResultsShouldReturnResultWithVariationsMap() Assert.NotNull(res.Response.Results[0].VariationsMap, "Variations Map exists"); } + [Test] + public async Task GetBrowseResultsShouldReturnResultWithVariationsMapValueCount() + { + BrowseRequest req = new BrowseRequest(this.FilterName, this.FilterValue) + { + UserInfo = UserInfo, + VariationsMap = new VariationsMap() + }; + req.VariationsMap.AddValueRule( + "deactivated", + AggregationTypes.ValueCount, + "data.deactivated", + "true" + ); + ConstructorIO constructorio = new ConstructorIO(this.Config); + BrowseResponse res = await constructorio.Browse.GetBrowseResults(req); + res.Request.TryGetValue("variations_map", out object reqVariationsMap); + JObject variationMapResult = JObject.Parse( + "{ \"group_by\": [], \"values\": { \"deactivated\": { \"aggregation\": \"value_count\", \"field\": \"data.deactivated\", \"value\": \"true\" }}, \"dtype\": \"object\" }" + ); + + Assert.NotNull(res.ResultId, "Result id exists"); + Assert.AreEqual( + JObject.Parse(reqVariationsMap.ToString()), + variationMapResult, + "Variations Map was passed as parameter" + ); + Assert.NotNull(res.Response.Results[0].VariationsMap, "Variations Map exists"); + } + [Test] public async Task GetBrowseResultsShouldReturnResultWithResultSources() { diff --git a/src/Constructorio_NET.Tests/client/modules/RecommendationsTests.cs b/src/Constructorio_NET.Tests/client/modules/RecommendationsTests.cs index cde497f..0f15006 100644 --- a/src/Constructorio_NET.Tests/client/modules/RecommendationsTests.cs +++ b/src/Constructorio_NET.Tests/client/modules/RecommendationsTests.cs @@ -161,6 +161,41 @@ public async Task GetRecommendationsResultsShouldReturnAResultWithVariationsMap( } } + [Test] + public async Task GetRecommendationsResultsShouldReturnAResultWithVariationsMapValueCount() + { + RecommendationsRequest req = new RecommendationsRequest("item_page_1") + { + UserInfo = this.UserInfo, + ItemIds = new List { "power_drill" }, + VariationsMap = new VariationsMap() + }; + req.VariationsMap.AddValueRule( + "deactivated", + AggregationTypes.ValueCount, + "data.deactivated", + "true" + ); + ConstructorIO constructorio = new ConstructorIO(this.Config); + RecommendationsResponse res = await constructorio.Recommendations.GetRecommendationsResults(req); + res.Request.TryGetValue("variations_map", out object reqVariationsMap); + JObject variationMapResult = JObject.Parse( + "{ \"group_by\": [], \"values\": { \"deactivated\": { \"aggregation\": \"value_count\", \"field\": \"data.deactivated\", \"value\": \"true\" }}, \"dtype\": \"object\" }" + ); + + Assert.GreaterOrEqual(res.Response.Results.Count, 0, "Results exist"); + Assert.NotNull(res.ResultId, "Result id exists"); + Assert.AreEqual( + JObject.Parse(reqVariationsMap.ToString()), + variationMapResult, + "Variations Map was passed as parameter" + ); + foreach (var result in res.Response.Results) + { + Assert.NotNull(result.VariationsMap, "Variations Map exists in every result"); + } + } + [Test] public async Task GetRecommendationsResultsShouldReturnAResultWithVariationIds() { diff --git a/src/Constructorio_NET.Tests/client/modules/SearchTests.cs b/src/Constructorio_NET.Tests/client/modules/SearchTests.cs index 4faa947..b0b55ba 100644 --- a/src/Constructorio_NET.Tests/client/modules/SearchTests.cs +++ b/src/Constructorio_NET.Tests/client/modules/SearchTests.cs @@ -3,6 +3,7 @@ using Constructorio_NET.Models; using Newtonsoft.Json.Linq; using NUnit.Framework; +using System; namespace Constructorio_NET.Tests { @@ -732,6 +733,35 @@ public async Task GetSearchResultsShouldReturnResultWithVariationsMap() ); } + [Test] + public async Task GetSearchResultsShouldReturnResultWithVariationsMapValueCount() + { + SearchRequest req = new SearchRequest("item1") + { + UserInfo = UserInfo, + VariationsMap = new VariationsMap() + }; + req.VariationsMap.AddValueRule( + "deactivated", + AggregationTypes.ValueCount, + "data.deactivated", + "true" + ); + ConstructorIO constructorio = new ConstructorIO(this.Config); + SearchResponse res = await constructorio.Search.GetSearchResults(req); + res.Request.TryGetValue("variations_map", out object reqVariationsMap); + JObject variationMapResult = JObject.Parse( + "{ \"group_by\": [], \"values\": { \"deactivated\": { \"aggregation\": \"value_count\", \"field\": \"data.deactivated\", \"value\": \"true\" }}, \"dtype\": \"object\" }" + ); + + Assert.NotNull(res.ResultId, "Result id exists"); + Assert.AreEqual( + JObject.Parse(reqVariationsMap.ToString()), + variationMapResult, + "Variations Map was passed as parameter" + ); + } + [Test] public void GetSearchResultsWithPageAndOffset() { From 29fca6a9aa897d238ccdaee4bb73eeb5b123503e Mon Sep 17 00:00:00 2001 From: Chris Gee Date: Tue, 16 Dec 2025 16:38:27 -0800 Subject: [PATCH 2/7] Lint --- src/Constructorio_NET.Tests/client/modules/SearchTests.cs | 1 - 1 file changed, 1 deletion(-) diff --git a/src/Constructorio_NET.Tests/client/modules/SearchTests.cs b/src/Constructorio_NET.Tests/client/modules/SearchTests.cs index b0b55ba..d68cd13 100644 --- a/src/Constructorio_NET.Tests/client/modules/SearchTests.cs +++ b/src/Constructorio_NET.Tests/client/modules/SearchTests.cs @@ -3,7 +3,6 @@ using Constructorio_NET.Models; using Newtonsoft.Json.Linq; using NUnit.Framework; -using System; namespace Constructorio_NET.Tests { From 69bc6c379968e6ec026fbaa71290bb7b8c388151 Mon Sep 17 00:00:00 2001 From: Chris Gee Date: Tue, 16 Dec 2025 16:39:55 -0800 Subject: [PATCH 3/7] Add value count --- src/constructor.io/models/common/VariationsMap.cs | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-) diff --git a/src/constructor.io/models/common/VariationsMap.cs b/src/constructor.io/models/common/VariationsMap.cs index 3dd5577..e812207 100644 --- a/src/constructor.io/models/common/VariationsMap.cs +++ b/src/constructor.io/models/common/VariationsMap.cs @@ -10,6 +10,8 @@ public class Value public string Aggregation { get; set; } [JsonProperty("field")] public string Field { get; set; } + [JsonProperty("value")] + public string CountedValue { get; set; } } public class Group @@ -26,6 +28,7 @@ public static class AggregationTypes public const string Min = "min"; public const string Max = "max"; public const string All = "all"; + public const string ValueCount = "value_count"; } public static class DTypes @@ -67,15 +70,15 @@ public void AddGroupByRule(string name, string field) } } - public void AddValueRule(string name, string aggregation, string field) + public void AddValueRule(string name, string aggregation, string field, string? countedValue = null) { if (this.Values != null) { - this.Values.Add(name, new Value { Aggregation = aggregation, Field = field }); + this.Values.Add(name, new Value { Aggregation = aggregation, Field = field, CountedValue = countedValue }); } else { - this.Values = new Dictionary { { name, new Value { Aggregation = aggregation, Field = field } } }; + this.Values = new Dictionary { { name, new Value { Aggregation = aggregation, Field = field, CountedValue = countedValue } } }; } } From c88891b14d11264baf111554b16ab4c3dea6c88a Mon Sep 17 00:00:00 2001 From: Chris Gee Date: Thu, 18 Dec 2025 11:43:51 -0800 Subject: [PATCH 4/7] Change data type --- src/constructor.io/models/common/VariationsMap.cs | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/constructor.io/models/common/VariationsMap.cs b/src/constructor.io/models/common/VariationsMap.cs index e812207..a67e835 100644 --- a/src/constructor.io/models/common/VariationsMap.cs +++ b/src/constructor.io/models/common/VariationsMap.cs @@ -11,7 +11,7 @@ public class Value [JsonProperty("field")] public string Field { get; set; } [JsonProperty("value")] - public string CountedValue { get; set; } + public object CountedValue { get; set; } } public class Group @@ -70,7 +70,7 @@ public void AddGroupByRule(string name, string field) } } - public void AddValueRule(string name, string aggregation, string field, string? countedValue = null) + public void AddValueRule(string name, string aggregation, string field, object? countedValue = null) { if (this.Values != null) { From d3e68ce503b0a66a04a5cad2a5a38758fe2b2ed8 Mon Sep 17 00:00:00 2001 From: mudaafi Date: Sat, 20 Dec 2025 05:27:20 +0800 Subject: [PATCH 5/7] add tests for different types --- .../client/modules/AutocompleteTests.cs | 60 +++++++++++++++- .../client/modules/BrowseTests.cs | 62 +++++++++++++++- .../client/modules/RecommendationsTests.cs | 72 ++++++++++++++++++- .../client/modules/SearchTests.cs | 60 +++++++++++++++- 4 files changed, 250 insertions(+), 4 deletions(-) diff --git a/src/Constructorio_NET.Tests/client/modules/AutocompleteTests.cs b/src/Constructorio_NET.Tests/client/modules/AutocompleteTests.cs index 0dc9926..ca58dd9 100644 --- a/src/Constructorio_NET.Tests/client/modules/AutocompleteTests.cs +++ b/src/Constructorio_NET.Tests/client/modules/AutocompleteTests.cs @@ -91,7 +91,7 @@ public async Task GetAutocompleteResultsShouldReturnResultWithVariationsMap() } [Test] - public async Task GetAutocompleteResultsShouldReturnResultWithVariationsMapValueCount() + public async Task GetAutocompleteResultsShouldReturnResultWithVariationsMapStringValueCount() { AutocompleteRequest req = new AutocompleteRequest("item1") { @@ -119,6 +119,64 @@ public async Task GetAutocompleteResultsShouldReturnResultWithVariationsMapValue ); } + [Test] + public async Task GetAutocompleteResultsShouldReturnResultWithVariationsMapBooleanValueCount() + { + AutocompleteRequest req = new AutocompleteRequest("item1") + { + UserInfo = UserInfo, + VariationsMap = new VariationsMap() + }; + req.VariationsMap.AddValueRule( + "deactivated", + AggregationTypes.ValueCount, + "data.deactivated", + true + ); + ConstructorIO constructorio = new ConstructorIO(this.Config); + AutocompleteResponse res = await constructorio.Autocomplete.GetAutocompleteResults(req); + res.Request.TryGetValue("variations_map", out object reqVariationsMap); + JObject variationMapResult = JObject.Parse( + "{ \"group_by\": [], \"values\": { \"deactivated\": { \"aggregation\": \"value_count\", \"field\": \"data.deactivated\", \"value\": true }}, \"dtype\": \"object\" }" + ); + + Assert.NotNull(res.ResultId, "Result id exists"); + Assert.AreEqual( + JObject.Parse(reqVariationsMap.ToString()), + variationMapResult, + "Variations Map was passed as parameter" + ); + } + + [Test] + public async Task GetAutocompleteResultsShouldReturnResultWithVariationsMapIntegerValueCount() + { + AutocompleteRequest req = new AutocompleteRequest("item1") + { + UserInfo = UserInfo, + VariationsMap = new VariationsMap() + }; + req.VariationsMap.AddValueRule( + "deactivated", + AggregationTypes.ValueCount, + "data.deactivated", + 24 + ); + ConstructorIO constructorio = new ConstructorIO(this.Config); + AutocompleteResponse res = await constructorio.Autocomplete.GetAutocompleteResults(req); + res.Request.TryGetValue("variations_map", out object reqVariationsMap); + JObject variationMapResult = JObject.Parse( + "{ \"group_by\": [], \"values\": { \"deactivated\": { \"aggregation\": \"value_count\", \"field\": \"data.deactivated\", \"value\": 24 }}, \"dtype\": \"object\" }" + ); + + Assert.NotNull(res.ResultId, "Result id exists"); + Assert.AreEqual( + JObject.Parse(reqVariationsMap.ToString()), + variationMapResult, + "Variations Map was passed as parameter" + ); + } + [Test] public async Task GetAutocompleteResultsShouldReturnResultWithSearchSuggestionOnly() { diff --git a/src/Constructorio_NET.Tests/client/modules/BrowseTests.cs b/src/Constructorio_NET.Tests/client/modules/BrowseTests.cs index 4702692..6e10a31 100644 --- a/src/Constructorio_NET.Tests/client/modules/BrowseTests.cs +++ b/src/Constructorio_NET.Tests/client/modules/BrowseTests.cs @@ -659,7 +659,7 @@ public async Task GetBrowseResultsShouldReturnResultWithVariationsMap() } [Test] - public async Task GetBrowseResultsShouldReturnResultWithVariationsMapValueCount() + public async Task GetBrowseResultsShouldReturnResultWithVariationsMapStringValueCount() { BrowseRequest req = new BrowseRequest(this.FilterName, this.FilterValue) { @@ -688,6 +688,66 @@ public async Task GetBrowseResultsShouldReturnResultWithVariationsMapValueCount( Assert.NotNull(res.Response.Results[0].VariationsMap, "Variations Map exists"); } + [Test] + public async Task GetBrowseResultsShouldReturnResultWithVariationsMapBooleanValueCount() + { + BrowseRequest req = new BrowseRequest(this.FilterName, this.FilterValue) + { + UserInfo = UserInfo, + VariationsMap = new VariationsMap() + }; + req.VariationsMap.AddValueRule( + "deactivated", + AggregationTypes.ValueCount, + "data.deactivated", + true + ); + ConstructorIO constructorio = new ConstructorIO(this.Config); + BrowseResponse res = await constructorio.Browse.GetBrowseResults(req); + res.Request.TryGetValue("variations_map", out object reqVariationsMap); + JObject variationMapResult = JObject.Parse( + "{ \"group_by\": [], \"values\": { \"deactivated\": { \"aggregation\": \"value_count\", \"field\": \"data.deactivated\", \"value\": true }}, \"dtype\": \"object\" }" + ); + + Assert.NotNull(res.ResultId, "Result id exists"); + Assert.AreEqual( + JObject.Parse(reqVariationsMap.ToString()), + variationMapResult, + "Variations Map was passed as parameter" + ); + Assert.NotNull(res.Response.Results[0].VariationsMap, "Variations Map exists"); + } + + [Test] + public async Task GetBrowseResultsShouldReturnResultWithVariationsMapIntegerValueCount() + { + BrowseRequest req = new BrowseRequest(this.FilterName, this.FilterValue) + { + UserInfo = UserInfo, + VariationsMap = new VariationsMap() + }; + req.VariationsMap.AddValueRule( + "deactivated", + AggregationTypes.ValueCount, + "data.deactivated", + 24 + ); + ConstructorIO constructorio = new ConstructorIO(this.Config); + BrowseResponse res = await constructorio.Browse.GetBrowseResults(req); + res.Request.TryGetValue("variations_map", out object reqVariationsMap); + JObject variationMapResult = JObject.Parse( + "{ \"group_by\": [], \"values\": { \"deactivated\": { \"aggregation\": \"value_count\", \"field\": \"data.deactivated\", \"value\": \"24\" }}, \"dtype\": \"object\" }" + ); + + Assert.NotNull(res.ResultId, "Result id exists"); + Assert.AreEqual( + JObject.Parse(reqVariationsMap.ToString()), + variationMapResult, + "Variations Map was passed as parameter" + ); + Assert.NotNull(res.Response.Results[0].VariationsMap, "Variations Map exists"); + } + [Test] public async Task GetBrowseResultsShouldReturnResultWithResultSources() { diff --git a/src/Constructorio_NET.Tests/client/modules/RecommendationsTests.cs b/src/Constructorio_NET.Tests/client/modules/RecommendationsTests.cs index 0f15006..99a7c9d 100644 --- a/src/Constructorio_NET.Tests/client/modules/RecommendationsTests.cs +++ b/src/Constructorio_NET.Tests/client/modules/RecommendationsTests.cs @@ -162,7 +162,7 @@ public async Task GetRecommendationsResultsShouldReturnAResultWithVariationsMap( } [Test] - public async Task GetRecommendationsResultsShouldReturnAResultWithVariationsMapValueCount() + public async Task GetRecommendationsResultsShouldReturnAResultWithVariationsMapStringValueCount() { RecommendationsRequest req = new RecommendationsRequest("item_page_1") { @@ -196,6 +196,76 @@ public async Task GetRecommendationsResultsShouldReturnAResultWithVariationsMapV } } + [Test] + public async Task GetRecommendationsResultsShouldReturnAResultWithVariationsMapBooleanValueCount() + { + RecommendationsRequest req = new RecommendationsRequest("item_page_1") + { + UserInfo = this.UserInfo, + ItemIds = new List { "power_drill" }, + VariationsMap = new VariationsMap() + }; + req.VariationsMap.AddValueRule( + "deactivated", + AggregationTypes.ValueCount, + "data.deactivated", + true + ); + ConstructorIO constructorio = new ConstructorIO(this.Config); + RecommendationsResponse res = await constructorio.Recommendations.GetRecommendationsResults(req); + res.Request.TryGetValue("variations_map", out object reqVariationsMap); + JObject variationMapResult = JObject.Parse( + "{ \"group_by\": [], \"values\": { \"deactivated\": { \"aggregation\": \"value_count\", \"field\": \"data.deactivated\", \"value\": true }}, \"dtype\": \"object\" }" + ); + + Assert.GreaterOrEqual(res.Response.Results.Count, 0, "Results exist"); + Assert.NotNull(res.ResultId, "Result id exists"); + Assert.AreEqual( + JObject.Parse(reqVariationsMap.ToString()), + variationMapResult, + "Variations Map was passed as parameter" + ); + foreach (var result in res.Response.Results) + { + Assert.NotNull(result.VariationsMap, "Variations Map exists in every result"); + } + } + + [Test] + public async Task GetRecommendationsResultsShouldReturnAResultWithVariationsMapIntegerValueCount() + { + RecommendationsRequest req = new RecommendationsRequest("item_page_1") + { + UserInfo = this.UserInfo, + ItemIds = new List { "power_drill" }, + VariationsMap = new VariationsMap() + }; + req.VariationsMap.AddValueRule( + "deactivated", + AggregationTypes.ValueCount, + "data.deactivated", + 24 + ); + ConstructorIO constructorio = new ConstructorIO(this.Config); + RecommendationsResponse res = await constructorio.Recommendations.GetRecommendationsResults(req); + res.Request.TryGetValue("variations_map", out object reqVariationsMap); + JObject variationMapResult = JObject.Parse( + "{ \"group_by\": [], \"values\": { \"deactivated\": { \"aggregation\": \"value_count\", \"field\": \"data.deactivated\", \"value\": 24 }}, \"dtype\": \"object\" }" + ); + + Assert.GreaterOrEqual(res.Response.Results.Count, 0, "Results exist"); + Assert.NotNull(res.ResultId, "Result id exists"); + Assert.AreEqual( + JObject.Parse(reqVariationsMap.ToString()), + variationMapResult, + "Variations Map was passed as parameter" + ); + foreach (var result in res.Response.Results) + { + Assert.NotNull(result.VariationsMap, "Variations Map exists in every result"); + } + } + [Test] public async Task GetRecommendationsResultsShouldReturnAResultWithVariationIds() { diff --git a/src/Constructorio_NET.Tests/client/modules/SearchTests.cs b/src/Constructorio_NET.Tests/client/modules/SearchTests.cs index d68cd13..4ed178d 100644 --- a/src/Constructorio_NET.Tests/client/modules/SearchTests.cs +++ b/src/Constructorio_NET.Tests/client/modules/SearchTests.cs @@ -733,7 +733,7 @@ public async Task GetSearchResultsShouldReturnResultWithVariationsMap() } [Test] - public async Task GetSearchResultsShouldReturnResultWithVariationsMapValueCount() + public async Task GetSearchResultsShouldReturnResultWithVariationsMapStringValueCount() { SearchRequest req = new SearchRequest("item1") { @@ -761,6 +761,64 @@ public async Task GetSearchResultsShouldReturnResultWithVariationsMapValueCount( ); } + [Test] + public async Task GetSearchResultsShouldReturnResultWithVariationsMapBooleanValueCount() + { + SearchRequest req = new SearchRequest("item1") + { + UserInfo = UserInfo, + VariationsMap = new VariationsMap() + }; + req.VariationsMap.AddValueRule( + "deactivated", + AggregationTypes.ValueCount, + "data.deactivated", + true + ); + ConstructorIO constructorio = new ConstructorIO(this.Config); + SearchResponse res = await constructorio.Search.GetSearchResults(req); + res.Request.TryGetValue("variations_map", out object reqVariationsMap); + JObject variationMapResult = JObject.Parse( + "{ \"group_by\": [], \"values\": { \"deactivated\": { \"aggregation\": \"value_count\", \"field\": \"data.deactivated\", \"value\": true }}, \"dtype\": \"object\" }" + ); + + Assert.NotNull(res.ResultId, "Result id exists"); + Assert.AreEqual( + JObject.Parse(reqVariationsMap.ToString()), + variationMapResult, + "Variations Map was passed as parameter" + ); + } + + [Test] + public async Task GetSearchResultsShouldReturnResultWithVariationsMapIntegerValueCount() + { + SearchRequest req = new SearchRequest("item1") + { + UserInfo = UserInfo, + VariationsMap = new VariationsMap() + }; + req.VariationsMap.AddValueRule( + "deactivated", + AggregationTypes.ValueCount, + "data.deactivated", + 24 + ); + ConstructorIO constructorio = new ConstructorIO(this.Config); + SearchResponse res = await constructorio.Search.GetSearchResults(req); + res.Request.TryGetValue("variations_map", out object reqVariationsMap); + JObject variationMapResult = JObject.Parse( + "{ \"group_by\": [], \"values\": { \"deactivated\": { \"aggregation\": \"value_count\", \"field\": \"data.deactivated\", \"value\": 24 }}, \"dtype\": \"object\" }" + ); + + Assert.NotNull(res.ResultId, "Result id exists"); + Assert.AreEqual( + JObject.Parse(reqVariationsMap.ToString()), + variationMapResult, + "Variations Map was passed as parameter" + ); + } + [Test] public void GetSearchResultsWithPageAndOffset() { From 34fd7f14fab57cbb8c68d5ab135d14413a4e1cd0 Mon Sep 17 00:00:00 2001 From: mudaafi Date: Sat, 20 Dec 2025 05:27:39 +0800 Subject: [PATCH 6/7] fix tests --- src/Constructorio_NET.Tests/client/modules/CatalogTests.cs | 6 +++--- src/Constructorio_NET.Tests/client/modules/TasksTests.cs | 4 ++-- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/src/Constructorio_NET.Tests/client/modules/CatalogTests.cs b/src/Constructorio_NET.Tests/client/modules/CatalogTests.cs index 71d8c5b..81cf184 100644 --- a/src/Constructorio_NET.Tests/client/modules/CatalogTests.cs +++ b/src/Constructorio_NET.Tests/client/modules/CatalogTests.cs @@ -100,7 +100,7 @@ public void ReplaceCatalogWithInvalidApiTokenShouldError() var constructorio = new ConstructorIO(new ConstructorioConfig(ApiKey, "invalidKey")); var req = new CatalogRequest(files); var ex = Assert.ThrowsAsync(() => constructorio.Catalog.ReplaceCatalog(req)); - Assert.IsTrue(ex.Message == "Http[401]: Invalid auth_token. If you've forgotten your token, you can generate a new one at app.constructor.io/dashboard", "Correct Error is Returned"); + Assert.IsTrue(ex.Message == "Http[401]: Unauthorized"); } [Test] @@ -207,7 +207,7 @@ public void UpdateCatalogWithInvalidApiTokenShouldError() var constructorio = new ConstructorIO(new ConstructorioConfig(ApiKey, "invalidKey")); var req = new CatalogRequest(files); var ex = Assert.ThrowsAsync(() => constructorio.Catalog.UpdateCatalog(req)); - Assert.IsTrue(ex.Message == "Http[401]: Invalid auth_token. If you've forgotten your token, you can generate a new one at app.constructor.io/dashboard", "Correct Error is Returned"); + Assert.IsTrue(ex.Message == "Http[401]: Unauthorized"); } [Test] @@ -307,7 +307,7 @@ public void PatchCatalogWithInvalidApiTokenShouldError() var constructorio = new ConstructorIO(new ConstructorioConfig(ApiKey) { ApiToken = "invalidKey" }); var req = new CatalogRequest(files); var ex = Assert.ThrowsAsync(() => constructorio.Catalog.PatchCatalog(req)); - Assert.IsTrue(ex.Message == "Http[401]: Invalid auth_token. If you've forgotten your token, you can generate a new one at app.constructor.io/dashboard", "Correct Error is Returned"); + Assert.IsTrue(ex.Message == "Http[401]: Unauthorized"); } [Test] diff --git a/src/Constructorio_NET.Tests/client/modules/TasksTests.cs b/src/Constructorio_NET.Tests/client/modules/TasksTests.cs index 7af6c05..15a3d65 100644 --- a/src/Constructorio_NET.Tests/client/modules/TasksTests.cs +++ b/src/Constructorio_NET.Tests/client/modules/TasksTests.cs @@ -46,7 +46,7 @@ public void GetTaskWithInvalidApiTokenShouldError() TaskRequest req = new TaskRequest(this.TaskId); ConstructorIO constructorio = new ConstructorIO(new ConstructorioConfig(this.ApiKey) { ApiToken = "invalidToken" }); var ex = Assert.ThrowsAsync(() => constructorio.Tasks.GetTask(req)); - Assert.IsTrue(ex.Message == "Http[401]: Invalid auth_token. If you've forgotten your token, you can generate a new one at app.constructor.io/dashboard", "Correct Error is Returned"); + Assert.IsTrue(ex.Message == "Http[401]: Unauthorized"); } [Test] @@ -69,7 +69,7 @@ public void GetAllTaskWithInvalidApiTokenShouldError() AllTasksRequest req = new AllTasksRequest(); ConstructorIO constructorio = new ConstructorIO(new ConstructorioConfig(this.ApiKey) { ApiToken = "invalidToken" }); var ex = Assert.ThrowsAsync(() => constructorio.Tasks.GetAllTasks(req)); - Assert.IsTrue(ex.Message == "Http[401]: Invalid auth_token. If you've forgotten your token, you can generate a new one at app.constructor.io/dashboard", "Correct Error is Returned"); + Assert.IsTrue(ex.Message == "Http[401]: Unauthorized"); } [Test] From 0abafd9cb6a3304250ef51f665ab3f2527fd140a Mon Sep 17 00:00:00 2001 From: mudaafi Date: Sat, 20 Dec 2025 05:48:17 +0800 Subject: [PATCH 7/7] lint --- src/Constructorio_NET.Tests/client/modules/BrowseTests.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/Constructorio_NET.Tests/client/modules/BrowseTests.cs b/src/Constructorio_NET.Tests/client/modules/BrowseTests.cs index 6e10a31..98f27c4 100644 --- a/src/Constructorio_NET.Tests/client/modules/BrowseTests.cs +++ b/src/Constructorio_NET.Tests/client/modules/BrowseTests.cs @@ -736,7 +736,7 @@ public async Task GetBrowseResultsShouldReturnResultWithVariationsMapIntegerValu BrowseResponse res = await constructorio.Browse.GetBrowseResults(req); res.Request.TryGetValue("variations_map", out object reqVariationsMap); JObject variationMapResult = JObject.Parse( - "{ \"group_by\": [], \"values\": { \"deactivated\": { \"aggregation\": \"value_count\", \"field\": \"data.deactivated\", \"value\": \"24\" }}, \"dtype\": \"object\" }" + "{ \"group_by\": [], \"values\": { \"deactivated\": { \"aggregation\": \"value_count\", \"field\": \"data.deactivated\", \"value\": 24 }}, \"dtype\": \"object\" }" ); Assert.NotNull(res.ResultId, "Result id exists");