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}