diff --git a/doc/release-notes/12386-manage-guestbook-apis.md b/doc/release-notes/12386-manage-guestbook-apis.md new file mode 100644 index 00000000000..ed28680720a --- /dev/null +++ b/doc/release-notes/12386-manage-guestbook-apis.md @@ -0,0 +1,12 @@ +## Feature - Manage Guestbook + +This feature adds 2 new APIs to help manage Guestbooks and Guestbook Responses. + + +This API allows the user to make edits to an existing Guestbook, including adding and removing Custom Guestbook Questions. + +`curl -PUT -H "X-Dataverse-key:$API_TOKEN" "$SERVER_URL/api/guestbooks/{ID}" -d "$JSON"` + +This API allows the user to retrieve Guestbook Responses for a specific Guestbook within a Collection. Optional pagination parameters can be added to limit the number of results, as this can get very large. + +`curl -H "X-Dataverse-key:$API_TOKEN" "$SERVER_URL/api/guestbooks/$ID/responses?limit10&offset=0"` diff --git a/doc/sphinx-guides/source/api/native-api.rst b/doc/sphinx-guides/source/api/native-api.rst index 1a1604886c6..792d92cb1de 100644 --- a/doc/sphinx-guides/source/api/native-api.rst +++ b/doc/sphinx-guides/source/api/native-api.rst @@ -1275,6 +1275,28 @@ The fully expanded example above (without environment variables) looks like this curl -H "X-Dataverse-key:xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx" "https://demo.dataverse.org/api/guestbooks/1234" +Update a Guestbook for a Dataverse Collection +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +For more about guestbooks, see :ref:`dataset-guestbooks` in the User Guide. + +Update a Guestbook that can be selected for a Dataset. +You must have "EditDataverse" permission on the Dataverse collection. + +.. code-block:: bash + + export API_TOKEN=xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx + export SERVER_URL=https://demo.dataverse.org + export ID=1234 + + curl -PUT -H "X-Dataverse-key:$API_TOKEN" "$SERVER_URL/api/guestbooks/{ID}" -d "$JSON" + +The fully expanded example above (without environment variables) looks like this: + +.. code-block:: bash + + curl -PUT -H "X-Dataverse-key:xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx" "https://demo.dataverse.org/api/guestbooks/1234" -d "$JSON" + Enable or Disable a Guestbook for a Dataverse Collection ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ @@ -1298,6 +1320,32 @@ The fully expanded example above (without environment variables) looks like this curl -X PUT -d 'true' -H "X-Dataverse-key:xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx" "https://demo.dataverse.org/api/guestbooks/root/1234" +Retrieve Guestbook Responses for a Guestbook +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + +For more about guestbooks, see :ref:`dataset-guestbooks` in the User Guide. + +In order to retrieve the Guestbook Responses for a Guestbook within a Dataverse collection, you must know the ID if the Guestbook. This API also supports pagination by passing a page limit and an optional offset (starting point). The resulting Json will include 'Next' and 'Prev' urls for navigation as well as the total number of responses. +The resulting Json will be more detailed than that of the :ref:`download-guestbook-api` CSV response file by including Guestbook metadata as well as Guestbook Response metadata. + +.. note:: See :ref:`curl-examples-and-environment-variables` if you are unfamiliar with the use of ``export`` below. + +.. code-block:: bash + + export API_TOKEN=xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx + export SERVER_URL=https://demo.dataverse.org + export ID=1 + + curl -H "X-Dataverse-key:$API_TOKEN" "$SERVER_URL/api/guestbooks/$ID/responses" + curl -H "X-Dataverse-key:$API_TOKEN" "$SERVER_URL/api/guestbooks/$ID/responses?limit10&offset=0" + +The fully expanded example above (without environment variables) looks like this: + +.. code-block:: bash + + curl -H "X-Dataverse-key:xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx" "https://demo.dataverse.org/api/guestbooks/1/responses" + curl -H "X-Dataverse-key:xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx" "https://demo.dataverse.org/api/guestbooks/1/responses?limit10&offset=0" + .. _collection-attributes-api: Change Collection Attributes diff --git a/src/main/java/edu/harvard/iq/dataverse/GuestbookResponseServiceBean.java b/src/main/java/edu/harvard/iq/dataverse/GuestbookResponseServiceBean.java index 754fe51714a..8ddda6a2a7e 100644 --- a/src/main/java/edu/harvard/iq/dataverse/GuestbookResponseServiceBean.java +++ b/src/main/java/edu/harvard/iq/dataverse/GuestbookResponseServiceBean.java @@ -111,10 +111,19 @@ public List findAllIds(Long dataverseId) { } public List findAllByGuestbookId(Long guestbookId) { + return findAllByGuestbookId(guestbookId, null, null); + } + public List findAllByGuestbookId(Long guestbookId, Integer offset, Integer limit) { + if (guestbookId != null) { + TypedQuery query = em.createQuery("select o from GuestbookResponse as o where o.guestbook.id = " + guestbookId + " order by o.responseTime desc", GuestbookResponse.class); + if (offset != null) { + query.setFirstResult(offset); + } + if (limit != null) { + query.setMaxResults(limit); + } - if (guestbookId == null) { - } else { - return em.createQuery("select o from GuestbookResponse as o where o.guestbook.id = " + guestbookId + " order by o.responseTime desc", GuestbookResponse.class).getResultList(); + return query.getResultList(); } return null; } diff --git a/src/main/java/edu/harvard/iq/dataverse/api/Guestbooks.java b/src/main/java/edu/harvard/iq/dataverse/api/Guestbooks.java index 160874838d0..77ac59f0859 100644 --- a/src/main/java/edu/harvard/iq/dataverse/api/Guestbooks.java +++ b/src/main/java/edu/harvard/iq/dataverse/api/Guestbooks.java @@ -1,9 +1,6 @@ package edu.harvard.iq.dataverse.api; -import edu.harvard.iq.dataverse.Dataverse; -import edu.harvard.iq.dataverse.Guestbook; -import edu.harvard.iq.dataverse.GuestbookResponseServiceBean; -import edu.harvard.iq.dataverse.GuestbookServiceBean; +import edu.harvard.iq.dataverse.*; import edu.harvard.iq.dataverse.api.auth.AuthRequired; import edu.harvard.iq.dataverse.authorization.Permission; import edu.harvard.iq.dataverse.authorization.users.AuthenticatedUser; @@ -31,6 +28,7 @@ import java.util.logging.Logger; import static edu.harvard.iq.dataverse.util.json.JsonPrinter.json; +import static edu.harvard.iq.dataverse.util.json.NullSafeJsonBuilder.jsonObjectBuilder; @Path("guestbooks") public class Guestbooks extends AbstractApiBean { @@ -119,6 +117,80 @@ public Response createGuestbook(@Context ContainerRequestContext crc, @PathParam } } + @PUT + @AuthRequired + @Path("{id}") + public Response updateGuestbook(@Context ContainerRequestContext crc, @PathParam("id") Long id, String jsonBody) { + return response( req -> { + Guestbook guestbook = guestbookService.find(id); + if (guestbook != null) { + try { + JsonObject jsonObj = JsonUtil.getJsonObject(jsonBody); + jsonParser().parseGuestbook(jsonObj, guestbook); + } catch (JsonException | JsonParseException ex) { + logger.log(Level.WARNING, "Error parsing guestbook JSON", ex); + return badRequest("Error parsing guestbook JSON"); + } + Guestbook newGuestbook = execCommand(new UpdateGuestbookCommand(guestbook, req, guestbook.getDataverse())); + return ok(json(newGuestbook)); + } else { + return notFound(BundleUtil.getStringFromBundle("dataset.manageGuestbooks.message.notFound")); + } + }, getRequestUser(crc)); + } + + @GET + @AuthRequired + @Path("/{id}/responses") + public Response getResponses(@Context ContainerRequestContext crc, @PathParam("id") Long id, + @QueryParam("limit") Integer limit, @QueryParam("offset") Integer offset) { + + return response( req -> { + Guestbook guestbook = guestbookService.find(id); + if (guestbook == null) { + return notFound("Guestbook " + id + " not found."); + } + Dataverse dataverse = guestbook.getDataverse(); + if (!permissionSvc.request(req).on(dataverse).has(Permission.EditDataverse)) { + return error(Response.Status.FORBIDDEN, "Not authorized"); + } + Long totalUsageCount = guestbookService.findCountUsages(guestbook.getId(), dataverse.getId()); + Long totalResponseCount = guestbookResponseService.findCountByGuestbookId(guestbook.getId(), dataverse.getId()); + guestbook.setUsageCount(totalUsageCount); + guestbook.setResponseCount(totalResponseCount); + + List responses = guestbookResponseService.findAllByGuestbookId(guestbook.getId(), offset, limit); + + JsonObjectBuilder guestbookResponseObject = jsonObjectBuilder(); + guestbookResponseObject.add("guestbook", JsonPrinter.json(guestbook)); + + JsonArrayBuilder responseObjects = Json.createArrayBuilder(); + for (GuestbookResponse gr : responses) { + responseObjects.add(JsonPrinter.json(gr)); + } + guestbookResponseObject.add("responses", responseObjects); + + if (limit != null) { + JsonObjectBuilder guestbookPageObject = jsonObjectBuilder(); + int thisOffset = offset != null ? offset : 0; + int next = thisOffset + limit; + int prev = thisOffset - limit; + + String baseUrl = crc.getUriInfo().getAbsolutePath() + "?limit=" + limit + "&offset=" ; + if (prev >= 0) { + guestbookPageObject.add("previous",baseUrl + prev); + } + if (next < totalResponseCount) { + guestbookPageObject.add("next", baseUrl + next); + } + guestbookPageObject.add("totalResponses", totalResponseCount); + + guestbookResponseObject.add("pagination", guestbookPageObject); + } + return ok(guestbookResponseObject); + }, getRequestUser(crc)); + } + @PUT @AuthRequired @Path("{identifier}/{id}/enabled") diff --git a/src/main/java/edu/harvard/iq/dataverse/util/json/JsonParser.java b/src/main/java/edu/harvard/iq/dataverse/util/json/JsonParser.java index f0d1301e346..2dfbdef17a2 100644 --- a/src/main/java/edu/harvard/iq/dataverse/util/json/JsonParser.java +++ b/src/main/java/edu/harvard/iq/dataverse/util/json/JsonParser.java @@ -553,6 +553,9 @@ public DatasetVersion parseDatasetVersion(JsonObject obj, DatasetVersion dsv) th public Guestbook parseGuestbook(JsonObject obj, Guestbook gb) throws JsonParseException { try { + if (obj.containsKey("id")) { + gb.setId(Long.valueOf(obj.getInt("id"))); + } gb.setName(obj.getString("name", null)); gb.setEnabled(obj.getBoolean("enabled")); gb.setEmailRequired(obj.getBoolean("emailRequired")); @@ -573,6 +576,9 @@ private List parseCustomQuestions(JsonArray customQuestions, Gue customQuestions.forEach(q -> { JsonObject obj = q.asJsonObject(); CustomQuestion cq = new CustomQuestion(); + if (obj.containsKey("id")) { + cq.setId(Long.valueOf(obj.getInt("id"))); + } cq.setQuestionString(obj.getString("question")); cq.setRequired(obj.getBoolean("required")); cq.setDisplayOrder(obj.getInt("displayOrder")); @@ -586,6 +592,9 @@ private List parseCustomQuestions(JsonArray customQuestions, Gue optionValues.forEach(v -> { JsonObject ov = v.asJsonObject(); CustomQuestionValue cqv = new CustomQuestionValue(); + if (ov.containsKey("id")) { + cqv.setId(Long.valueOf(ov.getInt("id"))); + } cqv.setValueString(ov.getString("value")); cqv.setDisplayOrder(ov.getInt("displayOrder")); cqv.setCustomQuestion(cq); diff --git a/src/main/java/edu/harvard/iq/dataverse/util/json/JsonPrinter.java b/src/main/java/edu/harvard/iq/dataverse/util/json/JsonPrinter.java index 729596fb3d4..03451b79767 100644 --- a/src/main/java/edu/harvard/iq/dataverse/util/json/JsonPrinter.java +++ b/src/main/java/edu/harvard/iq/dataverse/util/json/JsonPrinter.java @@ -413,10 +413,50 @@ public static JsonObjectBuilder getOwnersFromDvObject(DvObject dvObject){ return getOwnersFromDvObject(dvObject, null); } + public static JsonObjectBuilder json(GuestbookResponse gbResponse) { + JsonObjectBuilder guestbookResponseObject = jsonObjectBuilder(); + if (gbResponse != null) { + guestbookResponseObject.add("id", gbResponse.getId()); + guestbookResponseObject.add("dataset", gbResponse.getDataset().getDisplayName()); + guestbookResponseObject.add("datasetPid", gbResponse.getDataset().getIdentifier()); + guestbookResponseObject.add("date", format(gbResponse.getResponseTime())); + guestbookResponseObject.add("type", gbResponse.getEventType()); + guestbookResponseObject.add("fileName", gbResponse.getDataFile().getDisplayName()); + guestbookResponseObject.add("fileId", gbResponse.getDataFile().getId()); + if (gbResponse.getDataFile().getGlobalId() != null) { + guestbookResponseObject.add("filePid", gbResponse.getDataFile().getGlobalId().asString()); + } + guestbookResponseObject.add("userName", gbResponse.getAuthenticatedUser() != null ? gbResponse.getAuthenticatedUser().getUserIdentifier() : "Guest"); + if (gbResponse.getEmail() != null) { + guestbookResponseObject.add("email", gbResponse.getEmail()); + } + if (gbResponse.getInstitution() != null) { + guestbookResponseObject.add("institution", gbResponse.getInstitution()); + } + if (gbResponse.getPosition() != null) { + guestbookResponseObject.add("position", gbResponse.getPosition()); + } + final List cqResponses = gbResponse.getCustomQuestionResponses(); + if (cqResponses != null && !cqResponses.isEmpty()) { + JsonArrayBuilder customQuestions = Json.createArrayBuilder(); + for (CustomQuestionResponse cqResponse : cqResponses) { + JsonObjectBuilder cqObj = jsonObjectBuilder(); + cqObj.add("question", cqResponse.getCustomQuestion().getQuestionString()); + cqObj.add("response", cqResponse.getResponse()); + customQuestions.add(cqObj); + } + guestbookResponseObject.add("customQuestions", customQuestions); + } + } + return guestbookResponseObject; + } + public static JsonObjectBuilder json(Guestbook guestbook) { JsonObjectBuilder guestbookObject = jsonObjectBuilder(); if (guestbook != null) { - guestbookObject.add("id", guestbook.getId()); + if (guestbook.getId() != null) { + guestbookObject.add("id", guestbook.getId()); + } guestbookObject.add("name", guestbook.getName()); guestbookObject.add("enabled", guestbook.isEnabled()); guestbookObject.add("emailRequired", guestbook.isEmailRequired()); @@ -429,15 +469,15 @@ public static JsonObjectBuilder json(Guestbook guestbook) { if (guestbook.getResponseCount() != null) { guestbookObject.add("responseCount", guestbook.getResponseCount()); } - JsonArrayBuilder customQuestions = Json.createArrayBuilder(); - if (guestbook.getCustomQuestions() != null) { + if (guestbook.getCustomQuestions() != null && !guestbook.getCustomQuestions().isEmpty()) { + JsonArrayBuilder customQuestions = Json.createArrayBuilder(); for (CustomQuestion cq : guestbook.getCustomQuestions()) { customQuestions.add(json(cq)); } + guestbookObject.add("customQuestions", customQuestions); } - guestbookObject.add("customQuestions", customQuestions); if (guestbook.getCreateTime() != null) { - guestbookObject.add("createTime", guestbook.getCreateTime().toString()); + guestbookObject.add("createTime", format(guestbook.getCreateTime())); } if (guestbook.getDataverse() != null) { guestbookObject.add("dataverseId", guestbook.getDataverse().getId()); @@ -447,7 +487,9 @@ public static JsonObjectBuilder json(Guestbook guestbook) { } public static JsonObjectBuilder json(CustomQuestion customQuestion) { JsonObjectBuilder customQuestionObject = jsonObjectBuilder(); - customQuestionObject.add("id", customQuestion.getId()); + if (customQuestion.getId() != null) { + customQuestionObject.add("id", customQuestion.getId()); + } customQuestionObject.add("question", customQuestion.getQuestionString()); customQuestionObject.add("required", customQuestion.isRequired()); customQuestionObject.add("displayOrder", customQuestion.getDisplayOrder()); @@ -457,7 +499,9 @@ public static JsonObjectBuilder json(CustomQuestion customQuestion) { JsonArrayBuilder customQuestionsValues = Json.createArrayBuilder(); for (CustomQuestionValue value : customQuestion.getCustomQuestionValues()) { JsonObjectBuilder customQuestionValueObject = jsonObjectBuilder(); - customQuestionValueObject.add("id", value.getId()); + if (value.getId() != null) { + customQuestionValueObject.add("id", value.getId()); + } customQuestionValueObject.add("value", value.getValueString()); customQuestionValueObject.add("displayOrder", value.getDisplayOrder()); customQuestionsValues.add(customQuestionValueObject); diff --git a/src/test/java/edu/harvard/iq/dataverse/api/FilesIT.java b/src/test/java/edu/harvard/iq/dataverse/api/FilesIT.java index ee823a5c1e5..a4d6d9a1ba4 100644 --- a/src/test/java/edu/harvard/iq/dataverse/api/FilesIT.java +++ b/src/test/java/edu/harvard/iq/dataverse/api/FilesIT.java @@ -4105,6 +4105,32 @@ public void testDownloadFileWithGuestbookResponse() throws IOException, JsonPars .statusCode(OK.getStatusCode()) .body("data[0].usageCount", is(1)) .body("data[0].responseCount", is(17)); + + // Test Get All Responses + Response guestbookListResponses = UtilIT.getGuestbooksResponses(guestbook.getId(), null, null, ownerApiToken); + guestbookListResponses.prettyPrint(); + guestbookListResponses.then().assertThat() + .statusCode(OK.getStatusCode()); + JsonPath jsonPath = JsonPath.from(guestbookListResponses.body().asString()); + int totalCount = jsonPath.getList("data.responses").size(); + + // Test Get Responses with pagination + int pages = 4; // total should be 17. set to 4 pages + int limit = (totalCount / pages) + 1; // should be 5 per page. we should see 5, 5, 5, 2 + int pagedTotalCount = 0; + int totalCountFromJson = 0; + for (int i = 0; i < pages; i++) { + int offset = limit * i; + guestbookListResponses = UtilIT.getGuestbooksResponses(guestbook.getId(), offset, limit, ownerApiToken); + guestbookListResponses.prettyPrint(); + jsonPath = JsonPath.from(guestbookListResponses.body().asString()); + pagedTotalCount += jsonPath.getList("data.responses").size(); + totalCountFromJson = jsonPath.getInt("data.pagination.totalResponses"); + // 'No duplicate ids' was manually verified. Just make sure the count is good. If there were duplicates the count would be high + } + // verify all counts are good and equal + assertEquals(totalCount, pagedTotalCount); + assertEquals(pagedTotalCount, totalCountFromJson); } @Test diff --git a/src/test/java/edu/harvard/iq/dataverse/api/GuestbooksIT.java b/src/test/java/edu/harvard/iq/dataverse/api/GuestbooksIT.java new file mode 100644 index 00000000000..e2483405270 --- /dev/null +++ b/src/test/java/edu/harvard/iq/dataverse/api/GuestbooksIT.java @@ -0,0 +1,86 @@ +package edu.harvard.iq.dataverse.api; + +import edu.harvard.iq.dataverse.Guestbook; +import edu.harvard.iq.dataverse.util.json.JsonParseException; +import edu.harvard.iq.dataverse.util.json.JsonParser; +import edu.harvard.iq.dataverse.util.json.JsonPrinter; +import edu.harvard.iq.dataverse.util.json.JsonUtil; +import io.restassured.path.json.JsonPath; +import io.restassured.response.Response; +import jakarta.json.JsonObject; +import org.junit.jupiter.api.Test; + +import java.io.IOException; + +import static jakarta.ws.rs.core.Response.Status.OK; +import static org.hamcrest.CoreMatchers.containsString; +import static org.junit.jupiter.api.Assertions.assertTrue; + +public class GuestbooksIT { + + @Test + public void testGuestbook() throws IOException, JsonParseException { + Response createResponse = UtilIT.createRandomUser(); + String apiToken = UtilIT.getApiTokenFromResponse(createResponse); + Response createDataverseResponse = UtilIT.createRandomDataverse(apiToken); + String dataverseAlias = UtilIT.getAliasFromResponse(createDataverseResponse); + Response createDatasetResponse = UtilIT.createRandomDatasetViaNativeApi(dataverseAlias, apiToken); + String datasetPid = JsonPath.from(createDatasetResponse.asString()).getString("data.persistentId"); + + // Test create Guestbook + Guestbook guestbook = UtilIT.createRandomGuestbook(dataverseAlias, datasetPid, apiToken); + + // Test get Guestbook + Response getGestbookResponse = UtilIT.getGuestbook(guestbook.getId(), apiToken); + getGestbookResponse.then().assertThat().statusCode(OK.getStatusCode()); + JsonObject data = JsonUtil.getJsonObject(getGestbookResponse.getBody().asString()); + String guestbookAsJson = data.getJsonObject("data").toString(); + + // Test Update Guestbook + guestbookAsJson = guestbookAsJson.replace("my test guestbook","my modified test guestbook") + .replace("positionRequired\":false", "positionRequired\": true") + .replace("displayOrder\":3}", "displayOrder\":3},{\"value\":\"Green\",\"displayOrder\":4}"); // add a new option (Green) + + Response updateGuestbookResponse = UtilIT.updateGuestbook(guestbook.getId(), guestbookAsJson, apiToken); + updateGuestbookResponse.then().assertThat().statusCode(OK.getStatusCode()); + + getGestbookResponse = UtilIT.getGuestbook(guestbook.getId(), apiToken); + getGestbookResponse.then().assertThat().statusCode(OK.getStatusCode()); + data = JsonUtil.getJsonObject(getGestbookResponse.getBody().asString()); + String newGuestbookAsJson = data.getJsonObject("data").toString(); + // verify changed fields are changed + assertTrue(newGuestbookAsJson.contains("my modified test guestbook")); + assertTrue(newGuestbookAsJson.contains("\"positionRequired\":true")); + // verify all custom question options are there plus the new one (Green) + assertTrue(newGuestbookAsJson.contains("\"value\":\"Red\"")); + assertTrue(newGuestbookAsJson.contains("\"value\":\"White\"")); + assertTrue(newGuestbookAsJson.contains("\"value\":\"Yellow\"")); + assertTrue(newGuestbookAsJson.contains("\"value\":\"Purple\"")); + assertTrue(newGuestbookAsJson.contains("\"value\":\"Green\"")); + + // Test remove a custom question + JsonParser jsonParser = new JsonParser(); + guestbook = new Guestbook(); + // use the json from the previous 'get' to parse + guestbook = jsonParser.parseGuestbook(data.getJsonObject("data"), guestbook); + // remove the first question + String firstQuestion = guestbook.getCustomQuestions().get(0).getQuestionString(); + String secondQuestion = guestbook.getCustomQuestions().get(1).getQuestionString(); + guestbook.getCustomQuestions().remove(0); + // get the json minus the removed question and call update + guestbookAsJson = JsonPrinter.json(guestbook).build().toString(); + updateGuestbookResponse = UtilIT.updateGuestbook(guestbook.getId(), guestbookAsJson, apiToken); + updateGuestbookResponse.then().assertThat() + .statusCode(OK.getStatusCode()); + String body = updateGuestbookResponse.getBody().asString(); + assertTrue(!body.contains(firstQuestion)); // verify first question is removed + assertTrue(body.contains(secondQuestion)); // verify second question is still there + + // Test disable Guestbook + updateGuestbookResponse = UtilIT.enableGuestbook(dataverseAlias, guestbook.getId(), apiToken, "false"); + updateGuestbookResponse.prettyPrint(); + updateGuestbookResponse.then().assertThat() + .statusCode(OK.getStatusCode()) + .body("data.message", containsString("enabled=false")); + } +} diff --git a/src/test/java/edu/harvard/iq/dataverse/api/UtilIT.java b/src/test/java/edu/harvard/iq/dataverse/api/UtilIT.java index 86df06b74b7..70ded3c795b 100644 --- a/src/test/java/edu/harvard/iq/dataverse/api/UtilIT.java +++ b/src/test/java/edu/harvard/iq/dataverse/api/UtilIT.java @@ -611,6 +611,13 @@ static Response getGuestbook(Long guestbookId, String apiToken) { return requestSpec.get("/api/guestbooks/" + guestbookId ); } + static Response updateGuestbook(Long guestbookId, String guestbookAsJson, String apiToken) { + RequestSpecification requestSpec = given() + .header(API_TOKEN_HTTP_HEADER, apiToken) + .body(guestbookAsJson); + return requestSpec.put("/api/guestbooks/" + guestbookId ); + } + static Response getGuestbooks(String dataverseAlias, String apiToken) { return getGuestbooks(dataverseAlias, apiToken, false,null); } @@ -627,6 +634,20 @@ static Response getGuestbooks(String dataverseAlias, String apiToken, boolean in return requestSpec.get("/api/guestbooks/" + dataverseAlias + "/list"); } + static Response getGuestbooksResponses(Long guestbookId, Integer offset, Integer limit, String apiToken) { + RequestSpecification requestSpec = given(); + if (apiToken != null) { + requestSpec.header(API_TOKEN_HTTP_HEADER, apiToken); + } + if (offset != null) { + requestSpec.queryParam("offset", offset); + } + if (limit != null) { + requestSpec.queryParam("limit", limit); + } + return requestSpec.get("/api/guestbooks/" + guestbookId + "/responses"); + } + static Response enableGuestbook(String dataverseAlias, Long guestbookId, String apiToken, String enable) { Response createGuestbookResponse = given() .header(API_TOKEN_HTTP_HEADER, apiToken) diff --git a/tests/integration-tests.txt b/tests/integration-tests.txt index c271657eaac..6932d330337 100644 --- a/tests/integration-tests.txt +++ b/tests/integration-tests.txt @@ -1 +1 @@ -DataversesIT,DatasetsIT,SwordIT,AdminIT,BuiltinUsersIT,UsersIT,UtilIT,ConfirmEmailIT,FileMetadataIT,FilesIT,SearchIT,InReviewWorkflowIT,HarvestingServerIT,HarvestingClientsIT,MoveIT,MakeDataCountApiIT,FileTypeDetectionIT,EditDDIIT,ExternalToolsIT,AccessIT,DuplicateFilesIT,DownloadFilesIT,LinkIT,DeleteUsersIT,DeactivateUsersIT,AuxiliaryFilesIT,InvalidCharactersIT,LicensesIT,NotificationsIT,BagIT,MetadataBlocksIT,NetcdfIT,SignpostingIT,FitsIT,LogoutIT,DataRetrieverApiIT,ProvIT,S3AccessIT,OpenApiIT,InfoIT,DatasetFieldsIT,SavedSearchIT,DatasetTypesIT,DataverseFeaturedItemsIT,SendFeedbackApiIT,CustomizationIT,JsonLDExportIT,WorkflowsIT,LDNInboxIT,LocalContextsIT,CorsIT +DataversesIT,DatasetsIT,SwordIT,AdminIT,BuiltinUsersIT,UsersIT,UtilIT,ConfirmEmailIT,FileMetadataIT,FilesIT,SearchIT,InReviewWorkflowIT,HarvestingServerIT,HarvestingClientsIT,MoveIT,MakeDataCountApiIT,FileTypeDetectionIT,EditDDIIT,ExternalToolsIT,AccessIT,DuplicateFilesIT,DownloadFilesIT,LinkIT,DeleteUsersIT,DeactivateUsersIT,AuxiliaryFilesIT,InvalidCharactersIT,LicensesIT,NotificationsIT,BagIT,MetadataBlocksIT,NetcdfIT,SignpostingIT,FitsIT,LogoutIT,DataRetrieverApiIT,ProvIT,S3AccessIT,OpenApiIT,InfoIT,DatasetFieldsIT,SavedSearchIT,DatasetTypesIT,DataverseFeaturedItemsIT,SendFeedbackApiIT,CustomizationIT,JsonLDExportIT,WorkflowsIT,LDNInboxIT,LocalContextsIT,CorsIT,GuestbooksIT