From ddae1e777a25de27ced1e36be98549a8416eec71 Mon Sep 17 00:00:00 2001 From: Enes Kutay SEZEN Date: Mon, 23 Feb 2026 15:43:53 +0300 Subject: [PATCH 1/4] Add rex support --- .../client/modules/RecommendationsTests.cs | 34 +++++++++++++++++++ .../Recommendations/RecommendationsRequest.cs | 13 +++++++ 2 files changed, 47 insertions(+) diff --git a/src/Constructorio_NET.Tests/client/modules/RecommendationsTests.cs b/src/Constructorio_NET.Tests/client/modules/RecommendationsTests.cs index 09b30e3d..0aef5fbf 100644 --- a/src/Constructorio_NET.Tests/client/modules/RecommendationsTests.cs +++ b/src/Constructorio_NET.Tests/client/modules/RecommendationsTests.cs @@ -339,6 +339,40 @@ public async Task GetRecommendationsResultsWithPreFilterExpression() Assert.IsNotNull(res.Request["pre_filter_expression"], "PreFilterExpression was passed as parameter"); } + [Test] + public async Task GetRecommendationsResultsShouldReturnResultWithHiddenFields() + { + string requestedHiddenField = "testField"; + RecommendationsRequest req = new RecommendationsRequest("item_page_1") + { + UserInfo = this.UserInfo, + ItemIds = new List { "power_drill" }, + FmtOptions = new FmtOptions { HiddenFields = new List { requestedHiddenField } } + }; + 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"); + } + + [Test] + public async Task GetRecommendationsResultsShouldReturnResultWithHiddenFacets() + { + string requestedHiddenFacet = "Brand"; + RecommendationsRequest req = new RecommendationsRequest("item_page_1") + { + UserInfo = this.UserInfo, + ItemIds = new List { "power_drill" }, + FmtOptions = new FmtOptions { HiddenFacets = new List { requestedHiddenFacet } } + }; + 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"); + } + [Test] public async Task GetRecommendationsResultsWithPreFilterExpressionJson() { diff --git a/src/constructor.io/models/Recommendations/RecommendationsRequest.cs b/src/constructor.io/models/Recommendations/RecommendationsRequest.cs index 71eef298..04a9eace 100644 --- a/src/constructor.io/models/Recommendations/RecommendationsRequest.cs +++ b/src/constructor.io/models/Recommendations/RecommendationsRequest.cs @@ -80,6 +80,11 @@ public RecommendationsRequest(string podId) /// public PreFilterExpression PreFilterExpression { get; set; } + /// + /// Gets or sets format options to control result formatting. + /// + public FmtOptions FmtOptions { get; set; } + /// /// Get request parameters. /// @@ -158,6 +163,14 @@ public Hashtable GetRequestParameters() parameters.Add(Constants.PRE_FILTER_EXPRESSION, preFilterJson); } + if (this.FmtOptions != null) + { + foreach (DictionaryEntry entry in this.FmtOptions.GetQueryParameters()) + { + parameters.Add(entry.Key, entry.Value); + } + } + return parameters; } From 6755540b2214e0ec4554f05cfc8582a9ca4fb715 Mon Sep 17 00:00:00 2001 From: Enes Kutay SEZEN Date: Wed, 25 Feb 2026 14:24:52 +0300 Subject: [PATCH 2/4] Update src/Constructorio_NET.Tests/client/modules/RecommendationsTests.cs Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com> --- .../client/modules/RecommendationsTests.cs | 16 ++++++++++++++++ 1 file changed, 16 insertions(+) diff --git a/src/Constructorio_NET.Tests/client/modules/RecommendationsTests.cs b/src/Constructorio_NET.Tests/client/modules/RecommendationsTests.cs index 0aef5fbf..14a8801c 100644 --- a/src/Constructorio_NET.Tests/client/modules/RecommendationsTests.cs +++ b/src/Constructorio_NET.Tests/client/modules/RecommendationsTests.cs @@ -354,6 +354,22 @@ public async Task GetRecommendationsResultsShouldReturnResultWithHiddenFields() Assert.GreaterOrEqual(res.Response.Results.Count, 0, "Results exist"); Assert.NotNull(res.ResultId, "Result id exists"); + + // If we received at least one result, verify that the requested hidden field + // is present in the metadata of the first result. + if (res.Response.Results.Count > 0) + { + var metadata = res.Response.Results[0].Data?.Metadata; + Assert.IsNotNull(metadata, "Result metadata exists"); + Assert.IsTrue( + metadata.ContainsKey(requestedHiddenField), + "Requested hidden field is present in result metadata" + ); + Assert.IsNotNull( + metadata[requestedHiddenField], + "Requested hidden field has a non-null value in result metadata" + ); + } } [Test] From 0dac467f77d0ce141ef00cf29c31a62c63e0bd87 Mon Sep 17 00:00:00 2001 From: Enes Kutay SEZEN Date: Wed, 25 Feb 2026 14:49:57 +0300 Subject: [PATCH 3/4] Update tests --- .../client/modules/RecommendationsTests.cs | 18 ------------------ .../RecommendationsRequestTest.cs | 17 +++++++++++++++++ 2 files changed, 17 insertions(+), 18 deletions(-) diff --git a/src/Constructorio_NET.Tests/client/modules/RecommendationsTests.cs b/src/Constructorio_NET.Tests/client/modules/RecommendationsTests.cs index 14a8801c..1d233ee0 100644 --- a/src/Constructorio_NET.Tests/client/modules/RecommendationsTests.cs +++ b/src/Constructorio_NET.Tests/client/modules/RecommendationsTests.cs @@ -352,7 +352,6 @@ public async Task GetRecommendationsResultsShouldReturnResultWithHiddenFields() 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"); // If we received at least one result, verify that the requested hidden field @@ -372,23 +371,6 @@ public async Task GetRecommendationsResultsShouldReturnResultWithHiddenFields() } } - [Test] - public async Task GetRecommendationsResultsShouldReturnResultWithHiddenFacets() - { - string requestedHiddenFacet = "Brand"; - RecommendationsRequest req = new RecommendationsRequest("item_page_1") - { - UserInfo = this.UserInfo, - ItemIds = new List { "power_drill" }, - FmtOptions = new FmtOptions { HiddenFacets = new List { requestedHiddenFacet } } - }; - 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"); - } - [Test] public async Task GetRecommendationsResultsWithPreFilterExpressionJson() { diff --git a/src/Constructorio_NET.Tests/models/Recommendations/RecommendationsRequestTest.cs b/src/Constructorio_NET.Tests/models/Recommendations/RecommendationsRequestTest.cs index af55362d..f7e532e2 100644 --- a/src/Constructorio_NET.Tests/models/Recommendations/RecommendationsRequestTest.cs +++ b/src/Constructorio_NET.Tests/models/Recommendations/RecommendationsRequestTest.cs @@ -86,6 +86,23 @@ public void GetRequestParametersWithVariationIds() Assert.AreEqual(this.VariationIds, requestParameters["variation_id"]); } + [Test] + public void GetRequestParametersWithFmtOptions() + { + RecommendationsRequest req = new RecommendationsRequest(this.Pod) + { + UserInfo = this.UserInfo, + FmtOptions = new FmtOptions + { + HiddenFields = new List { "inventory" }, + }, + }; + + Hashtable requestParameters = req.GetRequestParameters(); + List hiddenFields = (List)requestParameters[$"{Constants.FMT_OPTIONS}[{Constants.HIDDEN_FIELDS}]"]; + Assert.AreEqual(new List { "inventory" }, hiddenFields); + } + [Test] public void RecommendationsRequestWithInvalidPod() { From 366fcdb4c12aed85e427e0807f5798cc70043792 Mon Sep 17 00:00:00 2001 From: Enes Kutay SEZEN Date: Wed, 25 Feb 2026 14:59:53 +0300 Subject: [PATCH 4/4] Fix flaky test --- src/Constructorio_NET.Tests/client/modules/SearchTests.cs | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/src/Constructorio_NET.Tests/client/modules/SearchTests.cs b/src/Constructorio_NET.Tests/client/modules/SearchTests.cs index 7dfc70d1..d0c553df 100644 --- a/src/Constructorio_NET.Tests/client/modules/SearchTests.cs +++ b/src/Constructorio_NET.Tests/client/modules/SearchTests.cs @@ -73,9 +73,11 @@ public async Task GetSearchResultsShouldReturnResultWithVaritionsSlice() SearchRequest req = new SearchRequest("item1") { UserInfo = this.UserInfo }; ConstructorIO constructorio = new ConstructorIO(this.Config); SearchResponse res = await constructorio.Search.GetSearchResults(req); - string sliceAttribute = res.Response.Results[0].VariationSlice["Color"][0]; - Assert.AreEqual("Blue", sliceAttribute); + Assert.IsNotNull(res.Response.Results[0].VariationSlice, "VariationSlice should exist"); + Assert.IsTrue(res.Response.Results[0].VariationSlice.ContainsKey("Color"), "VariationSlice should contain Color key"); + Assert.Greater(res.Response.Results[0].VariationSlice["Color"].Count, 0, "Color slice should have at least one value"); + Assert.IsNotEmpty(res.Response.Results[0].VariationSlice["Color"][0], "Color slice value should not be empty"); } [Test]