From 1935dd9babd146fb6ba98d4a7166fae6e402925d Mon Sep 17 00:00:00 2001 From: Enes Kutay SEZEN Date: Thu, 5 Feb 2026 20:38:04 +0400 Subject: [PATCH 01/13] Properly type FmtOptions --- .../utils/HelpersTest.cs | 93 ++++++++++++++++++- .../Browse/BrowseFacetOptionsRequest.cs | 13 +-- .../models/Browse/BrowseFacetsRequest.cs | 13 +-- .../models/Browse/BrowseItemsRequest.cs | 2 +- .../models/Browse/BrowseRequest.cs | 2 +- .../models/Search/SearchRequest.cs | 2 +- .../models/common/FmtOptions.cs | 57 ++++++++++++ .../models/common/IPlpRequest.cs | 2 +- src/constructor.io/utils/Helpers.cs | 70 ++++++++++++-- 9 files changed, 229 insertions(+), 25 deletions(-) create mode 100644 src/constructor.io/models/common/FmtOptions.cs diff --git a/src/Constructorio_NET.Tests/utils/HelpersTest.cs b/src/Constructorio_NET.Tests/utils/HelpersTest.cs index ba3ea796..28c7b1a8 100644 --- a/src/Constructorio_NET.Tests/utils/HelpersTest.cs +++ b/src/Constructorio_NET.Tests/utils/HelpersTest.cs @@ -195,10 +195,10 @@ public void MakeUrlSearchWithHiddenFacets() public void MakeUrlSearchWithFmtOptions() { List paths = new List { "search", this.Query }; - Dictionary fmtOptions = new Dictionary() + FmtOptions fmtOptions = new FmtOptions { - { "groups_max_depth", "3" }, - { "groups_start", "current" } + GroupsMaxDepth = 3, + GroupsStart = "current" }; Hashtable queryParams = new Hashtable() { @@ -214,6 +214,93 @@ public void MakeUrlSearchWithFmtOptions() Assert.That(regexMatched1 && regexMatched2, "url should be properly formed"); } + [Test] + public void MakeUrlSearchWithFmtOptionsFieldsArray() + { + List paths = new List { "search", this.Query }; + FmtOptions fmtOptions = new FmtOptions + { + Fields = new List { "id", "variation_id", "name" } + }; + Hashtable queryParams = new Hashtable() + { + { Constants.FMT_OPTIONS, fmtOptions } + }; + + string url = MakeUrl(this.Options, paths, queryParams); + bool hasField0 = Regex.Match(url, "&fmt_options%5Bfields%5D=id").Success; + bool hasField1 = Regex.Match(url, "&fmt_options%5Bfields%5D=variation_id").Success; + bool hasField2 = Regex.Match(url, "&fmt_options%5Bfields%5D=name").Success; + Assert.That(hasField0 && hasField1 && hasField2, "url should have repeated fields keys"); + } + + [Test] + public void MakeUrlSearchWithFmtOptionsHiddenFieldsArray() + { + List paths = new List { "search", this.Query }; + FmtOptions fmtOptions = new FmtOptions + { + HiddenFields = new List { "inventory", "margin" } + }; + Hashtable queryParams = new Hashtable() + { + { Constants.FMT_OPTIONS, fmtOptions } + }; + + string url = MakeUrl(this.Options, paths, queryParams); + bool hasField0 = Regex.Match(url, "&fmt_options%5Bhidden_fields%5D=inventory").Success; + bool hasField1 = Regex.Match(url, "&fmt_options%5Bhidden_fields%5D=margin").Success; + Assert.That(hasField0 && hasField1, "url should have repeated hidden_fields keys"); + } + + [Test] + public void MakeUrlSearchWithFmtOptionsHiddenFacetsArray() + { + List paths = new List { "search", this.Query }; + FmtOptions fmtOptions = new FmtOptions + { + HiddenFacets = new List { "brand", "category" } + }; + Hashtable queryParams = new Hashtable() + { + { Constants.FMT_OPTIONS, fmtOptions } + }; + + string url = MakeUrl(this.Options, paths, queryParams); + bool hasFacet0 = Regex.Match(url, "&fmt_options%5Bhidden_facets%5D=brand").Success; + bool hasFacet1 = Regex.Match(url, "&fmt_options%5Bhidden_facets%5D=category").Success; + Assert.That(hasFacet0 && hasFacet1, "url should have repeated hidden_facets keys"); + } + + [Test] + public void MakeUrlSearchWithFmtOptionsAllProperties() + { + List paths = new List { "search", this.Query }; + FmtOptions fmtOptions = new FmtOptions + { + GroupsMaxDepth = 5, + GroupsStart = "top", + ShowHiddenFields = true, + VariationsReturnType = "all", + Fields = new List { "id" }, + HiddenFields = new List { "inventory" }, + HiddenFacets = new List { "brand" } + }; + Hashtable queryParams = new Hashtable() + { + { Constants.FMT_OPTIONS, fmtOptions } + }; + + string url = MakeUrl(this.Options, paths, queryParams); + Assert.That(Regex.Match(url, "&fmt_options%5Bgroups_max_depth%5D=5").Success, "should have groups_max_depth"); + Assert.That(Regex.Match(url, "&fmt_options%5Bgroups_start%5D=top").Success, "should have groups_start"); + Assert.That(Regex.Match(url, "&fmt_options%5Bshow_hidden_fields%5D=true").Success, "should have show_hidden_fields"); + Assert.That(Regex.Match(url, "&fmt_options%5Bvariations_return_type%5D=all").Success, "should have variations_return_type"); + Assert.That(Regex.Match(url, "&fmt_options%5Bfields%5D=id").Success, "should have fields array"); + Assert.That(Regex.Match(url, "&fmt_options%5Bhidden_fields%5D=inventory").Success, "should have hidden_fields array"); + Assert.That(Regex.Match(url, "&fmt_options%5Bhidden_facets%5D=brand").Success, "should have hidden_facets array"); + } + [Test] public void MakeUrlSearchWithFiltersPerSection() { diff --git a/src/constructor.io/models/Browse/BrowseFacetOptionsRequest.cs b/src/constructor.io/models/Browse/BrowseFacetOptionsRequest.cs index b4bc0cae..a29b19aa 100644 --- a/src/constructor.io/models/Browse/BrowseFacetOptionsRequest.cs +++ b/src/constructor.io/models/Browse/BrowseFacetOptionsRequest.cs @@ -14,7 +14,6 @@ public class BrowseFacetOptionsRequest public bool ShowHiddenFacets { get; set; } public bool ShowProtectedFacets { get; set; } public UserInfo UserInfo { get; set; } - private Dictionary FmtOptions { get; set; } /// /// Initializes a new instance of the class. @@ -22,7 +21,6 @@ public class BrowseFacetOptionsRequest /// Facet to use for the request. public BrowseFacetOptionsRequest(string facetName) { - FmtOptions = new Dictionary(); this.FacetName = facetName; } @@ -39,19 +37,22 @@ public Hashtable GetRequestParameters() parameters.Add(Constants.FACET_NAME, this.FacetName); } + FmtOptions fmtOptions = null; if (this.ShowHiddenFacets) { - this.FmtOptions.Add(Constants.SHOW_HIDDEN_FACETS, this.ShowHiddenFacets.ToString()); + fmtOptions ??= new FmtOptions(); + fmtOptions.ShowHiddenFacets = this.ShowHiddenFacets; } if (this.ShowProtectedFacets) { - this.FmtOptions.Add(Constants.SHOW_PROTECTED_FACETS, this.ShowProtectedFacets.ToString()); + fmtOptions ??= new FmtOptions(); + fmtOptions.ShowProtectedFacets = this.ShowProtectedFacets; } - if (this.FmtOptions != null && this.FmtOptions.Count != 0) + if (fmtOptions != null) { - parameters.Add(Constants.FMT_OPTIONS, this.FmtOptions); + parameters.Add(Constants.FMT_OPTIONS, fmtOptions); } return parameters; diff --git a/src/constructor.io/models/Browse/BrowseFacetsRequest.cs b/src/constructor.io/models/Browse/BrowseFacetsRequest.cs index 58b5056c..58c83d7e 100644 --- a/src/constructor.io/models/Browse/BrowseFacetsRequest.cs +++ b/src/constructor.io/models/Browse/BrowseFacetsRequest.cs @@ -16,14 +16,12 @@ public class BrowseFacetsRequest public bool ShowHiddenFacets { get; set; } public bool ShowProtectedFacets { get; set; } public UserInfo UserInfo { get; set; } - private Dictionary FmtOptions { get; set; } /// /// Initializes a new instance of the class. /// public BrowseFacetsRequest() { - FmtOptions = new Dictionary(); } /// @@ -49,19 +47,22 @@ public Hashtable GetRequestParameters() parameters.Add(Constants.RESULTS_PER_PAGE, this.ResultsPerPage); } + FmtOptions fmtOptions = null; if (this.ShowHiddenFacets) { - this.FmtOptions.Add(Constants.SHOW_HIDDEN_FACETS, this.ShowHiddenFacets.ToString()); + fmtOptions ??= new FmtOptions(); + fmtOptions.ShowHiddenFacets = this.ShowHiddenFacets; } if (this.ShowProtectedFacets) { - this.FmtOptions.Add(Constants.SHOW_PROTECTED_FACETS, this.ShowProtectedFacets.ToString()); + fmtOptions ??= new FmtOptions(); + fmtOptions.ShowProtectedFacets = this.ShowProtectedFacets; } - if (this.FmtOptions != null && this.FmtOptions.Count != 0) + if (fmtOptions != null) { - parameters.Add(Constants.FMT_OPTIONS, this.FmtOptions); + parameters.Add(Constants.FMT_OPTIONS, fmtOptions); } return parameters; diff --git a/src/constructor.io/models/Browse/BrowseItemsRequest.cs b/src/constructor.io/models/Browse/BrowseItemsRequest.cs index 60179f6b..aed7b97e 100644 --- a/src/constructor.io/models/Browse/BrowseItemsRequest.cs +++ b/src/constructor.io/models/Browse/BrowseItemsRequest.cs @@ -13,7 +13,7 @@ public class BrowseItemsRequest { public List ItemIds { get; set; } public Dictionary> Filters { get; set; } - public Dictionary FmtOptions { get; set; } + public FmtOptions FmtOptions { get; set; } public List HiddenFields { get; set; } public List HiddenFacets { get; set; } public int Offset { get; set; } diff --git a/src/constructor.io/models/Browse/BrowseRequest.cs b/src/constructor.io/models/Browse/BrowseRequest.cs index 19b32d14..4b0bd407 100644 --- a/src/constructor.io/models/Browse/BrowseRequest.cs +++ b/src/constructor.io/models/Browse/BrowseRequest.cs @@ -25,7 +25,7 @@ public class BrowseRequest : IPlpRequest /// /// Gets or sets the format options used to refine result groups. /// - public Dictionary FmtOptions { get; set; } + public FmtOptions FmtOptions { get; set; } /// /// Gets or sets the filtering expression used to scope search results. diff --git a/src/constructor.io/models/Search/SearchRequest.cs b/src/constructor.io/models/Search/SearchRequest.cs index a2c98f9e..a10915a3 100644 --- a/src/constructor.io/models/Search/SearchRequest.cs +++ b/src/constructor.io/models/Search/SearchRequest.cs @@ -25,7 +25,7 @@ public class SearchRequest : IPlpRequest /// /// Gets or sets the format options used to refine result groups. /// - public Dictionary FmtOptions { get; set; } + public FmtOptions FmtOptions { get; set; } /// /// Gets or sets the filtering expression used to scope search results. diff --git a/src/constructor.io/models/common/FmtOptions.cs b/src/constructor.io/models/common/FmtOptions.cs new file mode 100644 index 00000000..0d885424 --- /dev/null +++ b/src/constructor.io/models/common/FmtOptions.cs @@ -0,0 +1,57 @@ +using System.Collections.Generic; + +namespace Constructorio_NET.Models +{ + /// + /// Format options used to refine result groups and control response fields. + /// + public class FmtOptions + { + /// + /// Gets or sets the maximum depth of result groups to return. + /// + public int? GroupsMaxDepth { get; set; } + + /// + /// Gets or sets the starting point for groups. + /// Valid values: "current", "top", or "group_id:{id}". + /// + public string? GroupsStart { get; set; } + + /// + /// Gets or sets the list of fields to return in results. + /// + public List Fields { get; set; } + + /// + /// Gets or sets hidden metadata fields to return. + /// + public List HiddenFields { get; set; } + + /// + /// Gets or sets hidden facet fields to return. + /// + public List HiddenFacets { get; set; } + + /// + /// Gets or sets whether to show hidden fields. + /// + public bool? ShowHiddenFields { get; set; } + + /// + /// Gets or sets the variations return type. + /// Valid values: "default", "all", "matched". + /// + public string? VariationsReturnType { get; set; } + + /// + /// Gets or sets whether to show hidden facets. + /// + public bool? ShowHiddenFacets { get; set; } + + /// + /// Gets or sets whether to show protected facets. + /// + public bool? ShowProtectedFacets { get; set; } + } +} diff --git a/src/constructor.io/models/common/IPlpRequest.cs b/src/constructor.io/models/common/IPlpRequest.cs index c9bb8eb1..dbaf8b8b 100644 --- a/src/constructor.io/models/common/IPlpRequest.cs +++ b/src/constructor.io/models/common/IPlpRequest.cs @@ -7,7 +7,7 @@ public interface IPlpRequest : IFilterable, IPageable, ISortable, IUserDetails /// /// Gets or sets the format options used to refine result groups. /// - Dictionary FmtOptions { get; set; } + FmtOptions FmtOptions { get; set; } /// /// Gets or sets hidden facets fields to return. diff --git a/src/constructor.io/utils/Helpers.cs b/src/constructor.io/utils/Helpers.cs index 5b15bc4b..6400370c 100644 --- a/src/constructor.io/utils/Helpers.cs +++ b/src/constructor.io/utils/Helpers.cs @@ -180,15 +180,54 @@ protected static string MakeUrl(Hashtable options, List paths, Hashtable // Add format options to query string if (queryParams.Contains(Constants.FMT_OPTIONS)) { - Dictionary fmtOptions = (Dictionary)queryParams[Constants.FMT_OPTIONS]; + FmtOptions fmtOptions = (FmtOptions)queryParams[Constants.FMT_OPTIONS]; queryParams.Remove(Constants.FMT_OPTIONS); - foreach (var fmtOption in fmtOptions) + // Scalar values + if (fmtOptions.GroupsMaxDepth.HasValue) { - url.Append("&" + Constants.FMT_OPTIONS + UrlEscapedStartSquareBracket) - .Append(OurEscapeDataString(fmtOption.Key)) - .Append(UrlEscapedEndSquareBracket + "=") - .Append(OurEscapeDataString(fmtOption.Value)); + AppendFmtOption(url, "groups_max_depth", fmtOptions.GroupsMaxDepth.Value.ToString()); + } + + if (!string.IsNullOrEmpty(fmtOptions.GroupsStart)) + { + AppendFmtOption(url, "groups_start", fmtOptions.GroupsStart); + } + + if (fmtOptions.ShowHiddenFields.HasValue) + { + AppendFmtOption(url, "show_hidden_fields", fmtOptions.ShowHiddenFields.Value.ToString().ToLower()); + } + + if (!string.IsNullOrEmpty(fmtOptions.VariationsReturnType)) + { + AppendFmtOption(url, "variations_return_type", fmtOptions.VariationsReturnType); + } + + if (fmtOptions.ShowHiddenFacets.HasValue) + { + AppendFmtOption(url, "show_hidden_facets", fmtOptions.ShowHiddenFacets.Value.ToString()); + } + + if (fmtOptions.ShowProtectedFacets.HasValue) + { + AppendFmtOption(url, "show_protected_facets", fmtOptions.ShowProtectedFacets.Value.ToString()); + } + + // Array values (indexed format) + if (fmtOptions.Fields != null) + { + AppendFmtOptionArray(url, "fields", fmtOptions.Fields); + } + + if (fmtOptions.HiddenFields != null) + { + AppendFmtOptionArray(url, "hidden_fields", fmtOptions.HiddenFields); + } + + if (fmtOptions.HiddenFacets != null) + { + AppendFmtOptionArray(url, "hidden_facets", fmtOptions.HiddenFacets); } } @@ -272,6 +311,25 @@ protected static string MakeUrl(Hashtable options, List paths, Hashtable return url.ToString(); } + private static void AppendFmtOption(StringBuilder url, string key, string value) + { + url.Append("&" + Constants.FMT_OPTIONS + UrlEscapedStartSquareBracket) + .Append(OurEscapeDataString(key)) + .Append(UrlEscapedEndSquareBracket + "=") + .Append(OurEscapeDataString(value)); + } + + private static void AppendFmtOptionArray(StringBuilder url, string key, List values) + { + foreach (string value in values) + { + url.Append("&" + Constants.FMT_OPTIONS + UrlEscapedStartSquareBracket) + .Append(OurEscapeDataString(key)) + .Append(UrlEscapedEndSquareBracket + "=") + .Append(OurEscapeDataString(value)); + } + } + private static async Task DeserializeFromResponse(HttpResponseMessage response, JsonSerializer jsonSerializer = null) { using Stream stream = await response.Content.ReadAsStreamAsync(); From e82ee57b02ac75fa6103816e40c6070c6ca881aa Mon Sep 17 00:00:00 2001 From: Enes Kutay SEZEN Date: Thu, 12 Feb 2026 15:54:07 +0400 Subject: [PATCH 02/13] Update src/constructor.io/utils/Helpers.cs Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com> --- src/constructor.io/utils/Helpers.cs | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/constructor.io/utils/Helpers.cs b/src/constructor.io/utils/Helpers.cs index 6400370c..92b0e269 100644 --- a/src/constructor.io/utils/Helpers.cs +++ b/src/constructor.io/utils/Helpers.cs @@ -206,12 +206,12 @@ protected static string MakeUrl(Hashtable options, List paths, Hashtable if (fmtOptions.ShowHiddenFacets.HasValue) { - AppendFmtOption(url, "show_hidden_facets", fmtOptions.ShowHiddenFacets.Value.ToString()); + AppendFmtOption(url, "show_hidden_facets", fmtOptions.ShowHiddenFacets.Value.ToString().ToLower()); } if (fmtOptions.ShowProtectedFacets.HasValue) { - AppendFmtOption(url, "show_protected_facets", fmtOptions.ShowProtectedFacets.Value.ToString()); + AppendFmtOption(url, "show_protected_facets", fmtOptions.ShowProtectedFacets.Value.ToString().ToLower()); } // Array values (indexed format) From aa49bd55763d2d40b86712faf7b448737b5d533e Mon Sep 17 00:00:00 2001 From: Enes Kutay SEZEN Date: Thu, 12 Feb 2026 16:00:32 +0400 Subject: [PATCH 03/13] Update FmtOptions --- src/constructor.io/models/common/FmtOptions.cs | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/constructor.io/models/common/FmtOptions.cs b/src/constructor.io/models/common/FmtOptions.cs index 0d885424..4e1cecca 100644 --- a/src/constructor.io/models/common/FmtOptions.cs +++ b/src/constructor.io/models/common/FmtOptions.cs @@ -21,17 +21,17 @@ public class FmtOptions /// /// Gets or sets the list of fields to return in results. /// - public List Fields { get; set; } + public List? Fields { get; set; } /// /// Gets or sets hidden metadata fields to return. /// - public List HiddenFields { get; set; } + public List? HiddenFields { get; set; } /// /// Gets or sets hidden facet fields to return. /// - public List HiddenFacets { get; set; } + public List? HiddenFacets { get; set; } /// /// Gets or sets whether to show hidden fields. From b9db2b28298b63078ae779565b8b0420e988f005 Mon Sep 17 00:00:00 2001 From: Enes Kutay SEZEN Date: Thu, 12 Feb 2026 16:18:03 +0400 Subject: [PATCH 04/13] Add tests --- .../Browse/BrowseFacetOptionsRequestTest.cs | 28 +++++++++++++++++++ .../models/Browse/BrowseFacetsRequestTest.cs | 28 +++++++++++++++++++ 2 files changed, 56 insertions(+) diff --git a/src/Constructorio_NET.Tests/models/Browse/BrowseFacetOptionsRequestTest.cs b/src/Constructorio_NET.Tests/models/Browse/BrowseFacetOptionsRequestTest.cs index 73d78503..64b8be8c 100644 --- a/src/Constructorio_NET.Tests/models/Browse/BrowseFacetOptionsRequestTest.cs +++ b/src/Constructorio_NET.Tests/models/Browse/BrowseFacetOptionsRequestTest.cs @@ -37,6 +37,34 @@ public void GetRequestParameters() Assert.AreEqual(this.FilterName, requestParameters[Constants.FACET_NAME]); } + [Test] + public void GetRequestParametersWithShowHiddenFacets() + { + BrowseFacetOptionsRequest req = new BrowseFacetOptionsRequest(FilterName) + { + ShowHiddenFacets = true, + }; + + Hashtable requestParameters = req.GetRequestParameters(); + FmtOptions fmtOptions = (FmtOptions)requestParameters[Constants.FMT_OPTIONS]; + Assert.IsNotNull(fmtOptions); + Assert.AreEqual(true, fmtOptions.ShowHiddenFacets); + } + + [Test] + public void GetRequestParametersWithShowProtectedFacets() + { + BrowseFacetOptionsRequest req = new BrowseFacetOptionsRequest(FilterName) + { + ShowProtectedFacets = true, + }; + + Hashtable requestParameters = req.GetRequestParameters(); + FmtOptions fmtOptions = (FmtOptions)requestParameters[Constants.FMT_OPTIONS]; + Assert.IsNotNull(fmtOptions); + Assert.AreEqual(true, fmtOptions.ShowProtectedFacets); + } + [Test] public void GetRequestHeaders() { diff --git a/src/Constructorio_NET.Tests/models/Browse/BrowseFacetsRequestTest.cs b/src/Constructorio_NET.Tests/models/Browse/BrowseFacetsRequestTest.cs index 5eb0ec0e..b07913e3 100644 --- a/src/Constructorio_NET.Tests/models/Browse/BrowseFacetsRequestTest.cs +++ b/src/Constructorio_NET.Tests/models/Browse/BrowseFacetsRequestTest.cs @@ -44,6 +44,34 @@ public void GetRequestParameters() Assert.AreEqual(this.Offset, requestParameters[Constants.OFFSET]); } + [Test] + public void GetRequestParametersWithShowHiddenFacets() + { + BrowseFacetsRequest req = new BrowseFacetsRequest() + { + ShowHiddenFacets = true, + }; + + Hashtable requestParameters = req.GetRequestParameters(); + FmtOptions fmtOptions = (FmtOptions)requestParameters[Constants.FMT_OPTIONS]; + Assert.IsNotNull(fmtOptions); + Assert.AreEqual(true, fmtOptions.ShowHiddenFacets); + } + + [Test] + public void GetRequestParametersWithShowProtectedFacets() + { + BrowseFacetsRequest req = new BrowseFacetsRequest() + { + ShowProtectedFacets = true, + }; + + Hashtable requestParameters = req.GetRequestParameters(); + FmtOptions fmtOptions = (FmtOptions)requestParameters[Constants.FMT_OPTIONS]; + Assert.IsNotNull(fmtOptions); + Assert.AreEqual(true, fmtOptions.ShowProtectedFacets); + } + [Test] public void GetRequestHeaders() { From 353790a3bbf30740fa3ac9c4da810fcc1deec4a8 Mon Sep 17 00:00:00 2001 From: Enes Kutay SEZEN Date: Fri, 20 Feb 2026 17:09:49 +0300 Subject: [PATCH 05/13] Address comments --- .../Browse/BrowseFacetOptionsRequestTest.cs | 40 +++++++++++++++++++ .../models/Browse/BrowseFacetsRequestTest.cs | 40 +++++++++++++++++++ .../Browse/BrowseFacetOptionsRequest.cs | 3 +- .../models/Browse/BrowseFacetsRequest.cs | 3 +- 4 files changed, 84 insertions(+), 2 deletions(-) diff --git a/src/Constructorio_NET.Tests/models/Browse/BrowseFacetOptionsRequestTest.cs b/src/Constructorio_NET.Tests/models/Browse/BrowseFacetOptionsRequestTest.cs index 64b8be8c..9afbf82f 100644 --- a/src/Constructorio_NET.Tests/models/Browse/BrowseFacetOptionsRequestTest.cs +++ b/src/Constructorio_NET.Tests/models/Browse/BrowseFacetOptionsRequestTest.cs @@ -65,6 +65,46 @@ public void GetRequestParametersWithShowProtectedFacets() Assert.AreEqual(true, fmtOptions.ShowProtectedFacets); } + [Test] + public void GetRequestParametersWithFmtOptions() + { + BrowseFacetOptionsRequest req = new BrowseFacetOptionsRequest(FilterName) + { + FmtOptions = new FmtOptions() + { + GroupsMaxDepth = 3, + ShowHiddenFacets = true, + ShowProtectedFacets = true, + }, + }; + + Hashtable requestParameters = req.GetRequestParameters(); + FmtOptions fmtOptions = (FmtOptions)requestParameters[Constants.FMT_OPTIONS]; + Assert.IsNotNull(fmtOptions); + Assert.AreEqual(3, fmtOptions.GroupsMaxDepth); + Assert.AreEqual(true, fmtOptions.ShowHiddenFacets); + Assert.AreEqual(true, fmtOptions.ShowProtectedFacets); + } + + [Test] + public void GetRequestParametersWithFmtOptionsAndShowHiddenFacets() + { + BrowseFacetOptionsRequest req = new BrowseFacetOptionsRequest(FilterName) + { + FmtOptions = new FmtOptions() + { + GroupsMaxDepth = 3, + }, + ShowHiddenFacets = true, + }; + + Hashtable requestParameters = req.GetRequestParameters(); + FmtOptions fmtOptions = (FmtOptions)requestParameters[Constants.FMT_OPTIONS]; + Assert.IsNotNull(fmtOptions); + Assert.AreEqual(3, fmtOptions.GroupsMaxDepth); + Assert.AreEqual(true, fmtOptions.ShowHiddenFacets); + } + [Test] public void GetRequestHeaders() { diff --git a/src/Constructorio_NET.Tests/models/Browse/BrowseFacetsRequestTest.cs b/src/Constructorio_NET.Tests/models/Browse/BrowseFacetsRequestTest.cs index b07913e3..85a223ff 100644 --- a/src/Constructorio_NET.Tests/models/Browse/BrowseFacetsRequestTest.cs +++ b/src/Constructorio_NET.Tests/models/Browse/BrowseFacetsRequestTest.cs @@ -72,6 +72,46 @@ public void GetRequestParametersWithShowProtectedFacets() Assert.AreEqual(true, fmtOptions.ShowProtectedFacets); } + [Test] + public void GetRequestParametersWithFmtOptions() + { + BrowseFacetsRequest req = new BrowseFacetsRequest() + { + FmtOptions = new FmtOptions() + { + GroupsMaxDepth = 3, + ShowHiddenFacets = true, + ShowProtectedFacets = true, + }, + }; + + Hashtable requestParameters = req.GetRequestParameters(); + FmtOptions fmtOptions = (FmtOptions)requestParameters[Constants.FMT_OPTIONS]; + Assert.IsNotNull(fmtOptions); + Assert.AreEqual(3, fmtOptions.GroupsMaxDepth); + Assert.AreEqual(true, fmtOptions.ShowHiddenFacets); + Assert.AreEqual(true, fmtOptions.ShowProtectedFacets); + } + + [Test] + public void GetRequestParametersWithFmtOptionsAndShowHiddenFacets() + { + BrowseFacetsRequest req = new BrowseFacetsRequest() + { + FmtOptions = new FmtOptions() + { + GroupsMaxDepth = 3, + }, + ShowHiddenFacets = true, + }; + + Hashtable requestParameters = req.GetRequestParameters(); + FmtOptions fmtOptions = (FmtOptions)requestParameters[Constants.FMT_OPTIONS]; + Assert.IsNotNull(fmtOptions); + Assert.AreEqual(3, fmtOptions.GroupsMaxDepth); + Assert.AreEqual(true, fmtOptions.ShowHiddenFacets); + } + [Test] public void GetRequestHeaders() { diff --git a/src/constructor.io/models/Browse/BrowseFacetOptionsRequest.cs b/src/constructor.io/models/Browse/BrowseFacetOptionsRequest.cs index a29b19aa..95a70e48 100644 --- a/src/constructor.io/models/Browse/BrowseFacetOptionsRequest.cs +++ b/src/constructor.io/models/Browse/BrowseFacetOptionsRequest.cs @@ -13,6 +13,7 @@ public class BrowseFacetOptionsRequest public string FacetName { get; set; } public bool ShowHiddenFacets { get; set; } public bool ShowProtectedFacets { get; set; } + public FmtOptions FmtOptions { get; set; } public UserInfo UserInfo { get; set; } /// @@ -37,7 +38,7 @@ public Hashtable GetRequestParameters() parameters.Add(Constants.FACET_NAME, this.FacetName); } - FmtOptions fmtOptions = null; + FmtOptions fmtOptions = this.FmtOptions; if (this.ShowHiddenFacets) { fmtOptions ??= new FmtOptions(); diff --git a/src/constructor.io/models/Browse/BrowseFacetsRequest.cs b/src/constructor.io/models/Browse/BrowseFacetsRequest.cs index 58c83d7e..df74ade0 100644 --- a/src/constructor.io/models/Browse/BrowseFacetsRequest.cs +++ b/src/constructor.io/models/Browse/BrowseFacetsRequest.cs @@ -15,6 +15,7 @@ public class BrowseFacetsRequest public int Offset { get; set; } public bool ShowHiddenFacets { get; set; } public bool ShowProtectedFacets { get; set; } + public FmtOptions FmtOptions { get; set; } public UserInfo UserInfo { get; set; } /// @@ -47,7 +48,7 @@ public Hashtable GetRequestParameters() parameters.Add(Constants.RESULTS_PER_PAGE, this.ResultsPerPage); } - FmtOptions fmtOptions = null; + FmtOptions fmtOptions = this.FmtOptions; if (this.ShowHiddenFacets) { fmtOptions ??= new FmtOptions(); From 99f0266a235ea89b32b1239c7c71e0d70a86b62f Mon Sep 17 00:00:00 2001 From: Enes Kutay SEZEN Date: Fri, 20 Feb 2026 17:12:59 +0300 Subject: [PATCH 06/13] Address comments --- src/constructor.io/utils/Helpers.cs | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/src/constructor.io/utils/Helpers.cs b/src/constructor.io/utils/Helpers.cs index 92b0e269..14f30b05 100644 --- a/src/constructor.io/utils/Helpers.cs +++ b/src/constructor.io/utils/Helpers.cs @@ -217,17 +217,17 @@ protected static string MakeUrl(Hashtable options, List paths, Hashtable // Array values (indexed format) if (fmtOptions.Fields != null) { - AppendFmtOptionArray(url, "fields", fmtOptions.Fields); + AppendFmtOption(url, "fields", fmtOptions.Fields); } if (fmtOptions.HiddenFields != null) { - AppendFmtOptionArray(url, "hidden_fields", fmtOptions.HiddenFields); + AppendFmtOption(url, "hidden_fields", fmtOptions.HiddenFields); } if (fmtOptions.HiddenFacets != null) { - AppendFmtOptionArray(url, "hidden_facets", fmtOptions.HiddenFacets); + AppendFmtOption(url, "hidden_facets", fmtOptions.HiddenFacets); } } @@ -319,7 +319,7 @@ private static void AppendFmtOption(StringBuilder url, string key, string value) .Append(OurEscapeDataString(value)); } - private static void AppendFmtOptionArray(StringBuilder url, string key, List values) + private static void AppendFmtOption(StringBuilder url, string key, List values) { foreach (string value in values) { From 80d2b1c05a8b7aa5081fd73b1ab63a9eeeb70975 Mon Sep 17 00:00:00 2001 From: Enes Kutay SEZEN Date: Fri, 20 Feb 2026 17:51:28 +0300 Subject: [PATCH 07/13] Refactor FmtOptions completley --- .../Browse/BrowseFacetOptionsRequestTest.cs | 22 +-- .../models/Browse/BrowseFacetsRequestTest.cs | 22 +-- .../models/common/FmtOptionsTest.cs | 142 ++++++++++++++++++ .../utils/HelpersTest.cs | 48 ++---- .../Autocomplete/AutocompleteRequest.cs | 6 +- .../Browse/BrowseFacetOptionsRequest.cs | 5 +- .../models/Browse/BrowseFacetsRequest.cs | 5 +- .../models/Browse/BrowseItemsRequest.cs | 18 ++- .../models/Browse/BrowseRequest.cs | 20 ++- .../models/Search/SearchRequest.cs | 18 ++- .../models/common/FmtOptions.cs | 59 ++++++++ src/constructor.io/utils/Constants.cs | 5 + src/constructor.io/utils/Helpers.cs | 99 ------------ 13 files changed, 284 insertions(+), 185 deletions(-) create mode 100644 src/Constructorio_NET.Tests/models/common/FmtOptionsTest.cs diff --git a/src/Constructorio_NET.Tests/models/Browse/BrowseFacetOptionsRequestTest.cs b/src/Constructorio_NET.Tests/models/Browse/BrowseFacetOptionsRequestTest.cs index 9afbf82f..5fdabd1b 100644 --- a/src/Constructorio_NET.Tests/models/Browse/BrowseFacetOptionsRequestTest.cs +++ b/src/Constructorio_NET.Tests/models/Browse/BrowseFacetOptionsRequestTest.cs @@ -46,9 +46,7 @@ public void GetRequestParametersWithShowHiddenFacets() }; Hashtable requestParameters = req.GetRequestParameters(); - FmtOptions fmtOptions = (FmtOptions)requestParameters[Constants.FMT_OPTIONS]; - Assert.IsNotNull(fmtOptions); - Assert.AreEqual(true, fmtOptions.ShowHiddenFacets); + Assert.AreEqual("true", requestParameters[$"{Constants.FMT_OPTIONS}[{Constants.SHOW_HIDDEN_FACETS}]"]); } [Test] @@ -60,9 +58,7 @@ public void GetRequestParametersWithShowProtectedFacets() }; Hashtable requestParameters = req.GetRequestParameters(); - FmtOptions fmtOptions = (FmtOptions)requestParameters[Constants.FMT_OPTIONS]; - Assert.IsNotNull(fmtOptions); - Assert.AreEqual(true, fmtOptions.ShowProtectedFacets); + Assert.AreEqual("true", requestParameters[$"{Constants.FMT_OPTIONS}[{Constants.SHOW_PROTECTED_FACETS}]"]); } [Test] @@ -79,11 +75,9 @@ public void GetRequestParametersWithFmtOptions() }; Hashtable requestParameters = req.GetRequestParameters(); - FmtOptions fmtOptions = (FmtOptions)requestParameters[Constants.FMT_OPTIONS]; - Assert.IsNotNull(fmtOptions); - Assert.AreEqual(3, fmtOptions.GroupsMaxDepth); - Assert.AreEqual(true, fmtOptions.ShowHiddenFacets); - Assert.AreEqual(true, fmtOptions.ShowProtectedFacets); + Assert.AreEqual("3", requestParameters[$"{Constants.FMT_OPTIONS}[{Constants.GROUPS_MAX_DEPTH}]"]); + Assert.AreEqual("true", requestParameters[$"{Constants.FMT_OPTIONS}[{Constants.SHOW_HIDDEN_FACETS}]"]); + Assert.AreEqual("true", requestParameters[$"{Constants.FMT_OPTIONS}[{Constants.SHOW_PROTECTED_FACETS}]"]); } [Test] @@ -99,10 +93,8 @@ public void GetRequestParametersWithFmtOptionsAndShowHiddenFacets() }; Hashtable requestParameters = req.GetRequestParameters(); - FmtOptions fmtOptions = (FmtOptions)requestParameters[Constants.FMT_OPTIONS]; - Assert.IsNotNull(fmtOptions); - Assert.AreEqual(3, fmtOptions.GroupsMaxDepth); - Assert.AreEqual(true, fmtOptions.ShowHiddenFacets); + Assert.AreEqual("3", requestParameters[$"{Constants.FMT_OPTIONS}[{Constants.GROUPS_MAX_DEPTH}]"]); + Assert.AreEqual("true", requestParameters[$"{Constants.FMT_OPTIONS}[{Constants.SHOW_HIDDEN_FACETS}]"]); } [Test] diff --git a/src/Constructorio_NET.Tests/models/Browse/BrowseFacetsRequestTest.cs b/src/Constructorio_NET.Tests/models/Browse/BrowseFacetsRequestTest.cs index 85a223ff..90624ea7 100644 --- a/src/Constructorio_NET.Tests/models/Browse/BrowseFacetsRequestTest.cs +++ b/src/Constructorio_NET.Tests/models/Browse/BrowseFacetsRequestTest.cs @@ -53,9 +53,7 @@ public void GetRequestParametersWithShowHiddenFacets() }; Hashtable requestParameters = req.GetRequestParameters(); - FmtOptions fmtOptions = (FmtOptions)requestParameters[Constants.FMT_OPTIONS]; - Assert.IsNotNull(fmtOptions); - Assert.AreEqual(true, fmtOptions.ShowHiddenFacets); + Assert.AreEqual("true", requestParameters[$"{Constants.FMT_OPTIONS}[{Constants.SHOW_HIDDEN_FACETS}]"]); } [Test] @@ -67,9 +65,7 @@ public void GetRequestParametersWithShowProtectedFacets() }; Hashtable requestParameters = req.GetRequestParameters(); - FmtOptions fmtOptions = (FmtOptions)requestParameters[Constants.FMT_OPTIONS]; - Assert.IsNotNull(fmtOptions); - Assert.AreEqual(true, fmtOptions.ShowProtectedFacets); + Assert.AreEqual("true", requestParameters[$"{Constants.FMT_OPTIONS}[{Constants.SHOW_PROTECTED_FACETS}]"]); } [Test] @@ -86,11 +82,9 @@ public void GetRequestParametersWithFmtOptions() }; Hashtable requestParameters = req.GetRequestParameters(); - FmtOptions fmtOptions = (FmtOptions)requestParameters[Constants.FMT_OPTIONS]; - Assert.IsNotNull(fmtOptions); - Assert.AreEqual(3, fmtOptions.GroupsMaxDepth); - Assert.AreEqual(true, fmtOptions.ShowHiddenFacets); - Assert.AreEqual(true, fmtOptions.ShowProtectedFacets); + Assert.AreEqual("3", requestParameters[$"{Constants.FMT_OPTIONS}[{Constants.GROUPS_MAX_DEPTH}]"]); + Assert.AreEqual("true", requestParameters[$"{Constants.FMT_OPTIONS}[{Constants.SHOW_HIDDEN_FACETS}]"]); + Assert.AreEqual("true", requestParameters[$"{Constants.FMT_OPTIONS}[{Constants.SHOW_PROTECTED_FACETS}]"]); } [Test] @@ -106,10 +100,8 @@ public void GetRequestParametersWithFmtOptionsAndShowHiddenFacets() }; Hashtable requestParameters = req.GetRequestParameters(); - FmtOptions fmtOptions = (FmtOptions)requestParameters[Constants.FMT_OPTIONS]; - Assert.IsNotNull(fmtOptions); - Assert.AreEqual(3, fmtOptions.GroupsMaxDepth); - Assert.AreEqual(true, fmtOptions.ShowHiddenFacets); + Assert.AreEqual("3", requestParameters[$"{Constants.FMT_OPTIONS}[{Constants.GROUPS_MAX_DEPTH}]"]); + Assert.AreEqual("true", requestParameters[$"{Constants.FMT_OPTIONS}[{Constants.SHOW_HIDDEN_FACETS}]"]); } [Test] diff --git a/src/Constructorio_NET.Tests/models/common/FmtOptionsTest.cs b/src/Constructorio_NET.Tests/models/common/FmtOptionsTest.cs new file mode 100644 index 00000000..5f6b6046 --- /dev/null +++ b/src/Constructorio_NET.Tests/models/common/FmtOptionsTest.cs @@ -0,0 +1,142 @@ +using System.Collections; +using System.Collections.Generic; +using Constructorio_NET.Models; +using Constructorio_NET.Utils; +using NUnit.Framework; + +namespace Constructorio_NET.Tests +{ + [TestFixture] + public class FmtOptionsTest + { + [Test] + public void GetQueryParametersEmpty() + { + FmtOptions fmtOptions = new FmtOptions(); + Hashtable result = fmtOptions.GetQueryParameters(); + Assert.AreEqual(0, result.Count); + } + + [Test] + public void GetQueryParametersGroupsMaxDepth() + { + FmtOptions fmtOptions = new FmtOptions { GroupsMaxDepth = 3 }; + Hashtable result = fmtOptions.GetQueryParameters(); + Assert.AreEqual("3", result[$"{Constants.FMT_OPTIONS}[{Constants.GROUPS_MAX_DEPTH}]"]); + Assert.AreEqual(1, result.Count); + } + + [Test] + public void GetQueryParametersGroupsStart() + { + FmtOptions fmtOptions = new FmtOptions { GroupsStart = "current" }; + Hashtable result = fmtOptions.GetQueryParameters(); + Assert.AreEqual("current", result[$"{Constants.FMT_OPTIONS}[{Constants.GROUPS_START}]"]); + Assert.AreEqual(1, result.Count); + } + + [Test] + public void GetQueryParametersShowHiddenFields() + { + FmtOptions fmtOptions = new FmtOptions { ShowHiddenFields = true }; + Hashtable result = fmtOptions.GetQueryParameters(); + Assert.AreEqual("true", result[$"{Constants.FMT_OPTIONS}[{Constants.SHOW_HIDDEN_FIELDS}]"]); + Assert.AreEqual(1, result.Count); + } + + [Test] + public void GetQueryParametersShowHiddenFieldsFalse() + { + FmtOptions fmtOptions = new FmtOptions { ShowHiddenFields = false }; + Hashtable result = fmtOptions.GetQueryParameters(); + Assert.AreEqual("false", result[$"{Constants.FMT_OPTIONS}[{Constants.SHOW_HIDDEN_FIELDS}]"]); + Assert.AreEqual(1, result.Count); + } + + [Test] + public void GetQueryParametersVariationsReturnType() + { + FmtOptions fmtOptions = new FmtOptions { VariationsReturnType = "all" }; + Hashtable result = fmtOptions.GetQueryParameters(); + Assert.AreEqual("all", result[$"{Constants.FMT_OPTIONS}[{Constants.VARIATIONS_RETURN_TYPE}]"]); + Assert.AreEqual(1, result.Count); + } + + [Test] + public void GetQueryParametersShowHiddenFacets() + { + FmtOptions fmtOptions = new FmtOptions { ShowHiddenFacets = true }; + Hashtable result = fmtOptions.GetQueryParameters(); + Assert.AreEqual("true", result[$"{Constants.FMT_OPTIONS}[{Constants.SHOW_HIDDEN_FACETS}]"]); + Assert.AreEqual(1, result.Count); + } + + [Test] + public void GetQueryParametersShowProtectedFacets() + { + FmtOptions fmtOptions = new FmtOptions { ShowProtectedFacets = true }; + Hashtable result = fmtOptions.GetQueryParameters(); + Assert.AreEqual("true", result[$"{Constants.FMT_OPTIONS}[{Constants.SHOW_PROTECTED_FACETS}]"]); + Assert.AreEqual(1, result.Count); + } + + [Test] + public void GetQueryParametersFields() + { + FmtOptions fmtOptions = new FmtOptions { Fields = new List { "id", "name" } }; + Hashtable result = fmtOptions.GetQueryParameters(); + List fields = (List)result[$"{Constants.FMT_OPTIONS}[{Constants.FIELDS}]"]; + Assert.AreEqual(new List { "id", "name" }, fields); + Assert.AreEqual(1, result.Count); + } + + [Test] + public void GetQueryParametersHiddenFields() + { + FmtOptions fmtOptions = new FmtOptions { HiddenFields = new List { "inventory", "margin" } }; + Hashtable result = fmtOptions.GetQueryParameters(); + List hiddenFields = (List)result[$"{Constants.FMT_OPTIONS}[{Constants.HIDDEN_FIELDS}]"]; + Assert.AreEqual(new List { "inventory", "margin" }, hiddenFields); + Assert.AreEqual(1, result.Count); + } + + [Test] + public void GetQueryParametersHiddenFacets() + { + FmtOptions fmtOptions = new FmtOptions { HiddenFacets = new List { "brand", "category" } }; + Hashtable result = fmtOptions.GetQueryParameters(); + List hiddenFacets = (List)result[$"{Constants.FMT_OPTIONS}[{Constants.HIDDEN_FACETS}]"]; + Assert.AreEqual(new List { "brand", "category" }, hiddenFacets); + Assert.AreEqual(1, result.Count); + } + + [Test] + public void GetQueryParametersAllProperties() + { + FmtOptions fmtOptions = new FmtOptions + { + GroupsMaxDepth = 5, + GroupsStart = "top", + ShowHiddenFields = true, + VariationsReturnType = "all", + ShowHiddenFacets = true, + ShowProtectedFacets = false, + Fields = new List { "id" }, + HiddenFields = new List { "inventory" }, + HiddenFacets = new List { "brand" }, + }; + + Hashtable result = fmtOptions.GetQueryParameters(); + Assert.AreEqual(9, result.Count); + Assert.AreEqual("5", result[$"{Constants.FMT_OPTIONS}[{Constants.GROUPS_MAX_DEPTH}]"]); + Assert.AreEqual("top", result[$"{Constants.FMT_OPTIONS}[{Constants.GROUPS_START}]"]); + Assert.AreEqual("true", result[$"{Constants.FMT_OPTIONS}[{Constants.SHOW_HIDDEN_FIELDS}]"]); + Assert.AreEqual("all", result[$"{Constants.FMT_OPTIONS}[{Constants.VARIATIONS_RETURN_TYPE}]"]); + Assert.AreEqual("true", result[$"{Constants.FMT_OPTIONS}[{Constants.SHOW_HIDDEN_FACETS}]"]); + Assert.AreEqual("false", result[$"{Constants.FMT_OPTIONS}[{Constants.SHOW_PROTECTED_FACETS}]"]); + Assert.AreEqual(new List { "id" }, result[$"{Constants.FMT_OPTIONS}[{Constants.FIELDS}]"]); + Assert.AreEqual(new List { "inventory" }, result[$"{Constants.FMT_OPTIONS}[{Constants.HIDDEN_FIELDS}]"]); + Assert.AreEqual(new List { "brand" }, result[$"{Constants.FMT_OPTIONS}[{Constants.HIDDEN_FACETS}]"]); + } + } +} diff --git a/src/Constructorio_NET.Tests/utils/HelpersTest.cs b/src/Constructorio_NET.Tests/utils/HelpersTest.cs index 28c7b1a8..ab05ef12 100644 --- a/src/Constructorio_NET.Tests/utils/HelpersTest.cs +++ b/src/Constructorio_NET.Tests/utils/HelpersTest.cs @@ -166,7 +166,7 @@ public void MakeUrlSearchWithHiddenFields() List hiddenFields = new List() { "inventory", "margin" }; Hashtable queryParams = new Hashtable() { - { Constants.HIDDEN_FIELDS, hiddenFields } + { $"{Constants.FMT_OPTIONS}[{Constants.HIDDEN_FIELDS}]", hiddenFields } }; string url = MakeUrl(this.Options, paths, queryParams); @@ -182,7 +182,7 @@ public void MakeUrlSearchWithHiddenFacets() List hiddenFacets = new List() { "inventory", "margin" }; Hashtable queryParams = new Hashtable() { - { Constants.HIDDEN_FACETS, hiddenFacets } + { $"{Constants.FMT_OPTIONS}[{Constants.HIDDEN_FACETS}]", hiddenFacets } }; string url = MakeUrl(this.Options, paths, queryParams); @@ -195,15 +195,11 @@ public void MakeUrlSearchWithHiddenFacets() public void MakeUrlSearchWithFmtOptions() { List paths = new List { "search", this.Query }; - FmtOptions fmtOptions = new FmtOptions - { - GroupsMaxDepth = 3, - GroupsStart = "current" - }; Hashtable queryParams = new Hashtable() { { Constants.SECTION, "Search Suggestions" }, - { Constants.FMT_OPTIONS, fmtOptions } + { $"{Constants.FMT_OPTIONS}[{Constants.GROUPS_MAX_DEPTH}]", "3" }, + { $"{Constants.FMT_OPTIONS}[{Constants.GROUPS_START}]", "current" }, }; string url = MakeUrl(this.Options, paths, queryParams); @@ -218,13 +214,9 @@ public void MakeUrlSearchWithFmtOptions() public void MakeUrlSearchWithFmtOptionsFieldsArray() { List paths = new List { "search", this.Query }; - FmtOptions fmtOptions = new FmtOptions - { - Fields = new List { "id", "variation_id", "name" } - }; Hashtable queryParams = new Hashtable() { - { Constants.FMT_OPTIONS, fmtOptions } + { $"{Constants.FMT_OPTIONS}[{Constants.FIELDS}]", new List { "id", "variation_id", "name" } } }; string url = MakeUrl(this.Options, paths, queryParams); @@ -238,13 +230,9 @@ public void MakeUrlSearchWithFmtOptionsFieldsArray() public void MakeUrlSearchWithFmtOptionsHiddenFieldsArray() { List paths = new List { "search", this.Query }; - FmtOptions fmtOptions = new FmtOptions - { - HiddenFields = new List { "inventory", "margin" } - }; Hashtable queryParams = new Hashtable() { - { Constants.FMT_OPTIONS, fmtOptions } + { $"{Constants.FMT_OPTIONS}[{Constants.HIDDEN_FIELDS}]", new List { "inventory", "margin" } } }; string url = MakeUrl(this.Options, paths, queryParams); @@ -257,13 +245,9 @@ public void MakeUrlSearchWithFmtOptionsHiddenFieldsArray() public void MakeUrlSearchWithFmtOptionsHiddenFacetsArray() { List paths = new List { "search", this.Query }; - FmtOptions fmtOptions = new FmtOptions - { - HiddenFacets = new List { "brand", "category" } - }; Hashtable queryParams = new Hashtable() { - { Constants.FMT_OPTIONS, fmtOptions } + { $"{Constants.FMT_OPTIONS}[{Constants.HIDDEN_FACETS}]", new List { "brand", "category" } } }; string url = MakeUrl(this.Options, paths, queryParams); @@ -276,19 +260,15 @@ public void MakeUrlSearchWithFmtOptionsHiddenFacetsArray() public void MakeUrlSearchWithFmtOptionsAllProperties() { List paths = new List { "search", this.Query }; - FmtOptions fmtOptions = new FmtOptions - { - GroupsMaxDepth = 5, - GroupsStart = "top", - ShowHiddenFields = true, - VariationsReturnType = "all", - Fields = new List { "id" }, - HiddenFields = new List { "inventory" }, - HiddenFacets = new List { "brand" } - }; Hashtable queryParams = new Hashtable() { - { Constants.FMT_OPTIONS, fmtOptions } + { $"{Constants.FMT_OPTIONS}[{Constants.GROUPS_MAX_DEPTH}]", "5" }, + { $"{Constants.FMT_OPTIONS}[{Constants.GROUPS_START}]", "top" }, + { $"{Constants.FMT_OPTIONS}[{Constants.SHOW_HIDDEN_FIELDS}]", "true" }, + { $"{Constants.FMT_OPTIONS}[{Constants.VARIATIONS_RETURN_TYPE}]", "all" }, + { $"{Constants.FMT_OPTIONS}[{Constants.FIELDS}]", new List { "id" } }, + { $"{Constants.FMT_OPTIONS}[{Constants.HIDDEN_FIELDS}]", new List { "inventory" } }, + { $"{Constants.FMT_OPTIONS}[{Constants.HIDDEN_FACETS}]", new List { "brand" } }, }; string url = MakeUrl(this.Options, paths, queryParams); diff --git a/src/constructor.io/models/Autocomplete/AutocompleteRequest.cs b/src/constructor.io/models/Autocomplete/AutocompleteRequest.cs index fb5ce35a..81264003 100644 --- a/src/constructor.io/models/Autocomplete/AutocompleteRequest.cs +++ b/src/constructor.io/models/Autocomplete/AutocompleteRequest.cs @@ -128,7 +128,11 @@ public Hashtable GetRequestParameters() if (this.HiddenFields != null) { - parameters.Add(Constants.HIDDEN_FIELDS, this.HiddenFields); + FmtOptions fmtOptions = new FmtOptions { HiddenFields = this.HiddenFields }; + foreach (DictionaryEntry entry in fmtOptions.GetQueryParameters()) + { + parameters.Add(entry.Key, entry.Value); + } } return parameters; diff --git a/src/constructor.io/models/Browse/BrowseFacetOptionsRequest.cs b/src/constructor.io/models/Browse/BrowseFacetOptionsRequest.cs index 95a70e48..d8b249ec 100644 --- a/src/constructor.io/models/Browse/BrowseFacetOptionsRequest.cs +++ b/src/constructor.io/models/Browse/BrowseFacetOptionsRequest.cs @@ -53,7 +53,10 @@ public Hashtable GetRequestParameters() if (fmtOptions != null) { - parameters.Add(Constants.FMT_OPTIONS, fmtOptions); + foreach (DictionaryEntry entry in fmtOptions.GetQueryParameters()) + { + parameters.Add(entry.Key, entry.Value); + } } return parameters; diff --git a/src/constructor.io/models/Browse/BrowseFacetsRequest.cs b/src/constructor.io/models/Browse/BrowseFacetsRequest.cs index df74ade0..3dbb4fbe 100644 --- a/src/constructor.io/models/Browse/BrowseFacetsRequest.cs +++ b/src/constructor.io/models/Browse/BrowseFacetsRequest.cs @@ -63,7 +63,10 @@ public Hashtable GetRequestParameters() if (fmtOptions != null) { - parameters.Add(Constants.FMT_OPTIONS, fmtOptions); + foreach (DictionaryEntry entry in fmtOptions.GetQueryParameters()) + { + parameters.Add(entry.Key, entry.Value); + } } return parameters; diff --git a/src/constructor.io/models/Browse/BrowseItemsRequest.cs b/src/constructor.io/models/Browse/BrowseItemsRequest.cs index aed7b97e..91f7b4a0 100644 --- a/src/constructor.io/models/Browse/BrowseItemsRequest.cs +++ b/src/constructor.io/models/Browse/BrowseItemsRequest.cs @@ -81,19 +81,25 @@ public Hashtable GetRequestParameters() parameters.Add(Constants.FILTERS, this.Filters); } - if (this.FmtOptions != null) + FmtOptions fmtOptions = this.FmtOptions; + if (this.HiddenFields != null) { - parameters.Add(Constants.FMT_OPTIONS, this.FmtOptions); + fmtOptions ??= new FmtOptions(); + fmtOptions.HiddenFields ??= this.HiddenFields; } - if (this.HiddenFields != null) + if (this.HiddenFacets != null) { - parameters.Add(Constants.HIDDEN_FIELDS, this.HiddenFields); + fmtOptions ??= new FmtOptions(); + fmtOptions.HiddenFacets ??= this.HiddenFacets; } - if (this.HiddenFacets != null) + if (fmtOptions != null) { - parameters.Add(Constants.HIDDEN_FACETS, this.HiddenFacets); + foreach (DictionaryEntry entry in fmtOptions.GetQueryParameters()) + { + parameters.Add(entry.Key, entry.Value); + } } if (this.Offset != 0) diff --git a/src/constructor.io/models/Browse/BrowseRequest.cs b/src/constructor.io/models/Browse/BrowseRequest.cs index 4b0bd407..2875b2e9 100644 --- a/src/constructor.io/models/Browse/BrowseRequest.cs +++ b/src/constructor.io/models/Browse/BrowseRequest.cs @@ -145,25 +145,31 @@ public Hashtable GetRequestParameters() parameters.Add(Constants.FILTERS, this.Filters); } - if (this.FmtOptions != null) - { - parameters.Add(Constants.FMT_OPTIONS, this.FmtOptions); - } - if (this.PreFilterExpression != null) { string preFilterJson = this.PreFilterExpression.GetExpression(); parameters.Add(Constants.PRE_FILTER_EXPRESSION, preFilterJson); } + FmtOptions fmtOptions = this.FmtOptions; if (this.HiddenFields != null) { - parameters.Add(Constants.HIDDEN_FIELDS, this.HiddenFields); + fmtOptions ??= new FmtOptions(); + fmtOptions.HiddenFields ??= this.HiddenFields; } if (this.HiddenFacets != null) { - parameters.Add(Constants.HIDDEN_FACETS, this.HiddenFacets); + fmtOptions ??= new FmtOptions(); + fmtOptions.HiddenFacets ??= this.HiddenFacets; + } + + if (fmtOptions != null) + { + foreach (DictionaryEntry entry in fmtOptions.GetQueryParameters()) + { + parameters.Add(entry.Key, entry.Value); + } } if (this.Offset != 0) diff --git a/src/constructor.io/models/Search/SearchRequest.cs b/src/constructor.io/models/Search/SearchRequest.cs index a10915a3..6288f83b 100644 --- a/src/constructor.io/models/Search/SearchRequest.cs +++ b/src/constructor.io/models/Search/SearchRequest.cs @@ -140,19 +140,25 @@ public Hashtable GetRequestParameters() parameters.Add(Constants.PRE_FILTER_EXPRESSION, preFilterJson); } - if (this.FmtOptions != null) + FmtOptions fmtOptions = this.FmtOptions; + if (this.HiddenFields != null) { - parameters.Add(Constants.FMT_OPTIONS, this.FmtOptions); + fmtOptions ??= new FmtOptions(); + fmtOptions.HiddenFields ??= this.HiddenFields; } - if (this.HiddenFields != null) + if (this.HiddenFacets != null) { - parameters.Add(Constants.HIDDEN_FIELDS, this.HiddenFields); + fmtOptions ??= new FmtOptions(); + fmtOptions.HiddenFacets ??= this.HiddenFacets; } - if (this.HiddenFacets != null) + if (fmtOptions != null) { - parameters.Add(Constants.HIDDEN_FACETS, this.HiddenFacets); + foreach (DictionaryEntry entry in fmtOptions.GetQueryParameters()) + { + parameters.Add(entry.Key, entry.Value); + } } if (this.Offset != 0) diff --git a/src/constructor.io/models/common/FmtOptions.cs b/src/constructor.io/models/common/FmtOptions.cs index 4e1cecca..0ce5a6c6 100644 --- a/src/constructor.io/models/common/FmtOptions.cs +++ b/src/constructor.io/models/common/FmtOptions.cs @@ -1,4 +1,6 @@ +using System.Collections; using System.Collections.Generic; +using Constructorio_NET.Utils; namespace Constructorio_NET.Models { @@ -53,5 +55,62 @@ public class FmtOptions /// Gets or sets whether to show protected facets. /// public bool? ShowProtectedFacets { get; set; } + + /// + /// Returns a Hashtable of pre-formatted query parameters with keys like "fmt_options[property_name]". + /// Values are either string or List<string>. + /// + /// Hashtable of query parameters. + public Hashtable GetQueryParameters() + { + Hashtable parameters = new Hashtable(); + + if (this.GroupsMaxDepth.HasValue) + { + parameters.Add($"{Constants.FMT_OPTIONS}[{Constants.GROUPS_MAX_DEPTH}]", this.GroupsMaxDepth.Value.ToString()); + } + + if (!string.IsNullOrEmpty(this.GroupsStart)) + { + parameters.Add($"{Constants.FMT_OPTIONS}[{Constants.GROUPS_START}]", this.GroupsStart); + } + + if (this.ShowHiddenFields.HasValue) + { + parameters.Add($"{Constants.FMT_OPTIONS}[{Constants.SHOW_HIDDEN_FIELDS}]", this.ShowHiddenFields.Value.ToString().ToLower()); + } + + if (!string.IsNullOrEmpty(this.VariationsReturnType)) + { + parameters.Add($"{Constants.FMT_OPTIONS}[{Constants.VARIATIONS_RETURN_TYPE}]", this.VariationsReturnType); + } + + if (this.ShowHiddenFacets.HasValue) + { + parameters.Add($"{Constants.FMT_OPTIONS}[{Constants.SHOW_HIDDEN_FACETS}]", this.ShowHiddenFacets.Value.ToString().ToLower()); + } + + if (this.ShowProtectedFacets.HasValue) + { + parameters.Add($"{Constants.FMT_OPTIONS}[{Constants.SHOW_PROTECTED_FACETS}]", this.ShowProtectedFacets.Value.ToString().ToLower()); + } + + if (this.Fields != null) + { + parameters.Add($"{Constants.FMT_OPTIONS}[{Constants.FIELDS}]", this.Fields); + } + + if (this.HiddenFields != null) + { + parameters.Add($"{Constants.FMT_OPTIONS}[{Constants.HIDDEN_FIELDS}]", this.HiddenFields); + } + + if (this.HiddenFacets != null) + { + parameters.Add($"{Constants.FMT_OPTIONS}[{Constants.HIDDEN_FACETS}]", this.HiddenFacets); + } + + return parameters; + } } } diff --git a/src/constructor.io/utils/Constants.cs b/src/constructor.io/utils/Constants.cs index 69ed876e..cc6e43a9 100644 --- a/src/constructor.io/utils/Constants.cs +++ b/src/constructor.io/utils/Constants.cs @@ -9,8 +9,11 @@ public static class Constants public const string FACET_NAME = "facet_name"; public const string FILTERS = "filters"; public const string FILTERS_PER_SECTION = "filters_per_section"; + public const string FIELDS = "fields"; public const string FMT_OPTIONS = "fmt_options"; public const string FORCE = "force"; + public const string GROUPS_MAX_DEPTH = "groups_max_depth"; + public const string GROUPS_START = "groups_start"; public const string HIDDEN_FIELDS = "hidden_fields"; public const string HIDDEN_FACETS = "hidden_facets"; public const string ITEM_IDS = "ids"; @@ -19,6 +22,7 @@ public static class Constants public const string RESULTS_PER_PAGE = "num_results_per_page"; public const string SECURITY_TOKEN = "x-cnstrc-token"; public const string SHOW_HIDDEN_FACETS = "show_hidden_facets"; + public const string SHOW_HIDDEN_FIELDS = "show_hidden_fields"; public const string SHOW_PROTECTED_FACETS = "show_protected_facets"; public const string USER_SEGMENTS = "us"; public const string SECTION = "section"; @@ -33,6 +37,7 @@ public static class Constants public const string USER_ID = "ui"; public const string USER_IP = "X-Forwarded-For"; public const string VARIATIONS_MAP = "variations_map"; + public const string VARIATIONS_RETURN_TYPE = "variations_return_type"; public const string START_DATE = "start_date"; public const string END_DATE = "end_date"; public const string STATUS = "status"; diff --git a/src/constructor.io/utils/Helpers.cs b/src/constructor.io/utils/Helpers.cs index 14f30b05..56f85bb8 100644 --- a/src/constructor.io/utils/Helpers.cs +++ b/src/constructor.io/utils/Helpers.cs @@ -177,86 +177,6 @@ protected static string MakeUrl(Hashtable options, List paths, Hashtable } } - // Add format options to query string - if (queryParams.Contains(Constants.FMT_OPTIONS)) - { - FmtOptions fmtOptions = (FmtOptions)queryParams[Constants.FMT_OPTIONS]; - queryParams.Remove(Constants.FMT_OPTIONS); - - // Scalar values - if (fmtOptions.GroupsMaxDepth.HasValue) - { - AppendFmtOption(url, "groups_max_depth", fmtOptions.GroupsMaxDepth.Value.ToString()); - } - - if (!string.IsNullOrEmpty(fmtOptions.GroupsStart)) - { - AppendFmtOption(url, "groups_start", fmtOptions.GroupsStart); - } - - if (fmtOptions.ShowHiddenFields.HasValue) - { - AppendFmtOption(url, "show_hidden_fields", fmtOptions.ShowHiddenFields.Value.ToString().ToLower()); - } - - if (!string.IsNullOrEmpty(fmtOptions.VariationsReturnType)) - { - AppendFmtOption(url, "variations_return_type", fmtOptions.VariationsReturnType); - } - - if (fmtOptions.ShowHiddenFacets.HasValue) - { - AppendFmtOption(url, "show_hidden_facets", fmtOptions.ShowHiddenFacets.Value.ToString().ToLower()); - } - - if (fmtOptions.ShowProtectedFacets.HasValue) - { - AppendFmtOption(url, "show_protected_facets", fmtOptions.ShowProtectedFacets.Value.ToString().ToLower()); - } - - // Array values (indexed format) - if (fmtOptions.Fields != null) - { - AppendFmtOption(url, "fields", fmtOptions.Fields); - } - - if (fmtOptions.HiddenFields != null) - { - AppendFmtOption(url, "hidden_fields", fmtOptions.HiddenFields); - } - - if (fmtOptions.HiddenFacets != null) - { - AppendFmtOption(url, "hidden_facets", fmtOptions.HiddenFacets); - } - } - - // Add hidden fields as fmt_options - if (queryParams.Contains(Constants.HIDDEN_FIELDS)) - { - List hiddenFields = (List)queryParams[Constants.HIDDEN_FIELDS]; - queryParams.Remove(Constants.HIDDEN_FIELDS); - - foreach (var hiddenField in hiddenFields) - { - url.Append("&" + Constants.FMT_OPTIONS + UrlEscapedStartSquareBracket + Constants.HIDDEN_FIELDS + UrlEscapedEndSquareBracket + "=") - .Append(OurEscapeDataString(hiddenField)); - } - } - - // Add hidden facets as fmt_options - if (queryParams.Contains(Constants.HIDDEN_FACETS)) - { - List hiddenFacets = (List)queryParams[Constants.HIDDEN_FACETS]; - queryParams.Remove(Constants.HIDDEN_FACETS); - - foreach (var hiddenFacet in hiddenFacets) - { - url.Append("&" + Constants.FMT_OPTIONS + UrlEscapedStartSquareBracket + Constants.HIDDEN_FACETS + UrlEscapedEndSquareBracket + "=") - .Append(OurEscapeDataString(hiddenFacet)); - } - } - // Add quiz answers to query string if (queryParams.Contains(Constants.ANSWERS)) { @@ -311,25 +231,6 @@ protected static string MakeUrl(Hashtable options, List paths, Hashtable return url.ToString(); } - private static void AppendFmtOption(StringBuilder url, string key, string value) - { - url.Append("&" + Constants.FMT_OPTIONS + UrlEscapedStartSquareBracket) - .Append(OurEscapeDataString(key)) - .Append(UrlEscapedEndSquareBracket + "=") - .Append(OurEscapeDataString(value)); - } - - private static void AppendFmtOption(StringBuilder url, string key, List values) - { - foreach (string value in values) - { - url.Append("&" + Constants.FMT_OPTIONS + UrlEscapedStartSquareBracket) - .Append(OurEscapeDataString(key)) - .Append(UrlEscapedEndSquareBracket + "=") - .Append(OurEscapeDataString(value)); - } - } - private static async Task DeserializeFromResponse(HttpResponseMessage response, JsonSerializer jsonSerializer = null) { using Stream stream = await response.Content.ReadAsStreamAsync(); From aea99f03c4b807c88ce2c646e22e8938766b1e19 Mon Sep 17 00:00:00 2001 From: Enes Kutay SEZEN Date: Fri, 20 Feb 2026 18:34:06 +0300 Subject: [PATCH 08/13] Remove legacy fields --- .../client/modules/AutocompleteTests.cs | 2 +- .../client/modules/BrowseTests.cs | 10 +++---- .../client/modules/SearchTests.cs | 4 +-- .../Browse/BrowseFacetOptionsRequestTest.cs | 6 ++--- .../models/Browse/BrowseFacetsRequestTest.cs | 6 ++--- .../Autocomplete/AutocompleteRequest.cs | 9 +++---- .../Browse/BrowseFacetOptionsRequest.cs | 19 ++----------- .../models/Browse/BrowseFacetsRequest.cs | 19 ++----------- .../models/Browse/BrowseItemsRequest.cs | 19 ++----------- .../models/Browse/BrowseRequest.cs | 27 ++----------------- .../models/Search/SearchRequest.cs | 27 ++----------------- .../models/common/IPlpRequest.cs | 12 --------- 12 files changed, 27 insertions(+), 133 deletions(-) diff --git a/src/Constructorio_NET.Tests/client/modules/AutocompleteTests.cs b/src/Constructorio_NET.Tests/client/modules/AutocompleteTests.cs index ca58dd96..e8edd593 100644 --- a/src/Constructorio_NET.Tests/client/modules/AutocompleteTests.cs +++ b/src/Constructorio_NET.Tests/client/modules/AutocompleteTests.cs @@ -203,7 +203,7 @@ public async Task GetAutocompleteResultsShouldReturnResultWithHiddenFields() AutocompleteRequest req = new AutocompleteRequest("item1") { UserInfo = UserInfo, - HiddenFields = new List { "testField" } + FmtOptions = new FmtOptions { HiddenFields = new List { "testField" } } }; ConstructorIO constructorio = new ConstructorIO(this.Config); AutocompleteResponse res = await constructorio.Autocomplete.GetAutocompleteResults(req); diff --git a/src/Constructorio_NET.Tests/client/modules/BrowseTests.cs b/src/Constructorio_NET.Tests/client/modules/BrowseTests.cs index 98f27c45..c1192b77 100644 --- a/src/Constructorio_NET.Tests/client/modules/BrowseTests.cs +++ b/src/Constructorio_NET.Tests/client/modules/BrowseTests.cs @@ -589,7 +589,7 @@ public async Task GetBrowseResultsShouldReturnResultWithHiddenFields() BrowseRequest req = new BrowseRequest(this.FilterName, this.FilterValue) { UserInfo = this.UserInfo, - HiddenFields = new List { requestedHiddenField } + FmtOptions = new FmtOptions { HiddenFields = new List { requestedHiddenField } } }; ConstructorIO constructorio = new ConstructorIO(this.Config); BrowseResponse res = await constructorio.Browse.GetBrowseResults(req); @@ -606,7 +606,7 @@ public async Task GetBrowseResultsShouldReturnResultWithHiddenFacets() BrowseRequest req = new BrowseRequest(this.FilterName, this.FilterValue) { UserInfo = this.UserInfo, - HiddenFacets = new List { requestedHiddenFacet } + FmtOptions = new FmtOptions { HiddenFacets = new List { requestedHiddenFacet } } }; ConstructorIO constructorio = new ConstructorIO(this.Config); BrowseResponse res = await constructorio.Browse.GetBrowseResults(req); @@ -913,8 +913,7 @@ public async Task GetBrowseFacetsWithFmtOptionParams() BrowseFacetsRequest req = new BrowseFacetsRequest { UserInfo = this.UserInfo, - ShowHiddenFacets = true, - ShowProtectedFacets = true + FmtOptions = new FmtOptions { ShowHiddenFacets = true, ShowProtectedFacets = true } }; ConstructorIO constructorio = new ConstructorIO(this.Config); BrowseFacetsResponse res = await constructorio.Browse.GetBrowseFacetsResult(req); @@ -956,8 +955,7 @@ public async Task GetBrowseFacetOptionsWithFmtOptionParams() BrowseFacetOptionsRequest req = new BrowseFacetOptionsRequest(this.FilterName) { UserInfo = this.UserInfo, - ShowHiddenFacets = true, - ShowProtectedFacets = true + FmtOptions = new FmtOptions { ShowHiddenFacets = true, ShowProtectedFacets = true } }; ConstructorIO constructorio = new ConstructorIO(this.Config); BrowseFacetOptionsResponse res = await constructorio.Browse.GetBrowseFacetOptionsResult( diff --git a/src/Constructorio_NET.Tests/client/modules/SearchTests.cs b/src/Constructorio_NET.Tests/client/modules/SearchTests.cs index 146d6252..7dfc70d1 100644 --- a/src/Constructorio_NET.Tests/client/modules/SearchTests.cs +++ b/src/Constructorio_NET.Tests/client/modules/SearchTests.cs @@ -678,7 +678,7 @@ public async Task GetSearchResultsShouldReturnResultWithHiddenFields() SearchRequest req = new SearchRequest("item1") { UserInfo = this.UserInfo, - HiddenFields = new List { requestedHiddenField } + FmtOptions = new FmtOptions { HiddenFields = new List { requestedHiddenField } } }; ConstructorIO constructorio = new ConstructorIO(this.Config); SearchResponse res = await constructorio.Search.GetSearchResults(req); @@ -695,7 +695,7 @@ public async Task GetSearchResultsShouldReturnResultWithHiddenFacets() SearchRequest req = new SearchRequest("item1") { UserInfo = this.UserInfo, - HiddenFacets = new List { requestedHiddenFacet } + FmtOptions = new FmtOptions { HiddenFacets = new List { requestedHiddenFacet } } }; ConstructorIO constructorio = new ConstructorIO(this.Config); SearchResponse res = await constructorio.Search.GetSearchResults(req); diff --git a/src/Constructorio_NET.Tests/models/Browse/BrowseFacetOptionsRequestTest.cs b/src/Constructorio_NET.Tests/models/Browse/BrowseFacetOptionsRequestTest.cs index 5fdabd1b..6caa5096 100644 --- a/src/Constructorio_NET.Tests/models/Browse/BrowseFacetOptionsRequestTest.cs +++ b/src/Constructorio_NET.Tests/models/Browse/BrowseFacetOptionsRequestTest.cs @@ -42,7 +42,7 @@ public void GetRequestParametersWithShowHiddenFacets() { BrowseFacetOptionsRequest req = new BrowseFacetOptionsRequest(FilterName) { - ShowHiddenFacets = true, + FmtOptions = new FmtOptions { ShowHiddenFacets = true }, }; Hashtable requestParameters = req.GetRequestParameters(); @@ -54,7 +54,7 @@ public void GetRequestParametersWithShowProtectedFacets() { BrowseFacetOptionsRequest req = new BrowseFacetOptionsRequest(FilterName) { - ShowProtectedFacets = true, + FmtOptions = new FmtOptions { ShowProtectedFacets = true }, }; Hashtable requestParameters = req.GetRequestParameters(); @@ -88,8 +88,8 @@ public void GetRequestParametersWithFmtOptionsAndShowHiddenFacets() FmtOptions = new FmtOptions() { GroupsMaxDepth = 3, + ShowHiddenFacets = true, }, - ShowHiddenFacets = true, }; Hashtable requestParameters = req.GetRequestParameters(); diff --git a/src/Constructorio_NET.Tests/models/Browse/BrowseFacetsRequestTest.cs b/src/Constructorio_NET.Tests/models/Browse/BrowseFacetsRequestTest.cs index 90624ea7..774456e1 100644 --- a/src/Constructorio_NET.Tests/models/Browse/BrowseFacetsRequestTest.cs +++ b/src/Constructorio_NET.Tests/models/Browse/BrowseFacetsRequestTest.cs @@ -49,7 +49,7 @@ public void GetRequestParametersWithShowHiddenFacets() { BrowseFacetsRequest req = new BrowseFacetsRequest() { - ShowHiddenFacets = true, + FmtOptions = new FmtOptions { ShowHiddenFacets = true }, }; Hashtable requestParameters = req.GetRequestParameters(); @@ -61,7 +61,7 @@ public void GetRequestParametersWithShowProtectedFacets() { BrowseFacetsRequest req = new BrowseFacetsRequest() { - ShowProtectedFacets = true, + FmtOptions = new FmtOptions { ShowProtectedFacets = true }, }; Hashtable requestParameters = req.GetRequestParameters(); @@ -95,8 +95,8 @@ public void GetRequestParametersWithFmtOptionsAndShowHiddenFacets() FmtOptions = new FmtOptions() { GroupsMaxDepth = 3, + ShowHiddenFacets = true, }, - ShowHiddenFacets = true, }; Hashtable requestParameters = req.GetRequestParameters(); diff --git a/src/constructor.io/models/Autocomplete/AutocompleteRequest.cs b/src/constructor.io/models/Autocomplete/AutocompleteRequest.cs index 81264003..a10f00f9 100644 --- a/src/constructor.io/models/Autocomplete/AutocompleteRequest.cs +++ b/src/constructor.io/models/Autocomplete/AutocompleteRequest.cs @@ -32,9 +32,9 @@ public class AutocompleteRequest : IFilterable, IUserDetails public Dictionary>> FiltersPerSection { get; set; } /// - /// Gets or sets hidden metadata fields to return. + /// Gets or sets the format options used to refine result groups. /// - public List HiddenFields { get; set; } + public FmtOptions FmtOptions { get; set; } /// /// Gets or sets user test cells. @@ -126,10 +126,9 @@ public Hashtable GetRequestParameters() } } - if (this.HiddenFields != null) + if (this.FmtOptions != null) { - FmtOptions fmtOptions = new FmtOptions { HiddenFields = this.HiddenFields }; - foreach (DictionaryEntry entry in fmtOptions.GetQueryParameters()) + foreach (DictionaryEntry entry in this.FmtOptions.GetQueryParameters()) { parameters.Add(entry.Key, entry.Value); } diff --git a/src/constructor.io/models/Browse/BrowseFacetOptionsRequest.cs b/src/constructor.io/models/Browse/BrowseFacetOptionsRequest.cs index d8b249ec..7e809d9d 100644 --- a/src/constructor.io/models/Browse/BrowseFacetOptionsRequest.cs +++ b/src/constructor.io/models/Browse/BrowseFacetOptionsRequest.cs @@ -11,8 +11,6 @@ namespace Constructorio_NET.Models public class BrowseFacetOptionsRequest { public string FacetName { get; set; } - public bool ShowHiddenFacets { get; set; } - public bool ShowProtectedFacets { get; set; } public FmtOptions FmtOptions { get; set; } public UserInfo UserInfo { get; set; } @@ -38,22 +36,9 @@ public Hashtable GetRequestParameters() parameters.Add(Constants.FACET_NAME, this.FacetName); } - FmtOptions fmtOptions = this.FmtOptions; - if (this.ShowHiddenFacets) + if (this.FmtOptions != null) { - fmtOptions ??= new FmtOptions(); - fmtOptions.ShowHiddenFacets = this.ShowHiddenFacets; - } - - if (this.ShowProtectedFacets) - { - fmtOptions ??= new FmtOptions(); - fmtOptions.ShowProtectedFacets = this.ShowProtectedFacets; - } - - if (fmtOptions != null) - { - foreach (DictionaryEntry entry in fmtOptions.GetQueryParameters()) + foreach (DictionaryEntry entry in this.FmtOptions.GetQueryParameters()) { parameters.Add(entry.Key, entry.Value); } diff --git a/src/constructor.io/models/Browse/BrowseFacetsRequest.cs b/src/constructor.io/models/Browse/BrowseFacetsRequest.cs index 3dbb4fbe..e30ab6c8 100644 --- a/src/constructor.io/models/Browse/BrowseFacetsRequest.cs +++ b/src/constructor.io/models/Browse/BrowseFacetsRequest.cs @@ -13,8 +13,6 @@ public class BrowseFacetsRequest public int Page { get; set; } public int ResultsPerPage { get; set; } public int Offset { get; set; } - public bool ShowHiddenFacets { get; set; } - public bool ShowProtectedFacets { get; set; } public FmtOptions FmtOptions { get; set; } public UserInfo UserInfo { get; set; } @@ -48,22 +46,9 @@ public Hashtable GetRequestParameters() parameters.Add(Constants.RESULTS_PER_PAGE, this.ResultsPerPage); } - FmtOptions fmtOptions = this.FmtOptions; - if (this.ShowHiddenFacets) + if (this.FmtOptions != null) { - fmtOptions ??= new FmtOptions(); - fmtOptions.ShowHiddenFacets = this.ShowHiddenFacets; - } - - if (this.ShowProtectedFacets) - { - fmtOptions ??= new FmtOptions(); - fmtOptions.ShowProtectedFacets = this.ShowProtectedFacets; - } - - if (fmtOptions != null) - { - foreach (DictionaryEntry entry in fmtOptions.GetQueryParameters()) + foreach (DictionaryEntry entry in this.FmtOptions.GetQueryParameters()) { parameters.Add(entry.Key, entry.Value); } diff --git a/src/constructor.io/models/Browse/BrowseItemsRequest.cs b/src/constructor.io/models/Browse/BrowseItemsRequest.cs index 91f7b4a0..41d1b249 100644 --- a/src/constructor.io/models/Browse/BrowseItemsRequest.cs +++ b/src/constructor.io/models/Browse/BrowseItemsRequest.cs @@ -14,8 +14,6 @@ public class BrowseItemsRequest public List ItemIds { get; set; } public Dictionary> Filters { get; set; } public FmtOptions FmtOptions { get; set; } - public List HiddenFields { get; set; } - public List HiddenFacets { get; set; } public int Offset { get; set; } public int Page { get; set; } public int ResultsPerPage { get; set; } @@ -81,22 +79,9 @@ public Hashtable GetRequestParameters() parameters.Add(Constants.FILTERS, this.Filters); } - FmtOptions fmtOptions = this.FmtOptions; - if (this.HiddenFields != null) + if (this.FmtOptions != null) { - fmtOptions ??= new FmtOptions(); - fmtOptions.HiddenFields ??= this.HiddenFields; - } - - if (this.HiddenFacets != null) - { - fmtOptions ??= new FmtOptions(); - fmtOptions.HiddenFacets ??= this.HiddenFacets; - } - - if (fmtOptions != null) - { - foreach (DictionaryEntry entry in fmtOptions.GetQueryParameters()) + foreach (DictionaryEntry entry in this.FmtOptions.GetQueryParameters()) { parameters.Add(entry.Key, entry.Value); } diff --git a/src/constructor.io/models/Browse/BrowseRequest.cs b/src/constructor.io/models/Browse/BrowseRequest.cs index 2875b2e9..5e3037dd 100644 --- a/src/constructor.io/models/Browse/BrowseRequest.cs +++ b/src/constructor.io/models/Browse/BrowseRequest.cs @@ -32,16 +32,6 @@ public class BrowseRequest : IPlpRequest /// public PreFilterExpression PreFilterExpression { get; set; } - /// - /// Gets or sets hidden metadata fields to return. - /// - public List HiddenFields { get; set; } - - /// - /// Gets or sets hidden facets fields to return. - /// - public List HiddenFacets { get; set; } - /// /// Gets or sets the number of results to skip from the beginning. /// Can't be used together with . @@ -151,22 +141,9 @@ public Hashtable GetRequestParameters() parameters.Add(Constants.PRE_FILTER_EXPRESSION, preFilterJson); } - FmtOptions fmtOptions = this.FmtOptions; - if (this.HiddenFields != null) - { - fmtOptions ??= new FmtOptions(); - fmtOptions.HiddenFields ??= this.HiddenFields; - } - - if (this.HiddenFacets != null) - { - fmtOptions ??= new FmtOptions(); - fmtOptions.HiddenFacets ??= this.HiddenFacets; - } - - if (fmtOptions != null) + if (this.FmtOptions != null) { - foreach (DictionaryEntry entry in fmtOptions.GetQueryParameters()) + foreach (DictionaryEntry entry in this.FmtOptions.GetQueryParameters()) { parameters.Add(entry.Key, entry.Value); } diff --git a/src/constructor.io/models/Search/SearchRequest.cs b/src/constructor.io/models/Search/SearchRequest.cs index 6288f83b..baa3bb1d 100644 --- a/src/constructor.io/models/Search/SearchRequest.cs +++ b/src/constructor.io/models/Search/SearchRequest.cs @@ -32,16 +32,6 @@ public class SearchRequest : IPlpRequest /// public PreFilterExpression PreFilterExpression { get; set; } - /// - /// Gets or sets hidden metadata fields to return. - /// - public List HiddenFields { get; set; } - - /// - /// Gets or sets hidden facets fields to return. - /// - public List HiddenFacets { get; set; } - /// /// Gets or sets the number of results to skip from the beginning. /// Can't be used together with . @@ -140,22 +130,9 @@ public Hashtable GetRequestParameters() parameters.Add(Constants.PRE_FILTER_EXPRESSION, preFilterJson); } - FmtOptions fmtOptions = this.FmtOptions; - if (this.HiddenFields != null) - { - fmtOptions ??= new FmtOptions(); - fmtOptions.HiddenFields ??= this.HiddenFields; - } - - if (this.HiddenFacets != null) - { - fmtOptions ??= new FmtOptions(); - fmtOptions.HiddenFacets ??= this.HiddenFacets; - } - - if (fmtOptions != null) + if (this.FmtOptions != null) { - foreach (DictionaryEntry entry in fmtOptions.GetQueryParameters()) + foreach (DictionaryEntry entry in this.FmtOptions.GetQueryParameters()) { parameters.Add(entry.Key, entry.Value); } diff --git a/src/constructor.io/models/common/IPlpRequest.cs b/src/constructor.io/models/common/IPlpRequest.cs index dbaf8b8b..e895de41 100644 --- a/src/constructor.io/models/common/IPlpRequest.cs +++ b/src/constructor.io/models/common/IPlpRequest.cs @@ -1,5 +1,3 @@ -using System.Collections.Generic; - namespace Constructorio_NET.Models { public interface IPlpRequest : IFilterable, IPageable, ISortable, IUserDetails @@ -9,16 +7,6 @@ public interface IPlpRequest : IFilterable, IPageable, ISortable, IUserDetails /// FmtOptions FmtOptions { get; set; } - /// - /// Gets or sets hidden facets fields to return. - /// - List HiddenFacets { get; set; } - - /// - /// Gets or sets hidden metadata fields to return. - /// - List HiddenFields { get; set; } - /// /// Gets or sets the filtering expression used to scope search results. /// From d1d73306ef8d78e2e129e0a96e6bea23de26cc73 Mon Sep 17 00:00:00 2001 From: Enes Kutay SEZEN Date: Thu, 26 Feb 2026 18:30:56 +0300 Subject: [PATCH 09/13] [CDX-373] Add FmtOptions to RecommendationsRequest (#96) * Add rex support * Update src/Constructorio_NET.Tests/client/modules/RecommendationsTests.cs Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com> * Update tests * Fix flaky test --------- Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com> --- .../client/modules/RecommendationsTests.cs | 32 +++++++++++++++++++ .../client/modules/SearchTests.cs | 6 ++-- .../RecommendationsRequestTest.cs | 17 ++++++++++ .../Recommendations/RecommendationsRequest.cs | 13 ++++++++ 4 files changed, 66 insertions(+), 2 deletions(-) diff --git a/src/Constructorio_NET.Tests/client/modules/RecommendationsTests.cs b/src/Constructorio_NET.Tests/client/modules/RecommendationsTests.cs index 09b30e3d..1d233ee0 100644 --- a/src/Constructorio_NET.Tests/client/modules/RecommendationsTests.cs +++ b/src/Constructorio_NET.Tests/client/modules/RecommendationsTests.cs @@ -339,6 +339,38 @@ 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.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] public async Task GetRecommendationsResultsWithPreFilterExpressionJson() { 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] 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() { 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 5be4d3dc91ecdee7b9e4819d861d933c72fcc59c Mon Sep 17 00:00:00 2001 From: Enes Kutay SEZEN Date: Fri, 27 Feb 2026 20:01:16 +0300 Subject: [PATCH 10/13] Address comments --- .../client/modules/RecommendationsTests.cs | 26 ++++++++----------- 1 file changed, 11 insertions(+), 15 deletions(-) diff --git a/src/Constructorio_NET.Tests/client/modules/RecommendationsTests.cs b/src/Constructorio_NET.Tests/client/modules/RecommendationsTests.cs index 1d233ee0..4580dbb8 100644 --- a/src/Constructorio_NET.Tests/client/modules/RecommendationsTests.cs +++ b/src/Constructorio_NET.Tests/client/modules/RecommendationsTests.cs @@ -353,22 +353,18 @@ public async Task GetRecommendationsResultsShouldReturnResultWithHiddenFields() RecommendationsResponse res = await constructorio.Recommendations.GetRecommendationsResults(req); Assert.NotNull(res.ResultId, "Result id exists"); + Assert.Greater(res.Response.Results.Count, 0, "Results expected to be greater than 0"); - // 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" - ); - } + 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 4a3ea270d4c81f5235defd9b3b45a2a7726077b1 Mon Sep 17 00:00:00 2001 From: Enes Kutay SEZEN Date: Fri, 27 Feb 2026 20:01:27 +0300 Subject: [PATCH 11/13] Remove unused constructor --- src/constructor.io/models/Browse/BrowseFacetsRequest.cs | 7 ------- 1 file changed, 7 deletions(-) diff --git a/src/constructor.io/models/Browse/BrowseFacetsRequest.cs b/src/constructor.io/models/Browse/BrowseFacetsRequest.cs index e30ab6c8..443922d1 100644 --- a/src/constructor.io/models/Browse/BrowseFacetsRequest.cs +++ b/src/constructor.io/models/Browse/BrowseFacetsRequest.cs @@ -16,13 +16,6 @@ public class BrowseFacetsRequest public FmtOptions FmtOptions { get; set; } public UserInfo UserInfo { get; set; } - /// - /// Initializes a new instance of the class. - /// - public BrowseFacetsRequest() - { - } - /// /// Get request parameters. /// From f35c4391179fefe4531a454a80786632e9d01bf6 Mon Sep 17 00:00:00 2001 From: Enes Kutay SEZEN Date: Fri, 27 Feb 2026 20:24:56 +0300 Subject: [PATCH 12/13] Address commenst --- .../client/modules/BrowseTests.cs | 17 +++++++++++++++++ .../models/common/FmtOptionsTest.cs | 18 ++++++++++++++++++ 2 files changed, 35 insertions(+) diff --git a/src/Constructorio_NET.Tests/client/modules/BrowseTests.cs b/src/Constructorio_NET.Tests/client/modules/BrowseTests.cs index c1192b77..47067fde 100644 --- a/src/Constructorio_NET.Tests/client/modules/BrowseTests.cs +++ b/src/Constructorio_NET.Tests/client/modules/BrowseTests.cs @@ -865,6 +865,23 @@ public async Task GetBrowseItemsResultsWithResultParams() Assert.IsNotNull(res.ResultId, "ResultId should exist"); } + [Test] + public async Task GetBrowseItemsResultsShouldReturnResultWithHiddenFields() + { + string requestedHiddenField = "testField"; + BrowseItemsRequest req = new BrowseItemsRequest(this.ItemIds) + { + UserInfo = this.UserInfo, + FmtOptions = new FmtOptions { HiddenFields = new List { requestedHiddenField } } + }; + ConstructorIO constructorio = new ConstructorIO(this.Config); + BrowseResponse res = await constructorio.Browse.GetBrowseItemsResult(req); + var returnedHiddenField = res.Response.Results[0].Data.Metadata[requestedHiddenField]; + + Assert.NotNull(res.ResultId, "Result id exists"); + Assert.NotNull(returnedHiddenField, "Hidden field returned"); + } + [Test] public async Task GetBrowseFacetsResults() { diff --git a/src/Constructorio_NET.Tests/models/common/FmtOptionsTest.cs b/src/Constructorio_NET.Tests/models/common/FmtOptionsTest.cs index 5f6b6046..5f71d1f0 100644 --- a/src/Constructorio_NET.Tests/models/common/FmtOptionsTest.cs +++ b/src/Constructorio_NET.Tests/models/common/FmtOptionsTest.cs @@ -71,6 +71,15 @@ public void GetQueryParametersShowHiddenFacets() Assert.AreEqual(1, result.Count); } + [Test] + public void GetQueryParametersShowHiddenFacetsFalse() + { + FmtOptions fmtOptions = new FmtOptions { ShowHiddenFacets = false }; + Hashtable result = fmtOptions.GetQueryParameters(); + Assert.AreEqual("false", result[$"{Constants.FMT_OPTIONS}[{Constants.SHOW_HIDDEN_FACETS}]"]); + Assert.AreEqual(1, result.Count); + } + [Test] public void GetQueryParametersShowProtectedFacets() { @@ -80,6 +89,15 @@ public void GetQueryParametersShowProtectedFacets() Assert.AreEqual(1, result.Count); } + [Test] + public void GetQueryParametersShowProtectedFacetsFalse() + { + FmtOptions fmtOptions = new FmtOptions { ShowProtectedFacets = false }; + Hashtable result = fmtOptions.GetQueryParameters(); + Assert.AreEqual("false", result[$"{Constants.FMT_OPTIONS}[{Constants.SHOW_PROTECTED_FACETS}]"]); + Assert.AreEqual(1, result.Count); + } + [Test] public void GetQueryParametersFields() { From b6eb23f1a12817a5aa9c3d019a824b1212b39b63 Mon Sep 17 00:00:00 2001 From: Enes Kutay SEZEN Date: Fri, 27 Feb 2026 22:13:43 +0300 Subject: [PATCH 13/13] Update test to use a different pod --- .../client/modules/RecommendationsTests.cs | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/src/Constructorio_NET.Tests/client/modules/RecommendationsTests.cs b/src/Constructorio_NET.Tests/client/modules/RecommendationsTests.cs index 4580dbb8..d9edef37 100644 --- a/src/Constructorio_NET.Tests/client/modules/RecommendationsTests.cs +++ b/src/Constructorio_NET.Tests/client/modules/RecommendationsTests.cs @@ -343,10 +343,13 @@ public async Task GetRecommendationsResultsWithPreFilterExpression() public async Task GetRecommendationsResultsShouldReturnResultWithHiddenFields() { string requestedHiddenField = "testField"; - RecommendationsRequest req = new RecommendationsRequest("item_page_1") + RecommendationsRequest req = new RecommendationsRequest("filtered_items") { UserInfo = this.UserInfo, - ItemIds = new List { "power_drill" }, + Filters = new Dictionary>() + { + { "Brand", new List() { "XYZ" } } + }, FmtOptions = new FmtOptions { HiddenFields = new List { requestedHiddenField } } }; ConstructorIO constructorio = new ConstructorIO(this.Config);