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.graph.NodeFactory.createURI;
020import static com.hp.hpl.jena.graph.Triple.create;
021import static java.util.stream.Stream.of;
022import static org.fcrepo.transform.transformations.LDPathTransform.CONFIGURATION_FOLDER;
023import static org.fcrepo.transform.transformations.LDPathTransform.getNodeTypeTransform;
024import static org.junit.Assert.assertEquals;
025import static org.junit.Assert.assertTrue;
026import static org.mockito.Mockito.RETURNS_DEEP_STUBS;
027import static org.mockito.Mockito.mock;
028import static org.mockito.Mockito.when;
029import static org.mockito.MockitoAnnotations.initMocks;
030
031import java.io.ByteArrayInputStream;
032import java.io.InputStream;
033import java.util.Collection;
034import java.util.Map;
035import java.util.List;
036
037import javax.jcr.Node;
038import javax.jcr.RepositoryException;
039import javax.jcr.Session;
040import javax.jcr.nodetype.NodeType;
041import javax.ws.rs.WebApplicationException;
042
043import org.fcrepo.kernel.api.RdfStream;
044import org.fcrepo.kernel.api.rdf.DefaultRdfStream;
045import org.junit.Before;
046import org.junit.Test;
047import org.mockito.Mock;
048import org.mockito.Mockito;
049
050/**
051 * <p>LDPathTransformTest class.</p>
052 *
053 * @author cbeer
054 */
055public class LDPathTransformTest {
056
057    @Mock
058    private Node mockNode;
059
060    @Mock
061    private Session mockSession;
062
063    @Mock
064    private InputStream mockInputStream;
065
066    @Mock
067    private NodeType mockNodeType;
068
069    private LDPathTransform testObj;
070
071    @Before
072    public void setUp() throws RepositoryException {
073        initMocks(this);
074
075        when(mockNode.getSession()).thenReturn(mockSession);
076    }
077
078    @Test(expected = WebApplicationException.class)
079    public void testGetNodeTypeSpecificLdpathProgramForMissingProgram() throws RepositoryException {
080        final Node mockConfigNode = mock(Node.class);
081        when(mockSession.getNode(CONFIGURATION_FOLDER + "some-program")).thenReturn(mockConfigNode);
082
083        when(mockNode.getMixinNodeTypes()).thenReturn(new NodeType[]{});
084        final NodeType mockNtBase = mock(NodeType.class);
085        when(mockNodeType.getSupertypes()).thenReturn(new NodeType[] { mockNtBase });
086        when(mockNode.getPrimaryNodeType()).thenReturn(mockNodeType);
087        getNodeTypeTransform(mockNode, "some-program");
088    }
089
090    @Test
091    public void testGetNodeTypeSpecificLdpathProgramForNodeTypeProgram() throws RepositoryException {
092        final Node mockConfigNode = mock(Node.class);
093        final Node mockTypeConfigNode = mock(Node.class, RETURNS_DEEP_STUBS);
094        when(mockSession.getNode(CONFIGURATION_FOLDER + "some-program")).thenReturn(mockConfigNode);
095
096        final NodeType mockNtBase = mock(NodeType.class);
097        when(mockNodeType.getSupertypes()).thenReturn(new NodeType[] { mockNtBase });
098        when(mockNode.getPrimaryNodeType()).thenReturn(mockNodeType);
099        when(mockNode.getMixinNodeTypes()).thenReturn(new NodeType[] {});
100        when(mockNodeType.toString()).thenReturn("custom:type");
101        when(mockConfigNode.hasNode("custom:type")).thenReturn(true);
102        when(mockConfigNode.getNode("custom:type")).thenReturn(mockTypeConfigNode);
103        when(mockTypeConfigNode.getNode("jcr:content").getProperty("jcr:data").getBinary().getStream()).thenReturn(
104                mockInputStream);
105        final LDPathTransform nodeTypeSpecificLdpathProgramStream = getNodeTypeTransform(mockNode, "some-program");
106
107        assertEquals(new LDPathTransform(mockInputStream), nodeTypeSpecificLdpathProgramStream);
108    }
109
110    @Test
111    public void testGetNodeTypeSpecificLdpathProgramForSupertypeProgram() throws RepositoryException {
112        final Node mockConfigNode = mock(Node.class);
113        final Node mockTypeConfigNode = mock(Node.class, Mockito.RETURNS_DEEP_STUBS);
114        when(mockSession.getNode(LDPathTransform.CONFIGURATION_FOLDER + "some-program")).thenReturn(mockConfigNode);
115
116        final NodeType mockNtBase = mock(NodeType.class);
117        when(mockNodeType.getSupertypes()).thenReturn(new NodeType[] { mockNtBase });
118        when(mockNodeType.toString()).thenReturn("custom:type");
119        when(mockNtBase.toString()).thenReturn("nt:base");
120        when(mockNode.getPrimaryNodeType()).thenReturn(mockNodeType);
121        when(mockNode.getMixinNodeTypes()).thenReturn(new NodeType[]{});
122        when(mockConfigNode.hasNode("custom:type")).thenReturn(false);
123
124        when(mockConfigNode.hasNode("nt:base")).thenReturn(true);
125        when(mockConfigNode.getNode("nt:base")).thenReturn(mockTypeConfigNode);
126        when(mockTypeConfigNode.getNode("jcr:content").getProperty("jcr:data").getBinary().getStream()).thenReturn(
127                mockInputStream);
128
129        final LDPathTransform nodeTypeSpecificLdpathProgramStream =
130                getNodeTypeTransform(mockNode, "some-program");
131
132        assertEquals(new LDPathTransform(mockInputStream), nodeTypeSpecificLdpathProgramStream);
133    }
134
135    @Test
136    public void testProgramQuery() {
137
138        final RdfStream rdfStream = new DefaultRdfStream(createURI("abc"), of(
139                create(createURI("abc"),
140                        createURI("http://purl.org/dc/elements/1.1/title"),
141                        createLiteral("some-title"))));
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}