/*
* Licensed to DuraSpace under one or more contributor license agreements.
* See the NOTICE file distributed with this work for additional information
* regarding copyright ownership.
*
* DuraSpace licenses this file to you 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 org.fcrepo.kernel.modeshape.utils;
import static org.apache.jena.rdf.model.ModelFactory.createDefaultModel;
import static org.apache.jena.vocabulary.RDF.type;
import static javax.jcr.PropertyType.URI;
import static org.fcrepo.kernel.api.RdfLexicon.REPOSITORY_NAMESPACE;
import static org.fcrepo.kernel.modeshape.utils.FedoraTypesUtils.getPropertyType;
import static org.mockito.Matchers.anyString;
import static org.mockito.Mockito.doThrow;
import static org.mockito.Mockito.never;
import static org.mockito.Mockito.verify;
import static org.mockito.Mockito.when;
import static org.mockito.MockitoAnnotations.initMocks;
import static org.slf4j.LoggerFactory.getLogger;
import java.util.Collections;
import java.util.Map;
import java.util.Optional;
import javax.jcr.Node;
import javax.jcr.RepositoryException;
import javax.jcr.Session;
import javax.jcr.Workspace;
import javax.jcr.nodetype.NodeTypeManager;
import org.apache.jena.vocabulary.RDF;
import org.fcrepo.kernel.api.models.FedoraResource;
import org.fcrepo.kernel.api.exception.RepositoryRuntimeException;
import org.fcrepo.kernel.api.identifiers.IdentifierConverter;
import org.fcrepo.kernel.modeshape.rdf.impl.DefaultIdentifierTranslator;
import org.fcrepo.kernel.modeshape.rdf.JcrRdfTools;
import org.junit.Before;
import org.junit.Ignore;
import org.junit.Test;
import org.mockito.Mock;
import org.slf4j.Logger;
import org.apache.jena.rdf.model.Model;
import org.apache.jena.rdf.model.ModelFactory;
import org.apache.jena.rdf.model.Property;
import org.apache.jena.rdf.model.RDFNode;
import org.apache.jena.rdf.model.Resource;
import org.apache.jena.rdf.model.Statement;
/**
* <p>JcrPropertyStatementListenerTest class.</p>
*
* @author awoods
*/
// TODO why are we ignoring this test?
@Ignore
public class JcrPropertyStatementListenerTest {
private static final Logger LOGGER =
getLogger(JcrPropertyStatementListenerTest.class);
private JcrPropertyStatementListener testObj;
@Mock
private Node mockNode;
@Mock
private Session mockSession;
private IdentifierConverter<Resource, FedoraResource> idTranslator;
@Mock
private Statement mockStatement;
@Mock
private Statement mockIrrelevantStatement;
@Mock
private Resource mockSubject;
@Mock
private Property mockPredicate;
@Mock
private Node mockSubjectNode;
@Mock
private JcrRdfTools mockJcrRdfTools;
@Mock
private Workspace mockWorkspace;
@Mock
private NodeTypeManager mockNodeTypeManager;
@Mock
private Model mockModel;
private final Map<String, String> mockNsMapping = Collections.emptyMap();
@Mock
private NodePropertiesTools mockPropertiesTools;
@Mock
private RDFNode mockValue;
private Resource mockResource;
private FedoraResource resource;
@Mock
private org.apache.jena.graph.Node mockTopic;
@Before
public void setUp() throws RepositoryException {
initMocks(this);
idTranslator = new DefaultIdentifierTranslator(mockSession);
when(mockNode.getSession()).thenReturn(mockSession);
testObj = new JcrPropertyStatementListener(idTranslator, mockJcrRdfTools, mockTopic);
mockResource = idTranslator.toDomain("/xyz");
when(mockStatement.getSubject()).thenReturn(mockResource);
when(mockStatement.getPredicate()).thenReturn(mockPredicate);
when(mockStatement.getModel()).thenReturn(mockModel);
when(mockStatement.getObject()).thenReturn(mockValue);
when(mockSession.getNode("/xyz")).thenReturn(mockSubjectNode);
when(mockSubjectNode.getPath()).thenReturn("/xyz");
when(mockIrrelevantStatement.getSubject()).thenReturn(mockSubject);
when(mockIrrelevantStatement.getPredicate()).thenReturn(mockPredicate);
when(mockIrrelevantStatement.getModel()).thenReturn(mockModel);
when(mockIrrelevantStatement.getObject()).thenReturn(mockValue);
when(mockModel.getNsPrefixMap()).thenReturn(mockNsMapping);
resource = idTranslator.convert(mockResource);
when(mockJcrRdfTools.skolemize(idTranslator, mockStatement, anyString())).thenReturn(mockStatement);
}
@Test
public void testAddedIrrelevantStatement() {
testObj.addedStatement(mockIrrelevantStatement);
}
@Test
public void testAddedStatement() throws RepositoryException {
when(mockSession.getNode("/some/path")).thenReturn(mockSubjectNode);
testObj.addedStatement(mockStatement);
verify(mockJcrRdfTools)
.addProperty(resource, mockStatement.getPredicate(), mockStatement.getObject(), mockNsMapping);
LOGGER.debug("Finished testAddedStatement()");
}
@Test(expected = RuntimeException.class)
public void testAddedStatementRepositoryException()
throws RepositoryException {
doThrow(new RepositoryRuntimeException("")).when(mockJcrRdfTools)
.addProperty(resource, mockPredicate, mockValue, mockNsMapping);
testObj.addedStatement(mockStatement);
}
@Test
public void testRemovedStatement() throws RepositoryException {
testObj.removedStatement(mockStatement);
verify(mockJcrRdfTools)
.removeProperty(resource,
mockStatement.getPredicate(),
mockStatement.getObject(),
mockNsMapping);
}
@Test(expected = RuntimeException.class)
public void testRemovedStatementRepositoryException()
throws RepositoryException {
doThrow(new RepositoryRuntimeException("")).when(mockJcrRdfTools)
.removeProperty(resource, mockPredicate, mockValue, mockNsMapping);
testObj.removedStatement(mockStatement);
}
@Test
public void testRemovedIrrelevantStatement() {
testObj.removedStatement(mockIrrelevantStatement);
// this was ignored, but not a problem
}
@Test
public void testAddRdfType() throws RepositoryException {
when(mockSubjectNode.getSession()).thenReturn(mockSession);
when(mockSession.getWorkspace()).thenReturn(mockWorkspace);
when(mockWorkspace.getNodeTypeManager()).thenReturn(mockNodeTypeManager);
when(mockNodeTypeManager.hasNodeType("fedora:object")).thenReturn(true);
when(mockSession.getNamespacePrefix(REPOSITORY_NAMESPACE))
.thenReturn("fedora");
final Model model = ModelFactory.createDefaultModel();
final Resource type = model.createResource(REPOSITORY_NAMESPACE
+ "object");
final Statement statement = model.createStatement(mockResource, RDF.type, type);
when(mockSubjectNode.canAddMixin("fedora:object")).thenReturn(true);
when(mockJcrRdfTools.skolemize(idTranslator, statement, anyString())).thenReturn(statement);
testObj.addedStatement(statement);
verify(mockJcrRdfTools).addMixin(resource, type, mockNsMapping);
}
@Test
public void testRemoveRdfType() throws RepositoryException {
when(mockSubjectNode.getSession()).thenReturn(mockSession);
when(mockSession.getWorkspace()).thenReturn(mockWorkspace);
when(mockWorkspace.getNodeTypeManager()).thenReturn(mockNodeTypeManager);
when(mockNodeTypeManager.hasNodeType("fedora:object")).thenReturn(true);
when(mockSession.getNamespacePrefix(REPOSITORY_NAMESPACE)).thenReturn(
"fedora");
final Model model = createDefaultModel();
final Resource type = model.createResource(REPOSITORY_NAMESPACE + "Container");
model.add(mockResource, RDF.type, type);
testObj.removedStatements(model);
verify(mockJcrRdfTools).removeMixin(resource, type, mockNsMapping);
}
@Test
public void testAddRdfTypeForNonMixin() throws RepositoryException {
when(mockSubjectNode.getSession()).thenReturn(mockSession);
when(mockSession.getWorkspace()).thenReturn(mockWorkspace);
when(mockWorkspace.getNodeTypeManager()).thenReturn(mockNodeTypeManager);
when(mockNodeTypeManager.hasNodeType("fedora:object")).thenReturn(false);
when(getPropertyType(mockSubjectNode, "rdf:type")).thenReturn(Optional.of(URI));
when(mockSession.getNamespacePrefix(REPOSITORY_NAMESPACE))
.thenReturn("fedora");
final Model model = createDefaultModel();
final Statement statement = model.createStatement(mockResource,
type,
model.createResource(REPOSITORY_NAMESPACE + "Container"));
when(mockSubjectNode.canAddMixin("fedora:object")).thenReturn(true);
when(mockJcrRdfTools.skolemize(idTranslator, statement, anyString())).thenReturn(statement);
testObj.addedStatement(statement);
verify(mockSubjectNode, never()).addMixin("fedora:object");
}
@Test
public void testRemoveRdfTypeForNonMixin() throws RepositoryException {
when(mockSubjectNode.getSession()).thenReturn(mockSession);
when(mockSession.getWorkspace()).thenReturn(mockWorkspace);
when(mockWorkspace.getNodeTypeManager()).thenReturn(mockNodeTypeManager);
when(mockNodeTypeManager.hasNodeType("fedora:object")).thenReturn(false);
when(mockSession.getNamespacePrefix(REPOSITORY_NAMESPACE)).thenReturn("fedora");
final Model model = createDefaultModel();
model.add(mockResource, type, model.createResource(REPOSITORY_NAMESPACE + "Container"));
testObj.removedStatements(model);
verify(mockSubjectNode, never()).removeMixin("fedora:Container");
}
}