/**
* 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.indexing;
import static org.mockito.Matchers.any;
import static org.mockito.Matchers.anyString;
import static org.mockito.Mockito.never;
import static org.mockito.Mockito.times;
import static org.mockito.Mockito.verify;
import static org.mockito.Mockito.when;
import static org.mockito.MockitoAnnotations.initMocks;
import java.io.File;
import java.io.FileInputStream;
import java.util.Collections;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import org.apache.commons.io.IOUtils;
import org.jdom2.Document;
import org.jdom2.Element;
import org.jdom2.input.SAXBuilder;
import org.junit.Assert;
import org.junit.Before;
import org.junit.Test;
import org.mockito.Mock;
import edu.unc.lib.dl.acl.service.AccessControlService;
import edu.unc.lib.dl.acl.util.ObjectAccessControlsBean;
import edu.unc.lib.dl.fedora.AccessClient;
import edu.unc.lib.dl.fedora.ManagementClient;
import edu.unc.lib.dl.fedora.NotFoundException;
import edu.unc.lib.dl.fedora.PID;
import edu.unc.lib.dl.fedora.types.Datastream;
import edu.unc.lib.dl.fedora.types.MIMETypedStream;
import edu.unc.lib.dl.util.ContentModelHelper.CDRProperty;
import edu.unc.lib.dl.util.ContentModelHelper.FedoraProperty;
import edu.unc.lib.dl.util.ContentModelHelper.Relationship;
import edu.unc.lib.dl.util.TripleStoreQueryService;
public class DocumentIndexingPackageDataLoaderTest extends Assert {
@Mock
private ManagementClient managementClient;
@Mock
private AccessClient accessClient;
@Mock
private AccessControlService aclLookup;
@Mock
private ObjectAccessControlsBean aclBean;
@Mock
private TripleStoreQueryService tsqs;
@Mock
private Datastream datastream;
@Mock
private MIMETypedStream datastreamData;
@Mock
private Document mockFoxml;
private DocumentIndexingPackageFactory factory;
private DocumentIndexingPackageDataLoader loader;
@Mock
private DocumentIndexingPackage parentDip;
private DocumentIndexingPackage dip;
@Before
public void setup() {
initMocks(this);
factory = new DocumentIndexingPackageFactory();
loader = new DocumentIndexingPackageDataLoader();
loader.setAccessClient(accessClient);
loader.setManagementClient(managementClient);
loader.setAccessControlService(aclLookup);
loader.setTsqs(tsqs);
loader.setFactory(factory);
factory.setDataLoader(loader);
dip = factory.createDip("uuid:test");
}
@Test
public void getFoxmlTest() throws Exception {
when(managementClient.getObjectXML(any(PID.class))).thenReturn(mockFoxml);
Document foxml = dip.getFoxml();
dip.getFoxml();
assertEquals(foxml, mockFoxml);
verify(managementClient).getObjectXML(any(PID.class));
}
@Test
public void getFoxmlRetryTest() throws Exception {
when(managementClient.getObjectXML(any(PID.class))).thenReturn(null, mockFoxml);
Document foxml = dip.getFoxml();
assertEquals(foxml, mockFoxml);
verify(managementClient, times(2)).getObjectXML(any(PID.class));
}
@Test
public void getAclBeanTest() throws Exception {
when(aclLookup.getObjectAccessControls(any(PID.class))).thenReturn(aclBean);
ObjectAccessControlsBean resultAcl = dip.getAclBean();
assertEquals(resultAcl, aclBean);
verify(aclLookup).getObjectAccessControls(any(PID.class));
}
@Test
public void getAclBeanFromParentTest() throws Exception {
aclBean = new ObjectAccessControlsBean(new PID("uuid:parent"), Collections.<String>emptyList());
when(parentDip.hasAclBean()).thenReturn(true);
when(parentDip.getAclBean()).thenReturn(aclBean);
dip.setParentDocument(parentDip);
ObjectAccessControlsBean resultAcl = dip.getAclBean();
assertNotNull("Resulting bean should be present", resultAcl);
assertNotEquals("But should also not be the parent's bean", resultAcl, aclBean);
verify(aclLookup, never()).getObjectAccessControls(any(PID.class));
}
@Test
public void getTriplesFromFoxmlTest() throws Exception {
dip.setFoxml(getDocument("src/test/resources/foxml/folderSmall.xml"));
Map<String, List<String>> triples = dip.getTriples();
assertTrue(triples.size() > 0);
assertTrue("Check that fedora properties are extracted",
triples.containsKey(FedoraProperty.state.toString()));
assertEquals("Check that datastreams appear",
5, triples.get(FedoraProperty.disseminates.toString()).size());
List<String> containsRels = triples.get(Relationship.contains.toString());
assertTrue(containsRels.size() > 5);
assertTrue("Check that relations get populated",
containsRels.contains("info:fedora/uuid:0f7343da-2c6f-48e2-9a2c-225e37cff2f6"));
assertEquals("yes", dip.getFirstTriple(CDRProperty.allowIndexing.toString()));
verify(tsqs, never()).fetchAllTriples(any(PID.class));
}
@Test
public void getTriplesTest() throws Exception {
Map<String, List<String>> tripleResponse = new HashMap<>();
when(tsqs.fetchAllTriples(any(PID.class))).thenReturn(tripleResponse);
Map<String, List<String>> triples = dip.getTriples();
// Invoke multiple times
dip.getTriples();
assertNotNull(triples);
// Check that only called once
verify(tsqs).fetchAllTriples(any(PID.class));
}
@Test
public void getMODSFromFoxmlTest() throws Exception {
dip.setFoxml(getDocument("src/test/resources/foxml/aggregateSplitDepartments.xml"));
Element mods = dip.getMods();
assertNotNull(mods);
assertEquals("mods", mods.getName());
verify(managementClient, never()).getDatastream(any(PID.class), anyString());
}
@Test
public void getMDContentsTest() throws Exception {
when(managementClient.getDatastream(any(PID.class), anyString())).thenReturn(datastream);
byte[] mdContentsBytes = IOUtils.toByteArray(
new FileInputStream(new File("src/test/resources/datastream/mdContents.xml")));
when(datastreamData.getStream()).thenReturn(mdContentsBytes);
when(accessClient.getDatastreamDissemination(any(PID.class), anyString(), anyString())).thenReturn(datastreamData);
Element mdContents = dip.getMdContents();
verify(accessClient).getDatastreamDissemination(any(PID.class), anyString(), anyString());
assertNotNull(mdContents);
assertEquals("structMap", mdContents.getName());
}
@Test
public void getMDContentsNotFoundTest() throws Exception {
when(managementClient.getDatastream(any(PID.class), anyString())).thenReturn(null);
when(accessClient.getDatastreamDissemination(any(PID.class), anyString(), anyString())).thenReturn(datastreamData);
Element mdContents = dip.getMdContents();
verify(accessClient, never()).getDatastreamDissemination(any(PID.class), anyString(), anyString());
assertNull(mdContents);
}
@Test
public void getMDContentsRetryTest() throws Exception {
when(managementClient.getDatastream(any(PID.class), anyString())).thenReturn(datastream);
byte[] mdContentsBytes = IOUtils.toByteArray(
new FileInputStream(new File("src/test/resources/datastream/mdContents.xml")));
when(datastreamData.getStream()).thenReturn(mdContentsBytes);
when(accessClient.getDatastreamDissemination(any(PID.class), anyString(), anyString()))
.thenThrow(new NotFoundException("")).thenReturn(datastreamData);
Element mdContents = dip.getMdContents();
verify(accessClient, times(2)).getDatastreamDissemination(any(PID.class), anyString(), anyString());
assertNotNull(mdContents);
assertEquals("structMap", mdContents.getName());
}
private Document getDocument(String filePath) throws Exception {
SAXBuilder builder = new SAXBuilder();
Document foxml = builder.build(new FileInputStream(new File(filePath)));
return foxml;
}
}