From 10cb4aca34da482e5d5dd11b72c9fe775edbeae5 Mon Sep 17 00:00:00 2001 From: Tarek Ahmed Date: Thu, 2 Oct 2025 04:53:19 +0300 Subject: [PATCH 1/5] Add Feature and Variant models, expose features for Search and Browse --- .../client/models/BrowseResponseInner.java | 14 +++++ .../io/constructor/client/models/Feature.java | 62 +++++++++++++++++++ .../client/models/SearchResponseInner.java | 14 +++++ .../io/constructor/client/models/Variant.java | 34 ++++++++++ .../client/BrowseResponseTest.java | 32 ++++++++++ .../client/ConstructorIOBrowseTest.java | 2 + .../client/SearchResponseTest.java | 30 +++++++++ 7 files changed, 188 insertions(+) create mode 100644 constructorio-client/src/main/java/io/constructor/client/models/Feature.java create mode 100644 constructorio-client/src/main/java/io/constructor/client/models/Variant.java diff --git a/constructorio-client/src/main/java/io/constructor/client/models/BrowseResponseInner.java b/constructorio-client/src/main/java/io/constructor/client/models/BrowseResponseInner.java index e9d75005..5f433536 100644 --- a/constructorio-client/src/main/java/io/constructor/client/models/BrowseResponseInner.java +++ b/constructorio-client/src/main/java/io/constructor/client/models/BrowseResponseInner.java @@ -12,6 +12,9 @@ public class BrowseResponseInner extends BaseResultsResponse { @SerializedName("refined_content") private List refinedContent; + @SerializedName("features") + private List features; + /** * @return the item collection data */ @@ -26,6 +29,13 @@ public List getRefinedContent() { return refinedContent; } + /** + * @return features list + */ + public List getFeatures() { + return features; + } + public void setCollection(ItemCollection collection) { this.collection = collection; } @@ -33,4 +43,8 @@ public void setCollection(ItemCollection collection) { public void setRefinedContent(List refinedContent) { this.refinedContent = refinedContent; } + + public void setFeatures(List features) { + this.features = features; + } } diff --git a/constructorio-client/src/main/java/io/constructor/client/models/Feature.java b/constructorio-client/src/main/java/io/constructor/client/models/Feature.java new file mode 100644 index 00000000..0233c6c9 --- /dev/null +++ b/constructorio-client/src/main/java/io/constructor/client/models/Feature.java @@ -0,0 +1,62 @@ +package io.constructor.client.models; + +import com.google.gson.annotations.SerializedName; + +public class Feature { + + @SerializedName("display_name") + private String displayName; + + @SerializedName("feature_name") + private String featureName; + + @SerializedName("enabled") + private Boolean enabled; + + @SerializedName("variant") + private Variant variant; + + /** + * @return the display name + */ + public String getDisplayName() { + return displayName; + } + + /** + * @return the feature name + */ + public String getFeatureName() { + return featureName; + } + + /** + * @return enabled + */ + public Boolean getEnabled() { + return enabled; + } + + /** + * @return the variant + */ + public Variant getVariant() { + return variant; + } + + public void setDisplayName(String displayName) { + this.displayName = displayName; + } + + public void setFeatureName(String featureName) { + this.featureName = featureName; + } + + public void setEnabled(Boolean enabled) { + this.enabled = enabled; + } + + public void setVariant(Variant variant) { + this.variant = variant; + } +} diff --git a/constructorio-client/src/main/java/io/constructor/client/models/SearchResponseInner.java b/constructorio-client/src/main/java/io/constructor/client/models/SearchResponseInner.java index 0fa66c99..b2664bb2 100644 --- a/constructorio-client/src/main/java/io/constructor/client/models/SearchResponseInner.java +++ b/constructorio-client/src/main/java/io/constructor/client/models/SearchResponseInner.java @@ -12,6 +12,9 @@ public class SearchResponseInner extends BaseResultsResponse { @SerializedName("refined_content") private List refinedContent; + @SerializedName("features") + private List features; + /** * @return redirect data */ @@ -26,6 +29,13 @@ public List getRefinedContent() { return refinedContent; } + /** + * @return features list + */ + public List getFeatures() { + return features; + } + public void setRedirect(Redirect redirect) { this.redirect = redirect; } @@ -33,4 +43,8 @@ public void setRedirect(Redirect redirect) { public void setRefinedContent(List refinedContent) { this.refinedContent = refinedContent; } + + public void setFeatures(List features) { + this.features = features; + } } diff --git a/constructorio-client/src/main/java/io/constructor/client/models/Variant.java b/constructorio-client/src/main/java/io/constructor/client/models/Variant.java new file mode 100644 index 00000000..4a279bbb --- /dev/null +++ b/constructorio-client/src/main/java/io/constructor/client/models/Variant.java @@ -0,0 +1,34 @@ +package io.constructor.client.models; + +import com.google.gson.annotations.SerializedName; + +public class Variant { + + @SerializedName("name") + private String name; + + @SerializedName("display_name") + private String displayName; + + /** + * @return the name + */ + public String getName() { + return name; + } + + /** + * @return the display name + */ + public String getDisplayName() { + return displayName; + } + + public void setName(String name) { + this.name = name; + } + + public void setDisplayName(String displayName) { + this.displayName = displayName; + } +} diff --git a/constructorio-client/src/test/java/io/constructor/client/BrowseResponseTest.java b/constructorio-client/src/test/java/io/constructor/client/BrowseResponseTest.java index 3774e812..b4598edb 100644 --- a/constructorio-client/src/test/java/io/constructor/client/BrowseResponseTest.java +++ b/constructorio-client/src/test/java/io/constructor/client/BrowseResponseTest.java @@ -17,6 +17,8 @@ public class BrowseResponseTest { public void createBrowseResponseShouldReturnAResult() throws Exception { String string = Utils.getTestResource("response.browse.color.blue.json"); BrowseResponse response = ConstructorIO.createBrowseResponse(string); + Map features = (Map) response.getRequest().get("features"); + System.out.println(features.get("personalization")); assertEquals("browse facets exist", response.getResponse().getFacets().size(), 7); assertEquals( "browse facet [Brand] exists", @@ -300,4 +302,34 @@ public void createBrowseResponseShouldReturnAResultWithIsSlotted() throws Except response.getResponse().getResults().get(1).getIsSlotted(), false); } + + @Test + public void createBrowseResponseShouldReturnAResultWithFeatures() throws Exception { + String string = Utils.getTestResource("response.browse.color.blue.json"); + BrowseResponse response = ConstructorIO.createBrowseResponse(string); + assertEquals( + "browse result [features] exists", + response.getResponse().getFeatures().size(), + 5); + assertEquals( + "browse result feature [feature name] exists", + response.getResponse().getFeatures().get(0).getFeatureName(), + "auto_generated_refined_query_rules"); + assertEquals( + "browse result feature [display name] exists", + response.getResponse().getFeatures().get(0).getDisplayName(), + "Affinity Engine"); + assertEquals( + "browse result feature [enabled] exists", + response.getResponse().getFeatures().get(0).getEnabled(), + true); + assertEquals( + "browse result feature variant [display name] exists", + response.getResponse().getFeatures().get(0).getVariant().getDisplayName(), + "Default weights"); + assertEquals( + "browse result feature variant [name] exists", + response.getResponse().getFeatures().get(0).getVariant().getName(), + "default_rules"); + } } diff --git a/constructorio-client/src/test/java/io/constructor/client/ConstructorIOBrowseTest.java b/constructorio-client/src/test/java/io/constructor/client/ConstructorIOBrowseTest.java index bbb41a67..c00415e5 100644 --- a/constructorio-client/src/test/java/io/constructor/client/ConstructorIOBrowseTest.java +++ b/constructorio-client/src/test/java/io/constructor/client/ConstructorIOBrowseTest.java @@ -606,6 +606,8 @@ public void BrowseShouldReturnItemLevelGroupsObject() throws Exception { BrowseRequest request = new BrowseRequest("group_id", "BrandA"); BrowseResponse response = constructor.browse(request, userInfo); + System.out.println(response.getRequest().get("features")); + List resultsList = response.getResponse().getResults(); assertTrue("search results exist", resultsList.size() > 0); diff --git a/constructorio-client/src/test/java/io/constructor/client/SearchResponseTest.java b/constructorio-client/src/test/java/io/constructor/client/SearchResponseTest.java index b757c633..fbe8f556 100644 --- a/constructorio-client/src/test/java/io/constructor/client/SearchResponseTest.java +++ b/constructorio-client/src/test/java/io/constructor/client/SearchResponseTest.java @@ -276,4 +276,34 @@ public void createSearchResponseShouldReturnAResultWithIsSlotted() throws Except response.getResponse().getResults().get(1).getIsSlotted(), false); } + + @Test + public void createSearchResponseShouldReturnAResultWithFeatures() throws Exception { + String string = Utils.getTestResource("response.search.item.json"); + SearchResponse response = ConstructorIO.createSearchResponse(string); + assertEquals( + "search result [features] exists", + response.getResponse().getFeatures().size(), + 5); + assertEquals( + "search result feature [feature name] exists", + response.getResponse().getFeatures().get(0).getFeatureName(), + "auto_generated_refined_query_rules"); + assertEquals( + "search result feature [display name] exists", + response.getResponse().getFeatures().get(0).getDisplayName(), + "Affinity Engine"); + assertEquals( + "search result feature [enabled] exists", + response.getResponse().getFeatures().get(0).getEnabled(), + true); + assertEquals( + "search result feature variant [name] exists", + response.getResponse().getFeatures().get(0).getVariant().getName(), + "default_rules"); + assertEquals( + "search result feature variant [display name] exists", + response.getResponse().getFeatures().get(0).getVariant().getDisplayName(), + "Default weights"); + } } From c0491dc57df1f033175e0debed83b6875bb06c3c Mon Sep 17 00:00:00 2001 From: Tarek Ahmed Date: Thu, 2 Oct 2025 04:54:17 +0300 Subject: [PATCH 2/5] Remove print --- .../src/test/java/io/constructor/client/BrowseResponseTest.java | 2 -- 1 file changed, 2 deletions(-) diff --git a/constructorio-client/src/test/java/io/constructor/client/BrowseResponseTest.java b/constructorio-client/src/test/java/io/constructor/client/BrowseResponseTest.java index b4598edb..3c7cde7b 100644 --- a/constructorio-client/src/test/java/io/constructor/client/BrowseResponseTest.java +++ b/constructorio-client/src/test/java/io/constructor/client/BrowseResponseTest.java @@ -17,8 +17,6 @@ public class BrowseResponseTest { public void createBrowseResponseShouldReturnAResult() throws Exception { String string = Utils.getTestResource("response.browse.color.blue.json"); BrowseResponse response = ConstructorIO.createBrowseResponse(string); - Map features = (Map) response.getRequest().get("features"); - System.out.println(features.get("personalization")); assertEquals("browse facets exist", response.getResponse().getFacets().size(), 7); assertEquals( "browse facet [Brand] exists", From 1b0bd7f77e6b8b8766800de240aff70414626bae Mon Sep 17 00:00:00 2001 From: Tarek Ahmed Date: Thu, 2 Oct 2025 04:54:46 +0300 Subject: [PATCH 3/5] Remove print --- .../java/io/constructor/client/ConstructorIOBrowseTest.java | 2 -- 1 file changed, 2 deletions(-) diff --git a/constructorio-client/src/test/java/io/constructor/client/ConstructorIOBrowseTest.java b/constructorio-client/src/test/java/io/constructor/client/ConstructorIOBrowseTest.java index c00415e5..bbb41a67 100644 --- a/constructorio-client/src/test/java/io/constructor/client/ConstructorIOBrowseTest.java +++ b/constructorio-client/src/test/java/io/constructor/client/ConstructorIOBrowseTest.java @@ -606,8 +606,6 @@ public void BrowseShouldReturnItemLevelGroupsObject() throws Exception { BrowseRequest request = new BrowseRequest("group_id", "BrandA"); BrowseResponse response = constructor.browse(request, userInfo); - System.out.println(response.getRequest().get("features")); - List resultsList = response.getResponse().getResults(); assertTrue("search results exist", resultsList.size() > 0); From 93fa5a74e7ee4c86f8b0d6352398443bf288acd3 Mon Sep 17 00:00:00 2001 From: Tarek Ahmed Date: Thu, 2 Oct 2025 05:03:06 +0300 Subject: [PATCH 4/5] Lint --- .../src/main/java/io/constructor/client/models/Feature.java | 2 +- .../test/java/io/constructor/client/BrowseResponseTest.java | 4 +--- .../test/java/io/constructor/client/SearchResponseTest.java | 4 +--- 3 files changed, 3 insertions(+), 7 deletions(-) diff --git a/constructorio-client/src/main/java/io/constructor/client/models/Feature.java b/constructorio-client/src/main/java/io/constructor/client/models/Feature.java index 0233c6c9..4512b1c8 100644 --- a/constructorio-client/src/main/java/io/constructor/client/models/Feature.java +++ b/constructorio-client/src/main/java/io/constructor/client/models/Feature.java @@ -6,7 +6,7 @@ public class Feature { @SerializedName("display_name") private String displayName; - + @SerializedName("feature_name") private String featureName; diff --git a/constructorio-client/src/test/java/io/constructor/client/BrowseResponseTest.java b/constructorio-client/src/test/java/io/constructor/client/BrowseResponseTest.java index 3c7cde7b..ecc4033c 100644 --- a/constructorio-client/src/test/java/io/constructor/client/BrowseResponseTest.java +++ b/constructorio-client/src/test/java/io/constructor/client/BrowseResponseTest.java @@ -306,9 +306,7 @@ public void createBrowseResponseShouldReturnAResultWithFeatures() throws Excepti String string = Utils.getTestResource("response.browse.color.blue.json"); BrowseResponse response = ConstructorIO.createBrowseResponse(string); assertEquals( - "browse result [features] exists", - response.getResponse().getFeatures().size(), - 5); + "browse result [features] exists", response.getResponse().getFeatures().size(), 5); assertEquals( "browse result feature [feature name] exists", response.getResponse().getFeatures().get(0).getFeatureName(), diff --git a/constructorio-client/src/test/java/io/constructor/client/SearchResponseTest.java b/constructorio-client/src/test/java/io/constructor/client/SearchResponseTest.java index fbe8f556..2998fd26 100644 --- a/constructorio-client/src/test/java/io/constructor/client/SearchResponseTest.java +++ b/constructorio-client/src/test/java/io/constructor/client/SearchResponseTest.java @@ -282,9 +282,7 @@ public void createSearchResponseShouldReturnAResultWithFeatures() throws Excepti String string = Utils.getTestResource("response.search.item.json"); SearchResponse response = ConstructorIO.createSearchResponse(string); assertEquals( - "search result [features] exists", - response.getResponse().getFeatures().size(), - 5); + "search result [features] exists", response.getResponse().getFeatures().size(), 5); assertEquals( "search result feature [feature name] exists", response.getResponse().getFeatures().get(0).getFeatureName(), From bfadeaf01f9d7e54cfbe7ff25cb74759f0c18d15 Mon Sep 17 00:00:00 2001 From: Tarek Ahmed Date: Thu, 2 Oct 2025 20:55:05 +0300 Subject: [PATCH 5/5] Add tests for null variants --- .../test/java/io/constructor/client/BrowseResponseTest.java | 4 ++++ .../test/java/io/constructor/client/SearchResponseTest.java | 4 ++++ 2 files changed, 8 insertions(+) diff --git a/constructorio-client/src/test/java/io/constructor/client/BrowseResponseTest.java b/constructorio-client/src/test/java/io/constructor/client/BrowseResponseTest.java index ecc4033c..3357bb48 100644 --- a/constructorio-client/src/test/java/io/constructor/client/BrowseResponseTest.java +++ b/constructorio-client/src/test/java/io/constructor/client/BrowseResponseTest.java @@ -327,5 +327,9 @@ public void createBrowseResponseShouldReturnAResultWithFeatures() throws Excepti "browse result feature variant [name] exists", response.getResponse().getFeatures().get(0).getVariant().getName(), "default_rules"); + assertEquals( + "browse result feature variant returns null if empty", + response.getResponse().getFeatures().get(1).getVariant(), + null); } } diff --git a/constructorio-client/src/test/java/io/constructor/client/SearchResponseTest.java b/constructorio-client/src/test/java/io/constructor/client/SearchResponseTest.java index 2998fd26..57a9e161 100644 --- a/constructorio-client/src/test/java/io/constructor/client/SearchResponseTest.java +++ b/constructorio-client/src/test/java/io/constructor/client/SearchResponseTest.java @@ -303,5 +303,9 @@ public void createSearchResponseShouldReturnAResultWithFeatures() throws Excepti "search result feature variant [display name] exists", response.getResponse().getFeatures().get(0).getVariant().getDisplayName(), "Default weights"); + assertEquals( + "search result feature variant returns null if empty", + response.getResponse().getFeatures().get(2).getVariant(), + null); } }