/** * Copyright 2008 The University of North Carolina at Chapel Hill * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package edu.unc.lib.dl.data.ingest.solr.filter; import static org.mockito.Matchers.any; import static org.mockito.Matchers.eq; import static org.mockito.Mockito.when; import static org.mockito.MockitoAnnotations.initMocks; import java.util.ArrayList; import java.util.Arrays; import java.util.Collection; import java.util.HashMap; import java.util.HashSet; import java.util.List; import java.util.Map; import org.junit.Assert; import org.junit.Before; import org.junit.Test; import org.mockito.Mock; import edu.unc.lib.dl.acl.util.ObjectAccessControlsBean; import edu.unc.lib.dl.acl.util.Permission; import edu.unc.lib.dl.acl.util.UserRole; import edu.unc.lib.dl.data.ingest.solr.indexing.DocumentIndexingPackage; import edu.unc.lib.dl.data.ingest.solr.indexing.DocumentIndexingPackageDataLoader; import edu.unc.lib.dl.data.ingest.solr.indexing.DocumentIndexingPackageFactory; import edu.unc.lib.dl.fedora.PID; import edu.unc.lib.dl.search.solr.model.IndexDocumentBean; import edu.unc.lib.dl.util.ContentModelHelper.CDRProperty; public class SetAccessControlFilterTest extends Assert { @Mock private DocumentIndexingPackageDataLoader loader; private DocumentIndexingPackageFactory factory; @Mock private ObjectAccessControlsBean aclBean; @Before public void setup() throws Exception { initMocks(this); factory = new DocumentIndexingPackageFactory(); factory.setDataLoader(loader); when(loader.loadAccessControlBean(any(DocumentIndexingPackage.class))).thenReturn(aclBean); } @Test public void noAdminGroups() throws Exception { when(aclBean.getGroupsByPermission(eq(Permission.viewDescription))) .thenReturn(new HashSet<>(Arrays.asList("patron"))); DocumentIndexingPackage dip = factory.createDip("uuid:item"); SetAccessControlFilter filter = new SetAccessControlFilter(); filter.filter(dip); assertEquals(1, dip.getDocument().getReadGroup().size()); assertTrue(dip.getDocument().getReadGroup().contains("patron")); assertNull(dip.getDocument().getAdminGroup()); } @Test public void allowIndexingNo() throws Exception { Map<String, List<String>> triples = new HashMap<>(); triples.put(CDRProperty.inheritPermissions.toString(), Arrays.asList("false")); triples.put(CDRProperty.allowIndexing.toString(), Arrays.asList("no")); when(loader.loadTriples(any(DocumentIndexingPackage.class))).thenReturn(triples); when(aclBean.getGroupsByPermission(eq(Permission.viewDescription))) .thenReturn(new HashSet<>(Arrays.asList("curator", "patron"))); when(aclBean.getGroupsByPermission(eq(Permission.viewAdminUI))) .thenReturn(new HashSet<>(Arrays.asList("curator"))); DocumentIndexingPackage dip = factory.createDip("uuid:item"); SetAccessControlFilter filter = new SetAccessControlFilter(); filter.filter(dip); assertEquals(0, dip.getDocument().getReadGroup().size()); assertEquals(1, dip.getDocument().getAdminGroup().size()); assertTrue(dip.getDocument().getAdminGroup().contains("curator")); } @Test public void unpublishedFromAclBean() throws Exception { when(aclBean.isAncestorsPublished()).thenReturn(true); when(aclBean.getIsPublished()).thenReturn(false); SetAccessControlFilter filter = new SetAccessControlFilter(); DocumentIndexingPackage dip = factory.createDip("uuid:item"); filter.filter(dip); IndexDocumentBean idb = dip.getDocument(); assertFalse(dip.getIsPublished()); assertFalse(idb.getStatus().contains("Published")); assertTrue(idb.getStatus().contains("Unpublished")); assertFalse(idb.getStatus().contains("Parent Unpublished")); } @Test public void unpublishedFromParentAclBean() throws Exception { when(aclBean.isAncestorsPublished()).thenReturn(false); when(aclBean.getIsPublished()).thenReturn(true); when(loader.loadAccessControlBean(any(DocumentIndexingPackage.class))).thenReturn(aclBean); DocumentIndexingPackage parentDip = factory.createDip("uuid:parent"); SetAccessControlFilter filter = new SetAccessControlFilter(); DocumentIndexingPackage dip = factory.createDip("uuid:item"); dip.setParentDocument(parentDip); filter.filter(dip); IndexDocumentBean idb = dip.getDocument(); assertFalse(dip.getIsPublished()); assertFalse(idb.getStatus().contains("Published")); assertFalse(idb.getStatus().contains("Unpublished")); assertTrue(idb.getStatus().contains("Parent Unpublished")); } @Test public void publishedFromBothAclBean() throws Exception { Map<String,Collection<String>> roles = new HashMap<String,Collection<String>>(); roles.put(UserRole.patron.toString(), Arrays.asList("public")); roles.put(UserRole.curator.toString(), Arrays.asList("curator")); ObjectAccessControlsBean parentAclBean = new ObjectAccessControlsBean(new PID("uuid:parent"), roles, null, new ArrayList<String>(), Arrays.asList("Published"), null); DocumentIndexingPackage parentDip = factory.createDip("uuid:parent"); when(loader.loadAccessControlBean(any(DocumentIndexingPackage.class))).thenReturn(parentAclBean); SetAccessControlFilter filter = new SetAccessControlFilter(); DocumentIndexingPackage dip = factory.createDip("uuid:item"); dip.setParentDocument(parentDip); filter.filter(dip); IndexDocumentBean idb = dip.getDocument(); assertTrue(dip.getIsPublished()); assertTrue(idb.getStatus().contains("Published")); assertFalse(idb.getStatus().contains("Unpublished")); assertFalse(idb.getStatus().contains("Parent Unpublished")); assertTrue(idb.getReadGroup().contains("public")); assertTrue(idb.getReadGroup().contains("curator")); } @Test public void embargoedStatus() throws Exception { DocumentIndexingPackage dip = factory.createDip("uuid:item"); Map<String, List<String>> triples = new HashMap<>(); triples.put(CDRProperty.embargoUntil.toString(), Arrays.asList("2074-02-03T00:00:00")); when(loader.loadTriples(any(DocumentIndexingPackage.class))).thenReturn(triples); DocumentIndexingPackage parentCollection = factory.createDip("uuid:collection"); parentCollection.setIsPublished(true); dip.setParentDocument(parentCollection); ObjectAccessControlsBean aclBean = new ObjectAccessControlsBean(new PID("uuid:item"), new HashMap<String, List<String>>(), null, new ArrayList<String>(), null, null); when(loader.loadAccessControlBean(any(DocumentIndexingPackage.class))).thenReturn(aclBean); SetAccessControlFilter filter = new SetAccessControlFilter(); filter.filter(dip); IndexDocumentBean idb = dip.getDocument(); assertTrue(dip.getIsPublished()); assertTrue(idb.getStatus().contains("Embargoed")); } @Test public void rolesAssigned() throws Exception { Map<String,List<String>> triples = new HashMap<>(); triples.put(UserRole.patron.toString(), Arrays.asList("public")); triples.put(UserRole.curator.toString(), Arrays.asList("curator")); triples.put(CDRProperty.inheritPermissions.toString(), Arrays.asList("false")); when(loader.loadTriples(any(DocumentIndexingPackage.class))).thenReturn(triples); DocumentIndexingPackage dip = factory.createDip("uuid:item"); DocumentIndexingPackage parentCollection = factory.createDip("uuid:collection"); parentCollection.setIsPublished(true); dip.setParentDocument(parentCollection); ObjectAccessControlsBean aclBean = new ObjectAccessControlsBean(new PID("uuid:item"), new HashMap<String, List<String>>(), null, new ArrayList<String>(), null, null); when(loader.loadAccessControlBean(any(DocumentIndexingPackage.class))).thenReturn(aclBean); SetAccessControlFilter filter = new SetAccessControlFilter(); filter.filter(dip); IndexDocumentBean idb = dip.getDocument(); assertTrue(dip.getIsPublished()); assertTrue(idb.getStatus().contains("Roles Assigned")); assertTrue(idb.getStatus().contains("Not Inheriting Roles")); } @Test public void nonActiveFromAclBean() throws Exception { when(aclBean.getGroupsByPermission(eq(Permission.viewDescription))) .thenReturn(new HashSet<>(Arrays.asList("curator", "patron"))); when(aclBean.getGroupsByPermission(eq(Permission.viewAdminUI))) .thenReturn(new HashSet<>(Arrays.asList("curator"))); when(aclBean.getIsActive()).thenReturn(false); when(aclBean.getIsPublished()).thenReturn(true); when(aclBean.isAncestorsPublished()).thenReturn(true); //ObjectAccessControlsBean aclBean = new ObjectAccessControlsBean(new PID("uuid:item"), roles, null, new ArrayList<String>(), null, Arrays.asList("Deleted")); //when(loader.loadAccessControlBean(any(DocumentIndexingPackage.class))).thenReturn(aclBean); SetAccessControlFilter filter = new SetAccessControlFilter(); DocumentIndexingPackage dip = factory.createDip("uuid:item"); filter.filter(dip); IndexDocumentBean idb = dip.getDocument(); assertTrue(dip.getIsDeleted()); assertTrue(idb.getStatus().contains("Published")); assertFalse(idb.getReadGroup().contains("public")); assertTrue(idb.getReadGroup().contains("curator")); } }