diff --git a/src/Constructorio_NET.Tests/client/modules/AutocompleteTests.cs b/src/Constructorio_NET.Tests/client/modules/AutocompleteTests.cs index 616fe08..ca58dd9 100644 --- a/src/Constructorio_NET.Tests/client/modules/AutocompleteTests.cs +++ b/src/Constructorio_NET.Tests/client/modules/AutocompleteTests.cs @@ -90,6 +90,93 @@ public async Task GetAutocompleteResultsShouldReturnResultWithVariationsMap() ); } + [Test] + public async Task GetAutocompleteResultsShouldReturnResultWithVariationsMapStringValueCount() + { + 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 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 b51888c..98f27c4 100644 --- a/src/Constructorio_NET.Tests/client/modules/BrowseTests.cs +++ b/src/Constructorio_NET.Tests/client/modules/BrowseTests.cs @@ -658,6 +658,96 @@ public async Task GetBrowseResultsShouldReturnResultWithVariationsMap() Assert.NotNull(res.Response.Results[0].VariationsMap, "Variations Map exists"); } + [Test] + public async Task GetBrowseResultsShouldReturnResultWithVariationsMapStringValueCount() + { + 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 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/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/RecommendationsTests.cs b/src/Constructorio_NET.Tests/client/modules/RecommendationsTests.cs index cde497f..99a7c9d 100644 --- a/src/Constructorio_NET.Tests/client/modules/RecommendationsTests.cs +++ b/src/Constructorio_NET.Tests/client/modules/RecommendationsTests.cs @@ -161,6 +161,111 @@ public async Task GetRecommendationsResultsShouldReturnAResultWithVariationsMap( } } + [Test] + public async Task GetRecommendationsResultsShouldReturnAResultWithVariationsMapStringValueCount() + { + 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 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 4faa947..4ed178d 100644 --- a/src/Constructorio_NET.Tests/client/modules/SearchTests.cs +++ b/src/Constructorio_NET.Tests/client/modules/SearchTests.cs @@ -732,6 +732,93 @@ public async Task GetSearchResultsShouldReturnResultWithVariationsMap() ); } + [Test] + public async Task GetSearchResultsShouldReturnResultWithVariationsMapStringValueCount() + { + 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 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() { 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] diff --git a/src/constructor.io/models/common/VariationsMap.cs b/src/constructor.io/models/common/VariationsMap.cs index 3dd5577..a67e835 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 object 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, object? 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 } } }; } }