/* * Copyright 2006-2015 University of Dundee. All rights reserved. * Use is subject to license terms supplied in LICENSE.txt */ package integration; import static org.testng.AssertJUnit.assertEquals; import static org.testng.AssertJUnit.assertTrue; import java.util.ArrayList; import java.util.Arrays; import java.util.List; import omero.api.IRenderingSettingsPrx; import omero.cmd.Delete2; import omero.cmd.DoAll; import omero.cmd.Request; import omero.constants.metadata.NSINSIGHTRATING; import omero.gateway.util.Requests; import omero.model.Annotation; import omero.model.CommentAnnotation; import omero.model.CommentAnnotationI; import omero.model.Dataset; import omero.model.DatasetImageLink; import omero.model.DatasetImageLinkI; import omero.model.IObject; import omero.model.Image; import omero.model.ImageAnnotationLink; import omero.model.ImageAnnotationLinkI; import omero.model.LongAnnotation; import omero.model.LongAnnotationI; import omero.model.Permissions; import omero.model.Pixels; import omero.model.Plate; import omero.model.Project; import omero.model.ProjectDatasetLink; import omero.model.ProjectDatasetLinkI; import omero.model.RenderingDef; import omero.model.Screen; import omero.model.ScreenPlateLink; import omero.model.ScreenPlateLinkI; import omero.model.TagAnnotation; import omero.model.TagAnnotationI; import omero.sys.EventContext; import omero.sys.ParametersI; import org.testng.annotations.AfterMethod; import org.testng.annotations.Test; /** * Collections of tests for the <code>Delete</code> service related to * permissions. Unlike {@link DeleteServiceTest} we are <em>not</em> creating a * new user before each method since these methods need multiple users in * specific groups. * * @since 4.2.1 */ public class DeleteServicePermissionsTest extends AbstractServerTest { /** * Since we are creating a new client on each invocation, we should also * clean it up. Note: {@link #newUserAndGroup(String)} also closes, but not * the very last invocation. */ @AfterMethod public void close() throws Exception { clean(); } /** * Test to try to delete an (top) object owned by another user in a private * group i.e. RW----. * * @throws Exception * Thrown if an error occurred. * * Group changed from RWRW to RWRA for 4.4 FIXME: is this * incorrectly named? */ public void testDeleteObjectOwnedByOtherRW() throws Exception { EventContext user1Ctx = newUserAndGroup("rwra--"); omero.client user1 = client; // Image Image img = (Image) iUpdate .saveAndReturnObject(mmFactory.createImage()); // Dataset Dataset d = (Dataset) iUpdate.saveAndReturnObject(mmFactory .simpleDatasetData().asDataset()); // Project Project p = (Project) iUpdate.saveAndReturnObject(mmFactory .simpleProjectData().asProject()); // Screen Screen s = (Screen) iUpdate.saveAndReturnObject(mmFactory .simpleScreenData().asScreen()); // Plate Plate plate = (Plate) iUpdate.saveAndReturnObject(mmFactory .simplePlateData().asPlate()); // other user tries to delete disconnect(); newUserInGroup(user1Ctx); List<Request> commands = new ArrayList<Request>(); Delete2 dc = Requests.delete("Image", img.getId().getValue()); commands.add(dc); dc = Requests.delete("Dataset", d.getId().getValue()); commands.add(dc); dc = Requests.delete("Project", p.getId().getValue()); commands.add(dc); dc = Requests.delete("Screen", s.getId().getValue()); commands.add(dc); dc = Requests.delete("Plate", plate.getId().getValue()); commands.add(dc); DoAll all = new DoAll(); all.requests = commands; doChange(client, factory, all, false, null); // Now log the original user back in disconnect(); init(user1); assertExists(img); assertExists(d); assertExists(p); assertExists(s); assertExists(plate); } /** * Test to try to delete an image owned by another user in a read-write * group i.e. RWR--- * * @throws Exception * Thrown if an error occurred. */ @Test public void testDeleteImageOwnedByOtherRWR() throws Exception { // set up collaborative group and one user, "the owner" newUserAndGroup("rwr---"); // create an owner who then creates the image Image img = (Image) iUpdate.saveAndReturnObject(mmFactory .simpleImage()); long imageID = img.getId().getValue(); // create another user and try to delete the image newUserInGroup(); Delete2 dc = Requests.delete("Image", imageID); callback(false, client, dc); // check the image exists as the owner assertExists(img); } /** * Test to try to delete an object by the administrator in a private group * i.e. RW---- * * @throws Exception * Thrown if an error occurred. */ @Test public void testDeleteObjectByAdmin() throws Exception { // Create the private group newUserAndGroup("rw----"); // Create the data as the user Image img = (Image) iUpdate .saveAndReturnObject(mmFactory.createImage()); // Log the admin into that users group logRootIntoGroup(); Delete2 dc = Requests.delete("Image", img.getId().getValue()); callback(true, client, dc); assertDoesNotExist(img); } /** * Test to try to delete an object by the owner of a private group i.e. * RWRW-- * * @throws Exception * Thrown if an error occurred. */ @Test public void testDeleteObjectByGroupOwnerRWRW() throws Exception { EventContext ownerEc = newUserAndGroup("rwrw--"); // owner creates the image Image img = (Image) iUpdate .saveAndReturnObject(mmFactory.createImage()); // group owner deletes it disconnect(); newUserInGroup(ownerEc); makeGroupOwner(); String sql = "select i from Image as i "; sql += "where i.id = :id"; ParametersI param = new ParametersI(); param.addId(img.getId().getValue()); List<IObject> images = iQuery.findAllByQuery(sql, param); assertEquals(images.size(), 1); img = (Image) images.get(0); Permissions perms = img.getDetails().getPermissions(); assertTrue(perms.canDelete()); Delete2 dc = Requests.delete("Image", img.getId().getValue()); callback(true, client, dc); assertDoesNotExist(img); } /** * Test to try to delete an object by the owner of a private group i.e. * RW----. The data should not be deleted * * @throws Exception * Thrown if an error occurred. */ @Test public void testDeleteObjectByGroupOwnerRW() throws Exception { EventContext ownerEc = newUserAndGroup("rw----"); // owner creates the image Image img = (Image) iUpdate .saveAndReturnObject(mmFactory.createImage()); // group owner deletes it disconnect(); newUserInGroup(ownerEc); makeGroupOwner(); Delete2 dc = Requests.delete("Image", img.getId().getValue()); callback(true, client, dc); assertDoesNotExist(img); // Deletion permitted in 4.4 } /** * Test to try to delete an object by the administrator in a read-only * collaborative group i.e. RWR--- * * @throws Exception * Thrown if an error occurred. */ @Test public void testDeleteObjectByAdminRWR() throws Exception { // set up collaborative group newUserAndGroup("rwr---"); // owner creates the image Image img = (Image) iUpdate .saveAndReturnObject(mmFactory.createImage()); // admin deletes the object. logRootIntoGroup(); Delete2 dc = Requests.delete("Image", img.getId().getValue()); callback(true, client, dc); assertDoesNotExist(img); } /** * Test to delete an image that has another user's comment and rating. * @throws Exception unexpected */ @Test(groups = { "ticket:2997" }) public void testDeleteImageAnnotatedByOtherOrphan() throws Exception { // set up collaborative group with an "owner" user final EventContext ec = newUserAndGroup("rwra--"); // owner creates the image final Image image = (Image) iUpdate.saveAndReturnObject(mmFactory.simpleImage()).proxy(); // other user adds comment and rating newUserInGroup(ec); CommentAnnotation comment = new CommentAnnotationI(); comment.setTextValue(omero.rtypes.rstring("What a lovely image!")); comment = (CommentAnnotation) iUpdate.saveAndReturnObject(comment).proxy(); LongAnnotation rating = new LongAnnotationI(); rating.setLongValue(omero.rtypes.rlong(5)); rating.setNs(omero.rtypes.rstring(NSINSIGHTRATING.value)); rating = (LongAnnotation) iUpdate.saveAndReturnObject(rating).proxy(); for (final Annotation annotation : new Annotation[] {comment, rating}) { final ImageAnnotationLink link = new ImageAnnotationLinkI(); link.setParent(image); link.setChild(annotation); iUpdate.saveAndReturnObject(link); } // owner deletes image loginUser(ec); long id = image.getId().getValue(); Delete2 dc = Requests.delete("Image", id); callback(true, client, dc); // image and annotations are all gone assertDoesNotExist(image); assertDoesNotExist(comment); assertDoesNotExist(rating); } /** * Test to delete an image that has another user's comment and rating. * The user has somehow also used the same annotations on their own image. * @throws Exception unexpected */ @Test(groups = { "ticket:2997" }) public void testDeleteImageAnnotatedByOtherMultilinked() throws Exception { // set up collaborative group with an "owner" user final EventContext ec = newUserAndGroup("rwra--"); // owner creates the image final Image imageOwner = (Image) iUpdate.saveAndReturnObject(mmFactory.simpleImage()).proxy(); // other user adds comment and rating to that image and their own newUserInGroup(ec); // other user creates an image final Image imageOther = (Image) iUpdate.saveAndReturnObject(mmFactory.simpleImage()).proxy(); // other user adds same comment and rating to both images CommentAnnotation comment = new CommentAnnotationI(); comment.setTextValue(omero.rtypes.rstring("What a lovely image!")); comment = (CommentAnnotation) iUpdate.saveAndReturnObject(comment).proxy(); LongAnnotation rating = new LongAnnotationI(); rating.setLongValue(omero.rtypes.rlong(5)); rating.setNs(omero.rtypes.rstring(NSINSIGHTRATING.value)); rating = (LongAnnotation) iUpdate.saveAndReturnObject(rating).proxy(); for (final Image image : new Image[] {imageOwner, imageOther}) { for (final Annotation annotation : new Annotation[] {comment, rating}) { final ImageAnnotationLink link = new ImageAnnotationLinkI(); link.setParent(image); link.setChild(annotation); iUpdate.saveAndReturnObject(link); } } // owner deletes their image loginUser(ec); long id = imageOwner.getId().getValue(); Delete2 dc = Requests.delete("Image", id); callback(true, client, dc); // image is gone but other image and annotations remain assertDoesNotExist(imageOwner); assertExists(imageOther); assertExists(comment); assertExists(rating); } /** * Test to delete an image tagged collaboratively by another user. * * @throws Exception * Thrown if an error occurred. * * Group changed from RWRW to RWRA for 4.4 */ @Test(groups = { "ticket:2881" }) public void testDeleteTaggedImageTagOwnedByOther() throws Exception { // set up collaborative group with an "owner" user EventContext ec = newUserAndGroup("rwra--"); // owner creates the image Image img = (Image) iUpdate.saveAndReturnObject(mmFactory .simpleImage()); // tagger creates tag and tags the image newUserInGroup(ec); TagAnnotation c = new TagAnnotationI(); c.setTextValue(omero.rtypes.rstring("tag")); c = (TagAnnotation) iUpdate.saveAndReturnObject(c); ImageAnnotationLink link = new ImageAnnotationLinkI(); link.setParent(img); link.setChild(new TagAnnotationI(c.getId().getValue(), false)); link = (ImageAnnotationLink) iUpdate.saveAndReturnObject(link); // owner tries to delete image. loginUser(ec); long id = img.getId().getValue(); Delete2 dc = Requests.delete("Image", id); callback(true, client, dc); assertDoesNotExist(img); assertExists(c); } /** * Test to delete a tag used by another user. * * @throws Exception * Thrown if an error occurred. * * Group changed from RWRW to RWRA for 4.4 */ @Test(groups = "ticket:2962") public void testDeleteTagUsedByOther() throws Exception { // set up collaborative group with an "owner" user EventContext ec = newUserAndGroup("rwra--"); // owner creates the image Image img = (Image) iUpdate.saveAndReturnObject(mmFactory .simpleImage()); omero.client owner = disconnect(); // tagger creates tag EventContext tagger = newUserInGroup(ec); TagAnnotation c = new TagAnnotationI(); c.setTextValue(omero.rtypes.rstring("tag")); c = (TagAnnotation) iUpdate.saveAndReturnObject(c); disconnect(); init(ec); // Image's owner tags the image. ImageAnnotationLink link = new ImageAnnotationLinkI(); link.setParent(img); link.setChild(new TagAnnotationI(c.getId().getValue(), false)); link = (ImageAnnotationLink) iUpdate.saveAndReturnObject(link); // Tag's owner now deletes the tag. init(tagger); Delete2 dc = Requests.delete("Annotation", c.getId().getValue()); callback(false, client, dc); assertExists(c); assertExists(link); assertExists(img); } /** * Test to delete a tag used by another user. The tag is owned by the group * owner. * * On 2010.10.12 meeting, it was decided that this test will be allowed to * pass, i.e. the owner will be able to delete, but the clients will show a * warning: "You are deleting as an admin/PI". * * @throws Exception * Thrown if an error occurred. */ @Test(groups = "ticket:2962") public void testDeleteTagOwnedByGroupOwnerUsedByOther() throws Exception { // set up collaborative group with an "owner" user EventContext ec = newUserAndGroup("rwrw--"); // owner creates the image Image img = (Image) iUpdate.saveAndReturnObject(mmFactory .simpleImage()); disconnect(); // tagger creates tag EventContext tagger = newUserInGroup(ec); // make the tagger the group owner. makeGroupOwner(); TagAnnotation c = new TagAnnotationI(); c.setTextValue(omero.rtypes.rstring("tag")); c = (TagAnnotation) iUpdate.saveAndReturnObject(c); disconnect(); init(ec); // Image's owner tags the image with another group's owner tag. ImageAnnotationLink link = new ImageAnnotationLinkI(); link.setParent(img); link.setChild(new TagAnnotationI(c.getId().getValue(), false)); link = (ImageAnnotationLink) iUpdate.saveAndReturnObject(link); disconnect(); // Tag's owner now deletes the tag. init(tagger); Delete2 dc = Requests.delete("Annotation", c.getId().getValue()); callback(true, client, dc); assertNoneExist(c, link); assertExists(img); } /** * Test to delete an image viewed by another user in a RWRW-- group. * * @throws Exception * Thrown if an error occurred. */ @Test(groups = "ticket:2963") public void testDeleteImageViewedByOtherRenderingSettingsOnlyRWRW() throws Exception { EventContext ownerCtx = newUserAndGroup("rwrw--"); // owner creates the image Image image = (Image) iUpdate.saveAndReturnObject(mmFactory .createImage()); // create rendering settings for that user. Pixels pixels = image.getPrimaryPixels(); long id = pixels.getId().getValue(); long imageID = image.getId().getValue(); // Image // method already tested IRenderingSettingsPrx prx = factory.getRenderingSettingsService(); prx.setOriginalSettingsInSet(Image.class.getName(), Arrays.asList(imageID)); RenderingDef ownerDef = factory.getPixelsService().retrieveRndSettings( id); newUserInGroup(ownerCtx); prx = factory.getRenderingSettingsService(); prx.setOriginalSettingsInSet(Image.class.getName(), Arrays.asList(imageID)); RenderingDef otherDef = factory.getPixelsService().retrieveRndSettings( id); assertAllExist(ownerDef, otherDef); disconnect(); // Delete the image. loginUser(ownerCtx); Delete2 dc = Requests.delete("Image", imageID); callback(true, client, dc); assertNoneExist(image, ownerDef, otherDef); } /** * Test to delete possible graph P/D in collaborative RWRA-- group. Attempts * to delete a graph by a member * * @throws Exception * Thrown if an error occurred. * * Group changed from RWRW to RWRA for 4.4 */ @Test(groups = "ticket:3119") public void testDeleteProjectDatasetGraphLinkByGroupOwnerRWRA() throws Exception { EventContext ctx = newUserAndGroup("rwra--"); Project project = (Project) iUpdate.saveAndReturnObject(mmFactory .simpleProjectData().asIObject()); Dataset dataset = (Dataset) iUpdate.saveAndReturnObject(mmFactory .simpleDatasetData().asIObject()); // now link the project and dataset. ProjectDatasetLink link = new ProjectDatasetLinkI(); link.setChild((Dataset) dataset.proxy()); link.setParent((Project) project.proxy()); iUpdate.saveAndReturnObject(link); omero.client user1 = disconnect(); // new user newUserInGroup(ctx); makeGroupOwner(); // Now try to delete the project. Delete2 dc = Requests.delete("Project", project.getId().getValue()); callback(true, client, dc); assertDoesNotExist(project); assertDoesNotExist(dataset); } /** * Test to delete possible graph P/D in collaborative RWRW-- group. The * owner of the dataset creates the link with another user's project. * Attempt to delete the dataset. None of the users are owner of the group. * * @throws Exception * Thrown if an error occurred. */ @Test(groups = "ticket:3119") public void testDeleteDatasetGraphLinkDoneByDatasetOwnerRWRW() throws Exception { EventContext ctx = newUserAndGroup("rwrw--"); Project project = (Project) iUpdate.saveAndReturnObject(mmFactory .simpleProjectData().asIObject()); omero.client user1 = disconnect(); // new user newUserInGroup(ctx); Dataset dataset = (Dataset) iUpdate.saveAndReturnObject(mmFactory .simpleDatasetData().asIObject()); // now link the project and dataset. ProjectDatasetLink link = new ProjectDatasetLinkI(); link.setChild((Dataset) dataset.proxy()); link.setParent((Project) project.proxy()); link = (ProjectDatasetLink) iUpdate.saveAndReturnObject(link); // Now try to delete the dataset. Delete2 dc = Requests.delete("Dataset", dataset.getId().getValue()); callback(true, client, dc); assertDoesNotExist(dataset); assertExists(project); assertDoesNotExist(link); } /** * Test to delete possible graph P/D in collaborative RWRW-- group. The * owner of the project creates the link with another user's dataset. * Attempt to delete the dataset. None of the users are owner of the group. * * @throws Exception * Thrown if an error occurred. */ @Test(groups = "ticket:3119") public void testDeleteDatasetProjectGraphLinkDoneByProjectOwnerRWRW() throws Exception { EventContext ctx = newUserAndGroup("rwrw--"); Project project = (Project) iUpdate.saveAndReturnObject(mmFactory .simpleProjectData().asIObject()); disconnect(); // new user EventContext user2Ctx = newUserInGroup(ctx); Dataset dataset = (Dataset) iUpdate.saveAndReturnObject(mmFactory .simpleDatasetData().asIObject()); disconnect(); loginUser(ctx); // now link the project and dataset. ProjectDatasetLink link = new ProjectDatasetLinkI(); link.setChild((Dataset) dataset.proxy()); link.setParent((Project) project.proxy()); link = (ProjectDatasetLink) iUpdate.saveAndReturnObject(link); disconnect(); loginUser(user2Ctx); // Now try to delete the dataset. Delete2 dc = Requests.delete("Dataset", dataset.getId().getValue()); callback(true, client, dc); assertDoesNotExist(dataset); assertExists(project); assertDoesNotExist(link); } /** * Test to delete a dataset in collaborative RWRA-- group. The dataset will * contain 2 images, one owned by another user. None of the users are owner * of the group. * * @throws Exception * Thrown if an error occurred. * * Group changed from RWRW to RWRA for 4.4 */ public void testDeleteDatasetImagesGraphRWRA() throws Exception { EventContext ctx = newUserAndGroup("rwra--"); Dataset dataset = (Dataset) iUpdate.saveAndReturnObject(mmFactory .simpleDatasetData().asIObject()); Image image1 = (Image) iUpdate.saveAndReturnObject(mmFactory .createImage()); DatasetImageLink link = new DatasetImageLinkI(); link.setChild((Image) image1.proxy()); link.setParent((Dataset) dataset.proxy()); iUpdate.saveAndReturnObject(link); disconnect(); EventContext user2Ctx = newUserInGroup(ctx, true); loginUser(user2Ctx); // create new user. Image image2 = (Image) iUpdate.saveAndReturnObject(mmFactory .createImage()); link = new DatasetImageLinkI(); link.setChild((Image) image2.proxy()); link.setParent((Dataset) dataset.proxy()); iUpdate.saveAndReturnObject(link); disconnect(); // now try to delete the dataset loginUser(ctx); Delete2 dc = Requests.delete("Dataset", dataset.getId().getValue()); callback(true, client, dc); assertDoesNotExist(dataset); assertDoesNotExist(image1); assertExists(image2); } /** * Test to delete an image in collaborative RWRW-- group. The image is * linked to another user's dataset. The image was added by the owner of the * image. None of the users are owner of the group. * * @throws Exception * Thrown if an error occurred. */ @Test(groups = "ticket:3119") public void testDeleteImageInOtherUserDatasetRWRW() throws Exception { EventContext ctx = newUserAndGroup("rwrw--"); Dataset dataset = (Dataset) iUpdate.saveAndReturnObject(mmFactory .simpleDatasetData().asIObject()); disconnect(); EventContext user2Ctx = newUserInGroup(ctx); loginUser(user2Ctx); // create new user. Image image = (Image) iUpdate.saveAndReturnObject(mmFactory .createImage()); DatasetImageLink link = new DatasetImageLinkI(); link.setChild((Image) image.proxy()); link.setParent((Dataset) dataset.proxy()); iUpdate.saveAndReturnObject(link); // Now try to delete the image Delete2 dc = Requests.delete("Image", image.getId().getValue()); callback(true, client, dc); assertDoesNotExist(image); assertExists(dataset); } /** * Test to delete an image in collaborative RWRW-- group. The image is * linked to another user's dataset. The image was added by the owner of the * dataset. None of the users are owner of the group. * * @throws Exception * Thrown if an error occurred. */ @Test(groups = "ticket:3119") public void testDeleteImageInOtherUserDatasetAddedByDatasetOwnerRWRW() throws Exception { EventContext ctx = newUserAndGroup("rwrw--"); Dataset dataset = (Dataset) iUpdate.saveAndReturnObject(mmFactory .simpleDatasetData().asIObject()); disconnect(); EventContext user2Ctx = newUserInGroup(ctx); loginUser(user2Ctx); // create new user. Image image = (Image) iUpdate.saveAndReturnObject(mmFactory .createImage()); disconnect(); loginUser(ctx); DatasetImageLink link = new DatasetImageLinkI(); link.setChild((Image) image.proxy()); link.setParent((Dataset) dataset.proxy()); iUpdate.saveAndReturnObject(link); disconnect(); // now try to delete the image loginUser(user2Ctx); Delete2 dc = Requests.delete("Image", image.getId().getValue()); callback(true, client, dc); assertDoesNotExist(image); assertExists(dataset); } /** * Test to delete possible graph Screen/Plate in collaborative RWRA-- group. * The graph delete by member None of the users are owner of the group. * * @throws Exception * Thrown if an error occurred. * * Group changed from RWRW to RWRA for 4.4 */ @Test(groups = "ticket:3119") public void testDeleteScreenPlateGraphLinkRWRA() throws Exception { EventContext ctx = newUserAndGroup("rwra--"); Screen screen = (Screen) iUpdate.saveAndReturnObject(mmFactory .simpleScreenData().asIObject()); Plate plate = (Plate) iUpdate.saveAndReturnObject(mmFactory .simplePlateData().asIObject()); // now link the project and dataset. ScreenPlateLink link = new ScreenPlateLinkI(); link.setChild((Plate) plate.proxy()); link.setParent((Screen) screen.proxy()); link = (ScreenPlateLink) iUpdate.saveAndReturnObject(link); disconnect(); // new user newUserInGroup(ctx); // Now try to delete the screen Delete2 dc = Requests.delete("Screen", screen.getId().getValue()); callback(false, client, dc); assertExists(screen); assertExists(plate); } /** * Test to delete possible graph Screen/Plate in collaborative RWRA-- group. * The graph delete by member None of the users are owner of the group. * * @throws Exception * Thrown if an error occurred. * * Group changed from RWRW to RWRA for 4.4 */ @Test(groups = "ticket:3119") public void testDeleteScreenPlateGraphLinkByGroupOwnerRWRA() throws Exception { EventContext ctx = newUserAndGroup("rwra--"); Screen screen = (Screen) iUpdate.saveAndReturnObject(mmFactory .simpleScreenData().asIObject()); Plate plate = (Plate) iUpdate.saveAndReturnObject(mmFactory .simplePlateData().asIObject()); // now link the project and dataset. ScreenPlateLink link = new ScreenPlateLinkI(); link.setChild((Plate) plate.proxy()); link.setParent((Screen) screen.proxy()); link = (ScreenPlateLink) iUpdate.saveAndReturnObject(link); disconnect(); // new user newUserInGroup(ctx); makeGroupOwner(); // Now try to delete the screen Delete2 dc = Requests.delete("Screen", screen.getId().getValue()); callback(true, client, dc); assertDoesNotExist(screen); assertDoesNotExist(plate); } /** * Test to delete possible graph Screen/Plate in collaborative RWRW-- group. * The owner of the plate creates the link with another user's screen. * Attempt to delete the plate. None of the users are owner of the group. * * @throws Exception * Thrown if an error occurred. */ @Test(groups = "ticket:3119") public void testDeletePlateGraphLinkDoneByPlateOwnerRWRW() throws Exception { EventContext ctx = newUserAndGroup("rwrw--"); Screen screen = (Screen) iUpdate.saveAndReturnObject(mmFactory .simpleScreenData().asIObject()); disconnect(); // new user newUserInGroup(ctx); Plate plate = (Plate) iUpdate.saveAndReturnObject(mmFactory .simplePlateData().asIObject()); ScreenPlateLink link = new ScreenPlateLinkI(); link.setChild((Plate) plate.proxy()); link.setParent((Screen) screen.proxy()); link = (ScreenPlateLink) iUpdate.saveAndReturnObject(link); // Now try to delete the plate Delete2 dc = Requests.delete("Plate", plate.getId().getValue()); callback(true, client, dc); assertDoesNotExist(plate); assertExists(screen); assertDoesNotExist(link); } /** * Test to delete possible graph Screen/Plate in collaborative RWRW-- group. * The owner of the screen creates the link with another user's plate. * Attempt to delete the plate. None of the users are owner of the group. * * @throws Exception * Thrown if an error occurred. */ @Test(groups = "ticket:3119") public void testDeletePlateScreenGraphLinkDoneByScreenOwnerRWRW() throws Exception { EventContext ctx = newUserAndGroup("rwrw--"); Screen screen = (Screen) iUpdate.saveAndReturnObject(mmFactory .simpleScreenData().asIObject()); disconnect(); // new user EventContext user2Ctx = newUserInGroup(ctx); Plate plate = (Plate) iUpdate.saveAndReturnObject(mmFactory .simplePlateData().asIObject()); disconnect(); loginUser(ctx); // now link the project and dataset. ScreenPlateLink link = new ScreenPlateLinkI(); link.setChild((Plate) plate.proxy()); link.setParent((Screen) screen.proxy()); link = (ScreenPlateLink) iUpdate.saveAndReturnObject(link); disconnect(); loginUser(user2Ctx); // Now try to delete the plate Delete2 dc = Requests.delete("Plate", plate.getId().getValue()); callback(true, client, dc); assertDoesNotExist(plate); assertExists(screen); assertDoesNotExist(link); } /** * Test to delete a dataset in collaborative RWRW-- group. The dataset * contains one image, the image has added by another user to his/her * dataset. None of the users are owner of the group. * * @throws Exception * Thrown if an error occurred. */ public void testDeleteDatasetWithInOtherUserDatasetRWRW() throws Exception { EventContext ctx = newUserAndGroup("rwrw--"); Dataset dataset = (Dataset) iUpdate.saveAndReturnObject(mmFactory .simpleDatasetData().asIObject()); Image image = (Image) iUpdate.saveAndReturnObject(mmFactory .createImage()); DatasetImageLink link = new DatasetImageLinkI(); link.setChild((Image) image.proxy()); link.setParent((Dataset) dataset.proxy()); iUpdate.saveAndReturnObject(link); disconnect(); EventContext user2Ctx = newUserInGroup(ctx); loginUser(user2Ctx); // create new user. Dataset dataset2 = (Dataset) iUpdate.saveAndReturnObject(mmFactory .simpleDatasetData().asIObject()); link = new DatasetImageLinkI(); link.setChild((Image) image.proxy()); link.setParent((Dataset) dataset2.proxy()); iUpdate.saveAndReturnObject(link); disconnect(); loginUser(ctx); // Now try to delete the dataset Delete2 dc = Requests.delete("Dataset", dataset.getId().getValue()); callback(true, client, dc); assertDoesNotExist(dataset); assertExists(image); assertExists(dataset2); } /** * Test to try to delete an object by the administrator in a read-annotate * collaborative group i.e. RWRA-- * * @throws Exception * Thrown if an error occurred. */ @Test public void testDeleteObjectByAdminRWRA() throws Exception { // set up collaborative group newUserAndGroup("rwra--"); // owner creates the image Image img = (Image) iUpdate .saveAndReturnObject(mmFactory.createImage()); // admin deletes the object. logRootIntoGroup(); Delete2 dc = Requests.delete("Image", img.getId().getValue()); callback(true, client, dc); assertDoesNotExist(img); } /** * Test to try to delete an object by the administrator in a read-write * collaborative group i.e. RWRW-- * * @throws Exception * Thrown if an error occurred. */ @Test public void testDeleteObjectByAdminRWRW() throws Exception { // set up collaborative group newUserAndGroup("rwrw--"); // owner creates the image Image img = (Image) iUpdate .saveAndReturnObject(mmFactory.createImage()); // admin deletes the object. logRootIntoGroup(); Delete2 dc = Requests.delete("Image", img.getId().getValue()); callback(true, client, dc); assertDoesNotExist(img); } /** * Test to try to delete an object by the owner of a read-annotate i.e. * RWRA-- * * @throws Exception * Thrown if an error occurred. */ @Test public void testDeleteObjectByGroupOwnerRWRA() throws Exception { EventContext ownerEc = newUserAndGroup("rwra--"); // owner creates the image Image img = (Image) iUpdate .saveAndReturnObject(mmFactory.createImage()); // group owner deletes it disconnect(); newUserInGroup(ownerEc); makeGroupOwner(); String sql = "select i from Image as i "; sql += "where i.id = :id"; ParametersI param = new ParametersI(); param.addId(img.getId().getValue()); List<IObject> images = iQuery.findAllByQuery(sql, param); assertEquals(images.size(), 1); img = (Image) images.get(0); Permissions perms = img.getDetails().getPermissions(); assertTrue(perms.canDelete()); Delete2 dc = Requests.delete("Image", img.getId().getValue()); callback(true, client, dc); // Image should be deleted. assertDoesNotExist(img); } /** * Test to try to delete an object by a member of a read-only group i.e. * RWR--- * * @throws Exception * Thrown if an error occurred. */ public void testDeleteObjectByMemberRWR() throws Exception { EventContext ownerEc = newUserAndGroup("rwr---"); // owner creates the image Image img = (Image) iUpdate .saveAndReturnObject(mmFactory.createImage()); // group owner deletes it disconnect(); newUserInGroup(ownerEc); Delete2 dc = Requests.delete("Image", img.getId().getValue()); callback(false, client, dc); assertExists(img); } /** * Test to try to delete an object by a member of a read-annotate group i.e. * RWRA-- * * @throws Exception * Thrown if an error occurred. */ public void testDeleteObjectByMemberRWRA() throws Exception { EventContext ownerEc = newUserAndGroup("rwra--"); // owner creates the image Image img = (Image) iUpdate .saveAndReturnObject(mmFactory.createImage()); // group owner deletes it disconnect(); newUserInGroup(ownerEc); Delete2 dc = Requests.delete("Image", img.getId().getValue()); callback(false, client, dc); assertExists(img); } /** * Test to try to delete an object by a member of a read-write group i.e. * RWRW-- * * @throws Exception * Thrown if an error occurred. */ @Test public void testDeleteObjectByMemberRWRW() throws Exception { EventContext ownerEc = newUserAndGroup("rwrw--"); // owner creates the image Image img = (Image) iUpdate .saveAndReturnObject(mmFactory.createImage()); // group owner deletes it disconnect(); newUserInGroup(ownerEc); String sql = "select i from Image as i "; sql += "where i.id = :id"; ParametersI param = new ParametersI(); param.addId(img.getId().getValue()); List<IObject> images = iQuery.findAllByQuery(sql, param); assertEquals(images.size(), 1); img = (Image) images.get(0); Permissions perms = img.getDetails().getPermissions(); assertTrue(perms.canDelete()); Delete2 dc = Requests.delete("Image", img.getId().getValue()); callback(true, client, dc); assertDoesNotExist(img); } }