001/* 002 * The contents of this file are subject to the license and copyright 003 * detailed in the LICENSE and NOTICE files at the root of the source 004 * tree. 005 */ 006package org.fcrepo.camel.ldpath; 007 008import com.fasterxml.jackson.databind.ObjectMapper; 009import org.apache.camel.CamelContext; 010import org.apache.camel.EndpointInject; 011import org.apache.camel.Produce; 012import org.apache.camel.ProducerTemplate; 013import org.apache.camel.builder.AdviceWith; 014import org.apache.camel.component.mock.MockEndpoint; 015import org.apache.camel.model.ModelCamelContext; 016import org.apache.camel.spring.javaconfig.CamelConfiguration; 017import org.apache.commons.io.FileUtils; 018import org.junit.AfterClass; 019import org.junit.BeforeClass; 020import org.junit.Test; 021import org.junit.runner.RunWith; 022import org.springframework.beans.factory.annotation.Autowired; 023import org.springframework.context.annotation.ComponentScan; 024import org.springframework.context.annotation.Configuration; 025import org.springframework.test.context.ContextConfiguration; 026import org.springframework.test.context.junit4.SpringJUnit4ClassRunner; 027import org.springframework.test.context.support.AnnotationConfigContextLoader; 028 029import java.io.File; 030import java.util.HashMap; 031import java.util.List; 032import java.util.Map; 033 034import static org.apache.camel.Exchange.CONTENT_TYPE; 035import static org.apache.camel.Exchange.HTTP_METHOD; 036import static org.apache.camel.Exchange.HTTP_URI; 037import static org.apache.camel.util.ObjectHelper.loadResourceAsStream; 038import static org.junit.Assert.assertFalse; 039import static org.junit.Assert.assertTrue; 040 041/** 042 * Test the route workflow. 043 * 044 * @author acoburn 045 * @since Aug 6, 2016 046 */ 047@RunWith(SpringJUnit4ClassRunner.class) 048@ContextConfiguration(classes = {RouteTest.ContextConfig.class}, loader = AnnotationConfigContextLoader.class) 049public class RouteTest { 050 051 private final ObjectMapper MAPPER = new ObjectMapper(); 052 053 @EndpointInject("mock:language:simple:resource:classpath:org/fcrepo/camel/ldpath/options.ttl") 054 protected MockEndpoint optionsEndpoint; 055 056 @EndpointInject("mock:http:localhost") 057 protected MockEndpoint httpEndpoint; 058 059 @Produce("direct:start") 060 protected ProducerTemplate template; 061 062 @Autowired 063 private CamelContext camelContext; 064 065 @BeforeClass 066 public static void beforeClass() { 067 final String targetDir = System.getProperty("project.build.directory", "target"); 068 final var ldCacheDir = targetDir + File.separator + RouteTest.class.getCanonicalName() + 069 File.separator + "ldcache"; 070 new File(ldCacheDir).mkdirs(); 071 System.setProperty("ldpath.ldcache.directory", ldCacheDir); 072 final String restPort = System.getProperty("fcrepo.dynamic.ldpath.port", "9085"); 073 System.setProperty("ldpath.rest.port", restPort); 074 System.setProperty("ldpath.rest.host", "0.0.0.0"); 075 } 076 077 @AfterClass 078 public static void afterClass() { 079 FileUtils.deleteQuietly(new File(System.getProperty("ldpath.ldcache.directory"))); 080 } 081 082 @Test 083 public void testGetDefault() throws Exception { 084 085 final String uri = "http://fedora.info/definitions/v4/event#ResourceCreation"; 086 final String endpoint = "mock:resultGet"; 087 final MockEndpoint mockEndpoint = (MockEndpoint) camelContext.getEndpoint(endpoint); 088 mockEndpoint.expectedMessageCount(1); 089 mockEndpoint.expectedHeaderReceived(CONTENT_TYPE, "application/json"); 090 final var context = camelContext.adapt(ModelCamelContext.class); 091 AdviceWith.adviceWith(context, "FcrepoLDPathGet", a -> { 092 a.weaveAddLast().to(endpoint); 093 }); 094 095 template.sendBodyAndHeader("direct:get", null, "context", uri); 096 097 mockEndpoint.assertIsSatisfied(); 098 final String result = mockEndpoint.getExchanges().get(0).getIn().getBody(String.class); 099 100 @SuppressWarnings("unchecked") 101 final List<Map<String, List<String>>> data = MAPPER.readValue(result, List.class); 102 103 assertFalse(data.isEmpty()); 104 assertTrue(data.get(0).containsKey("label")); 105 assertTrue(data.get(0).containsKey("type_ss")); 106 assertTrue(data.get(0).get("id").contains(uri)); 107 assertTrue(data.get(0).get("label").contains("resource creation")); 108 assertTrue(data.get(0).get("type_ss").contains("http://www.w3.org/2000/01/rdf-schema#Class")); 109 } 110 111 @Test 112 public void testOptions() throws Exception { 113 optionsEndpoint.expectedMessageCount(1); 114 final var context = camelContext.adapt(ModelCamelContext.class); 115 116 AdviceWith.adviceWith(context, "FcrepoLDPathRest", a -> { 117 a.replaceFromWith("direct:start"); 118 a.mockEndpointsAndSkip("language:simple:resource:classpath:org/fcrepo/camel/ldpath/options.ttl"); 119 }); 120 121 template.sendBodyAndHeader(null, HTTP_METHOD, "OPTIONS"); 122 optionsEndpoint.assertIsSatisfied(); 123 124 } 125 126 @Test 127 public void testGetParam() throws Exception { 128 final String uri = "http://fedora.info/definitions/v4/repository#Binary"; 129 final String endpoint = "mock:resultGetParam"; 130 final MockEndpoint mockEndpoint = (MockEndpoint) camelContext.getEndpoint(endpoint); 131 httpEndpoint.expectedMessageCount(1); 132 httpEndpoint.expectedHeaderReceived(HTTP_URI, "http://example.org/ldpath"); 133 final var context = camelContext.adapt(ModelCamelContext.class); 134 mockEndpoint.expectedMessageCount(1); 135 mockEndpoint.expectedHeaderReceived(CONTENT_TYPE, "application/json"); 136 137 AdviceWith.adviceWith(context, "FcrepoLDPathGet", a -> { 138 a.mockEndpointsAndSkip("http:*"); 139 a.weaveAddLast().to(endpoint); 140 }); 141 142 final Map<String, Object> headers = new HashMap<>(); 143 headers.put("ldpath", "http://example.org/ldpath"); 144 headers.put("context", uri); 145 template.sendBodyAndHeaders("direct:get", loadResourceAsStream("test.ldpath"), headers); 146 147 httpEndpoint.assertIsSatisfied(); 148 mockEndpoint.assertIsSatisfied(); 149 final String result = mockEndpoint.getExchanges().get(0).getIn().getBody(String.class); 150 151 @SuppressWarnings("unchecked") 152 final List<Map<String, List<String>>> data = MAPPER.readValue(result, List.class); 153 154 assertFalse(data.isEmpty()); 155 assertTrue(data.get(0).containsKey("label")); 156 assertTrue(data.get(0).containsKey("type")); 157 assertTrue(data.get(0).get("label").contains("binary")); 158 assertTrue(data.get(0).get("type").contains("Class")); 159 assertTrue(data.get(0).get("id").contains(uri)); 160 } 161 162 @Test 163 public void testMimicPost() throws Exception { 164 final String uri = "http://fedora.info/definitions/v4/repository#Container"; 165 final String endpoint = "mock:resultPost"; 166 final MockEndpoint mockEndpoint = (MockEndpoint) camelContext.getEndpoint(endpoint); 167 mockEndpoint.expectedMessageCount(1); 168 mockEndpoint.expectedHeaderReceived(CONTENT_TYPE, "application/json"); 169 final var context = camelContext.adapt(ModelCamelContext.class); 170 171 AdviceWith.adviceWith(context, "FcrepoLDPathPrepare", a -> { 172 a.weaveAddLast().to(endpoint); 173 }); 174 175 176 context.start(); 177 178 template.sendBodyAndHeader("direct:ldpathPrepare", loadResourceAsStream("test.ldpath"), "context", uri); 179 180 mockEndpoint.assertIsSatisfied(); 181 final String result = mockEndpoint.getExchanges().get(0).getIn().getBody(String.class); 182 183 @SuppressWarnings("unchecked") 184 final List<Map<String, List<String>>> data = MAPPER.readValue(result, List.class); 185 186 assertFalse(data.isEmpty()); 187 assertTrue(data.get(0).containsKey("label")); 188 assertTrue(data.get(0).containsKey("type")); 189 assertTrue(data.get(0).get("label").contains("Fedora Container")); 190 assertTrue(data.get(0).get("type").contains("Class")); 191 assertTrue(data.get(0).get("id").contains(uri)); 192 193 } 194 195 196 @Configuration 197 @ComponentScan(resourcePattern = "**/Fcrepo*.class") 198 static class ContextConfig extends CamelConfiguration { 199 } 200}