From 370bd9a992d0a985b02245a59d05ae6a81ed57a7 Mon Sep 17 00:00:00 2001
From: felmer <franz-josef.elmer@id.ethz.ch>
Date: Tue, 21 Apr 2020 07:19:01 +0200
Subject: [PATCH] SSDM-9367: UpdateExperimentTest and DeleteExperimentTest
 extended

---
 .../asapi/v3/DeleteExperimentTest.java        |  68 +++++-
 .../asapi/v3/UpdateExperimentTest.java        | 212 ++++++++++++++++++
 2 files changed, 279 insertions(+), 1 deletion(-)

diff --git a/openbis/sourceTest/java/ch/ethz/sis/openbis/systemtest/asapi/v3/DeleteExperimentTest.java b/openbis/sourceTest/java/ch/ethz/sis/openbis/systemtest/asapi/v3/DeleteExperimentTest.java
index 39b066f04b8..c5ec68864b3 100644
--- a/openbis/sourceTest/java/ch/ethz/sis/openbis/systemtest/asapi/v3/DeleteExperimentTest.java
+++ b/openbis/sourceTest/java/ch/ethz/sis/openbis/systemtest/asapi/v3/DeleteExperimentTest.java
@@ -29,16 +29,19 @@ import org.testng.annotations.Test;
 import ch.ethz.sis.openbis.generic.asapi.v3.dto.dataset.id.DataSetPermId;
 import ch.ethz.sis.openbis.generic.asapi.v3.dto.deletion.id.IDeletionId;
 import ch.ethz.sis.openbis.generic.asapi.v3.dto.entitytype.id.EntityTypePermId;
+import ch.ethz.sis.openbis.generic.asapi.v3.dto.experiment.Experiment;
 import ch.ethz.sis.openbis.generic.asapi.v3.dto.experiment.create.ExperimentCreation;
 import ch.ethz.sis.openbis.generic.asapi.v3.dto.experiment.delete.ExperimentDeletionOptions;
+import ch.ethz.sis.openbis.generic.asapi.v3.dto.experiment.fetchoptions.ExperimentFetchOptions;
 import ch.ethz.sis.openbis.generic.asapi.v3.dto.experiment.id.ExperimentPermId;
 import ch.ethz.sis.openbis.generic.asapi.v3.dto.project.id.ProjectIdentifier;
+import ch.ethz.sis.openbis.generic.asapi.v3.dto.property.id.PropertyTypePermId;
+import ch.ethz.sis.openbis.generic.asapi.v3.dto.sample.delete.SampleDeletionOptions;
 import ch.ethz.sis.openbis.generic.asapi.v3.dto.sample.id.SamplePermId;
 import ch.ethz.sis.openbis.systemtest.asapi.v3.index.RemoveFromIndexState;
 import ch.systemsx.cisd.common.action.IDelegatedAction;
 import ch.systemsx.cisd.openbis.generic.shared.dto.ExperimentPE;
 import ch.systemsx.cisd.openbis.systemtest.authorization.ProjectAuthorizationUser;
-
 import junit.framework.Assert;
 
 /**
@@ -250,4 +253,67 @@ public class DeleteExperimentTest extends AbstractDeletionTest
                 "delete-experiments  EXPERIMENT_IDS('[TEST-LOGGING-1, TEST-LOGGING-2]') DELETION_OPTIONS('ExperimentDeletionOptions[reason=test-reason]')");
     }
 
+    @Test
+    public void testDeleteSampleOfASampleProperty()
+    {
+        // Given
+        String sessionToken = v3api.login(TEST_USER, PASSWORD);
+        PropertyTypePermId propertyType = createASamplePropertyType(sessionToken, null);
+        EntityTypePermId experimentType = createAnExperimentType(sessionToken, true, propertyType);
+        ExperimentCreation creation = new ExperimentCreation();
+        creation.setCode("EXPERIMENT_WITH_SAMPLE_PROPERTY");
+        creation.setTypeId(experimentType);
+        creation.setProjectId(new ProjectIdentifier("/TEST-SPACE/TEST-PROJECT"));
+        SamplePermId propertySamplePermId = createCisdSample(createCisdExperiment());
+        creation.setSampleProperty(propertyType.getPermId(), propertySamplePermId);
+        ExperimentPermId experimentPermId = v3api.createExperiments(sessionToken, Arrays.asList(creation)).get(0);
+        SampleDeletionOptions deletionOptions = new SampleDeletionOptions();
+        deletionOptions.setReason("a test");
+
+        // When
+        IDeletionId deletionId = v3api.deleteSamples(sessionToken, Arrays.asList(propertySamplePermId), deletionOptions);
+
+        // Then
+        ExperimentFetchOptions fetchOptions = new ExperimentFetchOptions();
+        fetchOptions.withProperties();
+        fetchOptions.withSampleProperties();
+        Experiment experiment = v3api.getExperiments(sessionToken, Arrays.asList(experimentPermId), fetchOptions).get(experimentPermId);
+        assertEquals(experiment.getSampleProperties().toString(), "{}");
+        assertEquals(experiment.getProperties().toString(), "{}");
+
+        v3api.confirmDeletions(sessionToken, Arrays.asList(deletionId));
+        experiment = v3api.getExperiments(sessionToken, Arrays.asList(experimentPermId), fetchOptions).get(experimentPermId);
+        assertEquals(experiment.getSampleProperties().toString(), "{}");
+        assertEquals(experiment.getProperties().toString(), "{}");
+    }
+
+    @Test
+    public void testDeleteSampleWithSampleProperty()
+    {
+        // Given
+        String sessionToken = v3api.login(TEST_USER, PASSWORD);
+        PropertyTypePermId propertyType = createASamplePropertyType(sessionToken, null);
+        EntityTypePermId experimentType = createAnExperimentType(sessionToken, true, propertyType);
+        ExperimentCreation creation = new ExperimentCreation();
+        creation.setCode("EXPERIMENT_WITH_SAMPLE_PROPERTY");
+        creation.setTypeId(experimentType);
+        creation.setProjectId(new ProjectIdentifier("/TEST-SPACE/TEST-PROJECT"));
+        SamplePermId propertySamplePermId = createCisdSample(createCisdExperiment());
+        creation.setSampleProperty(propertyType.getPermId(), propertySamplePermId);
+        ExperimentPermId experimentPermId = v3api.createExperiments(sessionToken, Arrays.asList(creation)).get(0);
+        ExperimentDeletionOptions deletionOptions = new ExperimentDeletionOptions();
+        deletionOptions.setReason("a test");
+
+        // When
+        IDeletionId deletionId = v3api.deleteExperiments(sessionToken, Arrays.asList(experimentPermId), deletionOptions);
+
+        // Then
+        ExperimentFetchOptions fetchOptions = new ExperimentFetchOptions();
+        fetchOptions.withProperties();
+        fetchOptions.withSampleProperties();
+        assertEquals(v3api.getExperiments(sessionToken, Arrays.asList(experimentPermId), fetchOptions).toString(), "{}");
+        v3api.confirmDeletions(sessionToken, Arrays.asList(deletionId));
+        assertEquals(v3api.getExperiments(sessionToken, Arrays.asList(experimentPermId), fetchOptions).toString(), "{}");
+    }
+
 }
diff --git a/openbis/sourceTest/java/ch/ethz/sis/openbis/systemtest/asapi/v3/UpdateExperimentTest.java b/openbis/sourceTest/java/ch/ethz/sis/openbis/systemtest/asapi/v3/UpdateExperimentTest.java
index d0722b2bde6..b1cb6e8107e 100644
--- a/openbis/sourceTest/java/ch/ethz/sis/openbis/systemtest/asapi/v3/UpdateExperimentTest.java
+++ b/openbis/sourceTest/java/ch/ethz/sis/openbis/systemtest/asapi/v3/UpdateExperimentTest.java
@@ -48,6 +48,7 @@ import ch.ethz.sis.openbis.generic.asapi.v3.dto.experiment.update.ExperimentUpda
 import ch.ethz.sis.openbis.generic.asapi.v3.dto.person.id.PersonPermId;
 import ch.ethz.sis.openbis.generic.asapi.v3.dto.project.id.IProjectId;
 import ch.ethz.sis.openbis.generic.asapi.v3.dto.project.id.ProjectIdentifier;
+import ch.ethz.sis.openbis.generic.asapi.v3.dto.property.id.PropertyTypePermId;
 import ch.ethz.sis.openbis.generic.asapi.v3.dto.roleassignment.Role;
 import ch.ethz.sis.openbis.generic.asapi.v3.dto.roleassignment.create.RoleAssignmentCreation;
 import ch.ethz.sis.openbis.generic.asapi.v3.dto.sample.Sample;
@@ -55,7 +56,9 @@ import ch.ethz.sis.openbis.generic.asapi.v3.dto.sample.create.SampleCreation;
 import ch.ethz.sis.openbis.generic.asapi.v3.dto.sample.delete.SampleDeletionOptions;
 import ch.ethz.sis.openbis.generic.asapi.v3.dto.sample.fetchoptions.SampleFetchOptions;
 import ch.ethz.sis.openbis.generic.asapi.v3.dto.sample.id.ISampleId;
+import ch.ethz.sis.openbis.generic.asapi.v3.dto.sample.id.SampleIdentifier;
 import ch.ethz.sis.openbis.generic.asapi.v3.dto.sample.id.SamplePermId;
+import ch.ethz.sis.openbis.generic.asapi.v3.dto.sample.update.SampleUpdate;
 import ch.ethz.sis.openbis.generic.asapi.v3.dto.space.id.SpacePermId;
 import ch.ethz.sis.openbis.generic.asapi.v3.dto.tag.id.ITagId;
 import ch.ethz.sis.openbis.generic.asapi.v3.dto.tag.id.TagCode;
@@ -994,6 +997,215 @@ public class UpdateExperimentTest extends AbstractExperimentTest
                 "update-experiments  EXPERIMENT_UPDATES('[ExperimentUpdate[experimentId=/TEST-SPACE/TEST-PROJECT/EXP-SPACE-TEST], ExperimentUpdate[experimentId=200811050940555-1032]]')");
     }
 
+    @Test
+    public void testUpdateWithUnknownPropertyOfTypeSample()
+    {
+        // Given
+        String sessionToken = v3api.login(TEST_USER, PASSWORD);
+        ExperimentCreation creation = new ExperimentCreation();
+        creation.setCode("EXPERIMENT_WITH_SAMPLE_PROPERTY");
+        creation.setTypeId(new EntityTypePermId("DELETION_TEST"));
+        creation.setProjectId(new ProjectIdentifier("/TEST-SPACE/TEST-PROJECT"));
+        ExperimentPermId experimentPermId = v3api.createExperiments(sessionToken, Arrays.asList(creation)).get(0);
+
+        ExperimentUpdate update = new ExperimentUpdate();
+        update.setExperimentId(experimentPermId);
+        update.setSampleProperty("PLATE", new SamplePermId("200811050924898-997"));
+
+        // When
+        assertUserFailureException(Void -> v3api.updateExperiments(sessionToken, Arrays.asList(update)),
+                // Then
+                "Not a property of data type SAMPLE: PLATE");
+    }
+
+    @Test
+    public void testUpdateWithPropertyOfTypeSampleWithUnknownSample()
+    {
+        // Given
+        String sessionToken = v3api.login(TEST_USER, PASSWORD);
+        PropertyTypePermId propertyType = createASamplePropertyType(sessionToken, null);
+        EntityTypePermId experimentType = createAnExperimentType(sessionToken, false, propertyType);
+        ExperimentCreation creation = new ExperimentCreation();
+        creation.setCode("EXPERIMENT_WITH_SAMPLE_PROPERTY");
+        creation.setTypeId(experimentType);
+        creation.setProjectId(new ProjectIdentifier("/TEST-SPACE/TEST-PROJECT"));
+        creation.setSampleProperty(propertyType.getPermId(), new SampleIdentifier("/CISD/CL1"));
+        ExperimentPermId experimentPermId = v3api.createExperiments(sessionToken, Arrays.asList(creation)).get(0);
+
+        ExperimentUpdate update = new ExperimentUpdate();
+        update.setExperimentId(experimentPermId);
+        update.setSampleProperty(propertyType.getPermId(), new SampleIdentifier("/CISD/UNKNOWN"));
+
+        // When
+        assertUserFailureException(Void -> v3api.updateExperiments(sessionToken, Arrays.asList(update)),
+                // Then
+                "Unknown sample: /CISD/UNKNOWN");
+    }
+
+    @Test
+    public void testUpdateWithPropertyOfTypeSampleWithSampleOfWrongType()
+    {
+        // Given
+        String sessionToken = v3api.login(TEST_USER, PASSWORD);
+        PropertyTypePermId propertyType = createASamplePropertyType(sessionToken,
+                new EntityTypePermId("WELL", EntityKind.SAMPLE));
+        EntityTypePermId experimentType = createAnExperimentType(sessionToken, false, propertyType);
+        ExperimentCreation creation = new ExperimentCreation();
+        creation.setCode("EXPERIMENT_WITH_SAMPLE_PROPERTY");
+        creation.setTypeId(experimentType);
+        creation.setProjectId(new ProjectIdentifier("/TEST-SPACE/TEST-PROJECT"));
+        creation.setSampleProperty(propertyType.getPermId(), new SamplePermId("200811050917877-438"));
+        ExperimentPermId experimentPermId = v3api.createExperiments(sessionToken, Arrays.asList(creation)).get(0);
+
+        ExperimentUpdate update = new ExperimentUpdate();
+        update.setExperimentId(experimentPermId);
+        update.setSampleProperty(propertyType.getPermId(), new SamplePermId("200811050919915-8"));
+
+        // When
+        assertUserFailureException(Void -> v3api.updateExperiments(sessionToken, Arrays.asList(update)),
+                // Then
+                "Property " + propertyType.getPermId() + " is not a sample of type WELL but of type CONTROL_LAYOUT");
+    }
+
+    @Test
+    public void testUpdateWithPropertyOfTypeSampleWithSampleNotAccessable()
+    {
+        // Given
+        String adminSessionToken = v3api.login(TEST_USER, PASSWORD);
+        PropertyTypePermId propertyType = createASamplePropertyType(adminSessionToken, null);
+        EntityTypePermId experimentType = createAnExperimentType(adminSessionToken, false, propertyType);
+        ExperimentCreation creation = new ExperimentCreation();
+        creation.setCode("EXPERIMENT_WITH_SAMPLE_PROPERTY");
+        creation.setTypeId(experimentType);
+        creation.setProjectId(new ProjectIdentifier("/TEST-SPACE/TEST-PROJECT"));
+        creation.setSampleProperty(propertyType.getPermId(), new SampleIdentifier("/CISD/CL1"));
+        ExperimentPermId experimentPermId = v3api.createExperiments(adminSessionToken, Arrays.asList(creation)).get(0);
+
+        String sessionToken = v3api.login(TEST_SPACE_USER, PASSWORD);
+        ExperimentUpdate update = new ExperimentUpdate();
+        update.setExperimentId(experimentPermId);
+        update.setSampleProperty(propertyType.getPermId(), new SampleIdentifier("/CISD/CL1"));
+
+        // When
+        assertUserFailureException(Void -> v3api.updateExperiments(sessionToken, Arrays.asList(update)),
+                // Then
+                "Unknown sample: /CISD/CL1");
+    }
+
+    @Test
+    public void testUpdateAddSampleProperty()
+    {
+        // Given
+        String sessionToken = v3api.login(TEST_USER, PASSWORD);
+        PropertyTypePermId propertyType = createASamplePropertyType(sessionToken, null);
+        EntityTypePermId experimentType = createAnExperimentType(sessionToken, false, propertyType);
+        ExperimentCreation creation = new ExperimentCreation();
+        creation.setCode("EXPERIMENT_WITH_SAMPLE_PROPERTY");
+        creation.setTypeId(experimentType);
+        creation.setProjectId(new ProjectIdentifier("/TEST-SPACE/TEST-PROJECT"));
+        ExperimentPermId experimentPermId = v3api.createExperiments(sessionToken, Arrays.asList(creation)).get(0);
+
+        ExperimentUpdate update = new ExperimentUpdate();
+        update.setExperimentId(experimentPermId);
+        update.setSampleProperty(propertyType.getPermId(), new SamplePermId("200811050924898-997"));
+
+        // When
+        v3api.updateExperiments(sessionToken, Arrays.asList(update));
+
+        // Then
+        ExperimentFetchOptions fetchOptions = new ExperimentFetchOptions();
+        fetchOptions.withProperties();
+        fetchOptions.withSampleProperties();
+        Experiment experiment = v3api.getExperiments(sessionToken, Arrays.asList(experimentPermId), fetchOptions).get(experimentPermId);
+        assertEquals(experiment.getProperties().toString(), "{" + propertyType.getPermId() + "=200811050924898-997}");
+        assertEquals(experiment.getSampleProperties().toString(), "{" + propertyType.getPermId() + "=Sample 200811050924898-997}");
+    }
+
+    @Test
+    public void testUpdateChangeSampleProperty()
+    {
+        // Given
+        String sessionToken = v3api.login(TEST_USER, PASSWORD);
+        PropertyTypePermId propertyType = createASamplePropertyType(sessionToken, null);
+        EntityTypePermId experimentType = createAnExperimentType(sessionToken, false, propertyType);
+        ExperimentCreation creation = new ExperimentCreation();
+        creation.setCode("EXPERIMENT_WITH_SAMPLE_PROPERTY");
+        creation.setTypeId(experimentType);
+        creation.setProjectId(new ProjectIdentifier("/TEST-SPACE/TEST-PROJECT"));
+        creation.setSampleProperty(propertyType.getPermId(), new SamplePermId("200811050919915-8"));
+        ExperimentPermId experimentPermId = v3api.createExperiments(sessionToken, Arrays.asList(creation)).get(0);
+
+        ExperimentUpdate update = new ExperimentUpdate();
+        update.setExperimentId(experimentPermId);
+        update.setSampleProperty(propertyType.getPermId(), new SamplePermId("200811050924898-997"));
+
+        // When
+        v3api.updateExperiments(sessionToken, Arrays.asList(update));
+
+        // Then
+        ExperimentFetchOptions fetchOptions = new ExperimentFetchOptions();
+        fetchOptions.withProperties();
+        fetchOptions.withSampleProperties();
+        Experiment experiment = v3api.getExperiments(sessionToken, Arrays.asList(experimentPermId), fetchOptions).get(experimentPermId);
+        assertEquals(experiment.getProperties().toString(), "{" + propertyType.getPermId() + "=200811050924898-997}");
+        assertEquals(experiment.getSampleProperties().toString(), "{" + propertyType.getPermId() + "=Sample 200811050924898-997}");
+    }
+
+    @Test
+    public void testUpdateRemoveSampleProperty()
+    {
+        // Given
+        String sessionToken = v3api.login(TEST_USER, PASSWORD);
+        PropertyTypePermId propertyType = createASamplePropertyType(sessionToken, null);
+        EntityTypePermId experimentType = createAnExperimentType(sessionToken, false, propertyType);
+        ExperimentCreation creation = new ExperimentCreation();
+        creation.setCode("EXPERIMENT_WITH_SAMPLE_PROPERTY");
+        creation.setTypeId(experimentType);
+        creation.setProjectId(new ProjectIdentifier("/TEST-SPACE/TEST-PROJECT"));
+        creation.setSampleProperty(propertyType.getPermId(), new SamplePermId("200811050919915-8"));
+        ExperimentPermId experimentPermId = v3api.createExperiments(sessionToken, Arrays.asList(creation)).get(0);
+
+        ExperimentUpdate update = new ExperimentUpdate();
+        update.setExperimentId(experimentPermId);
+        update.setSampleProperty(propertyType.getPermId(), null);
+
+        // When
+        v3api.updateExperiments(sessionToken, Arrays.asList(update));
+
+        // Then
+        ExperimentFetchOptions fetchOptions = new ExperimentFetchOptions();
+        fetchOptions.withProperties();
+        fetchOptions.withSampleProperties();
+        Experiment experiment = v3api.getExperiments(sessionToken, Arrays.asList(experimentPermId), fetchOptions).get(experimentPermId);
+        assertEquals(experiment.getProperties().toString(), "{}");
+        assertEquals(experiment.getSampleProperties().toString(), "{}");
+    }
+
+    @Test
+    public void testUpdateRemoveMandatorySampleProperty()
+    {
+        // Given
+        String sessionToken = v3api.login(TEST_USER, PASSWORD);
+        PropertyTypePermId propertyType = createASamplePropertyType(sessionToken, null);
+        EntityTypePermId experimentType = createAnExperimentType(sessionToken, true, propertyType);
+        ExperimentCreation creation = new ExperimentCreation();
+        creation.setCode("EXPERIMENT_WITH_SAMPLE_PROPERTY");
+        creation.setTypeId(experimentType);
+        creation.setProjectId(new ProjectIdentifier("/TEST-SPACE/TEST-PROJECT"));
+        creation.setSampleProperty(propertyType.getPermId(), new SamplePermId("200811050919915-8"));
+        ExperimentPermId experimentPermId = v3api.createExperiments(sessionToken, Arrays.asList(creation)).get(0);
+
+        ExperimentUpdate update = new ExperimentUpdate();
+        update.setExperimentId(experimentPermId);
+        update.setSampleProperty(propertyType.getPermId(), null);
+
+        // When
+        assertUserFailureException(Void -> v3api.updateExperiments(sessionToken, Arrays.asList(update)),
+                "Property " + propertyType + " of entity type " + experimentType.getPermId()
+                        + " can not be deleted because it is mandatory.");
+    }
+
+    @Test
     private ExperimentPermId createExperimentWithoutAttachments()
     {
         final String sessionToken = v3api.login(TEST_USER, PASSWORD);
-- 
GitLab