/**
 * 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.krati;

import org.junit.Test;


import static org.junit.Assert.assertEquals;

public class KratiEndpointTest {

    @Test
    public void testCreateEndpointWithRelativePath() throws Exception {
        String uri = "krati://target/test/endpointtest?initialCapacity=10000";
        KratiComponent component = new KratiComponent();
        KratiEndpoint endpoint = new KratiEndpoint(uri, component);
        endpoint.start();
        endpoint.stop();
        assertEquals("target/test/endpointtest", endpoint.getPath());

    }

    @Test
    public void testCreateEndpointWithAbsolutePath() throws Exception {
        String uri = "krati:///tmp/target/test/endpointtest?initialCapacity=10000";
        KratiComponent component = new KratiComponent();
        KratiEndpoint endpoint = new KratiEndpoint(uri, component);
        endpoint.start();
        endpoint.stop();
        assertEquals("/tmp/target/test/endpointtest", endpoint.getPath());
    }
}
