From c88f0e4e101383c30949e12fbc56d4efa279ceea Mon Sep 17 00:00:00 2001
From: anttil <anttil>
Date: Thu, 28 Jun 2012 14:07:02 +0000
Subject: [PATCH] BIS-51 / SP-139: Authorization tests for sample parent-child
 relationship manipulation. Functional tests for sample containment
 relationship manipulation.

SVN: 25940
---
 .../EntityRelationshipChangeTest.java         | 49 ++++++++++
 .../RelationshipServiceAuthorizationTest.java | 95 +++++++++++++++++++
 .../openbis/systemtest/SystemTestCase.java    |  9 ++
 .../systemtest/base/SampleBuilder.java        | 13 ++-
 .../systemtest/base/SampleUpdateBuilder.java  | 12 ++-
 5 files changed, 175 insertions(+), 3 deletions(-)

diff --git a/openbis/sourceTest/java/ch/systemsx/cisd/openbis/systemtest/EntityRelationshipChangeTest.java b/openbis/sourceTest/java/ch/systemsx/cisd/openbis/systemtest/EntityRelationshipChangeTest.java
index 76d5324e196..a62d869793d 100644
--- a/openbis/sourceTest/java/ch/systemsx/cisd/openbis/systemtest/EntityRelationshipChangeTest.java
+++ b/openbis/sourceTest/java/ch/systemsx/cisd/openbis/systemtest/EntityRelationshipChangeTest.java
@@ -315,4 +315,53 @@ public class EntityRelationshipChangeTest extends BaseTest
         assertThat(serverSays(child).getParents(), containsExactly(parent1, parent2));
     }
 
+    @Test
+    public void addSampleToContainer()
+    {
+        Sample container = create(aSample().inSpace(space));
+        Sample componentCandidate = create(aSample().inSpace(space));
+        SampleUpdatesDTO updates = create(anUpdateOf(componentCandidate).withContainer(container));
+
+        commonServer.updateSample(session, updates);
+
+        assertThat(serverSays(componentCandidate).getContainer(), is(container));
+    }
+
+    @Test
+    public void removeSampleFromContainer()
+    {
+        Sample container = create(aSample().inSpace(space));
+        Sample component = create(aSample().inSpace(space).inContainer(container));
+        SampleUpdatesDTO updates = create(anUpdateOf(component));
+
+        commonServer.updateSample(session, updates);
+
+        assertThat(serverSays(component).getContainer(), is(nullValue()));
+    }
+
+    @Test
+    public void sampleUpdateWithNewContainerWillChangeContanerOfSample()
+    {
+        Sample container = create(aSample().inSpace(space));
+        Sample component = create(aSample().inSpace(space).inContainer(container));
+        Sample newContainer = create(aSample().inSpace(space));
+        SampleUpdatesDTO updates = create(anUpdateOf(component).withContainer(newContainer));
+
+        commonServer.updateSample(session, updates);
+
+        assertThat(serverSays(component).getContainer(), is(newContainer));
+    }
+
+    @Test(expectedExceptions =
+        { UserFailureException.class })
+    public void sampleCannotBeUpdatedToBeChildOfComponentSample()
+    {
+        Sample container = create(aSample().inSpace(space));
+        Sample component = create(aSample().inSpace(space).inContainer(container));
+        Sample subComponent = create(aSample().inSpace(space));
+        SampleUpdatesDTO updates = create(anUpdateOf(subComponent).withContainer(component));
+
+        commonServer.updateSample(session, updates);
+    }
+
 }
diff --git a/openbis/sourceTest/java/ch/systemsx/cisd/openbis/systemtest/RelationshipServiceAuthorizationTest.java b/openbis/sourceTest/java/ch/systemsx/cisd/openbis/systemtest/RelationshipServiceAuthorizationTest.java
index d2bb61f639d..d3446ea5afe 100644
--- a/openbis/sourceTest/java/ch/systemsx/cisd/openbis/systemtest/RelationshipServiceAuthorizationTest.java
+++ b/openbis/sourceTest/java/ch/systemsx/cisd/openbis/systemtest/RelationshipServiceAuthorizationTest.java
@@ -63,6 +63,10 @@ public class RelationshipServiceAuthorizationTest extends BaseTest
 
     private Sample sharedSample;
 
+    private Sample childSample;
+
+    private Sample parentSample;
+
     private DataSet dataSet;
 
     @BeforeClass
@@ -80,6 +84,9 @@ public class RelationshipServiceAuthorizationTest extends BaseTest
         destinationSample = create(aSample().inExperiment(destinationExperiment));
 
         sharedSample = create(aSample());
+
+        parentSample = create(aSample().inSpace(sourceSpace));
+        childSample = create(aSample().inSpace(destinationSpace).withParent(parentSample));
     }
 
     @Test(dataProvider = "rolesAllowedToAssignExperimentToProject")
@@ -231,6 +238,40 @@ public class RelationshipServiceAuthorizationTest extends BaseTest
         assignDataSetToSample(sourceSpaceRole, destinationSpaceRole, instanceRole);
     }
 
+    @Test(dataProvider = "rolesAllowedToAddParentToSample")
+    public void addingParentToSampleIsAuthorizedFor(RoleWithHierarchy sourceSpaceRole,
+            RoleWithHierarchy destinationSpaceRole,
+            RoleWithHierarchy instanceRole)
+    {
+        addParentToSample(sourceSpaceRole, destinationSpaceRole, instanceRole);
+    }
+
+    @Test(dataProvider = "rolesNotAllowedToAddParentToSample", expectedExceptions =
+        { AuthorizationFailureException.class })
+    public void addingParentToSampleIsNotAuthorizedFor(RoleWithHierarchy sourceSpaceRole,
+            RoleWithHierarchy destinationSpaceRole,
+            RoleWithHierarchy instanceRole)
+    {
+        addParentToSample(sourceSpaceRole, destinationSpaceRole, instanceRole);
+    }
+
+    @Test(dataProvider = "rolesAllowedToRemoveParentFromSample")
+    public void removingParentFromSampleIsAuthorizedFor(RoleWithHierarchy sourceSpaceRole,
+            RoleWithHierarchy destinationSpaceRole,
+            RoleWithHierarchy instanceRole)
+    {
+        removeParentFromSample(sourceSpaceRole, destinationSpaceRole, instanceRole);
+    }
+
+    @Test(dataProvider = "rolesNotAllowedToRemoveParentFromSample", expectedExceptions =
+        { AuthorizationFailureException.class })
+    public void removingParentFromSampleIsNotAuthorizedFor(RoleWithHierarchy sourceSpaceRole,
+            RoleWithHierarchy destinationSpaceRole,
+            RoleWithHierarchy instanceRole)
+    {
+        removeParentFromSample(sourceSpaceRole, destinationSpaceRole, instanceRole);
+    }
+
     private void assignExperimentToProject(RoleWithHierarchy sourceSpaceRole,
             RoleWithHierarchy destinationSpaceRole,
             RoleWithHierarchy instanceRole)
@@ -339,6 +380,32 @@ public class RelationshipServiceAuthorizationTest extends BaseTest
                 id(destinationSample));
     }
 
+    private void addParentToSample(RoleWithHierarchy sourceSpaceRole,
+            RoleWithHierarchy destinationSpaceRole,
+            RoleWithHierarchy instanceRole)
+    {
+        String session =
+                create(aSession().withSpaceRole(sourceSpaceRole, sourceSpace).withSpaceRole(
+                        destinationSpaceRole, destinationSpace).withInstanceRole(instanceRole));
+
+        relationshipService.addParentToSample(sessionManager.getSession(session), id(sourceSample),
+                id(destinationSample));
+
+    }
+
+    private void removeParentFromSample(RoleWithHierarchy sourceSpaceRole,
+            RoleWithHierarchy destinationSpaceRole,
+            RoleWithHierarchy instanceRole)
+    {
+        String session =
+                create(aSession().withSpaceRole(sourceSpaceRole, sourceSpace).withSpaceRole(
+                        destinationSpaceRole, destinationSpace).withInstanceRole(instanceRole));
+
+        relationshipService.removeParentFromSample(sessionManager.getSession(session),
+                id(childSample),
+                id(parentSample));
+    }
+
     @DataProvider(name = "rolesAllowedToAssignExperimentToProject")
     public static RoleWithHierarchy[][] rolesAllowedToAssignExperimentToProject()
     {
@@ -465,6 +532,34 @@ public class RelationshipServiceAuthorizationTest extends BaseTest
                 RoleWithHierarchy.SPACE_POWER_USER));
     }
 
+    @DataProvider(name = "rolesAllowedToAddParentToSample")
+    public static RoleWithHierarchy[][] rolesAllowedToAddParentToSample()
+    {
+        return toNestedArray(acceptedRoles(2, RoleWithHierarchy.SPACE_ETL_SERVER,
+                RoleWithHierarchy.SPACE_POWER_USER));
+    }
+
+    @DataProvider(name = "rolesNotAllowedToAddParentToSample")
+    public static RoleWithHierarchy[][] rolesNotAllowedToAddParentToSample()
+    {
+        return toNestedArray(rejectedRoles(2, RoleWithHierarchy.SPACE_ETL_SERVER,
+                RoleWithHierarchy.SPACE_POWER_USER));
+    }
+
+    @DataProvider(name = "rolesAllowedRemoveAddParentFromSample")
+    public static RoleWithHierarchy[][] rolesAllowedToRemoveParentFromSample()
+    {
+        return toNestedArray(acceptedRoles(2, RoleWithHierarchy.SPACE_ETL_SERVER,
+                RoleWithHierarchy.SPACE_POWER_USER));
+    }
+
+    @DataProvider(name = "rolesNotAllowedToRemoveParentFromSample")
+    public static RoleWithHierarchy[][] rolesNotAllowedToRemoveParentFromSample()
+    {
+        return toNestedArray(rejectedRoles(2, RoleWithHierarchy.SPACE_ETL_SERVER,
+                RoleWithHierarchy.SPACE_POWER_USER));
+    }
+
     public static Collection<RoleWithHierarchy> allInstanceRoles = new HashSet<RoleWithHierarchy>();
 
     public static Collection<RoleWithHierarchy> allSpaceRoles = new HashSet<RoleWithHierarchy>();
diff --git a/openbis/sourceTest/java/ch/systemsx/cisd/openbis/systemtest/SystemTestCase.java b/openbis/sourceTest/java/ch/systemsx/cisd/openbis/systemtest/SystemTestCase.java
index f026ace361a..84f66c0dc83 100644
--- a/openbis/sourceTest/java/ch/systemsx/cisd/openbis/systemtest/SystemTestCase.java
+++ b/openbis/sourceTest/java/ch/systemsx/cisd/openbis/systemtest/SystemTestCase.java
@@ -27,12 +27,14 @@ import java.util.List;
 import javax.servlet.http.HttpSession;
 
 import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.context.support.GenericApplicationContext;
 import org.springframework.mock.web.MockHttpServletRequest;
 import org.springframework.mock.web.MockMultipartFile;
 import org.springframework.test.context.ContextConfiguration;
 import org.springframework.test.context.testng.AbstractTransactionalTestNGSpringContextTests;
 import org.springframework.test.context.transaction.TransactionConfiguration;
 import org.testng.AssertJUnit;
+import org.testng.annotations.AfterTest;
 import org.testng.annotations.BeforeClass;
 import org.testng.annotations.BeforeSuite;
 
@@ -93,6 +95,13 @@ public abstract class SystemTestCase extends AbstractTransactionalTestNGSpringCo
         TestInitializer.init();
     }
 
+    @AfterTest()
+    public void testingThis()
+    {
+        System.out.println("!!!!!!!! AFTER TEST RUN - DESTROYING - IN SYSTEMTESTCASE!!!");
+        ((GenericApplicationContext) applicationContext).destroy();
+    }
+
     @BeforeClass
     public void loginAsSystem()
     {
diff --git a/openbis/sourceTest/java/ch/systemsx/cisd/openbis/systemtest/base/SampleBuilder.java b/openbis/sourceTest/java/ch/systemsx/cisd/openbis/systemtest/base/SampleBuilder.java
index 321f7cf9623..2aebd20615f 100644
--- a/openbis/sourceTest/java/ch/systemsx/cisd/openbis/systemtest/base/SampleBuilder.java
+++ b/openbis/sourceTest/java/ch/systemsx/cisd/openbis/systemtest/base/SampleBuilder.java
@@ -43,10 +43,13 @@ public class SampleBuilder extends Builder<Sample>
 
     private List<Sample> parents;
 
+    private Sample container;
+
     public SampleBuilder(ICommonServerForInternalUse commonServer, IGenericServer genericServer)
     {
         super(commonServer, genericServer);
         this.parents = new ArrayList<Sample>();
+        this.container = null;
     }
 
     @SuppressWarnings("hiding")
@@ -63,6 +66,12 @@ public class SampleBuilder extends Builder<Sample>
         return this;
     }
 
+    public SampleBuilder inContainer(Sample sample)
+    {
+        this.container = sample;
+        return this;
+    }
+
     public SampleBuilder withParent(Sample parent)
     {
         return this.withParents(parent);
@@ -116,8 +125,8 @@ public class SampleBuilder extends Builder<Sample>
         NewSample data = new NewSample();
         data.setIdentifier(identifier);
         data.setAttachments(new ArrayList<NewAttachment>());
-        data.setContainerIdentifier(null);
-        data.setCurrentContainerIdentifier(null);
+        data.setContainerIdentifier(this.container != null ? this.container.getIdentifier() : null);
+        // data.setCurrentContainerIdentifier(null);
         if (this.experiment != null)
         {
             data.setExperimentIdentifier(this.experiment.getIdentifier());
diff --git a/openbis/sourceTest/java/ch/systemsx/cisd/openbis/systemtest/base/SampleUpdateBuilder.java b/openbis/sourceTest/java/ch/systemsx/cisd/openbis/systemtest/base/SampleUpdateBuilder.java
index 2b50827456a..1daa3ed1cf2 100644
--- a/openbis/sourceTest/java/ch/systemsx/cisd/openbis/systemtest/base/SampleUpdateBuilder.java
+++ b/openbis/sourceTest/java/ch/systemsx/cisd/openbis/systemtest/base/SampleUpdateBuilder.java
@@ -50,6 +50,8 @@ public class SampleUpdateBuilder extends Builder<SampleUpdatesDTO>
 
     private List<Sample> parents;
 
+    private Sample container;
+
     public SampleUpdateBuilder(ICommonServerForInternalUse commonServer,
             IGenericServer genericServer, Sample sample)
     {
@@ -63,6 +65,7 @@ public class SampleUpdateBuilder extends Builder<SampleUpdatesDTO>
         this.version = sample.getModificationDate();
         this.sampleIdentifier = id(sample);
         this.parents = new ArrayList<Sample>();
+        this.container = null;
     }
 
     public SampleUpdateBuilder inExperiment(Experiment experiment)
@@ -109,6 +112,12 @@ public class SampleUpdateBuilder extends Builder<SampleUpdatesDTO>
         return this;
     }
 
+    public SampleUpdateBuilder withContainer(Sample sample)
+    {
+        this.container = sample;
+        return this;
+    }
+
     /*
      *     public SampleUpdatesDTO(TechId sampleId, List<IEntityProperty> properties,
             ExperimentIdentifier experimentIdentifierOrNull, Collection<NewAttachment> attachments,
@@ -126,6 +135,7 @@ public class SampleUpdateBuilder extends Builder<SampleUpdatesDTO>
         }
         return new SampleUpdatesDTO(this.sampleId, new ArrayList<IEntityProperty>(),
                 this.experimentId, new ArrayList<NewAttachment>(), this.version,
-                this.sampleIdentifier, null, parentCodes);
+                this.sampleIdentifier, this.container != null ? this.container.getIdentifier()
+                        : null, parentCodes);
     }
 }
\ No newline at end of file
-- 
GitLab