From 5de4c75ddd0c76d898f67c6b1995e10ac656c2e4 Mon Sep 17 00:00:00 2001 From: reeshika-h Date: Thu, 14 May 2026 16:31:06 +0530 Subject: [PATCH] Feat: Add support for variant branches in Entry and Query classes, and update tests --- contentstack/build.gradle | 1 + .../com/contentstack/sdk/EntryTestCase.java | 29 ++++++++ .../com/contentstack/sdk/QueryTestCase.java | 55 ++++++++++++++ .../main/java/com/contentstack/sdk/Entry.java | 32 ++++++++ .../main/java/com/contentstack/sdk/Query.java | 70 ++++++++++++++++++ .../sdk/TestEntryComprehensive.java | 44 +++++++++++ .../java/com/contentstack/sdk/TestQuery.java | 73 +++++++++++++++++++ 7 files changed, 304 insertions(+) diff --git a/contentstack/build.gradle b/contentstack/build.gradle index c2e1c461..51f6cef5 100755 --- a/contentstack/build.gradle +++ b/contentstack/build.gradle @@ -108,6 +108,7 @@ android { buildConfigField "String", "variantUID", getPropertyOrEmpty('variantUID') buildConfigField "String", "variantEntryUID", getPropertyOrEmpty('variantEntryUID') buildConfigField "String[]", "variantsUID", variantsAsArrayString + buildConfigField "String", "variantBranch", getPropertyOrEmpty('variantBranch') } release { minifyEnabled false diff --git a/contentstack/src/androidTest/java/com/contentstack/sdk/EntryTestCase.java b/contentstack/src/androidTest/java/com/contentstack/sdk/EntryTestCase.java index ae358b1c..fb8e2253 100644 --- a/contentstack/src/androidTest/java/com/contentstack/sdk/EntryTestCase.java +++ b/contentstack/src/androidTest/java/com/contentstack/sdk/EntryTestCase.java @@ -31,6 +31,7 @@ public class EntryTestCase { private static String variantUID = BuildConfig.variantUID; private static String variantEntryUID = BuildConfig.variantEntryUID; private static String[] variantsUID = BuildConfig.variantsUID; + private static String variantBranch = BuildConfig.variantBranch; @BeforeClass @@ -373,4 +374,32 @@ public void onCompletion(ResponseType responseType, Error error) { latch.await(); } + @Test + public void VariantsTestSingleUidWithBranch() throws InterruptedException { + final CountDownLatch latch = new CountDownLatch(1); + final Entry entry = stack.contentType("product").entry(variantEntryUID).variants(variantUID, variantBranch); + entry.fetch(new EntryResultCallBack() { + @Override + public void onCompletion(ResponseType responseType, Error error) { + System.out.println(entry.toJSON()); + latch.countDown(); + } + }); + latch.await(); + } + + @Test + public void VariantsTestArrayWithBranch() throws InterruptedException { + final CountDownLatch latch = new CountDownLatch(1); + final Entry entry = stack.contentType("product").entry(variantEntryUID).variants(variantsUID, variantBranch); + entry.fetch(new EntryResultCallBack() { + @Override + public void onCompletion(ResponseType responseType, Error error) { + System.out.println(entry.toJSON()); + latch.countDown(); + } + }); + latch.await(); + } + } \ No newline at end of file diff --git a/contentstack/src/androidTest/java/com/contentstack/sdk/QueryTestCase.java b/contentstack/src/androidTest/java/com/contentstack/sdk/QueryTestCase.java index 9e3e305c..8071abcd 100644 --- a/contentstack/src/androidTest/java/com/contentstack/sdk/QueryTestCase.java +++ b/contentstack/src/androidTest/java/com/contentstack/sdk/QueryTestCase.java @@ -17,6 +17,9 @@ public class QueryTestCase { private static final String TAG = AssetTestCase.class.getSimpleName(); private static final String contentTypeUID = BuildConfig.contentTypeUID; + private static final String variantUID = BuildConfig.variantUID; + private static final String[] variantsUID = BuildConfig.variantsUID; + private static final String variantBranch = BuildConfig.variantBranch; private static Query query; static { @@ -116,4 +119,56 @@ public void onCompletion(ResponseType responseType, QueryResult queryresult, Err }); } + @Test + public void test_42_variants_single_uid_find() throws Exception { + final Query q = TestCred.stack().contentType(contentTypeUID).query(); + q.variants(variantUID).find(new QueryResultsCallBack() { + @Override + public void onCompletion(ResponseType responseType, QueryResult queryresult, Error error) { + if (error == null) { + Log.d(TAG, "variants single find: " + queryresult.getResultObjects().size() + " entries"); + } + } + }); + } + + @Test + public void test_43_variants_array_find() throws Exception { + final Query q = TestCred.stack().contentType(contentTypeUID).query(); + q.variants(variantsUID).find(new QueryResultsCallBack() { + @Override + public void onCompletion(ResponseType responseType, QueryResult queryresult, Error error) { + if (error == null) { + Log.d(TAG, "variants array find: " + queryresult.getResultObjects().size() + " entries"); + } + } + }); + } + + @Test + public void test_44_variants_single_uid_with_branch_find() throws Exception { + final Query q = TestCred.stack().contentType(contentTypeUID).query(); + q.variants(variantUID, variantBranch).find(new QueryResultsCallBack() { + @Override + public void onCompletion(ResponseType responseType, QueryResult queryresult, Error error) { + if (error == null) { + Log.d(TAG, "variants single+branch find: " + queryresult.getResultObjects().size() + " entries"); + } + } + }); + } + + @Test + public void test_45_variants_array_with_branch_find() throws Exception { + final Query q = TestCred.stack().contentType(contentTypeUID).query(); + q.variants(variantsUID, variantBranch).find(new QueryResultsCallBack() { + @Override + public void onCompletion(ResponseType responseType, QueryResult queryresult, Error error) { + if (error == null) { + Log.d(TAG, "variants array+branch find: " + queryresult.getResultObjects().size() + " entries"); + } + } + }); + } + } \ No newline at end of file diff --git a/contentstack/src/main/java/com/contentstack/sdk/Entry.java b/contentstack/src/main/java/com/contentstack/sdk/Entry.java index 5c3a7ee3..8f1f7d4d 100755 --- a/contentstack/src/main/java/com/contentstack/sdk/Entry.java +++ b/contentstack/src/main/java/com/contentstack/sdk/Entry.java @@ -1551,6 +1551,38 @@ public Entry variants(String[] variants){ } return this; } + + /** + * Sets the variant UID and scopes the request to the given branch. + * Sets {@code x-cs-variant-uid} and {@code branch} request headers. + * + * @param variantUid single variant UID + * @param branch branch name to scope the request + * @return {@link Entry} + */ + public Entry variants(String variantUid, String branch) { + variants(variantUid); + if (branch != null && !branch.trim().isEmpty()) { + this.localHeader.put("branch", branch.trim()); + } + return this; + } + + /** + * Sets multiple variant UIDs and scopes the request to the given branch. + * Sets {@code x-cs-variant-uid} and {@code branch} request headers. + * + * @param variantUids array of variant UIDs + * @param branch branch name to scope the request + * @return {@link Entry} + */ + public Entry variants(String[] variantUids, String branch) { + variants(variantUids); + if (branch != null && !branch.trim().isEmpty()) { + this.localHeader.put("branch", branch.trim()); + } + return this; + } public ArrayMap getHeaders() { return localHeader; } diff --git a/contentstack/src/main/java/com/contentstack/sdk/Query.java b/contentstack/src/main/java/com/contentstack/sdk/Query.java index ceed7910..424021fa 100755 --- a/contentstack/src/main/java/com/contentstack/sdk/Query.java +++ b/contentstack/src/main/java/com/contentstack/sdk/Query.java @@ -2025,5 +2025,75 @@ public Query includeMetadata() { return this; } + /** + * Sets the variant UID for this query via the {@code x-cs-variant-uid} request header. + * + * @param variantUid single variant UID + * @return {@link Query} + */ + public Query variants(String variantUid) { + if (variantUid != null && !variantUid.trim().isEmpty()) { + localHeader.put("x-cs-variant-uid", variantUid.trim()); + } + return this; + } + + /** + * Sets multiple variant UIDs for this query via the {@code x-cs-variant-uid} request header. + * + * @param variantUids array of variant UIDs + * @return {@link Query} + */ + public Query variants(String[] variantUids) { + if (variantUids != null && variantUids.length > 0) { + List variantList = new ArrayList<>(); + for (String variant : variantUids) { + if (variant != null && !variant.trim().isEmpty()) { + variantList.add(variant.trim()); + } + } + if (!variantList.isEmpty()) { + localHeader.put("x-cs-variant-uid", String.join(", ", variantList)); + } + } + return this; + } + + /** + * Sets the variant UID and scopes the query to the given branch. + * Sets {@code x-cs-variant-uid} and {@code branch} request headers. + * + * @param variantUid single variant UID + * @param branch branch name to scope the request + * @return {@link Query} + */ + public Query variants(String variantUid, String branch) { + variants(variantUid); + if (branch != null && !branch.trim().isEmpty()) { + localHeader.put("branch", branch.trim()); + } + return this; + } + + /** + * Sets multiple variant UIDs and scopes the query to the given branch. + * Sets {@code x-cs-variant-uid} and {@code branch} request headers. + * + * @param variantUids array of variant UIDs + * @param branch branch name to scope the request + * @return {@link Query} + */ + public Query variants(String[] variantUids, String branch) { + variants(variantUids); + if (branch != null && !branch.trim().isEmpty()) { + localHeader.put("branch", branch.trim()); + } + return this; + } + + public ArrayMap getHeaders() { + return localHeader; + } + } diff --git a/contentstack/src/test/java/com/contentstack/sdk/TestEntryComprehensive.java b/contentstack/src/test/java/com/contentstack/sdk/TestEntryComprehensive.java index 12ed9b5f..1c6cfe98 100644 --- a/contentstack/src/test/java/com/contentstack/sdk/TestEntryComprehensive.java +++ b/contentstack/src/test/java/com/contentstack/sdk/TestEntryComprehensive.java @@ -353,6 +353,50 @@ public void testVariantsArrayNull() { assertNotNull(result); } + @Test + public void testVariantsSingleWithBranch() { + Entry result = entry.variants("xyz", "branch_name"); + assertNotNull(result); + assertEquals("xyz", entry.getHeaders().get("x-cs-variant-uid")); + assertEquals("branch_name", entry.getHeaders().get("branch")); + } + + @Test + public void testVariantsArrayWithBranch() { + Entry result = entry.variants(new String[]{"variant1", "variant2"}, "branch_name"); + assertNotNull(result); + assertEquals("variant1, variant2", entry.getHeaders().get("x-cs-variant-uid")); + assertEquals("branch_name", entry.getHeaders().get("branch")); + } + + @Test + public void testVariantsArrayWithBranchFiltersNullsAndBlanks() { + entry.variants(new String[]{"v1", null, " ", "v2"}, "staging"); + assertEquals("v1, v2", entry.getHeaders().get("x-cs-variant-uid")); + assertEquals("staging", entry.getHeaders().get("branch")); + } + + @Test + public void testVariantsSingleNullBranchDoesNotSetBranchHeader() { + entry.variants("xyz", null); + assertEquals("xyz", entry.getHeaders().get("x-cs-variant-uid")); + assertNull(entry.getHeaders().get("branch")); + } + + @Test + public void testVariantsArrayNullBranchDoesNotSetBranchHeader() { + entry.variants(new String[]{"v1", "v2"}, null); + assertEquals("v1, v2", entry.getHeaders().get("x-cs-variant-uid")); + assertNull(entry.getHeaders().get("branch")); + } + + @Test + public void testVariantsSingleEmptyBranchDoesNotSetBranchHeader() { + entry.variants("xyz", " "); + assertEquals("xyz", entry.getHeaders().get("x-cs-variant-uid")); + assertNull(entry.getHeaders().get("branch")); + } + // ==================== Locale ==================== @Test diff --git a/contentstack/src/test/java/com/contentstack/sdk/TestQuery.java b/contentstack/src/test/java/com/contentstack/sdk/TestQuery.java index 32fc5178..2c97d09d 100644 --- a/contentstack/src/test/java/com/contentstack/sdk/TestQuery.java +++ b/contentstack/src/test/java/com/contentstack/sdk/TestQuery.java @@ -584,5 +584,78 @@ public void testLocaleWithDifferentCodes() { assertNotNull("Query should not be null for locale " + locale, result); } } + + // ---------------- VARIANTS ---------------- + + @Test + public void testVariantsSingle() { + Query result = query.variants("variantA"); + assertNotNull(result); + assertEquals("variantA", query.getHeaders().get("x-cs-variant-uid")); + assertNull(query.getHeaders().get("branch")); + } + + @Test + public void testVariantsArray() { + Query result = query.variants(new String[]{"v1", "v2", "v3"}); + assertNotNull(result); + assertEquals("v1, v2, v3", query.getHeaders().get("x-cs-variant-uid")); + assertNull(query.getHeaders().get("branch")); + } + + @Test + public void testVariantsArrayFiltersNullsAndBlanks() { + query.variants(new String[]{"v1", null, " ", "v2"}); + assertEquals("v1, v2", query.getHeaders().get("x-cs-variant-uid")); + } + + @Test + public void testVariantsSingleWithBranch() { + Query result = query.variants("variantA", "my-branch"); + assertNotNull(result); + assertEquals("variantA", query.getHeaders().get("x-cs-variant-uid")); + assertEquals("my-branch", query.getHeaders().get("branch")); + } + + @Test + public void testVariantsArrayWithBranch() { + Query result = query.variants(new String[]{"v1", "v2"}, "feature-branch"); + assertNotNull(result); + assertEquals("v1, v2", query.getHeaders().get("x-cs-variant-uid")); + assertEquals("feature-branch", query.getHeaders().get("branch")); + } + + @Test + public void testVariantsSingleWithNullBranchDoesNotSetBranchHeader() { + query.variants("variantA", null); + assertEquals("variantA", query.getHeaders().get("x-cs-variant-uid")); + assertNull(query.getHeaders().get("branch")); + } + + @Test + public void testVariantsArrayWithNullBranchDoesNotSetBranchHeader() { + query.variants(new String[]{"v1", "v2"}, null); + assertEquals("v1, v2", query.getHeaders().get("x-cs-variant-uid")); + assertNull(query.getHeaders().get("branch")); + } + + @Test + public void testVariantsSingleWithEmptyBranchDoesNotSetBranchHeader() { + query.variants("variantA", " "); + assertEquals("variantA", query.getHeaders().get("x-cs-variant-uid")); + assertNull(query.getHeaders().get("branch")); + } + + @Test + public void testVariantsNullSingleDoesNotSetHeader() { + query.variants((String) null); + assertNull(query.getHeaders().get("x-cs-variant-uid")); + } + + @Test + public void testVariantsEmptyArrayDoesNotSetHeader() { + query.variants(new String[]{}); + assertNull(query.getHeaders().get("x-cs-variant-uid")); + } }