diff --git a/doc/release-notes/11588-search-api-doesnt-return-image-url.md b/doc/release-notes/11588-search-api-doesnt-return-image-url.md new file mode 100644 index 00000000000..6d0a474281c --- /dev/null +++ b/doc/release-notes/11588-search-api-doesnt-return-image-url.md @@ -0,0 +1,4 @@ +## BUG ## +Search API doesn't return image_url after newly created dataset is published. + +The Dataset thumbnail will be created automatically when a Dataset is published under the following conditions: The Dataset has no existing thumbnail; The Dataset has image files that can be converted to a thumbnail; The Feature Flag "disable-dataset-thumbnail-autoselect" is not enabled; diff --git a/src/main/java/edu/harvard/iq/dataverse/Dataset.java b/src/main/java/edu/harvard/iq/dataverse/Dataset.java index 71686adbc4b..39dccdcd4ea 100644 --- a/src/main/java/edu/harvard/iq/dataverse/Dataset.java +++ b/src/main/java/edu/harvard/iq/dataverse/Dataset.java @@ -763,6 +763,10 @@ public void setThumbnailFile(DataFile thumbnailFile) { this.thumbnailFile = thumbnailFile; } + public String getThumbnailUrl() { + return thumbnailFile != null ? SystemConfig.getDataverseSiteUrlStatic() + "/api/datasets/" + this.getId() + "/logo" : null; + } + public boolean isUseGenericThumbnail() { return useGenericThumbnail; } diff --git a/src/main/java/edu/harvard/iq/dataverse/DatasetVersionServiceBean.java b/src/main/java/edu/harvard/iq/dataverse/DatasetVersionServiceBean.java index a5dd724104f..dcc9995ef35 100644 --- a/src/main/java/edu/harvard/iq/dataverse/DatasetVersionServiceBean.java +++ b/src/main/java/edu/harvard/iq/dataverse/DatasetVersionServiceBean.java @@ -35,7 +35,6 @@ import jakarta.json.JsonObjectBuilder; import jakarta.persistence.EntityManager; import jakarta.persistence.NoResultException; -import jakarta.persistence.OptimisticLockException; import jakarta.persistence.PersistenceContext; import jakarta.persistence.Query; import jakarta.persistence.TypedQuery; @@ -892,7 +891,7 @@ public Long getThumbnailByVersionId(Long versionId) { if (thumbnailFileId != null) { logger.fine("obtained file id: " + thumbnailFileId); - DataFile thumbnailFile = datafileService.find(thumbnailFileId); + DataFile thumbnailFile = getDataFileById(thumbnailFileId); if (thumbnailFile != null) { if (datafileService.isThumbnailAvailable(thumbnailFile)) { assignDatasetThumbnailByNativeQuery(versionId, thumbnailFileId); @@ -925,7 +924,7 @@ public Long getThumbnailByVersionId(Long versionId) { } if (thumbnailFileId != null) { - DataFile thumbnailFile = datafileService.find(thumbnailFileId); + DataFile thumbnailFile = getDataFileById(thumbnailFileId); if (thumbnailFile != null) { if (datafileService.isThumbnailAvailable(thumbnailFile)) { assignDatasetThumbnailByNativeQuery(versionId, thumbnailFileId); @@ -937,7 +936,11 @@ public Long getThumbnailByVersionId(Long versionId) { } return null; } - + + public DataFile getDataFileById(Long id) { + return datafileService.find(id); + } + private void assignDatasetThumbnailByNativeQuery(Long versionId, Long dataFileId) { try { em.createNativeQuery("UPDATE dataset SET thumbnailfile_id=" + dataFileId + " WHERE id in (SELECT dataset_id FROM datasetversion WHERE id=" + versionId + ")").executeUpdate(); diff --git a/src/main/java/edu/harvard/iq/dataverse/ThumbnailServiceWrapper.java b/src/main/java/edu/harvard/iq/dataverse/ThumbnailServiceWrapper.java index 46736da73d4..eca3f470938 100644 --- a/src/main/java/edu/harvard/iq/dataverse/ThumbnailServiceWrapper.java +++ b/src/main/java/edu/harvard/iq/dataverse/ThumbnailServiceWrapper.java @@ -208,11 +208,11 @@ public String getDatasetCardImageAsUrl(Dataset dataset, Long versionId, boolean // If no other logo we attempt to auto-select via the optimized, native // query-based method // from the DatasetVersionService: - if (!hasDatasetLogo && datasetVersionService.getThumbnailByVersionId(versionId) == null) { + if (!hasDatasetLogo && (!autoselect || datasetVersionService.getThumbnailByVersionId(versionId) == null)) { return null; } } - String url = SystemConfig.getDataverseSiteUrlStatic() + "/api/datasets/" + dataset.getId() + "/logo"; + String url = dataset.getThumbnailUrl(); logger.fine("getDatasetCardImageAsUrl: " + url); this.dvobjectThumbnailsMap.put(datasetId,url); return url; diff --git a/src/main/java/edu/harvard/iq/dataverse/engine/command/impl/FinalizeDatasetPublicationCommand.java b/src/main/java/edu/harvard/iq/dataverse/engine/command/impl/FinalizeDatasetPublicationCommand.java index 51e37efe2b2..be47861316f 100644 --- a/src/main/java/edu/harvard/iq/dataverse/engine/command/impl/FinalizeDatasetPublicationCommand.java +++ b/src/main/java/edu/harvard/iq/dataverse/engine/command/impl/FinalizeDatasetPublicationCommand.java @@ -171,7 +171,16 @@ public Dataset execute(CommandContext ctxt) throws CommandException { //Use dataset pub date (which may not be the current date for migrated datasets) updateFiles(new Timestamp(version.getReleaseTime().getTime()), ctxt); - + + // Populate thumbnail if needed and allowed + if (theDataset.getThumbnailFile() == null && !theDataset.isUseGenericThumbnail()) { + Long thumbnailFileId = ctxt.datasetVersion().getThumbnailByVersionId(version.getId()); + if (thumbnailFileId != null) { + theDataset.setThumbnailFile(ctxt.datasetVersion().getDataFileById(thumbnailFileId)); + logger.info("Setting default thumbnail " + theDataset.getThumbnailUrl()); + } + } + // // TODO: Not sure if this .merge() is necessary here - ? // I'm moving a bunch of code from PublishDatasetCommand here; and this .merge() 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..8f975a3c976 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 @@ -551,6 +551,7 @@ public static JsonObjectBuilder json(Dataset ds, Boolean returnOwners) { .add("separator", ds.getSeparator()) .add("publisher", BrandingUtil.getInstallationBrandName()) .add("publicationDate", ds.getPublicationDateFormattedYYYYMMDD()) + .add("image_url", ds.getThumbnailUrl()) .add("storageIdentifier", ds.getStorageIdentifier()); if (ds.getGuestbook() != null) { bld.add("guestbookId", ds.getGuestbook().getId()); diff --git a/src/test/java/edu/harvard/iq/dataverse/api/DataRetrieverApiIT.java b/src/test/java/edu/harvard/iq/dataverse/api/DataRetrieverApiIT.java index 4e5a8cfada4..016fd5e3075 100644 --- a/src/test/java/edu/harvard/iq/dataverse/api/DataRetrieverApiIT.java +++ b/src/test/java/edu/harvard/iq/dataverse/api/DataRetrieverApiIT.java @@ -21,7 +21,6 @@ import static org.hamcrest.CoreMatchers.equalTo; import static org.hamcrest.CoreMatchers.startsWith; import static org.junit.jupiter.api.Assertions.*; -import org.junit.jupiter.api.Disabled; public class DataRetrieverApiIT { @@ -78,7 +77,7 @@ public void testRetrieveMyDataAsJsonString() throws InterruptedException { Response createDatasetResponse = UtilIT.createRandomDatasetViaNativeApi(dataverseAlias, normalUserApiToken); createDatasetResponse.prettyPrint(); Integer datasetId = UtilIT.getDatasetIdFromResponse(createDatasetResponse); - UtilIT.sleepForReindex(datasetId.toString(), normalUserApiToken, 4); + UtilIT.sleepForDatasetIndex(datasetId.toString(), normalUserApiToken); Response oneDatasetResponse = UtilIT.retrieveMyDataAsJsonString(normalUserApiToken, "", new ArrayList<>(Arrays.asList(6L))); assertEquals(OK.getStatusCode(), oneDatasetResponse.getStatusCode()); JsonPath jsonPathOneDataset = oneDatasetResponse.getBody().jsonPath(); @@ -277,13 +276,13 @@ public void testRetrieveMyDataAsJsonStringSortOrder() { createDatasetOneResponse.prettyPrint(); Integer datasetOneId = UtilIT.getDatasetIdFromResponse(createDatasetOneResponse); String datasetOnePid = UtilIT.getDatasetPersistentIdFromResponse(createDatasetOneResponse); - UtilIT.sleepForReindex(datasetOneId.toString(), userApiToken, 4); + UtilIT.sleepForDatasetIndex(datasetOneId.toString(), userApiToken); Response createDatasetTwoResponse = UtilIT.createRandomDatasetViaNativeApi(dataverseAlias, userApiToken); createDatasetTwoResponse.prettyPrint(); Integer datasetTwoId = UtilIT.getDatasetIdFromResponse(createDatasetTwoResponse); String datasetTwoPid = UtilIT.getDatasetPersistentIdFromResponse(createDatasetTwoResponse); - UtilIT.sleepForReindex(datasetTwoId.toString(), userApiToken, 4); + UtilIT.sleepForDatasetIndex(datasetTwoId.toString(), userApiToken); // Request datasets belonging to user Response twoDatasetsInReviewResponse = UtilIT.retrieveMyDataAsJsonString(userApiToken, "", new ArrayList<>(Arrays.asList(6L))); @@ -301,13 +300,13 @@ public void testRetrieveMyDataAsJsonStringSortOrder() { Response publishDatasetOne = UtilIT.publishDatasetViaNativeApi(datasetOneId, "major", superUserApiToken); publishDatasetOne.prettyPrint(); publishDatasetOne.then().assertThat().statusCode(OK.getStatusCode()); - UtilIT.sleepForReindex(datasetOneId.toString(), userApiToken, 4); + UtilIT.sleepForDatasetIndex(datasetOneId.toString(), userApiToken); // Publish dataset 2 Response publishDatasetTwo = UtilIT.publishDatasetViaNativeApi(datasetTwoId, "major", superUserApiToken); publishDatasetTwo.prettyPrint(); publishDatasetTwo.then().assertThat().statusCode(OK.getStatusCode()); - UtilIT.sleepForReindex(datasetTwoId.toString(), userApiToken, 4); + UtilIT.sleepForDatasetIndex(datasetTwoId.toString(), userApiToken); // Request datasets belonging to user Response twoPublishedDatasetsResponse = UtilIT.retrieveMyDataAsJsonString(userApiToken, "", new ArrayList<>(Arrays.asList(6L))); @@ -326,7 +325,7 @@ public void testRetrieveMyDataAsJsonStringSortOrder() { Response addDataToPublishedVersion = UtilIT.addDatasetMetadataViaNative(datasetOnePid, pathToJsonFilePostPub, userApiToken); addDataToPublishedVersion.prettyPrint(); addDataToPublishedVersion.then().assertThat().statusCode(OK.getStatusCode()); - UtilIT.sleepForReindex(datasetOneId.toString(), userApiToken, 4); + UtilIT.sleepForDatasetIndex(datasetOneId.toString(), userApiToken); // Request datasets belonging to user Response twoPublishedDatasetsOneDraftResponse = UtilIT.retrieveMyDataAsJsonString(userApiToken, "", new ArrayList<>(Arrays.asList(6L))); @@ -350,7 +349,7 @@ public void testRetrieveMyDataAsJsonStringSortOrder() { Response uploadImage = UtilIT.uploadFileViaNative(datasetTwoId.toString(), pathToFile, userApiToken); uploadImage.prettyPrint(); uploadImage.then().assertThat().statusCode(OK.getStatusCode()); - UtilIT.sleepForReindex(datasetTwoId.toString(), userApiToken, 4); + UtilIT.sleepForDatasetIndex(datasetTwoId.toString(), userApiToken); // Request datasets belonging to user Response twoPublishedDatasetsTwoDraftsResponse = UtilIT.retrieveMyDataAsJsonString(userApiToken, "", new ArrayList<>(Arrays.asList(6L))); @@ -373,7 +372,7 @@ public void testRetrieveMyDataAsJsonStringSortOrder() { Response publishDatasetOneMinor = UtilIT.publishDatasetViaNativeApi(datasetOneId, "minor", superUserApiToken); publishDatasetOneMinor.prettyPrint(); publishDatasetOneMinor.then().assertThat().statusCode(OK.getStatusCode()); - UtilIT.sleepForReindex(datasetOneId.toString(), userApiToken, 4); + UtilIT.sleepForDatasetIndex(datasetOneId.toString(), userApiToken); // Request datasets belonging to user Response oneMinorOneMajorOneDraftDatasetResponse = UtilIT.retrieveMyDataAsJsonString(userApiToken, "", new ArrayList<>(Arrays.asList(6L))); @@ -429,7 +428,7 @@ public void testRetrieveMyDataWithMetadataFields() { Response createDatasetResponse = UtilIT.createRandomDatasetViaNativeApi(dataverseAlias, apiToken); String datasetId = UtilIT.getDatasetIdFromResponse(createDatasetResponse).toString(); - UtilIT.sleepForReindex(datasetId, apiToken, 5); + UtilIT.sleepForDatasetIndex(datasetId, apiToken); Response myDataWithAuthor = UtilIT.retrieveMyDataAsJsonString(apiToken, "", new ArrayList<>(Arrays.asList(6L)), "&metadata_fields=citation:author"); myDataWithAuthor.prettyPrint(); @@ -482,7 +481,7 @@ public void testRetrieveMyDataWithCollections() { UtilIT.publishDatasetViaNativeApi(datasetId, "major", apiToken).then().assertThat().statusCode(OK.getStatusCode()); - UtilIT.sleepForReindex(datasetPid, apiToken, 5); + UtilIT.sleepForDatasetIndex(datasetPid, apiToken); // Test that the Dataverse collection that the dataset was created in is returned Response myDataResponse = UtilIT.retrieveMyDataAsJsonString(apiToken, "", new ArrayList<>(Arrays.asList(6L)), "&show_collections=true"); @@ -506,7 +505,7 @@ public void testRetrieveMyDataWithCollections() { UtilIT.linkDataset(datasetPid, dataverse2Alias, apiToken).then().assertThat().statusCode(OK.getStatusCode()); - UtilIT.sleepForReindex(String.valueOf(datasetId), apiToken, 5); + UtilIT.sleepForDatasetIndex(String.valueOf(datasetId), apiToken); // Test that the Dataverse collection that the dataset was linked to is also returned myDataResponse = UtilIT.retrieveMyDataAsJsonString(apiToken, "", new ArrayList<>(Arrays.asList(6L)), "&show_collections=true"); diff --git a/src/test/java/edu/harvard/iq/dataverse/api/SearchIT.java b/src/test/java/edu/harvard/iq/dataverse/api/SearchIT.java index 606088e2bd2..f109ec98b99 100644 --- a/src/test/java/edu/harvard/iq/dataverse/api/SearchIT.java +++ b/src/test/java/edu/harvard/iq/dataverse/api/SearchIT.java @@ -37,8 +37,8 @@ import static java.lang.Thread.sleep; import java.nio.file.Path; import java.nio.file.Paths; -import static org.hamcrest.CoreMatchers.equalTo; -import static org.hamcrest.CoreMatchers.is; + +import static org.hamcrest.CoreMatchers.*; import static org.junit.jupiter.api.Assertions.assertEquals; import static org.junit.jupiter.api.Assertions.assertFalse; import static org.junit.jupiter.api.Assertions.assertNotEquals; @@ -786,7 +786,7 @@ public void testIdentifier() { System.out.println("identifier: " + identifier); String searchPart = identifier.replace("FK2/", ""); - UtilIT.sleepForReindex(String.valueOf(datasetId), apiToken, 5); + UtilIT.sleepForDatasetIndex(String.valueOf(datasetId), apiToken); Response searchUnpublished = UtilIT.search(searchPart, apiToken); searchUnpublished.prettyPrint(); searchUnpublished.then().assertThat() @@ -802,7 +802,7 @@ public void testIdentifier() { .statusCode(OK.getStatusCode()); searchPart = identifier.replace("FK2/", ""); - UtilIT.sleepForReindex(String.valueOf(datasetId), apiToken, 5); + UtilIT.sleepForDatasetIndex(String.valueOf(datasetId), apiToken); Response searchTargeted = UtilIT.search("dsPersistentId:" + searchPart, apiToken); searchTargeted.prettyPrint(); searchTargeted.then().assertThat() @@ -896,7 +896,7 @@ public void testNestedSubtree() { Response publishDataset = UtilIT.publishDatasetViaNativeApi(datasetPid, "major", apiToken); publishDataset.then().assertThat() .statusCode(OK.getStatusCode()); - UtilIT.sleepForReindex(datasetPid, apiToken, 5); + UtilIT.sleepForDatasetIndex(datasetPid, apiToken); assertTrue(UtilIT.sleepForSearch(searchPart, apiToken, "&subtree=" + dataverseAlias, 2, UtilIT.GENERAL_LONG_DURATION), "Did not find 2 children"); assertTrue(UtilIT.sleepForSearch(searchPart, apiToken, "&subtree=" + dataverseAlias2, 1, UtilIT.GENERAL_LONG_DURATION), "Did not find 1 child"); } @@ -992,7 +992,7 @@ public void testSubtreePermissions() { .statusCode(OK.getStatusCode()); // Wait a little while for the index to pick up the datasets, otherwise timing issue with searching for it. - UtilIT.sleepForReindex(datasetId2.toString(), apiToken, 3); + UtilIT.sleepForDatasetIndex(datasetId2.toString(), apiToken); String identifier = JsonPath.from(datasetAsJson.getBody().asString()).getString("data.identifier"); String identifier2 = JsonPath.from(datasetAsJson2.getBody().asString()).getString("data.identifier"); @@ -1035,14 +1035,14 @@ public void testSubtreePermissions() { // TODO: investigate if this is a bug that nothing was found. .body("data.total_count", CoreMatchers.equalTo(0)); - UtilIT.sleepForReindex(String.valueOf(datasetId), apiToken, 5); + UtilIT.sleepForDatasetIndex(String.valueOf(datasetId), apiToken); Response searchUnpublishedRootSubtreeForDataset = UtilIT.search(identifier.replace("FK2/", ""), apiToken, "&subtree=root"); searchUnpublishedRootSubtreeForDataset.prettyPrint(); searchUnpublishedRootSubtreeForDataset.then().assertThat() .statusCode(OK.getStatusCode()) .body("data.total_count", CoreMatchers.equalTo(1)); - UtilIT.sleepForReindex(String.valueOf(datasetId), apiToken, 5); + UtilIT.sleepForDatasetIndex(String.valueOf(datasetId), apiToken); Response searchUnpublishedRootSubtreeForDatasetNoAPI = UtilIT.search(identifier.replace("FK2/", ""), null, "&subtree=root"); searchUnpublishedRootSubtreeForDatasetNoAPI.prettyPrint(); searchUnpublishedRootSubtreeForDatasetNoAPI.then().assertThat() @@ -1050,14 +1050,14 @@ public void testSubtreePermissions() { // TODO: investigate if this is a bug that nothing was found. .body("data.total_count", CoreMatchers.equalTo(0)); - UtilIT.sleepForReindex(String.valueOf(datasetId), apiToken, 5); + UtilIT.sleepForDatasetIndex(String.valueOf(datasetId), apiToken); Response searchUnpublishedNoSubtreeForDataset = UtilIT.search(identifier.replace("FK2/", ""), apiToken, ""); searchUnpublishedNoSubtreeForDataset.prettyPrint(); searchUnpublishedNoSubtreeForDataset.then().assertThat() .statusCode(OK.getStatusCode()) .body("data.total_count", CoreMatchers.equalTo(1)); - UtilIT.sleepForReindex(String.valueOf(datasetId), apiToken, 5); + UtilIT.sleepForDatasetIndex(String.valueOf(datasetId), apiToken); Response searchUnpublishedNoSubtreeForDatasetNoAPI = UtilIT.search(identifier.replace("FK2/", ""), null, ""); searchUnpublishedNoSubtreeForDatasetNoAPI.prettyPrint(); searchUnpublishedNoSubtreeForDatasetNoAPI.then().assertThat() @@ -1109,14 +1109,14 @@ public void testSubtreePermissions() { .statusCode(OK.getStatusCode()) .body("data.total_count", CoreMatchers.equalTo(2)); - UtilIT.sleepForReindex(String.valueOf(datasetId), apiToken, 5); + UtilIT.sleepForDatasetIndex(String.valueOf(datasetId), apiToken); Response searchPublishedRootSubtreeForDataset = UtilIT.search(identifier.replace("FK2/", ""), apiToken, "&subtree=root"); searchPublishedRootSubtreeForDataset.prettyPrint(); searchPublishedRootSubtreeForDataset.then().assertThat() .statusCode(OK.getStatusCode()) .body("data.total_count", CoreMatchers.equalTo(1)); - UtilIT.sleepForReindex(String.valueOf(datasetId), apiToken, 5); + UtilIT.sleepForDatasetIndex(String.valueOf(datasetId), apiToken); Response searchPublishedRootSubtreeForDatasetNoAPI = UtilIT.search(identifier.replace("FK2/", ""), null, "&subtree=root"); searchPublishedRootSubtreeForDatasetNoAPI.prettyPrint(); searchPublishedRootSubtreeForDatasetNoAPI.then().assertThat() @@ -1672,7 +1672,7 @@ public void testDataverseDatasetCounts() throws InterruptedException { Response publishDataset = UtilIT.publishDatasetViaNativeApi(datasetPid, "major", apiToken); publishDataset.then().assertThat() .statusCode(OK.getStatusCode()); - UtilIT.sleepForReindex(datasetPid, apiToken, 5); + UtilIT.sleepForDatasetIndex(datasetPid, apiToken); // Wait for reindex of dataverse after publishing String searchDataverseWithDatasetQuery = "identifier:" + dataverseAlias + " AND datasetCount:1"; @@ -1918,7 +1918,7 @@ public void testDataverseDatasetCounts() throws InterruptedException { Response publishGrandchildDataset = UtilIT.publishDatasetViaNativeApi(grandchildDatasetPid, "major", apiToken); publishGrandchildDataset.then().assertThat() .statusCode(OK.getStatusCode()); - UtilIT.sleepForReindex(grandchildDatasetPid, apiToken, 5); + UtilIT.sleepForDatasetIndex(grandchildDatasetPid, apiToken); // Wait for reindex of dataverse after publishing String searchDataverseWithGrandchildDatasetQuery = "identifier:" + dataverseAlias4 + " AND datasetCount:1"; @@ -2095,7 +2095,7 @@ public void testShowTypeCounts() throws InterruptedException { // This call forces a wait for dataset indexing to finish and gives time for file uploads to complete UtilIT.search("id:dataset_" + datasetId, apiToken); - UtilIT.sleepForReindex(datasetId, apiToken, 3); + UtilIT.sleepForDatasetIndex(datasetId, apiToken); } // Test Search without show_type_counts @@ -2314,7 +2314,7 @@ public void testShowCollections() { UtilIT.linkDataset(datasetPid, dataverse2Alias, apiToken).then().assertThat().statusCode(OK.getStatusCode()); - UtilIT.sleepForReindex(String.valueOf(datasetId), apiToken, 5); + UtilIT.sleepForDatasetIndex(String.valueOf(datasetId), apiToken); // Test that the Dataverse collection that the dataset was linked to is also returned searchResponse = UtilIT.search("*", apiToken, "&subtree=" + dataverseAlias + "&type=dataset&show_collections=true"); @@ -2422,4 +2422,58 @@ public void testFileAddedAfterPublicationIsIndexed() { .statusCode(OK.getStatusCode()); } + @Test + public void testWithThumbnailAutoSelect() { + Response createUser = UtilIT.createRandomUser(); + createUser.prettyPrint(); + createUser.then().assertThat().statusCode(OK.getStatusCode()); + String apiToken = UtilIT.getApiTokenFromResponse(createUser); + + Response createDataverseResponse = UtilIT.createRandomDataverse(apiToken); + createDataverseResponse.prettyPrint(); + createDataverseResponse.then().assertThat().statusCode(CREATED.getStatusCode()); + String dataverseAlias = UtilIT.getAliasFromResponse(createDataverseResponse); + UtilIT.publishDataverseViaNativeApi(dataverseAlias, apiToken); + + Response createDatasetResponse = UtilIT.createRandomDatasetViaNativeApi(dataverseAlias, apiToken); + createDatasetResponse.prettyPrint(); + createDatasetResponse.then().assertThat().statusCode(CREATED.getStatusCode()); + Integer datasetId = UtilIT.getDatasetIdFromResponse(createDatasetResponse); + String persistentId = UtilIT.getDatasetPersistentIdFromResponse(createDatasetResponse); + + uploadFile(datasetId, "src/test/resources/tab/test.tab", apiToken); + uploadFile(datasetId, "src/main/webapp/resources/images/dataverse-icon-1200.png", apiToken); + uploadFile(datasetId, "src/main/webapp/resources/images/dataverseproject.png", apiToken); + Response publishResponse = UtilIT.publishDatasetViaNativeApi(datasetId, "major", apiToken); + publishResponse.prettyPrint(); + publishResponse.then().assertThat().statusCode(OK.getStatusCode()); + UtilIT.sleepForDatasetIndex(datasetId.toString(), apiToken); + + Response search1 = UtilIT.search("id:dataset_" + datasetId, apiToken); + search1.prettyPrint(); + search1.then().assertThat() + .body("data.items[0].name", equalTo("Darwin's Finches")) + .body("data.items[0].image_url", notNullValue()) + .statusCode(OK.getStatusCode()); + + Response getDatasetResponse = UtilIT.getDatasetWithOwners(persistentId, apiToken, false); + getDatasetResponse.prettyPrint(); + getDatasetResponse.then().assertThat() + .body("data.image_url", notNullValue()) + .statusCode(OK.getStatusCode()); + } + + private long uploadFile(Integer datasetId, String pathToFile, String apiToken) { + JsonObjectBuilder json = Json.createObjectBuilder() + .add("description", "Test Data") + .add("directoryLabel", "data/subdir1") + .add("categories", Json.createArrayBuilder() + .add("Data") + ); + Response addResponse = UtilIT.uploadFileViaNative(datasetId.toString(), pathToFile, json.build(), apiToken); + addResponse.prettyPrint(); + addResponse.then().assertThat().statusCode(OK.getStatusCode()); + assertTrue(UtilIT.sleepForLock(datasetId.longValue(), "Ingest", apiToken, UtilIT.MAXIMUM_INGEST_LOCK_DURATION), "Failed test if Ingest Lock exceeds max duration " + pathToFile); + return UtilIT.getDataFileIdFromResponse(addResponse); + } } 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..2c0e25cc3cf 100644 --- a/src/test/java/edu/harvard/iq/dataverse/api/UtilIT.java +++ b/src/test/java/edu/harvard/iq/dataverse/api/UtilIT.java @@ -2674,16 +2674,17 @@ static Response search(String query, String apiToken, String parameterString) { return requestSpecification.get("/api/search?q=" + query + parameterString); } - private static void sleepForDatasetIndex(String query, String apiToken) { + static void sleepForDatasetIndex(String query, String apiToken) { + String id = query; if (query.contains("id:dataset") || query.contains("id:datafile")) { String[] splitted = query.split("_"); if (splitted.length >= 2) { - boolean ok = UtilIT.sleepForReindex(String.valueOf(splitted[1]), apiToken, 5); - if (!ok) { - logger.info("Still indexing after 5 seconds"); - } + id = splitted[1]; } } + if (!UtilIT.sleepForReindex(id, apiToken, 10)) { + logger.warning("Still indexing after 10 seconds"); + } } static Response search(String query, String apiToken) {