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}