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.reindexing;
007
008import static org.apache.camel.Exchange.CONTENT_TYPE;
009import static org.apache.camel.Exchange.HTTP_PATH;
010import static org.fcrepo.camel.reindexing.ReindexingHeaders.REINDEXING_RECIPIENTS;
011
012import java.io.IOException;
013import java.util.HashMap;
014import java.util.Map;
015
016import org.apache.camel.EndpointInject;
017import org.apache.camel.Produce;
018import org.apache.camel.ProducerTemplate;
019import org.apache.camel.builder.RouteBuilder;
020import org.apache.camel.component.mock.MockEndpoint;
021import org.apache.camel.test.junit4.CamelTestSupport;
022
023import org.junit.Test;
024
025/**
026 * Test the route workflow.
027 *
028 * @author Aaron Coburn
029 * @since 2015-04-10
030 */
031public class RestProcessorTest extends CamelTestSupport {
032
033    @EndpointInject(uri = "mock:result")
034    protected MockEndpoint resultEndpoint;
035
036    @Produce(uri = "direct:start")
037    protected ProducerTemplate template;
038
039    @Test
040    public void testRestProcessor() throws Exception {
041
042        resultEndpoint.expectedMessageCount(3);
043        resultEndpoint.message(0).header(REINDEXING_RECIPIENTS).isEqualTo("");
044        resultEndpoint.message(1).header(REINDEXING_RECIPIENTS).contains("broker:queue:bar");
045        resultEndpoint.message(1).header(REINDEXING_RECIPIENTS).contains("broker:queue:foo");
046        resultEndpoint.message(2).header(REINDEXING_RECIPIENTS).isEqualTo("");
047
048        final Map<String, Object> headers = new HashMap<>();
049        headers.put(HTTP_PATH, "/");
050        template.sendBodyAndHeaders("", headers);
051
052        headers.clear();
053        headers.put(HTTP_PATH, "/foo/bar");
054        headers.put(REINDEXING_RECIPIENTS,
055                "broker:queue:foo, broker:queue:bar,\t\nbroker:queue:foo   ");
056        template.sendBodyAndHeaders("", headers);
057
058        headers.clear();
059        headers.put(HTTP_PATH, "/foo/bar");
060        headers.put(REINDEXING_RECIPIENTS, null);
061        template.sendBodyAndHeaders("", headers);
062
063        assertMockEndpointsSatisfied();
064    }
065
066    @Test
067    public void testRestProcessorWithBody1() throws Exception {
068        final String body = "[\"broker:queue:foo\",\"broker:queue:bar\"]";
069
070        resultEndpoint.expectedMessageCount(1);
071        resultEndpoint.message(0).header(REINDEXING_RECIPIENTS).contains("broker:queue:bar");
072        resultEndpoint.message(0).header(REINDEXING_RECIPIENTS).contains("broker:queue:foo");
073
074        final Map<String, Object> headers = new HashMap<>();
075        headers.put(CONTENT_TYPE, "application/json");
076        headers.put(HTTP_PATH, "/foo/bar");
077        template.sendBodyAndHeaders(body, headers);
078
079        assertMockEndpointsSatisfied();
080    }
081
082    @Test
083    public void testRestProcessorWithBody2() throws Exception {
084        final String body = "[\"broker:queue:foo\",\"broker:queue:bar\"]";
085
086        resultEndpoint.expectedMessageCount(1);
087        resultEndpoint.message(0).header(REINDEXING_RECIPIENTS).contains("broker:queue:bar");
088        resultEndpoint.message(0).header(REINDEXING_RECIPIENTS).contains("broker:queue:foo");
089        resultEndpoint.message(0).header(REINDEXING_RECIPIENTS).contains("broker:queue:baz");
090
091        final Map<String, Object> headers = new HashMap<>();
092        headers.put(HTTP_PATH, "/foo/bar");
093        headers.put(CONTENT_TYPE, "application/json");
094        headers.put(REINDEXING_RECIPIENTS, "broker:queue:baz");
095        template.sendBodyAndHeaders(body, headers);
096
097        assertMockEndpointsSatisfied();
098    }
099
100    @Test
101    public void testRestProcessorWithNullBody() throws Exception {
102
103        resultEndpoint.expectedMessageCount(1);
104        resultEndpoint.message(0).header(REINDEXING_RECIPIENTS).isEqualTo("broker:queue:baz");
105
106        final Map<String, Object> headers = new HashMap<>();
107        headers.put(CONTENT_TYPE, "application/json");
108        headers.put(HTTP_PATH, "/foo/bar");
109        headers.put(REINDEXING_RECIPIENTS, "broker:queue:baz");
110        template.sendBodyAndHeaders(null, headers);
111
112        assertMockEndpointsSatisfied();
113    }
114
115    @Test
116    public void testRestProcessorWithNoContentType() throws Exception {
117
118        final String body = "[\"broker:queue:foo\",\"broker:queue:bar\"]";
119
120        resultEndpoint.expectedMessageCount(1);
121        resultEndpoint.message(0).header(REINDEXING_RECIPIENTS).isEqualTo("broker:queue:baz");
122
123        final Map<String, Object> headers = new HashMap<>();
124        headers.put(HTTP_PATH, "/foo/bar");
125        headers.put(REINDEXING_RECIPIENTS, "broker:queue:baz");
126        template.sendBodyAndHeaders(body, headers);
127
128        assertMockEndpointsSatisfied();
129    }
130
131    @Test
132    public void testRestProcessorWithBadContentType() throws Exception {
133
134        final String body = "[\"broker:queue:foo\",\"broker:queue:bar\"]";
135
136        resultEndpoint.expectedMessageCount(1);
137        resultEndpoint.message(0).header(REINDEXING_RECIPIENTS).isEqualTo("broker:queue:baz");
138
139        final Map<String, Object> headers = new HashMap<>();
140        headers.put(CONTENT_TYPE, "application/foo");
141        headers.put(HTTP_PATH, "/foo/bar");
142        headers.put(REINDEXING_RECIPIENTS, "broker:queue:baz");
143        template.sendBodyAndHeaders(body, headers);
144
145        assertMockEndpointsSatisfied();
146    }
147
148
149    @Test
150    public void testRestProcessorWithEmptyBody() throws Exception {
151
152        resultEndpoint.expectedMessageCount(1);
153        resultEndpoint.message(0).header(REINDEXING_RECIPIENTS).isEqualTo("broker:queue:baz");
154
155        final Map<String, Object> headers = new HashMap<>();
156        headers.put(CONTENT_TYPE, "application/json");
157        headers.put(HTTP_PATH, "/foo/bar");
158        headers.put(REINDEXING_RECIPIENTS, "broker:queue:baz");
159        template.sendBodyAndHeaders("    ", headers);
160
161        assertMockEndpointsSatisfied();
162    }
163
164
165    @Override
166    protected RouteBuilder createRouteBuilder() {
167        return new RouteBuilder() {
168            @Override
169            public void configure() throws IOException {
170                from("direct:start")
171                    .process(new RestProcessor())
172                    .to("mock:result");
173            }
174        };
175    }
176}