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" + } +} +