From 9fb3ac403846b8ef360d67660c4be023041cbcb3 Mon Sep 17 00:00:00 2001
From: pkupczyk <piotr.kupczyk@id.ethz.ch>
Date: Tue, 13 Jun 2023 16:29:40 +0200
Subject: [PATCH] SSDM-13718 : Fix user rights for creation and update :
 dataset update

---
 .../asapi/v3/UpdateDataSetTest.java           | 199 ++++++++++++++++++
 1 file changed, 199 insertions(+)

diff --git a/server-application-server/sourceTest/java/ch/ethz/sis/openbis/systemtest/asapi/v3/UpdateDataSetTest.java b/server-application-server/sourceTest/java/ch/ethz/sis/openbis/systemtest/asapi/v3/UpdateDataSetTest.java
index 87ce4f06f8c..2d70380580d 100644
--- a/server-application-server/sourceTest/java/ch/ethz/sis/openbis/systemtest/asapi/v3/UpdateDataSetTest.java
+++ b/server-application-server/sourceTest/java/ch/ethz/sis/openbis/systemtest/asapi/v3/UpdateDataSetTest.java
@@ -24,6 +24,7 @@ import java.util.Collections;
 import java.util.LinkedList;
 import java.util.List;
 import java.util.Map;
+import java.util.UUID;
 
 import org.testng.annotations.DataProvider;
 import org.testng.annotations.Test;
@@ -43,6 +44,7 @@ import ch.ethz.sis.openbis.generic.asapi.v3.dto.dataset.update.PhysicalDataUpdat
 import ch.ethz.sis.openbis.generic.asapi.v3.dto.datastore.id.DataStorePermId;
 import ch.ethz.sis.openbis.generic.asapi.v3.dto.entitytype.EntityKind;
 import ch.ethz.sis.openbis.generic.asapi.v3.dto.entitytype.id.EntityTypePermId;
+import ch.ethz.sis.openbis.generic.asapi.v3.dto.experiment.create.ExperimentCreation;
 import ch.ethz.sis.openbis.generic.asapi.v3.dto.experiment.id.ExperimentIdentifier;
 import ch.ethz.sis.openbis.generic.asapi.v3.dto.experiment.id.ExperimentPermId;
 import ch.ethz.sis.openbis.generic.asapi.v3.dto.experiment.id.IExperimentId;
@@ -51,6 +53,7 @@ import ch.ethz.sis.openbis.generic.asapi.v3.dto.person.id.PersonPermId;
 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.create.SampleCreation;
 import ch.ethz.sis.openbis.generic.asapi.v3.dto.sample.id.SamplePermId;
 import ch.ethz.sis.openbis.generic.asapi.v3.dto.space.id.SpacePermId;
 import ch.ethz.sis.openbis.generic.asapi.v3.dto.tag.Tag;
@@ -59,6 +62,7 @@ import ch.ethz.sis.openbis.generic.server.asapi.v3.helper.common.FreezingFlags;
 import ch.systemsx.cisd.common.action.IDelegatedAction;
 import ch.systemsx.cisd.common.exceptions.UserFailureException;
 import ch.systemsx.cisd.common.test.AssertionUtil;
+import ch.systemsx.cisd.openbis.generic.shared.basic.dto.RoleWithHierarchy;
 import ch.systemsx.cisd.openbis.generic.shared.dto.EventPE.EntityType;
 import ch.systemsx.cisd.openbis.systemtest.authorization.ProjectAuthorizationUser;
 
@@ -1344,6 +1348,201 @@ public class UpdateDataSetTest extends AbstractDataSetTest
         assertEquals(dataSet.getMetaData(), Map.of("key_modify", "new_value", "key_add", "value_add"));
     }
 
+    @Test(dataProvider = USER_ROLES_PROVIDER)
+    public void testUpdateWithDifferentRolesExperimentDataSet(RoleWithHierarchy role)
+    {
+        testWithUserRole(role, params ->
+        {
+            final ExperimentCreation experimentCreation = new ExperimentCreation();
+            experimentCreation.setTypeId(new EntityTypePermId("SIRNA_HCS"));
+            experimentCreation.setCode("TEST_EXPERIMENT_" + UUID.randomUUID());
+            experimentCreation.setProjectId(params.space1Project1Id);
+            experimentCreation.setProperty("DESCRIPTION", "test description");
+
+            final ExperimentCreation experimentCreation2 = new ExperimentCreation();
+            experimentCreation2.setTypeId(new EntityTypePermId("SIRNA_HCS"));
+            experimentCreation2.setCode("TEST_EXPERIMENT_" + UUID.randomUUID());
+            experimentCreation2.setProjectId(params.space1Project2Id);
+            experimentCreation2.setProperty("DESCRIPTION", "test description");
+
+            final List<ExperimentPermId> experimentIds =
+                    v3api.createExperiments(params.adminSessionToken, List.of(experimentCreation, experimentCreation2));
+            ExperimentPermId experiment1Id = experimentIds.get(0);
+            ExperimentPermId experiment2Id = experimentIds.get(1);
+
+            final DataSetCreation dataSetCreation = physicalDataSetCreation();
+            dataSetCreation.setExperimentId(experiment1Id);
+            dataSetCreation.setSampleId(null);
+
+            final DataSetPermId dataSetId = v3api.createDataSets(params.adminSessionToken, Collections.singletonList(dataSetCreation)).get(0);
+
+            final DataSetUpdate dataSetUpdate = new DataSetUpdate();
+            dataSetUpdate.setDataSetId(dataSetId);
+            dataSetUpdate.setExperimentId(experiment2Id);
+
+            // use instance admin to login on behalf of the user
+            final String onBehalfOfSessionToken = v3api.loginAs(TEST_USER, PASSWORD, params.userId);
+
+            if (List.of(RoleWithHierarchy.RoleCode.ADMIN, RoleWithHierarchy.RoleCode.POWER_USER)
+                    .contains(role.getRoleCode()))
+            {
+                v3api.updateDataSets(onBehalfOfSessionToken, Collections.singletonList(dataSetUpdate));
+            } else
+            {
+                assertAnyAuthorizationException(() -> v3api.updateDataSets(onBehalfOfSessionToken, Collections.singletonList(dataSetUpdate)));
+            }
+        });
+    }
+
+    @Test(dataProvider = USER_ROLES_PROVIDER)
+    public void testUpdateWithDifferentRolesSpaceSampleDataSet(RoleWithHierarchy role)
+    {
+        testWithUserRole(role, params ->
+        {
+            final SampleCreation sampleCreation = new SampleCreation();
+            sampleCreation.setCode("TEST_SPACE_SAMPLE_" + UUID.randomUUID());
+            sampleCreation.setTypeId(new EntityTypePermId("CELL_PLATE"));
+            sampleCreation.setSpaceId(params.space1Id);
+
+            final SampleCreation sampleCreation2 = new SampleCreation();
+            sampleCreation2.setCode("TEST_SPACE_SAMPLE_" + UUID.randomUUID());
+            sampleCreation2.setTypeId(new EntityTypePermId("CELL_PLATE"));
+            sampleCreation2.setSpaceId(params.space2Id);
+
+            final List<SamplePermId> sampleIds = v3api.createSamples(params.adminSessionToken, List.of(sampleCreation, sampleCreation2));
+            SamplePermId sample1Id = sampleIds.get(0);
+            SamplePermId sample2Id = sampleIds.get(1);
+
+            final DataSetCreation dataSetCreation = physicalDataSetCreation();
+            dataSetCreation.setExperimentId(null);
+            dataSetCreation.setSampleId(sample1Id);
+
+            final DataSetPermId dataSetId = v3api.createDataSets(params.adminSessionToken, Collections.singletonList(dataSetCreation)).get(0);
+
+            final DataSetUpdate dataSetUpdate = new DataSetUpdate();
+            dataSetUpdate.setDataSetId(dataSetId);
+            dataSetUpdate.setSampleId(sample2Id);
+
+            // use instance admin to login on behalf of the user
+            final String onBehalfOfSessionToken = v3api.loginAs(TEST_USER, PASSWORD, params.userId);
+
+            if (List.of(RoleWithHierarchy.RoleLevel.INSTANCE, RoleWithHierarchy.RoleLevel.SPACE).contains(role.getRoleLevel()) && List.of(
+                            RoleWithHierarchy.RoleCode.ADMIN, RoleWithHierarchy.RoleCode.POWER_USER)
+                    .contains(role.getRoleCode()))
+            {
+                v3api.updateDataSets(onBehalfOfSessionToken, Collections.singletonList(dataSetUpdate));
+            } else
+            {
+                assertAnyAuthorizationException(() -> v3api.updateDataSets(onBehalfOfSessionToken, Collections.singletonList(dataSetUpdate)));
+            }
+        });
+    }
+
+    @Test(dataProvider = USER_ROLES_PROVIDER)
+    public void testUpdateWithDifferentRolesProjectSampleDataSet(RoleWithHierarchy role)
+    {
+        testWithUserRole(role, params ->
+        {
+            final SampleCreation sampleCreation = new SampleCreation();
+            sampleCreation.setCode("TEST_PROJECT_SAMPLE_" + UUID.randomUUID());
+            sampleCreation.setTypeId(new EntityTypePermId("CELL_PLATE"));
+            sampleCreation.setSpaceId(params.space1Id);
+            sampleCreation.setProjectId(params.space1Project1Id);
+
+            final SampleCreation sampleCreation2 = new SampleCreation();
+            sampleCreation2.setCode("TEST_PROJECT_SAMPLE_" + UUID.randomUUID());
+            sampleCreation2.setTypeId(new EntityTypePermId("CELL_PLATE"));
+            sampleCreation2.setSpaceId(params.space1Id);
+            sampleCreation2.setProjectId(params.space1Project2Id);
+
+            final List<SamplePermId> sampleIds = v3api.createSamples(params.adminSessionToken, List.of(sampleCreation, sampleCreation2));
+            SamplePermId sample1Id = sampleIds.get(0);
+            SamplePermId sample2Id = sampleIds.get(1);
+
+            final DataSetCreation dataSetCreation = physicalDataSetCreation();
+            dataSetCreation.setExperimentId(null);
+            dataSetCreation.setSampleId(sample1Id);
+
+            final DataSetPermId dataSetId = v3api.createDataSets(params.adminSessionToken, Collections.singletonList(dataSetCreation)).get(0);
+
+            final DataSetUpdate dataSetUpdate = new DataSetUpdate();
+            dataSetUpdate.setDataSetId(dataSetId);
+            dataSetUpdate.setSampleId(sample2Id);
+
+            // use instance admin to login on behalf of the user
+            final String onBehalfOfSessionToken = v3api.loginAs(TEST_USER, PASSWORD, params.userId);
+
+            if (List.of(RoleWithHierarchy.RoleCode.ADMIN, RoleWithHierarchy.RoleCode.POWER_USER).contains(role.getRoleCode()))
+            {
+                v3api.updateDataSets(onBehalfOfSessionToken, Collections.singletonList(dataSetUpdate));
+            } else
+            {
+                assertAnyAuthorizationException(() -> v3api.updateDataSets(onBehalfOfSessionToken, Collections.singletonList(dataSetUpdate)));
+            }
+        });
+    }
+
+    @Test(dataProvider = USER_ROLES_PROVIDER)
+    public void testUpdateWithDifferentRolesExperimentSampleDataSet(RoleWithHierarchy role)
+    {
+        testWithUserRole(role, params ->
+        {
+            final ExperimentCreation experimentCreation = new ExperimentCreation();
+            experimentCreation.setTypeId(new EntityTypePermId("SIRNA_HCS"));
+            experimentCreation.setCode("TEST_EXPERIMENT_" + UUID.randomUUID());
+            experimentCreation.setProjectId(params.space1Project1Id);
+            experimentCreation.setProperty("DESCRIPTION", "test description");
+
+            final ExperimentCreation experimentCreation2 = new ExperimentCreation();
+            experimentCreation2.setTypeId(new EntityTypePermId("SIRNA_HCS"));
+            experimentCreation2.setCode("TEST_EXPERIMENT_" + UUID.randomUUID());
+            experimentCreation2.setProjectId(params.space1Project2Id);
+            experimentCreation2.setProperty("DESCRIPTION", "test description");
+
+            final List<ExperimentPermId> experimentIds =
+                    v3api.createExperiments(params.adminSessionToken, List.of(experimentCreation, experimentCreation2));
+            ExperimentPermId experiment1Id = experimentIds.get(0);
+            ExperimentPermId experiment2Id = experimentIds.get(1);
+
+            final SampleCreation sampleCreation = new SampleCreation();
+            sampleCreation.setCode("TEST_EXPERIMENT_SAMPLE_" + UUID.randomUUID());
+            sampleCreation.setTypeId(new EntityTypePermId("CELL_PLATE"));
+            sampleCreation.setSpaceId(params.space1Id);
+            sampleCreation.setExperimentId(experiment1Id);
+
+            final SampleCreation sampleCreation2 = new SampleCreation();
+            sampleCreation2.setCode("TEST_EXPERIMENT_SAMPLE_" + UUID.randomUUID());
+            sampleCreation2.setTypeId(new EntityTypePermId("CELL_PLATE"));
+            sampleCreation2.setSpaceId(params.space1Id);
+            sampleCreation2.setExperimentId(experiment2Id);
+
+            final List<SamplePermId> sampleIds = v3api.createSamples(params.adminSessionToken, List.of(sampleCreation, sampleCreation2));
+            SamplePermId sample1Id = sampleIds.get(0);
+            SamplePermId sample2Id = sampleIds.get(1);
+
+            final DataSetCreation dataSetCreation = physicalDataSetCreation();
+            dataSetCreation.setExperimentId(null);
+            dataSetCreation.setSampleId(sample1Id);
+
+            final DataSetPermId dataSetId = v3api.createDataSets(params.adminSessionToken, Collections.singletonList(dataSetCreation)).get(0);
+
+            final DataSetUpdate dataSetUpdate = new DataSetUpdate();
+            dataSetUpdate.setDataSetId(dataSetId);
+            dataSetUpdate.setSampleId(sample2Id);
+
+            // use instance admin to login on behalf of the user
+            final String onBehalfOfSessionToken = v3api.loginAs(TEST_USER, PASSWORD, params.userId);
+
+            if (List.of(RoleWithHierarchy.RoleCode.ADMIN, RoleWithHierarchy.RoleCode.POWER_USER).contains(role.getRoleCode()))
+            {
+                v3api.updateDataSets(onBehalfOfSessionToken, Collections.singletonList(dataSetUpdate));
+            } else
+            {
+                assertAnyAuthorizationException(() -> v3api.updateDataSets(onBehalfOfSessionToken, Collections.singletonList(dataSetUpdate)));
+            }
+        });
+    }
+
     private Collection<String> dataSetCodes(Collection<? extends DataSet> list)
     {
         LinkedList<String> result = new LinkedList<String>();
-- 
GitLab