/**
 * Licensed to the Apache Software Foundation (ASF) under one or more
 * contributor license agreements.  See the NOTICE file distributed with
 * this work for additional information regarding copyright ownership.
 * The ASF licenses this file to You under the Apache License, Version 2.0
 * (the "License"); you may not use this file except in compliance with
 * the License.  You may obtain a copy of the License at
 *
 *      http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */
package org.apache.camel.component.bean;

import org.apache.camel.ContextTestSupport;
import org.apache.camel.RuntimeCamelException;
import org.apache.camel.builder.RouteBuilder;

/**
 * @version 
 */
public class MyServiceProxyTest extends ContextTestSupport {

    public void testOk() throws Exception {
        MyService myService = ProxyHelper.createProxy(context.getEndpoint("direct:start"), MyService.class);
        String reply = myService.method("Hello World");
        assertEquals("Camel in Action", reply);
    }

    public void testKaboom() throws Exception {
        MyService myService = ProxyHelper.createProxy(context.getEndpoint("direct:start"), MyService.class);
        try {
            myService.method("Kaboom");
            fail("Should have thrown exception");
        } catch (IllegalArgumentException e) {
            assertEquals("Damn", e.getMessage());
        }
    }

    public void testCheckedException() throws Exception {
        MyService myService = ProxyHelper.createProxy(context.getEndpoint("direct:start"), MyService.class);
        try {
            myService.method("Tiger in Action");
            fail("Should have thrown exception");
        } catch (MyApplicationException e) {
            assertEquals("No tigers", e.getMessage());
            assertEquals(9, e.getCode());
        }
    }

    public void testNestedRuntimeCheckedException() throws Exception {
        MyService myService = ProxyHelper.createProxy(context.getEndpoint("direct:start"), MyService.class);
        try {
            myService.method("Donkey in Action");
            fail("Should have thrown exception");
        } catch (MyApplicationException e) {
            assertEquals("No donkeys", e.getMessage());
            assertEquals(8, e.getCode());
        }
    }

    public void testNestedCheckedCheckedException() throws Exception {
        MyService myService = ProxyHelper.createProxy(context.getEndpoint("direct:start"), MyService.class);
        try {
            myService.method("Elephant in Action");
            fail("Should have thrown exception");
        } catch (MyApplicationException e) {
            assertEquals("No elephants", e.getMessage());
            assertEquals(7, e.getCode());
        }
    }

    @Override
    protected RouteBuilder createRouteBuilder() throws Exception {
        return new RouteBuilder() {
            @Override
            public void configure() throws Exception {
                from("direct:start")
                    .choice()
                        .when(body().isEqualTo("Tiger in Action")).throwException(new MyApplicationException("No tigers", 9))
                        .when(body().isEqualTo("Donkey in Action")).throwException(new RuntimeCamelException(new MyApplicationException("No donkeys", 8)))
                        .when(body().isEqualTo("Elephant in Action")).throwException(new MyCustomException("Damn", new MyApplicationException("No elephants", 7)))
                        .when(body().isEqualTo("Kaboom")).throwException(new IllegalArgumentException("Damn"))
                        .otherwise().transform(constant("Camel in Action"));
            }
        };
    }

}
