/** * The contents of this file are subject to the license and copyright * detailed in the LICENSE and NOTICE files at the root of the source * tree and available online at * * http://www.dspace.org/license/ */ package org.dspace.content; import static org.hamcrest.CoreMatchers.equalTo; import static org.hamcrest.CoreMatchers.not; import static org.hamcrest.CoreMatchers.notNullValue; import static org.hamcrest.CoreMatchers.nullValue; import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertFalse; import static org.junit.Assert.assertThat; import static org.junit.Assert.assertTrue; import static org.junit.Assert.fail; import static org.mockito.ArgumentMatchers.any; import static org.mockito.ArgumentMatchers.eq; import static org.mockito.Mockito.doNothing; import static org.mockito.Mockito.doThrow; import static org.mockito.Mockito.spy; import static org.mockito.Mockito.when; import java.io.File; import java.io.FileInputStream; import java.sql.SQLException; import java.util.List; import java.util.UUID; import org.apache.logging.log4j.Logger; import org.dspace.authorize.AuthorizeException; import org.dspace.authorize.factory.AuthorizeServiceFactory; import org.dspace.authorize.service.AuthorizeService; import org.dspace.content.service.CommunityService; import org.dspace.core.Constants; import org.dspace.core.Context; import org.dspace.eperson.Group; import org.junit.After; import org.junit.Before; import org.junit.Test; import org.springframework.test.util.ReflectionTestUtils; /** * Unit Tests for class Community * * @author pvillega */ public class CommunityTest extends AbstractDSpaceObjectTest { /** * log4j category */ private static final Logger log = org.apache.logging.log4j.LogManager.getLogger(CommunityTest.class); /** * Community instance for the tests */ private Community c; /** * Spy of AuthorizeService to use for tests * (initialized / setup in @Before method) */ private AuthorizeService authorizeServiceSpy; /** * This method will be run before every test as per @Before. It will * initialize resources required for the tests. * * Other methods can be annotated with @Before here or in subclasses * but no execution order is guaranteed */ @Before @Override public void init() { super.init(); try { // we have to create a new community in the database // and only Admins can create a top-level community context.turnOffAuthorisationSystem(); this.c = communityService.create(null, context); this.dspaceObject = c; //we need to commit the changes so we don't block the table for testing context.restoreAuthSystemState(); // Initialize our spy of the autowired (global) authorizeService bean. // This allows us to customize the bean's method return values in tests below authorizeServiceSpy = spy(authorizeService); // "Wire" our spy to be used by the current loaded object services // (To ensure both these services use the spy instead of the real service) ReflectionTestUtils.setField(communityService, "authorizeService", authorizeServiceSpy); ReflectionTestUtils.setField(collectionService, "authorizeService", authorizeServiceSpy); ReflectionTestUtils.setField(itemService, "authorizeService", authorizeServiceSpy); // Also wire into current AuthorizeServiceFactory, as that is used for some checks (e.g. AuthorizeUtil) ReflectionTestUtils.setField(AuthorizeServiceFactory.getInstance(), "authorizeService", authorizeServiceSpy); } catch (AuthorizeException ex) { log.error("Authorization Error in init", ex); fail("Authorization Error in init: " + ex.getMessage()); } catch (SQLException ex) { log.error("SQL Error in init", ex); fail("SQL Error in init: " + ex.getMessage()); } } /** * This method will be run after every test as per @After. It will * clean resources initialized by the @Before methods. * * Other methods can be annotated with @After here or in subclasses * but no execution order is guaranteed */ @After @Override public void destroy() { context.turnOffAuthorisationSystem(); // Delete community created in init() try { communityService.delete(context, c); } catch (Exception e) { // ignore } context.restoreAuthSystemState(); c = null; super.destroy(); } /** * Test of find method, of class Community. */ @Test public void testCommunityFind() throws Exception { UUID id = c.getID(); Community found = communityService.find(context, id); assertThat("testCommunityFind 0", found, notNullValue()); assertThat("testCommunityFind 1", found.getID(), equalTo(id)); //the community created by default has no name assertThat("testCommunityFind 2", found.getName(), equalTo("")); } /** * Test of create method, of class Community. */ @Test public void testCreateAuth() throws Exception { // Below settings default to Community-Admin Rights (but not full Admin rights) // Allow parent Community ADD perms (needed to just create community) when(authorizeServiceSpy.authorizeActionBoolean(context, c, Constants.ADD)).thenReturn(true); // Disallow full Admin perms when(authorizeServiceSpy.isAdmin(context)).thenReturn(false); // test that a Community Admin can create a Community with parent (Sub-Community) Community sub = communityService.create(c, context); //the item created by default has no name set assertThat("testCreate 2", sub, notNullValue()); assertThat("testCreate 3", sub.getName(), equalTo("")); assertTrue("testCreate 4", communityService.getAllParents(context, sub).size() == 1); assertThat("testCreate 5", communityService.getAllParents(context, sub).get(0), equalTo(c)); } /** * Test of create method, of class Community. */ @Test public void testCreateAuth2() throws Exception { // Below settings default to Full Admin Rights (but not Community Admin rights) // Allow full Admin perms when(authorizeServiceSpy.isAdmin(context)).thenReturn(true); //Test that a full Admin can create a Community without a parent (Top-Level Community) Community created = communityService.create(null, context); //the item created by default has no name set assertThat("testCreate 0", created, notNullValue()); assertThat("testCreate 1", created.getName(), equalTo("")); //Test that a full Admin can also create a Community with a parent (Sub-Community) Community son = communityService.create(created, context); //the item created by default has no name set assertThat("testCreate 2", son, notNullValue()); assertThat("testCreate 3", son.getName(), equalTo("")); assertTrue("testCreate 4", communityService.getAllParents(context, son).size() == 1); assertThat("testCreate 5", communityService.getAllParents(context, son).get(0), equalTo(created)); } /** * Test of create method, of class Community. */ @Test(expected = AuthorizeException.class) public void testCreateNoAuth() throws Exception { // Disallow full Admin perms when(authorizeServiceSpy.isAdmin(context)).thenReturn(false); // test creating community with no parent (as a non-admin) // this should throw an exception communityService.create(null, context); fail("Exception expected"); } /** * Test of create method (with specified valid handle), of class Community. */ @Test public void testCreateWithValidHandle() throws Exception { // Allow full Admin perms when(authorizeServiceSpy.isAdmin(context)).thenReturn(true); // test creating community with a specified handle which is NOT already in use // (this handle should not already be used by system, as it doesn't start with "1234567689" prefix) Community created = communityService.create(null, context, "987654321/100c"); // check that community was created, and that its handle was set to proper value assertThat("testCreateWithValidHandle 0", created, notNullValue()); assertThat("testCreateWithValidHandle 1", created.getHandle(), equalTo("987654321/100c")); } /** * Test of create method (with specified invalid handle), of class Community. */ @Test(expected = IllegalStateException.class) public void testCreateWithInvalidHandle() throws Exception { // Allow full Admin perms when(authorizeServiceSpy.isAdmin(context)).thenReturn(true); //get handle of our default created community String inUseHandle = c.getHandle(); // test creating community with a specified handle which IS already in use // This should throw an exception communityService.create(null, context, inUseHandle); fail("Exception expected"); } /** * Test of findAll method, of class Community. */ @Test public void testFindAll() throws Exception { List all = communityService.findAll(context); assertThat("testFindAll 0", all, notNullValue()); assertTrue("testFindAll 1", all.size() >= 1); boolean added = false; for (Community cm : all) { if (cm.equals(c)) { added = true; } } assertTrue("testFindAll 2", added); } /** * Test of findAllTop method, of class Community. */ @Test public void testFindAllTop() throws Exception { List all = communityService.findAllTop(context); assertThat("testFindAllTop 0", all, notNullValue()); assertTrue("testFindAllTop 1", all.size() >= 1); for (Community cm : all) { assertThat("testFindAllTop for", communityService.getAllParents(context, cm).size(), equalTo(0)); } boolean added = false; for (Community cm : all) { if (cm.equals(c)) { added = true; } } assertTrue("testFindAllTop 2", added); } /** * Test of getID method, of class Community. */ @Test @Override public void testGetID() { assertTrue("testGetID 0", c.getID() != null); } @Test public void testLegacyID() { assertTrue("testGetLegacyID 0", c.getLegacyId() == null); } /** * Test of getHandle method, of class Community. */ @Test @Override public void testGetHandle() { //default instance has a random handle assertTrue("testGetHandle 0", c.getHandle().contains("123456789/")); } /** * Test of setMetadata method, of class Community. */ @Test public void testSetMetadata() throws SQLException { String name = "name"; String sdesc = "short description"; String itext = "introductory text"; String copy = "copyright declaration"; String sidebar = "side bar text"; communityService.setMetadata(context, c, "name", name); communityService.setMetadata(context, c, "short_description", sdesc); communityService.setMetadata(context, c, "introductory_text", itext); communityService.setMetadata(context, c, "copyright_text", copy); communityService.setMetadata(context, c, "side_bar_text", sidebar); assertEquals("Name not set properly.", name, communityService.getMetadataFirstValue(c, CommunityService.MD_NAME, Item.ANY)); assertEquals("Short description not set properly.", sdesc, communityService.getMetadataFirstValue(c, CommunityService.MD_SHORT_DESCRIPTION, Item.ANY)); assertEquals("Introductory text not set properly.", itext, communityService.getMetadataFirstValue(c, CommunityService.MD_INTRODUCTORY_TEXT, Item.ANY)); assertEquals("Copyright text not set properly.", copy, communityService.getMetadataFirstValue(c, CommunityService.MD_COPYRIGHT_TEXT, Item.ANY)); assertEquals("Sidebar text not set properly.", sidebar, communityService.getMetadataFirstValue(c, CommunityService.MD_SIDEBAR_TEXT, Item.ANY)); } /** * Test of getName method, of class Community. */ @Test @Override public void testGetName() { //by default is empty assertThat("testGetName 0", c.getName(), equalTo("")); } /** * Test of getLogo method, of class Community. */ @Test public void testGetLogo() { //by default is empty assertThat("testGetLogo 0", c.getLogo(), nullValue()); } /** * Test of setLogo method, of class Community. */ @Test public void testSetLogoAuth() throws Exception { // Allow current Community WRITE perms doNothing().when(authorizeServiceSpy).authorizeAction(context, c, Constants.WRITE); File f = new File(testProps.get("test.bitstream").toString()); Bitstream logo = communityService.setLogo(context, c, new FileInputStream(f)); assertThat("testSetLogoAuth 0", c.getLogo(), equalTo(logo)); c.setLogo(null); assertThat("testSetLogoAuth 1", c.getLogo(), nullValue()); } /** * Test of setLogo method, of class Community. */ @Test(expected = AuthorizeException.class) public void testSetLogoNoAuth() throws Exception { // Disallow current Community WRITE perms doThrow(new AuthorizeException()).when(authorizeServiceSpy).authorizeAction(context, c, Constants.WRITE); File f = new File(testProps.get("test.bitstream").toString()); communityService.setLogo(context, c, new FileInputStream(f)); fail("Exception expected"); } /** * Test of update method, of class Community. */ @Test(expected = AuthorizeException.class) public void testUpdateNoAuth() throws Exception { // Disallow current Community WRITE perms doThrow(new AuthorizeException()).when(authorizeServiceSpy).authorizeAction(context, c, Constants.WRITE); //TODO: we need to verify the update, how? communityService.update(context, c); fail("Exception must be thrown"); } /** * Test of update method, of class Community. */ @Test public void testUpdateAuth() throws Exception { // Allow current Community WRITE perms doNothing().when(authorizeServiceSpy).authorizeAction(context, c, Constants.WRITE); //TODO: we need to verify the update, how? communityService.update(context, c); } /** * Test of createAdministrators method, of class Community. */ @Test public void testCreateAdministratorsAuth() throws Exception { // Allow Community ADMIN perms doNothing().when(authorizeServiceSpy).authorizeAction(context, c, Constants.ADMIN); Group result = communityService.createAdministrators(context, c); assertThat("testCreateAdministratorsAuth 0", c.getAdministrators(), notNullValue()); assertThat("testCreateAdministratorsAuth 1", c.getAdministrators(), equalTo(result)); } /** * Test of createAdministrators method, of class Community. */ @Test(expected = AuthorizeException.class) public void testCreateAdministratorsNoAuth() throws Exception { communityService.createAdministrators(context, c); fail("Exception should have been thrown"); } /** * Test of removeAdministrators method, of class Community. */ @Test public void testRemoveAdministratorsAuth() throws Exception { // Allow Full ADMIN perms (Community Admins cannot delete their Admin Group) when(authorizeServiceSpy.isAdmin(context)).thenReturn(true); // Ensure admin group is created first context.turnOffAuthorisationSystem(); Group result = communityService.createAdministrators(context, c); context.restoreAuthSystemState(); assertThat("testRemoveAdministratorsAuth 0", c.getAdministrators(), notNullValue()); assertThat("testRemoveAdministratorsAuth 1", c.getAdministrators(), equalTo(result)); communityService.removeAdministrators(context, c); assertThat("testRemoveAdministratorsAuth 2", c.getAdministrators(), nullValue()); } /** * Test of removeAdministrators method, of class Community. */ @Test(expected = AuthorizeException.class) public void testRemoveAdministratorsNoAuth() throws Exception { // Allow Community ADMIN perms (Community Admins cannot delete their Admin Group) doNothing().when(authorizeServiceSpy).authorizeAction(context, c, Constants.ADMIN); // Ensure admin group is created first context.turnOffAuthorisationSystem(); Group result = communityService.createAdministrators(context, c); context.restoreAuthSystemState(); assertThat("testRemoveAdministratorsAuth 0", c.getAdministrators(), notNullValue()); assertThat("testRemoveAdministratorsAuth 1", c.getAdministrators(), equalTo(result)); communityService.removeAdministrators(context, c); fail("Should have thrown exception"); } /** * Test of getAdministrators method, of class Community. */ @Test public void testGetAdministrators() { //null by default assertThat("testGetAdministrators 0", c.getAdministrators(), nullValue()); } /** * Test of getCollections method, of class Community. */ @Test public void testGetCollections() throws Exception { //empty by default assertThat("testGetCollections 0", c.getCollections(), notNullValue()); assertTrue("testGetCollections 1", c.getCollections().size() == 0); context.turnOffAuthorisationSystem(); Collection collection = collectionService.create(context, c); collectionService .setMetadataSingleValue(context, collection, MetadataSchemaEnum.DC.getName(), "title", null, Item.ANY, "collection B"); collection = collectionService.create(context, c); collectionService .setMetadataSingleValue(context, collection, MetadataSchemaEnum.DC.getName(), "title", null, Item.ANY, "collection C"); collection = collectionService.create(context, c); collectionService .setMetadataSingleValue(context, collection, MetadataSchemaEnum.DC.getName(), "title", null, Item.ANY, "collection A"); //we need to commit the changes so we don't block the table for testing context.restoreAuthSystemState(); //sorted assertTrue("testGetCollections 2", c.getCollections().get(0).getName().equals("collection A")); assertTrue("testGetCollections 3", c.getCollections().get(1).getName().equals("collection B")); assertTrue("testGetCollections 4", c.getCollections().get(2).getName().equals("collection C")); } /** * Test of getSubcommunities method, of class Community. */ @Test public void testGetSubcommunities() throws Exception { //empty by default assertThat("testGetSubcommunities 0", c.getSubcommunities(), notNullValue()); assertTrue("testGetSubcommunities 1", c.getSubcommunities().size() == 0); context.turnOffAuthorisationSystem(); Community community = communityService.create(c, context); communityService .setMetadataSingleValue(context, community, MetadataSchemaEnum.DC.getName(), "title", null, Item.ANY, "subcommunity B"); community = communityService.create(c, context); communityService .setMetadataSingleValue(context, community, MetadataSchemaEnum.DC.getName(), "title", null, Item.ANY, "subcommunity A"); community = communityService.create(c, context); communityService .setMetadataSingleValue(context, community, MetadataSchemaEnum.DC.getName(), "title", null, Item.ANY, "subcommunity C"); //we need to commit the changes so we don't block the table for testing context.restoreAuthSystemState(); //get Subcommunities sorted assertTrue("testGetCollections 2", c.getSubcommunities().get(0).getName().equals("subcommunity A")); assertTrue("testGetCollections 3", c.getSubcommunities().get(1).getName().equals("subcommunity B")); assertTrue("testGetCollections 4", c.getSubcommunities().get(2).getName().equals("subcommunity C")); } /** * Test of getParentCommunity method, of class Community. */ @Test public void testGetParentCommunity() throws Exception { //null by default assertThat("testGetParentCommunity 0", c.getParentCommunities().size(), equalTo(0)); //community with parent context.turnOffAuthorisationSystem(); Community son = communityService.create(c, context); context.restoreAuthSystemState(); assertThat("testGetParentCommunity 1", son.getParentCommunities().size(), not(0)); assertThat("testGetParentCommunity 2", son.getParentCommunities().get(0), equalTo(c)); } /** * Test of getAllParents method, of class Community. */ @Test public void testGetAllParents() throws Exception { //empty by default assertThat("testGetAllParents 0", communityService.getAllParents(context, c), notNullValue()); assertTrue("testGetAllParents 1", communityService.getAllParents(context, c).size() == 0); //community with parent context.turnOffAuthorisationSystem(); Community son = communityService.create(c, context); context.restoreAuthSystemState(); assertThat("testGetAllParents 2", communityService.getAllParents(context, son), notNullValue()); assertTrue("testGetAllParents 3", communityService.getAllParents(context, son).size() == 1); assertThat("testGetAllParents 4", communityService.getAllParents(context, son).get(0), equalTo(c)); } /** * Test of getAllCollections method, of class Community. */ @Test public void testGetAllCollections() throws Exception { //empty by default assertThat("testGetAllCollections 0", communityService.getAllCollections(context, c), notNullValue()); assertTrue("testGetAllCollections 1", communityService.getAllCollections(context, c).isEmpty()); //community has a collection and a subcommunity, subcommunity has a collection context.turnOffAuthorisationSystem(); Collection collOfC = collectionService.create(context, c); Community sub = communityService.create(c, context); Collection collOfSub = collectionService.create(context, sub); context.restoreAuthSystemState(); assertThat("testGetAllCollections 2", communityService.getAllCollections(context, c), notNullValue()); assertTrue("testGetAllCollections 3", communityService.getAllCollections(context, c).size() == 2); assertThat("testGetAllCollections 4", communityService.getAllCollections(context, c).get(0), equalTo(collOfSub)); assertThat("testGetAllCollections 5", communityService.getAllCollections(context, c).get(1), equalTo(collOfC)); } /** * Test of createCollection method, of class Community. */ @Test public void testCreateCollectionAuth() throws Exception { // Allow current Community ADD perms doNothing().when(authorizeServiceSpy).authorizeAction(context, c, Constants.ADD); Collection result = collectionService.create(context, c); assertThat("testCreateCollectionAuth 0", result, notNullValue()); assertThat("testCreateCollectionAuth 1", c.getCollections(), notNullValue()); assertThat("testCreateCollectionAuth 2", c.getCollections().get(0), equalTo(result)); } /** * Test of createCollection method, of class Community. */ @Test(expected = AuthorizeException.class) public void testCreateCollectionNoAuth() throws Exception { // Disallow current Community ADD perms doThrow(new AuthorizeException()).when(authorizeServiceSpy).authorizeAction(context, c, Constants.ADD); collectionService.create(context, c); fail("Exception expected"); } /** * Test of addCollection method, of class Community. */ @Test public void testAddCollectionAuth() throws Exception { // Allow current Community ADD perms doNothing().when(authorizeServiceSpy).authorizeAction(context, c, Constants.ADD); Collection col = collectionService.create(context, c); c.addCollection(col); assertThat("testAddCollectionAuth 0", c.getCollections(), notNullValue()); assertThat("testAddCollectionAuth 1", c.getCollections().get(0), equalTo(col)); } /** * Test of addCollection method, of class Community. */ @Test(expected = AuthorizeException.class) public void testAddCollectionNoAuth() throws Exception { // Disallow current Community ADD perms doThrow(new AuthorizeException()).when(authorizeServiceSpy).authorizeAction(context, c, Constants.ADD); Collection col = collectionService.create(context, c); c.addCollection(col); fail("Exception expected"); } /** * Test of createSubcommunity method, of class Community. */ @Test public void testCreateSubcommunityAuth() throws Exception { // Allow current Community ADD perms doNothing().when(authorizeServiceSpy).authorizeAction(context, c, Constants.ADD); // Allow parent Community ADD perms when(authorizeServiceSpy.authorizeActionBoolean(context, c, Constants.ADD)).thenReturn(true); Community result = communityService.createSubcommunity(context, c); assertThat("testCreateSubcommunityAuth 0", c.getSubcommunities(), notNullValue()); assertTrue("testCreateSubcommunityAuth 1", c.getSubcommunities().size() == 1); assertThat("testCreateSubcommunityAuth 2", c.getSubcommunities().get(0), equalTo(result)); } /** * Test of createSubcommunity method, of class Community. */ @Test(expected = AuthorizeException.class) public void testCreateSubcommunityNoAuth() throws Exception { // Disallow current Community ADD perms doThrow(new AuthorizeException()).when(authorizeServiceSpy).authorizeAction(context, c, Constants.ADD); communityService.createSubcommunity(context, c); fail("Exception expected"); } /** * Test of addSubcommunity method, of class Community. */ @Test public void testAddSubcommunityAuth() throws Exception { // Allow current Community ADD perms doNothing().when(authorizeServiceSpy).authorizeAction(context, c, Constants.ADD); // Turn off authorization temporarily to create a new top-level community context.turnOffAuthorisationSystem(); Community result = communityService.create(null, context); context.restoreAuthSystemState(); communityService.addSubcommunity(context, c, result); assertThat("testAddSubcommunityAuth 0", c.getSubcommunities(), notNullValue()); assertTrue("testAddSubcommunityAuth 1", c.getSubcommunities().size() == 1); assertThat("testAddSubcommunityAuth 2", c.getSubcommunities().get(0), equalTo(result)); } /** * Test of addSubcommunity method, of class Community. */ @Test(expected = AuthorizeException.class) public void testAddSubcommunityNoAuth() throws Exception { // Turn off authorization temporarily to create a new top-level community context.turnOffAuthorisationSystem(); Community result = communityService.create(null, context); context.restoreAuthSystemState(); communityService.addSubcommunity(context, c, result); fail("Exception expected"); } /** * Test of removeCollection method, of class Community. */ @Test public void testRemoveCollectionAuth() throws Exception { // Turn off authorization temporarily to create a new Collection context.turnOffAuthorisationSystem(); Collection col = collectionService.create(context, c); context.restoreAuthSystemState(); assertThat("testRemoveCollectionAuth 0", c.getCollections(), notNullValue()); assertTrue("testRemoveCollectionAuth 1", c.getCollections().size() == 1); assertThat("testRemoveCollectionAuth 2", c.getCollections().get(0), equalTo(col)); // Allow current Community REMOVE perms (to remove Collection from Community & delete) doNothing().when(authorizeServiceSpy).authorizeAction(context, c, Constants.REMOVE); // Allow collection WRITE perms (needed to remove Logo before Collection can be deleted) doNothing().when(authorizeServiceSpy).authorizeAction(context, col, Constants.WRITE,true); // Allow current Community ADMIN perms (to remove Collection from Community & delete) doNothing().when(authorizeServiceSpy).authorizeAction(context, col, Constants.ADMIN); // Note that this will *also* delete the collection (hence the extra permissions provided above) communityService.removeCollection(context, c, col); assertThat("testRemoveCollectionAuth 3", c.getCollections(), notNullValue()); assertTrue("testRemoveCollectionAuth 4", c.getCollections().size() == 0); } /** * Test of removeCollection method, of class Community. */ @Test(expected = AuthorizeException.class) public void testRemoveCollectionNoAuth() throws Exception { // Disallow current Community REMOVE perms doThrow(new AuthorizeException()).when(authorizeServiceSpy).authorizeAction(context, c, Constants.REMOVE); // Turn off authorization temporarily to create a new Collection context.turnOffAuthorisationSystem(); Collection col = collectionService.create(context, c); context.restoreAuthSystemState(); assertThat("testRemoveCollectionNoAuth 0", c.getCollections(), notNullValue()); assertTrue("testRemoveCollectionNoAuth 1", c.getCollections().size() == 1); assertThat("testRemoveCollectionNoAuth 2", c.getCollections().get(0), equalTo(col)); communityService.removeCollection(context, c, col); fail("Exception expected"); } /** * Test of removeSubcommunity method, of class Community. */ @Test public void testRemoveSubcommunityAuth() throws Exception { // Allow current Community ADD perms (in order to add a new subcommunity to parent) doNothing().when(authorizeServiceSpy) .authorizeAction(any(Context.class), any(Community.class), eq(Constants.ADD), eq(true)); // Allow current Community REMOVE perms (needed to unmap/remove subcommunity) doNothing().when(authorizeServiceSpy) .authorizeAction(any(Context.class), any(Community.class), eq(Constants.REMOVE), eq(true)); // Allow current Community REMOVE perms (needed to actually delete subcommunity) doNothing().when(authorizeServiceSpy) .authorizeAction(any(Context.class), any(Community.class), eq(Constants.DELETE), eq(true)); // Turn off authorization temporarily to create a new top-level community context.turnOffAuthorisationSystem(); Community com = communityService.create(null, context); context.restoreAuthSystemState(); communityService.addSubcommunity(context, c, com); assertThat("testRemoveSubcommunityAuth 0", c.getSubcommunities(), notNullValue()); assertTrue("testRemoveSubcommunityAuth 1", c.getSubcommunities().size() == 1); assertThat("testRemoveSubcommunityAuth 2", c.getSubcommunities().get(0), equalTo(com)); communityService.removeSubcommunity(context, c, com); assertThat("testRemoveSubcommunityAuth 3", c.getSubcommunities(), notNullValue()); assertTrue("testRemoveSubcommunityAuth 4", c.getSubcommunities().size() == 0); } /** * Test of delete method, of class Community. */ @Test public void testDeleteAuth() throws Exception { // Allow current Community WRITE perms (to create content to be deleted) doNothing().when(authorizeServiceSpy) .authorizeAction(any(Context.class), any(Community.class), eq(Constants.WRITE)); // Allow current Community DELETE perms (needed to delete community) doNothing().when(authorizeServiceSpy) .authorizeAction(any(Context.class), any(Community.class), eq(Constants.DELETE)); // Turn off authorization temporarily to create a new top-level community context.turnOffAuthorisationSystem(); Community todelete = communityService.create(null, context); context.restoreAuthSystemState(); // Now, test deletion UUID id = todelete.getID(); communityService.delete(context, todelete); Community found = communityService.find(context, id); assertThat("testDeleteAuth 0", found, nullValue()); } /** * Test of delete method, of class Community. */ @Test public void testDeleteAuth2() throws Exception { // Allow current Community WRITE perms doNothing().when(authorizeServiceSpy) .authorizeAction(any(Context.class), any(Community.class), eq(Constants.WRITE)); // Allow current Community DELETE perms (needed to delete community) doNothing().when(authorizeServiceSpy) .authorizeAction(any(Context.class), any(Community.class), eq(Constants.DELETE)); // Turn off authorization temporarily to create a new top-level community context.turnOffAuthorisationSystem(); Community todelete = communityService.create(null, context); context.restoreAuthSystemState(); // Now, test deletion UUID id = todelete.getID(); communityService.delete(context, todelete); Community found = communityService.find(context, id); assertThat("testDeleteAuth2 0", found, nullValue()); } /** * Test of delete method, of class Community, using a hierarchy of Communities and Collections. */ @Test public void testDeleteHierachyAuth() throws Exception { // Allow current Community DELETE perms (needed to delete a community) doNothing().when(authorizeServiceSpy) .authorizeAction(any(Context.class), any(Community.class), eq(Constants.DELETE), eq(true)); // Allow current Community REMOVE perms (needed to remove a sub-community from a community) doNothing().when(authorizeServiceSpy) .authorizeAction(any(Context.class), any(Community.class), eq(Constants.REMOVE), eq(true)); // Allow current Collection DELETE perms (needed to delete a Collection) doNothing().when(authorizeServiceSpy) .authorizeAction(any(Context.class), any(Collection.class), eq(Constants.DELETE), eq(true)); // Allow current Collection ADMIN perms (needed to delete a Collection) doNothing().when(authorizeServiceSpy) .authorizeAction(any(Context.class), any(Collection.class), eq(Constants.ADMIN)); // Allow current Item WRITE perms (needed to remove identifiers from an Item prior to deletion) doNothing().when(authorizeServiceSpy) .authorizeAction(any(Context.class), any(Item.class), eq(Constants.WRITE), eq(true)); // Allow current Item DELETE perms (needed to delete Item) doNothing().when(authorizeServiceSpy) .authorizeAction(any(Context.class), any(Item.class), eq(Constants.DELETE), eq(true)); // Allow current Item REMOVE perms (needed to delete Item) doNothing().when(authorizeServiceSpy) .authorizeAction(any(Context.class), any(Item.class), eq(Constants.REMOVE), eq(true)); // Create a dummy Community hierarchy to test delete with // Turn off authorization temporarily to create some test objects. context.turnOffAuthorisationSystem(); Community parent = communityService.create(null, context); // Create a hierachy of sub-Communities and Collections and Items. Community child = communityService.createSubcommunity(context, parent); Community grandchild = communityService.createSubcommunity(context, child); Collection childCol = collectionService.create(context, child); Collection grandchildCol = collectionService.create(context, grandchild); // Create two separate items WorkspaceItem wsItem = workspaceItemService.create(context, childCol, false); Item item = installItemService.installItem(context, wsItem); wsItem = workspaceItemService.create(context, grandchildCol, false); Item item2 = installItemService.installItem(context, wsItem); // Done creating the objects. Turn auth system back on context.restoreAuthSystemState(); // Now, test hierarchical deletion UUID parentId = parent.getID(); UUID childId = child.getID(); UUID grandchildId = grandchild.getID(); UUID childColId = childCol.getID(); UUID grandchildColId = grandchildCol.getID(); UUID itemId = item.getID(); UUID item2Id = item2.getID(); // Delete the parent of this entire hierarchy communityService.delete(context, parent); // Test that everything created here is deleted. assertThat("top-level Community not deleted", communityService.find(context, parentId), nullValue()); assertThat("child Community not deleted", communityService.find(context, childId), nullValue()); assertThat("grandchild Community not deleted", communityService.find(context, grandchildId), nullValue()); assertThat("Collection of child Community not deleted", collectionService.find(context, childColId), nullValue()); assertThat("Collection of grandchild Community not deleted", collectionService.find(context, grandchildColId), nullValue()); assertThat("Item not deleted", itemService.find(context, itemId), nullValue()); assertThat("Item not deleted", itemService.find(context, item2Id), nullValue()); } /** * Test of delete method, of class Community. */ @Test(expected = AuthorizeException.class) public void testDeleteNoAuth() throws Exception { // Disallow current Community DELETE perms doThrow(new AuthorizeException()).when(authorizeServiceSpy) .authorizeAction(any(Context.class), any(Community.class), eq(Constants.DELETE)); communityService.delete(context, c); fail("Exception expected"); } /** * Test of equals method, of class Community. */ @Test @SuppressWarnings("ObjectEqualsNull") public void testEquals() throws SQLException, AuthorizeException { // Allow full Admin perms (just to create top-level community) when(authorizeServiceSpy.isAdmin(context)).thenReturn(true); assertFalse("testEquals 0", c.equals(null)); assertFalse("testEquals 1", c.equals(communityService.create(null, context))); assertTrue("testEquals 2", c.equals(c)); } /** * Test of getType method, of class Community. */ @Test @Override public void testGetType() { assertThat("testGetType 0", c.getType(), equalTo(Constants.COMMUNITY)); } /** * Test of canEditBoolean method, of class Community. */ @Test public void testCanEditBooleanAuth() throws Exception { // Allow current Community WRITE perms doNothing().when(authorizeServiceSpy) .authorizeAction(context, c, Constants.WRITE); assertTrue("testCanEditBooleanAuth 0", communityService.canEditBoolean(context, c)); } /** * Test of canEditBoolean method, of class Community. */ @Test public void testCanEditBooleanNoAuth() throws Exception { // Disallow current Community WRITE perms doThrow(new AuthorizeException()).when(authorizeServiceSpy).authorizeAction(context, c, Constants.WRITE); assertFalse("testCanEditBooleanNoAuth 0", communityService.canEditBoolean(context, c)); } /** * Test of canEdit method, of class Community. */ @Test public void testCanEditAuth() throws Exception { // Allow current Community WRITE perms doNothing().when(authorizeServiceSpy).authorizeAction(context, c, Constants.WRITE); communityService.canEdit(context, c); } /** * Test of canEdit method, of class Community. */ @Test(expected = AuthorizeException.class) public void testCanEditNoAuth() throws Exception { // Disallow current Community WRITE perms doThrow(new AuthorizeException()).when(authorizeServiceSpy).authorizeAction(context, c,Constants.WRITE); communityService.canEdit(context, c); fail("Exception expected"); } /** * Test of countItems method, of class Community. */ @Test public void testCountItems() throws Exception { //0 by default assertTrue("testCountItems 0", itemService.countItems(context, c) == 0); //NOTE: a more thorough test of item counting is in ITCommunityCollection integration test } /** * Test of getAdminObject method, of class Community. */ @Test @Override public void testGetAdminObject() throws SQLException { //default community has no admin object assertThat("testGetAdminObject 0", (Community) communityService.getAdminObject(context, c, Constants.REMOVE), equalTo(c)); assertThat("testGetAdminObject 1", (Community) communityService.getAdminObject(context, c, Constants.ADD), equalTo(c)); assertThat("testGetAdminObject 2", (Community) communityService.getAdminObject(context, c, Constants.DELETE), equalTo(c)); assertThat("testGetAdminObject 3", (Community) communityService.getAdminObject(context, c, Constants.ADMIN), equalTo(c)); } /** * Test of getParentObject method, of class Community. */ @Test @Override public void testGetParentObject() throws SQLException { try { //default has no parent assertThat("testGetParentObject 0", communityService.getParentObject(context, c), nullValue()); context.turnOffAuthorisationSystem(); Community son = communityService.createSubcommunity(context, c); context.restoreAuthSystemState(); assertThat("testGetParentObject 1", communityService.getParentObject(context, son), notNullValue()); assertThat("testGetParentObject 2", (Community) communityService.getParentObject(context, son), equalTo(c)); } catch (AuthorizeException ex) { throw new AssertionError("AuthorizeException occurred", ex); } } }