diff --git a/.github/workflows/check-branch.yml b/.github/workflows/check-branch.yml index 1e2d24a5..8a3a32ab 100644 --- a/.github/workflows/check-branch.yml +++ b/.github/workflows/check-branch.yml @@ -8,13 +8,13 @@ jobs: runs-on: ubuntu-latest steps: - name: Comment PR - if: github.base_ref == 'master' && github.head_ref != 'next' + if: github.base_ref == 'master' && github.head_ref != 'staging' uses: thollander/actions-comment-pull-request@v2 with: message: | - We regret to inform you that you are currently not able to merge your changes into the master branch due to restrictions applied by our SRE team. To proceed with merging your changes, we kindly request that you create a pull request from the next branch. Our team will then review the changes and work with you to ensure a successful merge into the master branch. + We regret to inform you that you are currently not able to merge your changes into the master branch due to restrictions applied by our SRE team. To proceed with merging your changes, we kindly request that you create a pull request from the staging branch. Our team will then review the changes and work with you to ensure a successful merge into the master branch. - name: Check branch - if: github.base_ref == 'master' && github.head_ref != 'next' + if: github.base_ref == 'master' && github.head_ref != 'staging' run: | - echo "ERROR: We regret to inform you that you are currently not able to merge your changes into the master branch due to restrictions applied by our SRE team. To proceed with merging your changes, we kindly request that you create a pull request from the next branch. Our team will then review the changes and work with you to ensure a successful merge into the master branch." + echo "ERROR: We regret to inform you that you are currently not able to merge your changes into the master branch due to restrictions applied by our SRE team. To proceed with merging your changes, we kindly request that you create a pull request from the staging branch. Our team will then review the changes and work with you to ensure a successful merge into the master branch." exit 1 \ No newline at end of file diff --git a/.gitignore b/.gitignore index 10f7b829..f23a362c 100644 --- a/.gitignore +++ b/.gitignore @@ -271,3 +271,4 @@ src/main/resources/ .vscode/settings.json .vscode/ /.vscode/ +.env \ No newline at end of file diff --git a/changelog.md b/changelog.md index 12ce4168..f8679fd2 100644 --- a/changelog.md +++ b/changelog.md @@ -1,5 +1,11 @@ # Changelog +## v1.6.0 + +### Jun 09, 2025 + +- Release 2.0 feature implementation + ## v1.5.3 ### Apr 21, 2025 diff --git a/pom.xml b/pom.xml index 0af9d292..9d040f3b 100644 --- a/pom.xml +++ b/pom.xml @@ -7,7 +7,7 @@ cms jar contentstack-management-java - 1.5.3 + 1.6.0 Contentstack Java Management SDK for Content Management API, Contentstack is a headless CMS with an API-first approach diff --git a/src/main/java/com/contentstack/cms/stack/BulkOperation.java b/src/main/java/com/contentstack/cms/stack/BulkOperation.java index 52bcb1d8..c72615e1 100644 --- a/src/main/java/com/contentstack/cms/stack/BulkOperation.java +++ b/src/main/java/com/contentstack/cms/stack/BulkOperation.java @@ -24,8 +24,8 @@ * @author ***REMOVED*** * @version v1.0.0 * @see - * Bulk Operations Queue + * "https://www.contentstack.com/docs/developers/apis/content-management-api/#bulk-publish-operation"> + * Bulk Operations Queue * @since 2023 -08-23 */ public class BulkOperation implements BaseImplementation { @@ -49,7 +49,7 @@ public class BulkOperation implements BaseImplementation { * * @param retrofit the retrofit */ - protected BulkOperation(Retrofit retrofit,Map headers) { + protected BulkOperation(Retrofit retrofit, Map headers) { this.headers = new HashMap<>(); this.headers.putAll(headers); this.params = new HashMap<>(); @@ -88,9 +88,9 @@ protected BulkOperation(Retrofit retrofit,Map headers) { * @param body The JSON object containing the data to be published. * @return Call object for the API request. * @see - * Publish entries and assets in bulk + * href= + * "https://www.contentstack.com/docs/developers/apis/content-management-api/#publish-entries-and-assets-in-bulk"> + * Publish entries and assets in bulk * @see #addHeader(String, String) #addHeader(String, String)to add headers in * @see #addParam(String, Object) #addParam(String, Object)to add query * @since 1.0.0 @@ -130,11 +130,11 @@ public Call publish(@NotNull JSONObject body) { * @param body the body * @return Call call * @see Bulk - * Unpublish Operation + * "https://www.contentstack.com/docs/developers/apis/content-management-api/#bulk-unpublish-operation">Bulk + * Unpublish Operation * @see #addHeader(String, String) #addHeader(String, String)to add headers * @see #addParam(String, Object) #addParam(String, Object)to add query - * parameters + * parameters * @since 0.1.0 */ public Call unpublish(@NotNull JSONObject body) { @@ -159,11 +159,11 @@ public Call unpublish(@NotNull JSONObject body) { * @param body the body * @return Call call * @see Bulk - * Delete Operation + * "https://www.contentstack.com/docs/developers/apis/content-management-api/#delete-entries-and-assets-in-bulk">Bulk + * Delete Operation * @see #addHeader(String, String) #addHeader(String, String)to add headers * @see #addParam(String, Object) #addParam(String, Object)to add query - * parameters + * parameters * @since 0.1.0 */ public Call delete(JSONObject body) { @@ -190,16 +190,61 @@ public Call delete(JSONObject body) { * @param body the body * @return Call * @see Bulk - * Delete Operation + * "https://www.contentstack.com/docs/developers/apis/content-management-api/#delete-entries-and-assets-in-bulk">Bulk + * Delete Operation * @see #addHeader(String, String) #addHeader(String, String)to add headers * @see #addParam(String, Object) #addParam(String, Object)to add query - * parameters + * parameters * @since 0.1.0 */ public Call updateWorkflow(@NotNull JSONObject body) { return this.service.updateWorkflowDetails(this.headers, this.params, body); } + /** + * The Add Release items request allows you to add multiple items (entries and + * assets) to a Release. + *

+ * When executing the API request, you need to provide the Release UID. In the + * 'Body' section, you need to provide + * the details of the items + * + * @param jsonBody requestBody for create/add single Item + * @return Call + */ + public Call addReleaseItems(@NotNull JSONObject jsonBody) { + Call addItemsCall; + this.headers.put("bulk_version", "2.0"); + addItemsCall = this.service.addBulkItems(this.headers, this.params, jsonBody); + this.headers.remove("bulk_version"); + return addItemsCall; + } + + /** + * The Update Release items request to Update release items to latest version + */ + public Call updateReleaseItems(@NotNull JSONObject jsonBody) { + Call updateItemsCall; + this.headers.put("bulk_version", "2.0"); + updateItemsCall = this.service.updateBulkItems(this.headers, this.params, jsonBody); + this.headers.remove("bulk_version"); + return updateItemsCall; + } + + /** + * The Get Job Status request allows you to get the status of a job. + *

+ * When executing the API request, you need to provide the job UID. + * + * @param jobUid the job UID + * @return Call + */ + public Call jobStatus(@NotNull String jobUid) { + Call jobStatusCall; + this.headers.put("bulk_version", "2.0"); + jobStatusCall = this.service.getJobStatus(this.headers, jobUid, this.params); + this.headers.remove("bulk_version"); + return jobStatusCall; + } /** * Adds a header with the specified key and value to this location and returns @@ -236,7 +281,8 @@ public BulkOperation addHeader(@NotNull String key, @NotNull String value) { * location. * * @param params a {@link HashMap} containing the parameters to be added - * @return a new {@link BulkOperation} object with the specified parameters added + * @return a new {@link BulkOperation} object with the specified parameters + * added * @throws NullPointerException if the params argument is null */ @Override diff --git a/src/main/java/com/contentstack/cms/stack/BulkOperationService.java b/src/main/java/com/contentstack/cms/stack/BulkOperationService.java index 7344b293..07080734 100644 --- a/src/main/java/com/contentstack/cms/stack/BulkOperationService.java +++ b/src/main/java/com/contentstack/cms/stack/BulkOperationService.java @@ -4,8 +4,11 @@ import org.json.simple.JSONObject; import retrofit2.Call; import retrofit2.http.Body; +import retrofit2.http.GET; import retrofit2.http.HeaderMap; import retrofit2.http.POST; +import retrofit2.http.PUT; +import retrofit2.http.Path; import retrofit2.http.QueryMap; import java.util.HashMap; @@ -37,4 +40,22 @@ Call updateWorkflowDetails( @QueryMap HashMap params, @Body JSONObject body); + @POST("bulk/release/items") + Call addBulkItems( + @HeaderMap Map headers, + @QueryMap Map params, + @Body JSONObject body); + + @PUT("bulk/release/update_items") + Call updateBulkItems( + @HeaderMap Map headers, + @QueryMap Map params, + @Body JSONObject body); + + @GET("bulk/jobs/{job_id}") + Call getJobStatus( + @HeaderMap Map headers, + @Path("job_id") String jobUid, + @QueryMap Map params); + } diff --git a/src/main/java/com/contentstack/cms/stack/ReleaseItem.java b/src/main/java/com/contentstack/cms/stack/ReleaseItem.java index 49b93cd5..8dbf44f7 100644 --- a/src/main/java/com/contentstack/cms/stack/ReleaseItem.java +++ b/src/main/java/com/contentstack/cms/stack/ReleaseItem.java @@ -30,7 +30,7 @@ public class ReleaseItem implements BaseImplementation { protected HashMap params; private final String releaseUid; - protected ReleaseItem(Retrofit retrofit,Map headers, String releaseUid) { + protected ReleaseItem(Retrofit retrofit, Map headers, String releaseUid) { this.headers = new HashMap<>(); this.headers.putAll(headers); this.params = new HashMap<>(); @@ -43,7 +43,6 @@ void validate() { throw new IllegalAccessError("Release Uid can not be null or empty"); } - /** * @param key A string representing the key of the parameter. It cannot be * null and must be @@ -244,4 +243,38 @@ public Call delete() { return this.service.removeItem(this.headers, this.releaseUid); } + /** + * The Deletes a multiple items request deteles multiple items from a Release + * + * @param jsonBody requestBody for delete Items + * @return Call + */ + public Call deleteReleaseItems(@NotNull JSONObject jsonBody) { + validate(); + return this.service.deleteItems(this.headers, this.releaseUid, this.params, jsonBody); + } + + /** + * The Delete a single item request delete single item from a Release + * + * @param jsonBody requestBody for delete single Item + * @return Call + */ + public Call deleteReleaseItem(@NotNull JSONObject jsonBody) { + validate(); + return this.service.deleteItem(this.headers, this.releaseUid, this.params, jsonBody); + } + + /** + * The Move items in a Release request allows you to move one or more items + * (entries and/or assets) from one + * Release to another. + * + * @param jsonBody requestBody for move items + * @return Call + */ + public Call move(@NotNull JSONObject jsonBody) { + validate(); + return this.service.moveItems(this.headers, this.releaseUid, this.params, jsonBody); + } } diff --git a/src/main/java/com/contentstack/cms/stack/ReleaseService.java b/src/main/java/com/contentstack/cms/stack/ReleaseService.java index 7d470db7..a11bdba0 100644 --- a/src/main/java/com/contentstack/cms/stack/ReleaseService.java +++ b/src/main/java/com/contentstack/cms/stack/ReleaseService.java @@ -79,4 +79,24 @@ Call clone( @QueryMap Map params, @Body JSONObject body); + @POST("/releases/{source_releaseUid}/items/move") + Call moveItems( + @HeaderMap Map headers, + @Path("source_releaseUid") String releaseUid, + @QueryMap Map params, + @Body JSONObject body); + + @HTTP(method = "DELETE", path = "releases/{release_uid}/items", hasBody = true) + Call deleteItems( + @HeaderMap Map headers, + @Path("release_uid") String releaseUid, + @QueryMap Map params, + @Body JSONObject body); + + @HTTP(method = "DELETE", path = "releases/{release_uid}/item", hasBody = true) + Call deleteItem( + @HeaderMap Map headers, + @Path("release_uid") String releaseUid, + @QueryMap Map params, + @Body JSONObject body); } diff --git a/src/test/java/com/contentstack/cms/stack/BulkOperationTest.java b/src/test/java/com/contentstack/cms/stack/BulkOperationAPITest.java similarity index 80% rename from src/test/java/com/contentstack/cms/stack/BulkOperationTest.java rename to src/test/java/com/contentstack/cms/stack/BulkOperationAPITest.java index 9fbdc7eb..9ff653f0 100644 --- a/src/test/java/com/contentstack/cms/stack/BulkOperationTest.java +++ b/src/test/java/com/contentstack/cms/stack/BulkOperationAPITest.java @@ -11,7 +11,7 @@ @Tag("unit") @TestMethodOrder(MethodOrderer.OrderAnnotation.class) -class BulkOperationTest { +class BulkOperationAPITest { protected static String AUTHTOKEN = TestClient.AUTHTOKEN; protected static String API_KEY = TestClient.API_KEY; @@ -130,4 +130,37 @@ void testUpdateWorkflow() { request.url().toString()); } + @Test + @Order(8) + void testAddBulkItems() { + Request request = bulkOperation.addReleaseItems(new JSONObject()).request(); + Assertions.assertEquals(3, request.headers().names().size()); + Assertions.assertEquals("POST", request.method()); + Assertions.assertTrue(request.url().isHttps()); + Assertions.assertEquals("bulk", request.url().pathSegments().get(1)); + Assertions.assertEquals("v3", request.url().pathSegments().get(0)); + } + + @Test + @Order(9) + void testUpdateBulkItems() { + Request request = bulkOperation.updateReleaseItems(new JSONObject()).request(); + Assertions.assertEquals(3, request.headers().names().size()); + Assertions.assertEquals("PUT", request.method()); + Assertions.assertTrue(request.url().isHttps()); + Assertions.assertEquals("bulk", request.url().pathSegments().get(1)); + Assertions.assertEquals("v3", request.url().pathSegments().get(0)); + } + + @Test + @Order(10) + void testGetJobStatus() { + Request request = bulkOperation.jobStatus("jobId").request(); + Assertions.assertEquals("GET", request.method()); + Assertions.assertTrue(request.url().isHttps()); + Assertions.assertEquals("bulk", request.url().pathSegments().get(1)); + Assertions.assertEquals("v3", request.url().pathSegments().get(0)); + Assertions.assertEquals("jobs", request.url().pathSegments().get(2)); + } + } diff --git a/src/test/java/com/contentstack/cms/stack/ReleaseAPITest.java b/src/test/java/com/contentstack/cms/stack/ReleaseAPITest.java new file mode 100644 index 00000000..18b5c15c --- /dev/null +++ b/src/test/java/com/contentstack/cms/stack/ReleaseAPITest.java @@ -0,0 +1,188 @@ +package com.contentstack.cms.stack; + +import com.contentstack.cms.TestClient; +import com.contentstack.cms.Utils; +import com.contentstack.cms.core.Util; + +import okhttp3.Request; +import okhttp3.ResponseBody; +import retrofit2.Response; + +import java.io.IOException; + +import org.json.simple.JSONObject; +import org.json.simple.parser.JSONParser; +import org.json.simple.parser.ParseException; +import org.junit.jupiter.api.*; +import static org.junit.jupiter.api.Assertions.*; + +@Tag("api") +@TestInstance(TestInstance.Lifecycle.PER_CLASS) +@TestMethodOrder(MethodOrderer.OrderAnnotation.class) + +class ReleaseAPITest { + + public static Release releases; + protected static String API_KEY = TestClient.API_KEY; + protected static String MANAGEMENT_TOKEN = TestClient.MANAGEMENT_TOKEN; + protected static Stack stack; + protected String releaseUid1; + protected String releaseUid2; + JSONParser parser = new JSONParser(); + + @BeforeAll + public void setUp() { + stack = TestClient.getStack().addHeader(Util.API_KEY, API_KEY) + .addHeader("api_key", API_KEY); + } + + @Order(1) + @Test + void testCreateRelease() throws IOException, ParseException { + JSONObject requestBody = Utils.readJson("releases/create_release1.json"); + Response response = stack.releases().create(requestBody).execute(); + + assertTrue(response.isSuccessful(), "Release creation should be successful"); + + String responseString = response.body().string(); + JSONObject responseObject = (JSONObject) parser.parse(responseString); + JSONObject releaseObject = (JSONObject) responseObject.get("release"); + releaseUid1 = (String) releaseObject.get("uid"); + + assertNotNull(releaseUid1, "Release UID should not be null"); + assertEquals("First release", releaseObject.get("name"), "Release name should match"); + assertEquals("Adding release date", releaseObject.get("description"), + "Release description should match"); + assertEquals("Release created successfully.", responseObject.get("notice"), "Success notice should be present"); + } + + @Order(2) + @Test + void testFindReleases() throws IOException, ParseException { + Response response = stack.releases().find().execute(); + + assertTrue(response.isSuccessful(), "Fetch releases should be successful"); + + String responseString = response.body().string(); + JSONObject responseObject = (JSONObject) parser.parse(responseString); + org.json.simple.JSONArray releases = (org.json.simple.JSONArray) responseObject.get("releases"); + + assertNotNull(releases, "Releases array should not be null"); + assertFalse(releases.isEmpty(), "Releases array should not be empty"); + + boolean foundRelease = false; + for (Object obj : releases) { + JSONObject release = (JSONObject) obj; + if (releaseUid1.equals(release.get("uid"))) { + foundRelease = true; + assertEquals("First release", release.get("name"), "Release name should match"); + break; + } + } + + assertTrue(foundRelease, "Created release should be present in the releases list"); + } + + @Test + @Order(3) + void testUpdateRelease() throws IOException, ParseException { + assertNotNull(releaseUid1, "Release UID should be available for updating"); + + JSONObject requestBody = Utils.readJson("releases/update_release1.json"); + + Response response = stack.releases(releaseUid1).update(requestBody).execute(); + assertTrue(response.isSuccessful(), "Release update should be successful"); + + String responseString = response.body().string(); + JSONObject responseObject = (JSONObject) parser.parse(responseString); + JSONObject releaseObject = (JSONObject) responseObject.get("release"); + assertNotNull(releaseObject, "Release object should not be null"); + assertEquals(releaseUid1, releaseObject.get("uid"), "Release UID should match"); + assertEquals("First release update", releaseObject.get("name"), "Release name should match"); + assertEquals("Adding release date", releaseObject.get("description"), + "Release description should match"); + assertEquals("Release updated successfully.", responseObject.get("notice"), "Success notice should be present"); + } + + @Test + @Order(4) + void testFetchReleaseByUid() throws IOException, ParseException { + assertNotNull(releaseUid1, "Release UID should be available for fetching"); + + Response response = stack.releases(releaseUid1).fetch().execute(); + + assertTrue(response.isSuccessful(), "Fetch release by UID should be successful"); + + String responseString = response.body().string(); + JSONObject responseObject = (JSONObject) parser.parse(responseString); + JSONObject releaseObject = (JSONObject) responseObject.get("release"); + + assertNotNull(releaseObject, "Release object should not be null"); + assertEquals(releaseUid1, releaseObject.get("uid"), "Release UID should match"); + assertEquals("First release update", releaseObject.get("name"), "Release name should match"); + } + + @Order(5) + @Test + void testCloneRelease() throws IOException, ParseException { + JSONObject requestBody = Utils.readJson("releases/create_release1.json"); + Response response = stack.releases(releaseUid1).clone(requestBody).execute(); + + assertTrue(response.isSuccessful(), "Clone release should be successful"); + + String responseString = response.body().string(); + JSONObject responseObject = (JSONObject) parser.parse(responseString); + JSONObject releaseObject = (JSONObject) responseObject.get("release"); + releaseUid2 = (String) releaseObject.get("uid"); + + assertNotNull(releaseUid2, "Clone release UID should not be null"); + assertEquals("First release", releaseObject.get("name"), "Clone release name should match"); + assertEquals("Adding release date", releaseObject.get("description"), + "Second release description should match"); + assertEquals("Release cloned successfully.", responseObject.get("notice"), "Success notice should be present"); + } + + @Order(6) + @Test + void testDeployRelease() throws IOException, ParseException { + JSONObject requestBody = Utils.readJson("releases/create_release1.json"); + + assertNotNull(releaseUid2, "Release UID should be available for deployment"); + Request request = stack.releases(releaseUid1).deploy(requestBody).request(); + Assertions.assertEquals("POST", request.method(), "Request method should be PUT"); + Assertions.assertTrue(request.url().toString().contains(releaseUid1), + "Request URL should contain the release UID"); + Assertions.assertEquals("releases", request.url().pathSegments().get(1)); + Assertions.assertEquals("v3", request.url().pathSegments().get(0)); + } + + @Order(7) + @Test + void testDeleteRelease1() throws IOException, ParseException { + assertNotNull(releaseUid1, "Release UID should be available for deletion"); + + Response response = stack.releases(releaseUid1).delete().execute(); + + assertTrue(response.isSuccessful(), "Release deletion should be successful"); + + String responseString = response.body().string(); + JSONObject responseObject = (JSONObject) parser.parse(responseString); + + assertEquals("Release deleted successfully.", responseObject.get("notice"), "Success notice should be present"); + } + + @Order(8) + @Test + void testDeleteRelease2() throws IOException, ParseException { + assertNotNull(releaseUid2, "Release UID should be available for deletion"); + + Response response = stack.releases(releaseUid2).delete().execute(); + + assertTrue(response.isSuccessful(), "Release deletion should be successful"); + + String responseString = response.body().string(); + JSONObject responseObject = (JSONObject) parser.parse(responseString); + + assertEquals("Release deleted successfully.", responseObject.get("notice"), "Success notice should be present"); + } +} \ No newline at end of file diff --git a/src/test/java/com/contentstack/cms/stack/ReleaseItemAPITest.java b/src/test/java/com/contentstack/cms/stack/ReleaseItemAPITest.java new file mode 100644 index 00000000..5a6c3c1b --- /dev/null +++ b/src/test/java/com/contentstack/cms/stack/ReleaseItemAPITest.java @@ -0,0 +1,189 @@ +package com.contentstack.cms.stack; + +import com.contentstack.cms.TestClient; +import com.contentstack.cms.core.Util; +import okhttp3.Request; +import org.json.simple.JSONArray; +import org.json.simple.JSONObject; +import org.junit.jupiter.api.*; + +import java.util.HashMap; + +@Tag("unit") +@TestMethodOrder(MethodOrderer.OrderAnnotation.class) +class ReleaseItemAPITest { + + protected static String API_KEY = TestClient.API_KEY; + protected static String MANAGEMENT_TOKEN = TestClient.MANAGEMENT_TOKEN; + protected static String RELEASE_UID = "test_release_uid"; + protected static Stack stack; + protected static ReleaseItem releaseItem; + + @BeforeAll + static void setup() { + HashMap headers = new HashMap<>(); + headers.put(Util.API_KEY, API_KEY); + headers.put(Util.AUTHORIZATION, MANAGEMENT_TOKEN); + stack = TestClient.getStack(); // Remove the "Stack" type declaration to use the class field + releaseItem = stack.releases(RELEASE_UID).item(); + releaseItem.addHeader("testHeader", "testValue"); + } + + @Test + @Order(1) + void testFind() { + releaseItem.addParam("include_count", "true"); + Request request = releaseItem.find().request(); + + Assertions.assertEquals("GET", request.method()); + Assertions.assertTrue(request.url().isHttps()); + Assertions.assertEquals("api.contentstack.io", request.url().host()); + Assertions.assertTrue(request.url().pathSegments().contains("items")); + Assertions.assertTrue(request.url().toString().contains(RELEASE_UID)); + Assertions.assertTrue(request.url().toString().contains("include_count=true")); + } + + @Test + @Order(2) + void testCreate() { + // Prepare test request body + JSONObject requestBody = new JSONObject(); + JSONObject item = new JSONObject(); + item.put("uid", "entry123"); + item.put("content_type_uid", "blog"); + item.put("locale", "en-us"); + item.put("version", 1); + requestBody.put("item", item); + + Request request = releaseItem.create(requestBody).request(); + + Assertions.assertEquals("POST", request.method()); + Assertions.assertTrue(request.url().isHttps()); + Assertions.assertTrue(request.url().pathSegments().contains("item")); + Assertions.assertTrue(request.url().toString().contains(RELEASE_UID)); + Assertions.assertNotNull(request.body()); + } + + @Test + @Order(3) + void testCreateMultiple() { + // Prepare test request body for multiple items + JSONObject requestBody = new JSONObject(); + JSONArray items = new JSONArray(); + + JSONObject item1 = new JSONObject(); + item1.put("uid", "entry123"); + item1.put("content_type_uid", "blog"); + item1.put("locale", "en-us"); + + JSONObject item2 = new JSONObject(); + item2.put("uid", "asset456"); + item2.put("action", "publish"); + + items.add(item1); + items.add(item2); + requestBody.put("items", items); + + // Add bulk parameter + releaseItem.addParam("bulk", true); + + Request request = releaseItem.createMultiple(requestBody).request(); + + Assertions.assertEquals("POST", request.method()); + Assertions.assertTrue(request.url().isHttps()); + Assertions.assertTrue(request.url().toString().contains(RELEASE_UID)); + Assertions.assertTrue(request.url().toString().contains("items")); + Assertions.assertTrue(request.url().toString().contains("bulk=true")); + Assertions.assertNotNull(request.body()); + } + + @Test + @Order(4) + void testUpdate() { + Request request = releaseItem.update(new JSONObject()).request(); + + Assertions.assertEquals("PUT", request.method()); + Assertions.assertTrue(request.url().isHttps()); + Assertions.assertTrue(request.url().toString().contains(RELEASE_UID)); + + Assertions.assertNotNull(request.body()); + } + + @Test + @Order(5) + void testDelete() { + Request request = releaseItem.delete().request(); + + Assertions.assertEquals("DELETE", request.method()); + Assertions.assertTrue(request.url().isHttps()); + Assertions.assertTrue(request.url().toString().contains(RELEASE_UID)); + Assertions.assertTrue(request.url().pathSegments().contains("items")); + } + + @Test + @Order(6) + void testDeleteReleaseItems() { + + Request request = releaseItem.deleteReleaseItems(new JSONObject()).request(); + + Assertions.assertEquals("DELETE", request.method()); + Assertions.assertTrue(request.url().isHttps()); + Assertions.assertTrue(request.url().toString().contains(RELEASE_UID)); + Assertions.assertTrue(request.url().pathSegments().contains("items")); + Assertions.assertNotNull(request.body()); + } + + @Test + @Order(7) + void testDeleteReleaseItem() { + + Request request = releaseItem.deleteReleaseItem(new JSONObject()).request(); + + Assertions.assertEquals("DELETE", request.method()); + Assertions.assertTrue(request.url().isHttps()); + Assertions.assertTrue(request.url().toString().contains(RELEASE_UID)); + Assertions.assertTrue(request.url().pathSegments().contains("item")); + Assertions.assertNotNull(request.body()); + } + + @Test + @Order(8) + void testMove() { + Request request = releaseItem.move(new JSONObject()).request(); + + Assertions.assertEquals("POST", request.method()); + Assertions.assertTrue(request.url().isHttps()); + Assertions.assertTrue(request.url().toString().contains(RELEASE_UID)); + Assertions.assertTrue(request.url().pathSegments().contains("move")); + Assertions.assertNotNull(request.body()); + + // Verify release_version header was added + // Assertions.assertEquals("2.0", Objects.requireNonNull(request.headers().get("release_version"))); + } + + @Test + @Order(9) + void testParamsManagement() { + releaseItem.clearParams(); + releaseItem.addParam("test_key", "test_value"); + + Request request = releaseItem.find().request(); + + Assertions.assertTrue(request.url().toString().contains("test_key=test_value")); + + releaseItem.removeParam("test_key"); + request = releaseItem.find().request(); + + Assertions.assertFalse(request.url().toString().contains("test_key=test_value")); + } + + @Test + @Order(10) + void testHeadersManagement() { + releaseItem.addHeader("custom_header", "custom_value"); + + Request request = releaseItem.find().request(); + + Assertions.assertEquals("custom_value", request.headers().get("custom_header")); + } +} \ No newline at end of file diff --git a/src/test/java/com/contentstack/cms/stack/ReleaseUnitTest.java b/src/test/java/com/contentstack/cms/stack/ReleaseUnitTest.java index 95bd0146..6250085a 100644 --- a/src/test/java/com/contentstack/cms/stack/ReleaseUnitTest.java +++ b/src/test/java/com/contentstack/cms/stack/ReleaseUnitTest.java @@ -48,7 +48,7 @@ static void setup() { @Order(1) void allReleaseHeaders() { release.addHeader("Content-Type", "application/json"); - Assertions.assertEquals(1, release.headers.size()); + Assertions.assertEquals(3, release.headers.size()); } @Test @@ -77,7 +77,7 @@ void allReleaseParamsWithSizeMax() { @Order(5) void releaseQueryParams() { Request request = release.find().request(); - Assertions.assertEquals(1, request.headers().names().size()); + Assertions.assertEquals(3, request.headers().names().size()); Assertions.assertEquals("GET", request.method()); Assertions.assertTrue(request.url().isHttps()); Assertions.assertEquals("api.contentstack.io", request.url().host()); @@ -94,7 +94,7 @@ void fetchSingleUrl() { release.addParam("include_rules", true); release.addParam("include_permissions", true); Request request = release.fetch().request(); - Assertions.assertEquals(1, request.headers().names().size()); + Assertions.assertEquals(3, request.headers().names().size()); Assertions.assertEquals("GET", request.method()); Assertions.assertTrue(request.url().isHttps()); Assertions.assertEquals("api.contentstack.io", request.url().host()); @@ -108,7 +108,7 @@ void fetchSingleUrl() { @Order(7) void createRelease() { Request request = release.create(body).request(); - Assertions.assertEquals(0, request.headers().names().size()); + Assertions.assertEquals(2, request.headers().names().size()); Assertions.assertEquals("POST", request.method()); Assertions.assertTrue(request.url().isHttps()); Assertions.assertEquals("api.contentstack.io", request.url().host()); @@ -123,7 +123,7 @@ void createRelease() { @Order(8) void updateRelease() { Request request = release.update(body).request(); - Assertions.assertEquals(0, request.headers().names().size()); + Assertions.assertEquals(2, request.headers().names().size()); Assertions.assertEquals("PUT", request.method()); Assertions.assertTrue(request.url().isHttps()); Assertions.assertEquals("api.contentstack.io", request.url().host()); @@ -138,7 +138,7 @@ void updateRelease() { @Order(9) void deleteRelease() { Request request = release.delete().request(); - Assertions.assertEquals(1, request.headers().names().size()); + Assertions.assertEquals(3, request.headers().names().size()); Assertions.assertEquals("DELETE", request.method()); Assertions.assertTrue(request.url().isHttps()); Assertions.assertEquals("api.contentstack.io", request.url().host()); @@ -153,7 +153,7 @@ void deleteRelease() { @Order(10) void getReleaseItems() { Request request = release.item().find().request(); - Assertions.assertEquals(0, request.headers().names().size()); + Assertions.assertEquals(3, request.headers().names().size()); Assertions.assertEquals("GET", request.method()); Assertions.assertTrue(request.url().isHttps()); Assertions.assertEquals("api.contentstack.io", request.url().host()); @@ -167,7 +167,7 @@ void getReleaseItems() { @Order(10) void createItemRelease() { Request request = release.item().create(body).request(); - Assertions.assertEquals(0, request.headers().names().size()); + Assertions.assertEquals(2, request.headers().names().size()); Assertions.assertEquals("POST", request.method()); Assertions.assertTrue(request.url().isHttps()); Assertions.assertEquals("api.contentstack.io", request.url().host()); @@ -181,7 +181,7 @@ void createItemRelease() { @Order(10) void createMultipleReleaseItems() { Request request = release.item().createMultiple(body).request(); - Assertions.assertEquals(0, request.headers().names().size()); + Assertions.assertEquals(2, request.headers().names().size()); Assertions.assertEquals("POST", request.method()); Assertions.assertTrue(request.url().isHttps()); Assertions.assertEquals("api.contentstack.io", request.url().host()); @@ -195,7 +195,7 @@ void createMultipleReleaseItems() { @Order(10) void updateReleaseItems() { Request request = release.item().update(body).request(); - Assertions.assertEquals(0, request.headers().names().size()); + Assertions.assertEquals(2, request.headers().names().size()); Assertions.assertEquals("PUT", request.method()); Assertions.assertTrue(request.url().isHttps()); Assertions.assertEquals("api.contentstack.io", request.url().host()); @@ -209,7 +209,7 @@ void updateReleaseItems() { @Order(10) void deleteReleaseItems() { Request request = release.item().delete().request(); - Assertions.assertEquals(0, request.headers().names().size()); + Assertions.assertEquals(3, request.headers().names().size()); Assertions.assertEquals("DELETE", request.method()); Assertions.assertTrue(request.url().isHttps()); Assertions.assertEquals("api.contentstack.io", request.url().host()); diff --git a/src/test/resources/releases/create_release1.json b/src/test/resources/releases/create_release1.json new file mode 100644 index 00000000..e5723bb1 --- /dev/null +++ b/src/test/resources/releases/create_release1.json @@ -0,0 +1,9 @@ +{ + "release": { + "name": "First release", + "description": "Adding release date", + "locked": false, + "archived": false + } +} + diff --git a/src/test/resources/releases/create_release2.json b/src/test/resources/releases/create_release2.json new file mode 100644 index 00000000..55424f61 --- /dev/null +++ b/src/test/resources/releases/create_release2.json @@ -0,0 +1,8 @@ +{ + "release": { + "name": "Second release", + "description": "Adding release date", + "locked": false, + "archived": false + } +} diff --git a/src/test/resources/releases/update_release1.json b/src/test/resources/releases/update_release1.json new file mode 100644 index 00000000..523cd8da --- /dev/null +++ b/src/test/resources/releases/update_release1.json @@ -0,0 +1,7 @@ +{ + "release": { + "name": "First release update", + "description": "Adding release date" + } +} +