From 4a63208047becd6e78f143273e76b763b3a02f57 Mon Sep 17 00:00:00 2001
From: pkupczyk <pkupczyk>
Date: Tue, 8 May 2012 14:42:30 +0000
Subject: [PATCH] SP-22 / BIS-1: Allow changing connections on dataset in the
 dataset bulk update function - JUNIT

SVN: 25221
---
 .../basic/dto/DataSetBatchUpdateDetails.java  |   4 +-
 .../db/AbstractDAOWithoutContextTest.java     |  23 ++
 .../dataaccess/db/ExperimentDAOTest.java      |  10 +-
 .../server/GenericServerDatabaseTest.java     | 217 ++++++++++++++++++
 4 files changed, 248 insertions(+), 6 deletions(-)
 create mode 100644 openbis/sourceTest/java/ch/systemsx/cisd/openbis/plugin/generic/server/GenericServerDatabaseTest.java

diff --git a/openbis/source/java/ch/systemsx/cisd/openbis/generic/shared/basic/dto/DataSetBatchUpdateDetails.java b/openbis/source/java/ch/systemsx/cisd/openbis/generic/shared/basic/dto/DataSetBatchUpdateDetails.java
index 31702f7fbff..908ebec9a5b 100644
--- a/openbis/source/java/ch/systemsx/cisd/openbis/generic/shared/basic/dto/DataSetBatchUpdateDetails.java
+++ b/openbis/source/java/ch/systemsx/cisd/openbis/generic/shared/basic/dto/DataSetBatchUpdateDetails.java
@@ -17,6 +17,7 @@
 package ch.systemsx.cisd.openbis.generic.shared.basic.dto;
 
 import java.io.Serializable;
+import java.util.Collections;
 import java.util.Set;
 
 /**
@@ -38,7 +39,8 @@ public class DataSetBatchUpdateDetails implements Serializable
 
     private boolean fileFormatUpdateRequested;
 
-    private Set<String> propertiesToUpdate; // codes of properties to update
+    private Set<String> propertiesToUpdate = Collections.emptySet(); // codes of properties to
+                                                                     // update
 
     public DataSetBatchUpdateDetails()
     {
diff --git a/openbis/sourceTest/java/ch/systemsx/cisd/openbis/generic/server/dataaccess/db/AbstractDAOWithoutContextTest.java b/openbis/sourceTest/java/ch/systemsx/cisd/openbis/generic/server/dataaccess/db/AbstractDAOWithoutContextTest.java
index af101d70d87..9309ee71400 100644
--- a/openbis/sourceTest/java/ch/systemsx/cisd/openbis/generic/server/dataaccess/db/AbstractDAOWithoutContextTest.java
+++ b/openbis/sourceTest/java/ch/systemsx/cisd/openbis/generic/server/dataaccess/db/AbstractDAOWithoutContextTest.java
@@ -40,6 +40,8 @@ import org.testng.annotations.BeforeMethod;
 import ch.rinn.restrictions.Friend;
 import ch.systemsx.cisd.openbis.generic.server.dataaccess.IDAOFactory;
 import ch.systemsx.cisd.openbis.generic.server.dataaccess.IDataDAO;
+import ch.systemsx.cisd.openbis.generic.server.dataaccess.IExperimentDAO;
+import ch.systemsx.cisd.openbis.generic.server.dataaccess.ISampleDAO;
 import ch.systemsx.cisd.openbis.generic.server.util.TestInitializer;
 import ch.systemsx.cisd.openbis.generic.shared.basic.dto.DataTypeCode;
 import ch.systemsx.cisd.openbis.generic.shared.basic.dto.IEntityPropertiesHolder;
@@ -60,6 +62,7 @@ import ch.systemsx.cisd.openbis.generic.shared.dto.MaterialTypePE;
 import ch.systemsx.cisd.openbis.generic.shared.dto.PersonPE;
 import ch.systemsx.cisd.openbis.generic.shared.dto.ProjectPE;
 import ch.systemsx.cisd.openbis.generic.shared.dto.PropertyTypePE;
+import ch.systemsx.cisd.openbis.generic.shared.dto.SamplePE;
 import ch.systemsx.cisd.openbis.generic.shared.dto.ScriptPE;
 import ch.systemsx.cisd.openbis.generic.shared.dto.SpacePE;
 import ch.systemsx.cisd.openbis.generic.shared.dto.TableNames;
@@ -280,6 +283,26 @@ public abstract class AbstractDAOWithoutContextTest extends
         return externalData;
     }
 
+    protected SamplePE findSample(String permId)
+    {
+        final ISampleDAO sampleDAO = daoFactory.getSampleDAO();
+        SamplePE sample = sampleDAO.tryToFindByPermID(permId);
+
+        assertNotNull(sample);
+
+        return sample;
+    }
+
+    protected ExperimentPE findExperiment(String permId)
+    {
+        final IExperimentDAO experimentDAO = daoFactory.getExperimentDAO();
+        ExperimentPE experiment = experimentDAO.tryGetByPermID(permId);
+
+        assertNotNull(experiment);
+
+        return experiment;
+    }
+
     protected ProjectPE findProject(String db, String group, String project)
     {
         return daoFactory.getProjectDAO().tryFindProject(db, group, project);
diff --git a/openbis/sourceTest/java/ch/systemsx/cisd/openbis/generic/server/dataaccess/db/ExperimentDAOTest.java b/openbis/sourceTest/java/ch/systemsx/cisd/openbis/generic/server/dataaccess/db/ExperimentDAOTest.java
index cc4d37ce4a2..d9ef2472f81 100644
--- a/openbis/sourceTest/java/ch/systemsx/cisd/openbis/generic/server/dataaccess/db/ExperimentDAOTest.java
+++ b/openbis/sourceTest/java/ch/systemsx/cisd/openbis/generic/server/dataaccess/db/ExperimentDAOTest.java
@@ -237,7 +237,7 @@ public class ExperimentDAOTest extends AbstractDAOTest
         assertEquals(1, experiment.getDataSets().size());
     }
 
-    private final ExperimentPE findExperiment(String identifier)
+    private final ExperimentPE findExperimentByIdentifier(String identifier)
     {
         final IExperimentDAO experimentDAO = daoFactory.getExperimentDAO();
         List<ExperimentPE> experiments = experimentDAO.listExperiments();
@@ -251,7 +251,7 @@ public class ExperimentDAOTest extends AbstractDAOTest
     public final void testDeleteWithProperties()
     {
         final IExperimentDAO experimentDAO = daoFactory.getExperimentDAO();
-        final ExperimentPE deletedExperiment = findExperiment("/CISD/DEFAULT/EXP-Y");
+        final ExperimentPE deletedExperiment = findExperimentByIdentifier("/CISD/DEFAULT/EXP-Y");
 
         // Deleted experiment should have all collections which prevent it from deletion empty.
         assertTrue(deletedExperiment.getDataSets().isEmpty());
@@ -277,7 +277,7 @@ public class ExperimentDAOTest extends AbstractDAOTest
     public final void testDeleteWithAttachments()
     {
         final IExperimentDAO experimentDAO = daoFactory.getExperimentDAO();
-        final ExperimentPE deletedExperiment = findExperiment("/CISD/DEFAULT/EXP-Y");
+        final ExperimentPE deletedExperiment = findExperimentByIdentifier("/CISD/DEFAULT/EXP-Y");
 
         // Deleted experiment should have attachments which prevent it from deletion.
         // Other connections which also prevent experiment deletion should be empty in this test.
@@ -324,7 +324,7 @@ public class ExperimentDAOTest extends AbstractDAOTest
                 createExperiment("CISD", "CISD", "DEFAULT", "EXP-13", "SIRNA_HCS");
         daoFactory.getExperimentDAO().createOrUpdateExperiment(experiment);
 
-        final ExperimentPE deletedExperiment = findExperiment("/CISD/DEFAULT/EXP-13");
+        final ExperimentPE deletedExperiment = findExperimentByIdentifier("/CISD/DEFAULT/EXP-13");
         final ExternalDataPE dataSet = findExternalData("20110805092359990-17");
         dataSet.setExperiment(deletedExperiment);
         daoFactory.getDataDAO().validateAndSaveUpdatedEntity(dataSet);
@@ -341,7 +341,7 @@ public class ExperimentDAOTest extends AbstractDAOTest
     public final void testDeleteFailWithSamples()
     {
         final IExperimentDAO experimentDAO = daoFactory.getExperimentDAO();
-        final ExperimentPE deletedExperiment = findExperiment("/CISD/NEMO/EXP10");
+        final ExperimentPE deletedExperiment = findExperimentByIdentifier("/CISD/NEMO/EXP10");
 
         // Deleted experiment should have samples which prevent it from deletion.
         // Other connections which also prevent sample deletion should be empty in this test.
diff --git a/openbis/sourceTest/java/ch/systemsx/cisd/openbis/plugin/generic/server/GenericServerDatabaseTest.java b/openbis/sourceTest/java/ch/systemsx/cisd/openbis/plugin/generic/server/GenericServerDatabaseTest.java
new file mode 100644
index 00000000000..8572394e88a
--- /dev/null
+++ b/openbis/sourceTest/java/ch/systemsx/cisd/openbis/plugin/generic/server/GenericServerDatabaseTest.java
@@ -0,0 +1,217 @@
+/*
+ * Copyright 2012 ETH Zuerich, CISD
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package ch.systemsx.cisd.openbis.plugin.generic.server;
+
+import java.sql.SQLException;
+import java.util.ArrayList;
+import java.util.List;
+
+import javax.annotation.Resource;
+
+import junit.framework.Assert;
+
+import org.testng.annotations.BeforeClass;
+import org.testng.annotations.Test;
+
+import ch.systemsx.cisd.common.exceptions.UserFailureException;
+import ch.systemsx.cisd.openbis.generic.server.dataaccess.db.AbstractDAOTest;
+import ch.systemsx.cisd.openbis.generic.shared.basic.dto.DataSetBatchUpdateDetails;
+import ch.systemsx.cisd.openbis.generic.shared.basic.dto.DataSetType;
+import ch.systemsx.cisd.openbis.generic.shared.basic.dto.NewDataSet;
+import ch.systemsx.cisd.openbis.generic.shared.basic.dto.NewDataSetsWithTypes;
+import ch.systemsx.cisd.openbis.generic.shared.basic.dto.UpdatedDataSet;
+import ch.systemsx.cisd.openbis.generic.shared.dto.DataPE;
+import ch.systemsx.cisd.openbis.generic.shared.dto.ExperimentPE;
+import ch.systemsx.cisd.openbis.generic.shared.dto.SamplePE;
+import ch.systemsx.cisd.openbis.generic.shared.dto.SessionContextDTO;
+import ch.systemsx.cisd.openbis.plugin.generic.shared.IGenericServer;
+import ch.systemsx.cisd.openbis.plugin.generic.shared.ResourceNames;
+
+/**
+ * @author pkupczyk
+ */
+public class GenericServerDatabaseTest extends AbstractDAOTest
+{
+    private static final String REUSE_EXPERIMENT_PERMID = "200811050940555-1032";
+
+    private static final String WELLS_EXPERIMENT_PERMID = "200811050937246-1036";
+
+    private static final String TEST_EXPERIMENT_PERMID = "200902091255058-1035";
+
+    private static final String REUSE_EXPERIMENT_SAMPLE_PERMID = "200811050929940-1018";
+
+    private static final String WELLS_EXPERIMENT_SAMPLE_PERMID = "200902091250077-1051";
+
+    private static final String TEST_EXPERIMENT_SAMPLE_PERMID = "200902091225616-1027";
+
+    private static final String REUSE_EXPERIMENT_CONTAINER_DATA_SET_CODE = "20110509092359990-10";
+
+    private static final String REUSE_EXPERIMENT_CONTAINED_DATA_SET_CODE = "20110509092359990-11";
+
+    private static final String TEST_EXPERIMENT_CONTAINED_DATA_SET_CODE = "20110805092359990-17";
+
+    @Resource(name = ResourceNames.GENERIC_PLUGIN_SERVER)
+    IGenericServer server;
+
+    private SessionContextDTO session;
+
+    @BeforeClass(alwaysRun = true)
+    public void init() throws SQLException
+    {
+        session = server.tryToAuthenticate("test", "password");
+    }
+
+    @Test
+    public void testChangingSampleShouldSetSampleAndExperiment()
+    {
+        DataPE dataset = findData(TEST_EXPERIMENT_CONTAINED_DATA_SET_CODE);
+
+        Assert.assertEquals(TEST_EXPERIMENT_SAMPLE_PERMID, dataset.tryGetSample().getPermId());
+        Assert.assertEquals(TEST_EXPERIMENT_PERMID, dataset.getExperiment().getPermId());
+
+        SamplePE newSample = findSample(REUSE_EXPERIMENT_SAMPLE_PERMID);
+
+        NewDataSet newDataset = new NewDataSet();
+        newDataset.setCode(dataset.getCode());
+        newDataset.setSampleIdentifierOrNull(newSample.getIdentifier());
+
+        DataSetBatchUpdateDetails updateDetails = new DataSetBatchUpdateDetails();
+        updateDetails.setSampleUpdateRequested(true);
+
+        update(dataset, newDataset, updateDetails);
+
+        Assert.assertEquals(REUSE_EXPERIMENT_SAMPLE_PERMID, dataset.tryGetSample().getPermId());
+        Assert.assertEquals(REUSE_EXPERIMENT_PERMID, dataset.getExperiment().getPermId());
+    }
+
+    @Test
+    public void testChangingExperimentShouldClearSampleAndSetExperiment()
+    {
+        DataPE dataset = findData(TEST_EXPERIMENT_CONTAINED_DATA_SET_CODE);
+
+        Assert.assertEquals(TEST_EXPERIMENT_SAMPLE_PERMID, dataset.tryGetSample().getPermId());
+        Assert.assertEquals(TEST_EXPERIMENT_PERMID, dataset.getExperiment().getPermId());
+
+        ExperimentPE newExperiment = findExperiment(REUSE_EXPERIMENT_PERMID);
+
+        NewDataSet newDataset = new NewDataSet();
+        newDataset.setCode(dataset.getCode());
+        newDataset.setExperimentIdentifier(newExperiment.getIdentifier());
+
+        DataSetBatchUpdateDetails updateDetails = new DataSetBatchUpdateDetails();
+        updateDetails.setExperimentUpdateRequested(true);
+
+        update(dataset, newDataset, updateDetails);
+
+        Assert.assertNull(dataset.tryGetSample());
+        Assert.assertEquals(REUSE_EXPERIMENT_PERMID, dataset.getExperiment().getPermId());
+    }
+
+    @Test
+    public void testChangingContainerToDataSetThatIsContainerShouldBeAllowed()
+    {
+        DataPE dataset = findData(TEST_EXPERIMENT_CONTAINED_DATA_SET_CODE);
+
+        Assert.assertNull(dataset.getContainer());
+
+        DataPE newContainer = findData(REUSE_EXPERIMENT_CONTAINER_DATA_SET_CODE);
+
+        NewDataSet newDataset = new NewDataSet();
+        newDataset.setCode(dataset.getCode());
+        newDataset.setContainerIdentifierOrNull(newContainer.getIdentifier());
+
+        DataSetBatchUpdateDetails updateDetails = new DataSetBatchUpdateDetails();
+        updateDetails.setContainerUpdateRequested(true);
+
+        update(dataset, newDataset, updateDetails);
+
+        Assert.assertEquals(REUSE_EXPERIMENT_CONTAINER_DATA_SET_CODE, dataset.getContainer()
+                .getPermId());
+    }
+
+    @Test(expectedExceptions = UserFailureException.class)
+    public void testChangingContainerToDataSetThatIsNotContainerShouldNotBeAllowed()
+    {
+        DataPE dataset = findData(REUSE_EXPERIMENT_CONTAINER_DATA_SET_CODE);
+
+        Assert.assertNull(dataset.getContainer());
+
+        DataPE newContainer = findData(REUSE_EXPERIMENT_CONTAINED_DATA_SET_CODE);
+
+        NewDataSet newDataset = new NewDataSet();
+        newDataset.setCode(dataset.getCode());
+        newDataset.setContainerIdentifierOrNull(newContainer.getIdentifier());
+
+        DataSetBatchUpdateDetails updateDetails = new DataSetBatchUpdateDetails();
+        updateDetails.setContainerUpdateRequested(true);
+
+        update(dataset, newDataset, updateDetails);
+    }
+
+    @Test
+    public void testClearingSampleShouldClearSampleAndLeaveExperiment()
+    {
+        DataPE dataset = findData(TEST_EXPERIMENT_CONTAINED_DATA_SET_CODE);
+
+        Assert.assertEquals(TEST_EXPERIMENT_SAMPLE_PERMID, dataset.tryGetSample().getPermId());
+        Assert.assertEquals(TEST_EXPERIMENT_PERMID, dataset.getExperiment().getPermId());
+
+        NewDataSet newDataset = new NewDataSet();
+        newDataset.setCode(dataset.getCode());
+        newDataset.setSampleIdentifierOrNull(null);
+
+        DataSetBatchUpdateDetails updateDetails = new DataSetBatchUpdateDetails();
+        updateDetails.setSampleUpdateRequested(true);
+
+        update(dataset, newDataset, updateDetails);
+
+        Assert.assertNull(dataset.tryGetSample());
+        Assert.assertEquals(TEST_EXPERIMENT_PERMID, dataset.getExperiment().getPermId());
+    }
+
+    @Test(expectedExceptions = AssertionError.class)
+    public void testClearingExperimentShouldNotBeAllowed()
+    {
+        DataPE dataset = findData(TEST_EXPERIMENT_CONTAINED_DATA_SET_CODE);
+
+        Assert.assertEquals(TEST_EXPERIMENT_SAMPLE_PERMID, dataset.tryGetSample().getPermId());
+        Assert.assertEquals(TEST_EXPERIMENT_PERMID, dataset.getExperiment().getPermId());
+
+        NewDataSet newDataset = new NewDataSet();
+        newDataset.setCode(dataset.getCode());
+        newDataset.setExperimentIdentifier(null);
+
+        DataSetBatchUpdateDetails updateDetails = new DataSetBatchUpdateDetails();
+        updateDetails.setExperimentUpdateRequested(true);
+
+        update(dataset, newDataset, updateDetails);
+    }
+
+    private void update(DataPE data, NewDataSet newDataset, DataSetBatchUpdateDetails updateDetails)
+    {
+        List<NewDataSet> newDatasets = new ArrayList<NewDataSet>();
+        newDatasets.add(new UpdatedDataSet(newDataset, updateDetails));
+
+        NewDataSetsWithTypes newDatasetsWithType = new NewDataSetsWithTypes();
+        newDatasetsWithType.setDataSetType(new DataSetType(data.getDataSetType().getCode()));
+        newDatasetsWithType.setNewDataSets(newDatasets);
+
+        server.updateDataSets(session.getSessionToken(), newDatasetsWithType);
+        sessionFactory.getCurrentSession().update(data);
+    }
+
+}
-- 
GitLab