From 27a21a11ca4bbd72b8cc791989c837f40181591f Mon Sep 17 00:00:00 2001 From: Stephen Kraffmiller Date: Fri, 22 May 2020 15:23:52 -0400 Subject: [PATCH 1/3] #5886 Allow unpublished, but harvested ds's tobe linked --- .../command/impl/LinkDatasetCommand.java | 4 +- src/main/java/propertyFiles/Bundle.properties | 1 + .../harvard/iq/dataverse/api/DatasetsIT.java | 124 +++++++++++++++++- 3 files changed, 126 insertions(+), 3 deletions(-) diff --git a/src/main/java/edu/harvard/iq/dataverse/engine/command/impl/LinkDatasetCommand.java b/src/main/java/edu/harvard/iq/dataverse/engine/command/impl/LinkDatasetCommand.java index fa81abfd0e3..18eec164a2a 100644 --- a/src/main/java/edu/harvard/iq/dataverse/engine/command/impl/LinkDatasetCommand.java +++ b/src/main/java/edu/harvard/iq/dataverse/engine/command/impl/LinkDatasetCommand.java @@ -41,8 +41,8 @@ public LinkDatasetCommand(DataverseRequest aRequest, Dataverse dataverse, Datase @Override public DatasetLinkingDataverse execute(CommandContext ctxt) throws CommandException { - if (!linkedDataset.isReleased()) { - throw new IllegalCommandException(BundleUtil.getStringFromBundle("dataset.link.not.published"), this); + if (!linkedDataset.isReleased() && !linkedDataset.isHarvested()) { + throw new IllegalCommandException(BundleUtil.getStringFromBundle("dataset.link.not.available"), this); } if (linkedDataset.getOwner().equals(linkingDataverse)) { throw new IllegalCommandException(BundleUtil.getStringFromBundle("dataset.link.not.to.owner"), this); diff --git a/src/main/java/propertyFiles/Bundle.properties b/src/main/java/propertyFiles/Bundle.properties index 181f26446cb..1a5019318f1 100755 --- a/src/main/java/propertyFiles/Bundle.properties +++ b/src/main/java/propertyFiles/Bundle.properties @@ -753,6 +753,7 @@ dataset.link.save=Save Linked Dataset dataset.link.not.to.owner=Can't link a dataset to its dataverse dataset.link.not.to.parent.dataverse=Can't link a dataset to its parent dataverses dataset.link.not.published=Can't link a dataset that has not been published +dataset.link.not.available=Can't link a dataset that has not been published or is not harvested dataverse.link.dataverse.choose=Choose which of your dataverses you would like to link this dataverse to. dataverse.link.dataset.choose=Enter the name of the dataverse you would like to link this dataset to. If you need to remove this link in the future, please contact {0}. dataverse.link.dataset.none=No linkable dataverses available. 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 65b6d9c5ba9..6a31051a43b 100644 --- a/src/test/java/edu/harvard/iq/dataverse/api/DatasetsIT.java +++ b/src/test/java/edu/harvard/iq/dataverse/api/DatasetsIT.java @@ -26,14 +26,15 @@ import edu.harvard.iq.dataverse.authorization.users.PrivateUrlUser; import edu.harvard.iq.dataverse.settings.SettingsServiceBean; import java.util.UUID; -import static javax.ws.rs.core.Response.Status.NO_CONTENT; import org.apache.commons.lang.StringUtils; import com.jayway.restassured.parsing.Parser; import static com.jayway.restassured.path.json.JsonPath.with; import com.jayway.restassured.path.xml.XmlPath; +import edu.harvard.iq.dataverse.Dataset; import static edu.harvard.iq.dataverse.api.UtilIT.equalToCI; import static edu.harvard.iq.dataverse.authorization.AuthenticationResponse.Status.ERROR; import edu.harvard.iq.dataverse.authorization.groups.impl.builtin.AuthenticatedUsers; +import edu.harvard.iq.dataverse.util.BundleUtil; import edu.harvard.iq.dataverse.util.SystemConfig; import java.io.IOException; import java.util.ArrayList; @@ -41,6 +42,10 @@ import javax.json.Json; import javax.json.JsonArray; import javax.json.JsonObjectBuilder; +import javax.persistence.EntityManager; +import javax.persistence.EntityManagerFactory; +import javax.persistence.Persistence; +import javax.persistence.PersistenceContext; import static javax.ws.rs.core.Response.Status.BAD_REQUEST; import static javax.ws.rs.core.Response.Status.CREATED; import static javax.ws.rs.core.Response.Status.FORBIDDEN; @@ -50,18 +55,38 @@ import static junit.framework.Assert.assertEquals; import static org.hamcrest.CoreMatchers.equalTo; import static org.hamcrest.CoreMatchers.nullValue; +import org.junit.After; import org.junit.AfterClass; import org.junit.Assert; import static org.junit.Assert.assertTrue; import static org.junit.Assert.fail; +import org.junit.Before; import static org.junit.matchers.JUnitMatchers.containsString; public class DatasetsIT { private static final Logger logger = Logger.getLogger(DatasetsIT.class.getCanonicalName()); + + @PersistenceContext(unitName = "VDCNet-ejbPU") + private EntityManager em; + + private EntityManagerFactory entityManagerFactory; + + @Before + public void init() { + entityManagerFactory = Persistence.createEntityManagerFactory( "VDCNet-ejbPU" ); + } + + @After + public void destroy() { + entityManagerFactory.close(); + } + @BeforeClass public static void setUpClass() { + + RestAssured.baseURI = UtilIT.getRestAssuredBaseUri(); Response removeIdentifierGenerationStyle = UtilIT.deleteSetting(SettingsServiceBean.Key.IdentifierGenerationStyle); @@ -1936,6 +1961,103 @@ public void testUpdateDatasetVersionWithFiles() throws InterruptedException { System.out.println("Author username/password: " + authorUsername); } + + @Test + public void testLinkingDatasets() { + + Response createUser = UtilIT.createRandomUser(); + createUser.prettyPrint(); + createUser.then().assertThat() + .statusCode(OK.getStatusCode()); + String username = UtilIT.getUsernameFromResponse(createUser); + String apiToken = UtilIT.getApiTokenFromResponse(createUser); + + Response createSuperUser = UtilIT.createRandomUser(); + createSuperUser.prettyPrint(); + createSuperUser.then().assertThat() + .statusCode(OK.getStatusCode()); + String superuserUsername = UtilIT.getUsernameFromResponse(createSuperUser); + String superuserApiToken = UtilIT.getApiTokenFromResponse(createSuperUser); + Response makeSuperuser = UtilIT.makeSuperUser(superuserUsername); + makeSuperuser.prettyPrint(); + makeSuperuser.then().assertThat() + .statusCode(OK.getStatusCode()); + + Response createDataverse1 = UtilIT.createRandomDataverse(apiToken); + createDataverse1.prettyPrint(); + createDataverse1.then().assertThat() + .statusCode(CREATED.getStatusCode()); + String dataverse1Alias = UtilIT.getAliasFromResponse(createDataverse1); + + Response createDataset = UtilIT.createRandomDatasetViaNativeApi(dataverse1Alias, apiToken); + createDataset.prettyPrint(); + createDataset.then().assertThat() + .statusCode(CREATED.getStatusCode()); + + Integer datasetId = UtilIT.getDatasetIdFromResponse(createDataset); + String datasetPid = JsonPath.from(createDataset.asString()).getString("data.persistentId"); + + Response createDataverse2 = UtilIT.createRandomDataverse(apiToken); + createDataverse2.prettyPrint(); + createDataverse2.then().assertThat() + .statusCode(CREATED.getStatusCode()); + String dataverse2Alias = UtilIT.getAliasFromResponse(createDataverse2); + Integer dataverse2Id = UtilIT.getDatasetIdFromResponse(createDataverse2); + String dataverse2Name = JsonPath.from(createDataverse2.asString()).getString("data.name"); + + UtilIT.publishDataverseViaNativeApi(dataverse1Alias, apiToken).then().assertThat() + .statusCode(OK.getStatusCode()); + + + // Link dataset to second dataverse. + //should fail if dataset is not published + Response linkDataset = UtilIT.linkDataset(datasetPid, dataverse2Alias, superuserApiToken); + linkDataset.prettyPrint(); + linkDataset.then().assertThat() + .body("message", equalTo( BundleUtil.getStringFromBundle("dataset.link.not.available"))) + .statusCode(FORBIDDEN.getStatusCode()); + + + UtilIT.publishDatasetViaNativeApi(datasetPid, "major", apiToken).then().assertThat() + .statusCode(OK.getStatusCode()); + + //Once published you should be able to link it + linkDataset = UtilIT.linkDataset(datasetPid, dataverse2Alias, superuserApiToken); + linkDataset.prettyPrint(); + linkDataset.then().assertThat() + .statusCode(OK.getStatusCode()); + + +//Experimental code for trying to trick test into thinking the dataset has been harvested +/* +createDataset = UtilIT.createRandomDatasetViaNativeApi(dataverse1Alias, apiToken); + createDataset.prettyPrint(); + createDataset.then().assertThat() + .statusCode(CREATED.getStatusCode()); + + Integer datasetId2 = UtilIT.getDatasetIdFromResponse(createDataset); + String datasetPid2 = JsonPath.from(createDataset.asString()).getString("data.persistentId"); + + linkDataset = UtilIT.linkDataset(datasetPid2, dataverse2Alias, superuserApiToken); + linkDataset.prettyPrint(); + linkDataset.then().assertThat() + .body("message", equalTo( BundleUtil.getStringFromBundle("dataset.link.not.available"))) + .statusCode(FORBIDDEN.getStatusCode()); + EntityManager entityManager = entityManagerFactory.createEntityManager(); + entityManager.getTransaction().begin(); + // Do stuff... + entityManager.createNativeQuery("UPDATE dataset SET harvestingclient_id=1 WHERE id="+datasetId2).executeUpdate(); + entityManager.getTransaction().commit(); + entityManager.close(); + + + UtilIT.linkDataset(datasetId2.toString(), dataverse2Alias, superuserApiToken); + linkDataset.prettyPrint(); + linkDataset.then().assertThat() + .statusCode(OK.getStatusCode()); + */ + } + } From 07c68f2b7fcbb7261cbf83ebbe86190c1f711933 Mon Sep 17 00:00:00 2001 From: Stephen Kraffmiller Date: Fri, 22 May 2020 16:28:59 -0400 Subject: [PATCH 2/3] #5886 fix failing test --- .../edu/harvard/iq/dataverse/api/DatasetsIT.java | 14 -------------- 1 file changed, 14 deletions(-) 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 6a31051a43b..0d472439d39 100644 --- a/src/test/java/edu/harvard/iq/dataverse/api/DatasetsIT.java +++ b/src/test/java/edu/harvard/iq/dataverse/api/DatasetsIT.java @@ -67,20 +67,6 @@ public class DatasetsIT { private static final Logger logger = Logger.getLogger(DatasetsIT.class.getCanonicalName()); - @PersistenceContext(unitName = "VDCNet-ejbPU") - private EntityManager em; - - private EntityManagerFactory entityManagerFactory; - - @Before - public void init() { - entityManagerFactory = Persistence.createEntityManagerFactory( "VDCNet-ejbPU" ); - } - - @After - public void destroy() { - entityManagerFactory.close(); - } @BeforeClass From 988572ba099df5119e0befff932993b125eb76bc Mon Sep 17 00:00:00 2001 From: Stephen Kraffmiller Date: Tue, 26 May 2020 12:51:44 -0400 Subject: [PATCH 3/3] #5886 fix testing formatting --- .../harvard/iq/dataverse/api/DatasetsIT.java | 17 ++++++----------- 1 file changed, 6 insertions(+), 11 deletions(-) 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 0d472439d39..fb7914561bc 100644 --- a/src/test/java/edu/harvard/iq/dataverse/api/DatasetsIT.java +++ b/src/test/java/edu/harvard/iq/dataverse/api/DatasetsIT.java @@ -1948,7 +1948,7 @@ public void testUpdateDatasetVersionWithFiles() throws InterruptedException { } - @Test + @Test public void testLinkingDatasets() { Response createUser = UtilIT.createRandomUser(); @@ -1993,27 +1993,24 @@ public void testLinkingDatasets() { UtilIT.publishDataverseViaNativeApi(dataverse1Alias, apiToken).then().assertThat() .statusCode(OK.getStatusCode()); - - + // Link dataset to second dataverse. //should fail if dataset is not published Response linkDataset = UtilIT.linkDataset(datasetPid, dataverse2Alias, superuserApiToken); linkDataset.prettyPrint(); linkDataset.then().assertThat() - .body("message", equalTo( BundleUtil.getStringFromBundle("dataset.link.not.available"))) + .body("message", equalTo(BundleUtil.getStringFromBundle("dataset.link.not.available"))) .statusCode(FORBIDDEN.getStatusCode()); - - + UtilIT.publishDatasetViaNativeApi(datasetPid, "major", apiToken).then().assertThat() .statusCode(OK.getStatusCode()); - + //Once published you should be able to link it linkDataset = UtilIT.linkDataset(datasetPid, dataverse2Alias, superuserApiToken); linkDataset.prettyPrint(); linkDataset.then().assertThat() .statusCode(OK.getStatusCode()); - //Experimental code for trying to trick test into thinking the dataset has been harvested /* createDataset = UtilIT.createRandomDatasetViaNativeApi(dataverse1Alias, apiToken); @@ -2041,9 +2038,7 @@ public void testLinkingDatasets() { linkDataset.prettyPrint(); linkDataset.then().assertThat() .statusCode(OK.getStatusCode()); - */ + */ } - - }