diff --git a/doc/release-notes/12008-is-in-review-state.md b/doc/release-notes/12008-is-in-review-state.md new file mode 100644 index 00000000000..f0162c328c4 --- /dev/null +++ b/doc/release-notes/12008-is-in-review-state.md @@ -0,0 +1 @@ +The APIs returning information about dataset versions (`/api/datasets/{id}/versions` and `/api/datasets/{id}/versions/{vid}`) now include an `isInReviewState` field indicating whether a specific version is currently under review. \ No newline at end of file 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 27b7a122c93..67788e8a15c 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 @@ -534,6 +534,7 @@ public static JsonObjectBuilder json(DatasetVersion dsv, List anonymized .add("internalVersionNumber", dsv.getVersion()) .add("versionMinorNumber", dsv.getMinorVersionNumber()) .add("versionState", dsv.getVersionState().name()) + .add("isInReviewState", dsv.isInReview()) .add("latestVersionPublishingState", dataset.getLatestVersion().getVersionState().name()) .add("deaccessionNote", dsv.getDeaccessionNote()) .add("deaccessionLink", dsv.getDeaccessionLink()) diff --git a/src/test/java/edu/harvard/iq/dataverse/api/DatasetsIT.java b/src/test/java/edu/harvard/iq/dataverse/api/DatasetsIT.java index b7cbb37480c..e424fed4ebd 100644 --- a/src/test/java/edu/harvard/iq/dataverse/api/DatasetsIT.java +++ b/src/test/java/edu/harvard/iq/dataverse/api/DatasetsIT.java @@ -1169,6 +1169,7 @@ public void testDatasetVersionsAPI() { datasetVersion.then().assertThat() .statusCode(OK.getStatusCode()) .body("data.versionState", equalTo("RELEASED")) + .body("data.isInReviewState", equalTo(false)) .body("data.latestVersionPublishingState", equalTo("RELEASED")); // Upload another file: @@ -1182,6 +1183,7 @@ public void testDatasetVersionsAPI() { datasetVersion.then().assertThat() .statusCode(OK.getStatusCode()) .body("data.versionState", equalTo("DRAFT")) + .body("data.isInReviewState", equalTo(false)) .body("data.latestVersionPublishingState", equalTo("DRAFT")); datasetVersion = UtilIT.getDatasetVersion(datasetPid, DS_VERSION_LATEST, apiTokenNoPerms, excludeFiles, includeDeaccessioned); @@ -1189,6 +1191,7 @@ public void testDatasetVersionsAPI() { datasetVersion.then().assertThat() .statusCode(OK.getStatusCode()) .body("data.versionState", equalTo("RELEASED")) + .body("data.isInReviewState", equalTo(false)) .body("data.latestVersionPublishingState", equalTo("DRAFT")); // We should now have a published version, and a draft. @@ -1215,6 +1218,7 @@ public void testDatasetVersionsAPI() { .statusCode(OK.getStatusCode()) .body("data.size()", equalTo(1)) .body("data.versionState[0]", equalTo("DRAFT")) + .body("data[0].isInReviewState", equalTo(false)) .body("data[0].files.size()", equalTo(2)); // And now call it with an un-privileged token, to make sure only one @@ -1224,6 +1228,7 @@ public void testDatasetVersionsAPI() { versionsResponse.then().assertThat() .statusCode(OK.getStatusCode()) .body("data.versionState[0]", not("DRAFT")) + .body("data[0].isInReviewState", equalTo(false)) .body("data.size()", equalTo(1)); // And now call the "short", no-files version of the same api @@ -1246,6 +1251,7 @@ public void testDatasetVersionsAPI() { datasetVersion.prettyPrint(); datasetVersion.then().assertThat().statusCode(OK.getStatusCode()) .body("data.versionState", equalTo("RELEASED")) + .body("data.isInReviewState", equalTo(false)) .body("data.files", equalTo(null)); //Latest published unauthorized token @@ -1254,6 +1260,7 @@ public void testDatasetVersionsAPI() { datasetVersion.prettyPrint(); datasetVersion.then().assertThat().statusCode(OK.getStatusCode()) .body("data.versionState", equalTo("RELEASED")) + .body("data.isInReviewState", equalTo(false)) .body("data.files", equalTo(null)); //Latest authorized token @@ -1262,6 +1269,7 @@ public void testDatasetVersionsAPI() { datasetVersion.prettyPrint(); datasetVersion.then().assertThat().statusCode(OK.getStatusCode()) .body("data.versionState", equalTo("DRAFT")) + .body("data.isInReviewState", equalTo(false)) .body("data.files", equalTo(null)); //Latest unauthorized token @@ -1270,6 +1278,7 @@ public void testDatasetVersionsAPI() { datasetVersion.prettyPrint(); datasetVersion.then().assertThat().statusCode(OK.getStatusCode()) .body("data.versionState", equalTo("RELEASED")) + .body("data.isInReviewState", equalTo(false)) .body("data.files", equalTo(null)); //Specific version authorized token @@ -1278,6 +1287,7 @@ public void testDatasetVersionsAPI() { datasetVersion.prettyPrint(); datasetVersion.then().assertThat().statusCode(OK.getStatusCode()) .body("data.versionState", equalTo("RELEASED")) + .body("data.isInReviewState", equalTo(false)) .body("data.files", equalTo(null)); //Specific version unauthorized token @@ -1286,6 +1296,7 @@ public void testDatasetVersionsAPI() { datasetVersion.prettyPrint(); datasetVersion.then().assertThat().statusCode(OK.getStatusCode()) .body("data.versionState", equalTo("RELEASED")) + .body("data.isInReviewState", equalTo(false)) .body("data.files", equalTo(null)); excludeFiles = false; @@ -1296,6 +1307,7 @@ public void testDatasetVersionsAPI() { datasetVersion.prettyPrint(); datasetVersion.then().assertThat().statusCode(OK.getStatusCode()) .body("data.versionState", equalTo("RELEASED")) + .body("data.isInReviewState", equalTo(false)) .body("data.files.size()", equalTo(1)); //Latest published unauthorized token @@ -1304,6 +1316,7 @@ public void testDatasetVersionsAPI() { datasetVersion.prettyPrint(); datasetVersion.then().assertThat().statusCode(OK.getStatusCode()) .body("data.versionState", equalTo("RELEASED")) + .body("data.isInReviewState", equalTo(false)) .body("data.files.size()", equalTo(1)); //Latest authorized token, user is authenticated should get the Draft version @@ -1312,6 +1325,7 @@ public void testDatasetVersionsAPI() { datasetVersion.prettyPrint(); datasetVersion.then().assertThat().statusCode(OK.getStatusCode()) .body("data.versionState", equalTo("DRAFT")) + .body("data.isInReviewState", equalTo(false)) .body("data.files.size()", equalTo(2)); //Latest unauthorized token, user has no permissions should get the latest Published version @@ -1320,6 +1334,7 @@ public void testDatasetVersionsAPI() { datasetVersion.prettyPrint(); datasetVersion.then().assertThat().statusCode(OK.getStatusCode()) .body("data.versionState", equalTo("RELEASED")) + .body("data.isInReviewState", equalTo(false)) .body("data.files.size()", equalTo(1)); //Specific version authorized token @@ -1328,6 +1343,7 @@ public void testDatasetVersionsAPI() { datasetVersion.prettyPrint(); datasetVersion.then().assertThat().statusCode(OK.getStatusCode()) .body("data.versionState", equalTo("RELEASED")) + .body("data.isInReviewState", equalTo(false)) .body("data.files.size()", equalTo(1)); //Specific version unauthorized token @@ -1336,6 +1352,7 @@ public void testDatasetVersionsAPI() { datasetVersion.prettyPrint(); datasetVersion.then().assertThat().statusCode(OK.getStatusCode()) .body("data.versionState", equalTo("RELEASED")) + .body("data.isInReviewState", equalTo(false)) .body("data.files.size()", equalTo(1)); //We deaccession the dataset @@ -1352,6 +1369,7 @@ public void testDatasetVersionsAPI() { datasetVersion.prettyPrint(); datasetVersion.then().assertThat().statusCode(OK.getStatusCode()) .body("data.versionState", equalTo("DEACCESSIONED")) + .body("data.isInReviewState", equalTo(false)) .body("data.files.size()", equalTo(1)); //Latest published requesting files, one version is DEACCESSIONED the second is DRAFT so shouldn't get any datasets @@ -1364,6 +1382,7 @@ public void testDatasetVersionsAPI() { datasetVersion.prettyPrint(); datasetVersion.then().assertThat().statusCode(OK.getStatusCode()) .body("data.versionState", equalTo("DRAFT")) + .body("data.isInReviewState", equalTo(false)) .body("data.files.size()", equalTo(2)); //Latest unauthorized token requesting files, one version is DEACCESSIONED the second is DRAFT so shouldn't get any datasets @@ -1376,6 +1395,7 @@ public void testDatasetVersionsAPI() { datasetVersion.prettyPrint(); datasetVersion.then().assertThat().statusCode(OK.getStatusCode()) .body("data.versionState", equalTo("DEACCESSIONED")) + .body("data.isInReviewState", equalTo(false)) .body("data.files.size()", equalTo(1)); //Specific version unauthorized token requesting files, one version is DEACCESSIONED the second is DRAFT so shouldn't get any datasets. @@ -1391,6 +1411,7 @@ public void testDatasetVersionsAPI() { datasetVersion.prettyPrint(); datasetVersion.then().assertThat().statusCode(OK.getStatusCode()) .body("data.versionState", equalTo("DEACCESSIONED")) + .body("data.isInReviewState", equalTo(false)) .body("data.files", equalTo(null)); //Latest published exclude files, should get the DEACCESSIONED version @@ -1399,6 +1420,7 @@ public void testDatasetVersionsAPI() { datasetVersion.prettyPrint(); datasetVersion.then().assertThat().statusCode(OK.getStatusCode()) .body("data.versionState", equalTo("DEACCESSIONED")) + .body("data.isInReviewState", equalTo(false)) .body("data.files", equalTo(null)); //Latest authorized token should get the DRAFT version with no files @@ -1407,6 +1429,7 @@ public void testDatasetVersionsAPI() { datasetVersion.prettyPrint(); datasetVersion.then().assertThat().statusCode(OK.getStatusCode()) .body("data.versionState", equalTo("DRAFT")) + .body("data.isInReviewState", equalTo(false)) .body("data.files", equalTo(null)); //Latest unauthorized token excluding files, one version is DEACCESSIONED the second is DRAFT so shouldn't get any datasets @@ -1415,6 +1438,7 @@ public void testDatasetVersionsAPI() { datasetVersion.prettyPrint(); datasetVersion.then().assertThat().statusCode(OK.getStatusCode()) .body("data.versionState", equalTo("DEACCESSIONED")) + .body("data.isInReviewState", equalTo(false)) .body("data.files", equalTo(null)); //Specific version authorized token @@ -1423,6 +1447,7 @@ public void testDatasetVersionsAPI() { datasetVersion.prettyPrint(); datasetVersion.then().assertThat().statusCode(OK.getStatusCode()) .body("data.versionState", equalTo("DEACCESSIONED")) + .body("data.isInReviewState", equalTo(false)) .body("data.files", equalTo(null)); //Specific version unauthorized token requesting files, one version is DEACCESSIONED the second is DRAFT so shouldn't get any datasets. @@ -1431,6 +1456,7 @@ public void testDatasetVersionsAPI() { datasetVersion.prettyPrint(); datasetVersion.then().assertThat().statusCode(OK.getStatusCode()) .body("data.versionState", equalTo("DEACCESSIONED")) + .body("data.isInReviewState", equalTo(false)) .body("data.files", equalTo(null)); //Set of test when we have a deaccessioned dataset but we don't include deaccessioned @@ -1453,6 +1479,7 @@ public void testDatasetVersionsAPI() { datasetVersion.prettyPrint(); datasetVersion.then().assertThat().statusCode(OK.getStatusCode()) .body("data.versionState", equalTo("DRAFT")) + .body("data.isInReviewState", equalTo(false)) .body("data.files.size()", equalTo(2)); //Latest unauthorized token one version is DEACCESSIONED the second is DRAFT so shouldn't get any datasets @@ -1487,6 +1514,7 @@ public void testDatasetVersionsAPI() { datasetVersion.prettyPrint(); datasetVersion.then().assertThat().statusCode(OK.getStatusCode()) .body("data.versionState", equalTo("DRAFT")) + .body("data.isInReviewState", equalTo(false)) .body("data.files", equalTo(null)); //Latest unauthorized token one version is DEACCESSIONED the second is DRAFT so shouldn't get any datasets @@ -1503,6 +1531,28 @@ public void testDatasetVersionsAPI() { datasetVersion = UtilIT.getDatasetVersion(datasetPid, specificVersion, apiTokenNoPerms, excludeFiles, includeDeaccessioned); datasetVersion.prettyPrint(); datasetVersion.then().assertThat().statusCode(NOT_FOUND.getStatusCode()); + + // Now we request review for the dataset, and check that this is reflected in the API responses + + Response submitForReview = UtilIT.submitDatasetForReview(datasetPid, apiToken); + submitForReview.prettyPrint(); + submitForReview.then().assertThat() + .statusCode(OK.getStatusCode()); + + datasetVersion = UtilIT.getDatasetVersion(datasetPid, DS_VERSION_LATEST, apiToken); + datasetVersion.prettyPrint(); + datasetVersion.then().assertThat() + .statusCode(OK.getStatusCode()) + .body("data.versionState", equalTo("DRAFT")) + .body("data.isInReviewState", equalTo(true)) + .body("data.latestVersionPublishingState", equalTo("DRAFT")); + + versionsResponse = UtilIT.getDatasetVersions(datasetPid, apiToken); + versionsResponse.prettyPrint(); + versionsResponse.then().assertThat() + .statusCode(OK.getStatusCode()) + .body("data.versionState[0]", equalTo("DRAFT")) + .body("data[0].isInReviewState", equalTo(true)); }