/**
* 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.util;
import static edu.unc.lib.dl.test.TestHelpers.setField;
import static edu.unc.lib.dl.util.ContentModelHelper.CDRProperty.indexValidTerms;
import static edu.unc.lib.dl.util.ContentModelHelper.CDRProperty.invalidTerm;
import static edu.unc.lib.dl.util.ContentModelHelper.CDRProperty.replaceInvalidTerms;
import static edu.unc.lib.dl.util.ContentModelHelper.CDRProperty.warnInvalidTerms;
import static edu.unc.lib.dl.util.ContentModelHelper.Datastream.DATA_FILE;
import static edu.unc.lib.dl.util.ContentModelHelper.Datastream.RELS_EXT;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertTrue;
import static org.mockito.Matchers.any;
import static org.mockito.Matchers.anyString;
import static org.mockito.Matchers.eq;
import static org.mockito.Mockito.mock;
import static org.mockito.Mockito.verify;
import static org.mockito.Mockito.when;
import static org.mockito.MockitoAnnotations.initMocks;
import java.util.Arrays;
import java.util.HashMap;
import java.util.HashSet;
import java.util.List;
import java.util.Map;
import java.util.Set;
import org.jdom2.Document;
import org.jdom2.Element;
import org.junit.Before;
import org.junit.Test;
import org.mockito.ArgumentCaptor;
import org.mockito.Mock;
import edu.unc.lib.dl.fedora.AccessClient;
import edu.unc.lib.dl.fedora.DatastreamDocument;
import edu.unc.lib.dl.fedora.ManagementClient;
import edu.unc.lib.dl.fedora.PID;
import edu.unc.lib.dl.fedora.types.MIMETypedStream;
import edu.unc.lib.dl.xml.JDOMNamespaceUtil;
import edu.unc.lib.dl.xml.VocabularyHelper;
/**
* @author bbpennel
* @date Oct 21, 2014
*/
public class VocabularyHelperManagerTest {
private VocabularyHelperManager manager;
@Mock
private VocabularyHelper mockHelper;
@Mock
private MIMETypedStream dataFile;
@Mock
private TripleStoreQueryService queryService;
@Mock
private ManagementClient managementClient;
@Mock
private AccessClient accessClient;
private static String COLL_PID = "info:fedora/cdr:collection";
private static String ITEM_PID = "info:fedora/cdr:item";
private static String VOCAB_PID = "info:fedora/cdr:vocab";
private static String VOCAB_URI = "http://example/vocab";
private static String VOCAB_TYPE = "vocab";
private static PID collectionsPID = new PID("cdr:collections");
@Before
public void init() throws Exception {
initMocks(this);
manager = new VocabularyHelperManager();
setField(manager, "queryService", queryService);
setField(manager, "managementClient", managementClient);
setField(manager, "accessClient", accessClient);
setField(manager, "collectionsPID", collectionsPID);
Map<String, Map<String, String>> vocabInfo = new HashMap<>();
Map<String, String> entryMap = new HashMap<>();
entryMap.put("vocabURI", VOCAB_URI);
entryMap.put("vocabType", VOCAB_TYPE);
vocabInfo.put(VOCAB_PID, entryMap);
when(queryService.fetchVocabularyInfo()).thenReturn(vocabInfo);
Map<String, Map<String, Set<String>>> vocabMapping = new HashMap<>();
Map<String, Set<String>> collMapping = new HashMap<>();
Set<String> levels = new HashSet<>(Arrays.asList(indexValidTerms.toString(), warnInvalidTerms.toString(),
replaceInvalidTerms.toString()));
collMapping.put(VOCAB_URI, levels);
vocabMapping.put(COLL_PID, collMapping);
when(queryService.fetchVocabularyMapping()).thenReturn(vocabMapping);
Map<String, String> helperClassMap = new HashMap<>();
helperClassMap.put("vocab", "edu.unc.lib.dl.util.TestVocabularyHelper");
manager.setHelperClasses(helperClassMap);
when(dataFile.getStream()).thenReturn(new byte[0]);
when(accessClient.getDatastreamDissemination(any(PID.class), eq(DATA_FILE.getName()), anyString())).thenReturn(
dataFile);
when(queryService.fetchParentCollection(any(PID.class))).thenReturn(new PID(COLL_PID));
}
@Test
public void getHelpersTest() {
manager.init();
Set<VocabularyHelper> helpers = manager.getHelpers(new PID(ITEM_PID));
assertEquals("Incorrect number of helpers were found for item", helpers.size(), 1);
assertTrue("Wrong kind of helper was returned", helpers.iterator().next() instanceof TestVocabularyHelper);
}
@Test
public void getInvalidTermsTest() throws Exception {
manager.init();
// Add in some invalid terms
Set<VocabularyHelper> helpers = manager.getHelpers(new PID(ITEM_PID));
((TestVocabularyHelper) helpers.iterator().next()).setInvalidTerms(new HashSet<>(Arrays.asList("term", "term2")));
Element doc = mock(Element.class);
Map<String, Set<String>> invalidTerms = manager.getInvalidTerms(new PID(ITEM_PID), doc);
assertEquals("Incorrect number of vocabularies returned", 1, invalidTerms.size());
assertEquals("Incorrect number of invalid terms returned for vocabulary", 2, invalidTerms.get(VOCAB_URI).size());
}
@Test
public void updateInvalidTermsTest() throws Exception {
manager.init();
Set<VocabularyHelper> helpers = manager.getHelpers(new PID(ITEM_PID));
TestVocabularyHelper helper = (TestVocabularyHelper) helpers.iterator().next();
helper.setInvalidTerms(new HashSet<>(Arrays.asList("term", "term2")));
helper.setPrefix(VOCAB_TYPE);
Document relsDoc = new Document()
.addContent(new Element("RDF", JDOMNamespaceUtil.RDF_NS)
.addContent(new Element("Description", JDOMNamespaceUtil.RDF_NS)
.addContent(new Element(invalidTerm.getPredicate(), invalidTerm.getNamespace()))
.setText(VOCAB_TYPE + "|term")));
when(managementClient.getXMLDatastreamIfExists(any(PID.class), eq(RELS_EXT.getName())))
.thenReturn(new DatastreamDocument(relsDoc, "2015-07-29"));
Element doc = mock(Element.class);
manager.updateInvalidTermsRelations(new PID(ITEM_PID), doc);
ArgumentCaptor<Document> captor = ArgumentCaptor.forClass(Document.class);
verify(managementClient).modifyDatastream(any(PID.class), eq(RELS_EXT.getName()),
anyString(), anyString(), captor.capture());
Document modified = captor.getValue();
List<Element> invTerms = modified.getRootElement().getChild("Description", JDOMNamespaceUtil.RDF_NS)
.getChildren(invalidTerm.getPredicate(), invalidTerm.getNamespace());
assertEquals("Incorrect number of invalid terms after update", 2, invTerms.size());
}
}