diff --git a/src/Constructorio_NET.Tests/client/modules/RecommendationsTests.cs b/src/Constructorio_NET.Tests/client/modules/RecommendationsTests.cs index 99a7c9d..09b30e3 100644 --- a/src/Constructorio_NET.Tests/client/modules/RecommendationsTests.cs +++ b/src/Constructorio_NET.Tests/client/modules/RecommendationsTests.cs @@ -321,5 +321,53 @@ public async Task GetRecommendationsResultsShouldReturnAResultProvidedUserInfo() Assert.GreaterOrEqual(res.Response.Results.Count, 0, "Results exist"); Assert.NotNull(res.ResultId, "Result id exists"); } + + [Test] + public async Task GetRecommendationsResultsWithPreFilterExpression() + { + ValuePreFilterExpression filterByBrand = new ValuePreFilterExpression("Brand", "XYZ"); + RecommendationsRequest req = new RecommendationsRequest("filtered_items") + { + UserInfo = this.UserInfo, + PreFilterExpression = filterByBrand, + }; + ConstructorIO constructorio = new ConstructorIO(this.Config); + RecommendationsResponse res = await constructorio.Recommendations.GetRecommendationsResults(req); + + Assert.GreaterOrEqual(res.Response.Results.Count, 0, "Results exist"); + Assert.NotNull(res.ResultId, "Result id exists"); + Assert.IsNotNull(res.Request["pre_filter_expression"], "PreFilterExpression was passed as parameter"); + } + + [Test] + public async Task GetRecommendationsResultsWithPreFilterExpressionJson() + { + JObject preFilterExpressionJObject = JObject.Parse( + @"{ + 'name': 'Brand', + 'value': 'XYZ' + }" + ); + JsonPrefilterExpression preFilterExpression = new JsonPrefilterExpression( + preFilterExpressionJObject + ); + RecommendationsRequest req = new RecommendationsRequest("filtered_items") + { + UserInfo = this.UserInfo, + PreFilterExpression = preFilterExpression, + }; + + ConstructorIO constructorio = new ConstructorIO(this.Config); + RecommendationsResponse res = await constructorio.Recommendations.GetRecommendationsResults(req); + res.Request.TryGetValue("pre_filter_expression", out object reqPreFilterExpression); + + Assert.AreEqual( + reqPreFilterExpression, + JObject.Parse(preFilterExpression.GetExpression()), + "Pre Filter Expression is sent in request" + ); + Assert.GreaterOrEqual(res.Response.Results.Count, 0, "Results exist"); + Assert.NotNull(res.ResultId, "Result id exists"); + } } } diff --git a/src/Constructorio_NET.Tests/models/Recommendations/RecommendationsRequestTest.cs b/src/Constructorio_NET.Tests/models/Recommendations/RecommendationsRequestTest.cs index 7f3f3a8..af55362 100644 --- a/src/Constructorio_NET.Tests/models/Recommendations/RecommendationsRequestTest.cs +++ b/src/Constructorio_NET.Tests/models/Recommendations/RecommendationsRequestTest.cs @@ -91,5 +91,26 @@ public void RecommendationsRequestWithInvalidPod() { Assert.Throws(() => new RecommendationsRequest(null)); } + + [Test] + public void GetRequestParametersWithPreFilterExpression() + { + ValuePreFilterExpression filterByGroupId = new ValuePreFilterExpression("group_id", "BrandXY"); + ValuePreFilterExpression filterByColor = new ValuePreFilterExpression("Color", "red"); + AndPreFilterExpression preFilterExpression = new AndPreFilterExpression( + new List { filterByGroupId, filterByColor } + ); + + RecommendationsRequest req = new RecommendationsRequest(this.Pod) + { + UserInfo = this.UserInfo, + PreFilterExpression = preFilterExpression + }; + + Hashtable requestParameters = req.GetRequestParameters(); + Assert.IsNotNull(requestParameters[Constants.PRE_FILTER_EXPRESSION]); + Assert.IsTrue(requestParameters[Constants.PRE_FILTER_EXPRESSION].ToString().Contains("group_id")); + Assert.IsTrue(requestParameters[Constants.PRE_FILTER_EXPRESSION].ToString().Contains("BrandXY")); + } } } diff --git a/src/constructor.io/models/Recommendations/RecommendationsRequest.cs b/src/constructor.io/models/Recommendations/RecommendationsRequest.cs index 4871356..71eef29 100644 --- a/src/constructor.io/models/Recommendations/RecommendationsRequest.cs +++ b/src/constructor.io/models/Recommendations/RecommendationsRequest.cs @@ -75,6 +75,11 @@ public RecommendationsRequest(string podId) /// public VariationsMap VariationsMap { get; set; } + /// + /// Gets or sets the filtering expression used to scope recommendation results. + /// + public PreFilterExpression PreFilterExpression { get; set; } + /// /// Get request parameters. /// @@ -147,6 +152,12 @@ public Hashtable GetRequestParameters() parameters.Add(Constants.VARIATIONS_MAP, serializedJson); } + if (this.PreFilterExpression != null) + { + string preFilterJson = this.PreFilterExpression.GetExpression(); + parameters.Add(Constants.PRE_FILTER_EXPRESSION, preFilterJson); + } + return parameters; }