001/*
002 * Copyright 2015 DuraSpace, Inc.
003 *
004 * Licensed under the Apache License, Version 2.0 (the "License");
005 * you may not use this file except in compliance with the License.
006 * You may obtain a copy of the License at
007 *
008 *     http://www.apache.org/licenses/LICENSE-2.0
009 *
010 * Unless required by applicable law or agreed to in writing, software
011 * distributed under the License is distributed on an "AS IS" BASIS,
012 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
013 * See the License for the specific language governing permissions and
014 * limitations under the License.
015 */
016package org.fcrepo.transform.transformations;
017
018import static com.hp.hpl.jena.graph.NodeFactory.createLiteral;
019import static com.hp.hpl.jena.rdf.model.ResourceFactory.createProperty;
020import static com.hp.hpl.jena.rdf.model.ResourceFactory.createResource;
021import static org.fcrepo.transform.transformations.LDPathTransform.CONFIGURATION_FOLDER;
022import static org.fcrepo.transform.transformations.LDPathTransform.getNodeTypeTransform;
023import static org.junit.Assert.assertEquals;
024import static org.junit.Assert.assertTrue;
025import static org.mockito.Mockito.RETURNS_DEEP_STUBS;
026import static org.mockito.Mockito.mock;
027import static org.mockito.Mockito.when;
028import static org.mockito.MockitoAnnotations.initMocks;
029
030import java.io.ByteArrayInputStream;
031import java.io.InputStream;
032import java.util.Collection;
033import java.util.Map;
034import java.util.List;
035
036import javax.jcr.Node;
037import javax.jcr.RepositoryException;
038import javax.jcr.Session;
039import javax.jcr.nodetype.NodeType;
040import javax.ws.rs.WebApplicationException;
041
042import com.hp.hpl.jena.graph.Triple;
043import org.fcrepo.kernel.api.utils.iterators.RdfStream;
044import org.junit.Before;
045import org.junit.Test;
046import org.mockito.Mock;
047import org.mockito.Mockito;
048
049/**
050 * <p>LDPathTransformTest class.</p>
051 *
052 * @author cbeer
053 */
054public class LDPathTransformTest {
055
056    @Mock
057    private Node mockNode;
058
059    @Mock
060    private Session mockSession;
061
062    @Mock
063    private InputStream mockInputStream;
064
065    @Mock
066    private NodeType mockNodeType;
067
068    private LDPathTransform testObj;
069
070    @Before
071    public void setUp() throws RepositoryException {
072        initMocks(this);
073
074        when(mockNode.getSession()).thenReturn(mockSession);
075    }
076
077    @Test(expected = WebApplicationException.class)
078    public void testGetNodeTypeSpecificLdpathProgramForMissingProgram() throws RepositoryException {
079        final Node mockConfigNode = mock(Node.class);
080        when(mockSession.getNode(CONFIGURATION_FOLDER + "some-program")).thenReturn(mockConfigNode);
081
082        when(mockNode.getMixinNodeTypes()).thenReturn(new NodeType[]{});
083        final NodeType mockNtBase = mock(NodeType.class);
084        when(mockNodeType.getSupertypes()).thenReturn(new NodeType[] { mockNtBase });
085        when(mockNode.getPrimaryNodeType()).thenReturn(mockNodeType);
086        getNodeTypeTransform(mockNode, "some-program");
087    }
088
089    @Test
090    public void testGetNodeTypeSpecificLdpathProgramForNodeTypeProgram() throws RepositoryException {
091        final Node mockConfigNode = mock(Node.class);
092        final Node mockTypeConfigNode = mock(Node.class, RETURNS_DEEP_STUBS);
093        when(mockSession.getNode(CONFIGURATION_FOLDER + "some-program")).thenReturn(mockConfigNode);
094
095        final NodeType mockNtBase = mock(NodeType.class);
096        when(mockNodeType.getSupertypes()).thenReturn(new NodeType[] { mockNtBase });
097        when(mockNode.getPrimaryNodeType()).thenReturn(mockNodeType);
098        when(mockNode.getMixinNodeTypes()).thenReturn(new NodeType[] {});
099        when(mockNodeType.toString()).thenReturn("custom:type");
100        when(mockConfigNode.hasNode("custom:type")).thenReturn(true);
101        when(mockConfigNode.getNode("custom:type")).thenReturn(mockTypeConfigNode);
102        when(mockTypeConfigNode.getNode("jcr:content").getProperty("jcr:data").getBinary().getStream()).thenReturn(
103                mockInputStream);
104        final LDPathTransform nodeTypeSpecificLdpathProgramStream = getNodeTypeTransform(mockNode, "some-program");
105
106        assertEquals(new LDPathTransform(mockInputStream), nodeTypeSpecificLdpathProgramStream);
107    }
108
109    @Test
110    public void testGetNodeTypeSpecificLdpathProgramForSupertypeProgram() throws RepositoryException {
111        final Node mockConfigNode = mock(Node.class);
112        final Node mockTypeConfigNode = mock(Node.class, Mockito.RETURNS_DEEP_STUBS);
113        when(mockSession.getNode(LDPathTransform.CONFIGURATION_FOLDER + "some-program")).thenReturn(mockConfigNode);
114
115        final NodeType mockNtBase = mock(NodeType.class);
116        when(mockNodeType.getSupertypes()).thenReturn(new NodeType[] { mockNtBase });
117        when(mockNodeType.toString()).thenReturn("custom:type");
118        when(mockNtBase.toString()).thenReturn("nt:base");
119        when(mockNode.getPrimaryNodeType()).thenReturn(mockNodeType);
120        when(mockNode.getMixinNodeTypes()).thenReturn(new NodeType[]{});
121        when(mockConfigNode.hasNode("custom:type")).thenReturn(false);
122
123        when(mockConfigNode.hasNode("nt:base")).thenReturn(true);
124        when(mockConfigNode.getNode("nt:base")).thenReturn(mockTypeConfigNode);
125        when(mockTypeConfigNode.getNode("jcr:content").getProperty("jcr:data").getBinary().getStream()).thenReturn(
126                mockInputStream);
127
128        final LDPathTransform nodeTypeSpecificLdpathProgramStream =
129                getNodeTypeTransform(mockNode, "some-program");
130
131        assertEquals(new LDPathTransform(mockInputStream), nodeTypeSpecificLdpathProgramStream);
132    }
133
134    @Test
135    public void testProgramQuery() {
136
137        final RdfStream rdfStream = new RdfStream();
138        rdfStream.concat(new Triple(createResource("abc").asNode(),
139                createProperty("http://purl.org/dc/elements/1.1/title").asNode(),
140                createLiteral("some-title")));
141        rdfStream.topic(createResource("abc").asNode());
142        final InputStream testReader = new ByteArrayInputStream("title = dc:title :: xsd:string ;".getBytes());
143
144        testObj = new LDPathTransform(testReader);
145        final List<Map<String,Collection<Object>>> stringCollectionMapList = testObj.apply(rdfStream);
146        final Map<String,Collection<Object>> stringCollectionMap = stringCollectionMapList.get(0);
147
148        assert(stringCollectionMap != null);
149        assertEquals(1, stringCollectionMap.size());
150        assertEquals(1, stringCollectionMap.get("title").size());
151        assertTrue(stringCollectionMap.get("title").contains("some-title"));
152    }
153}