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

import java.util.List;

import org.apache.camel.test.junit4.CamelTestSupport;
import org.junit.Test;

public class HttpEndpointURLTest extends CamelTestSupport {
    
    @Test
    public void testHttpEndpointURLWithAuthPassWord() {
        HttpEndpoint endpoint = (HttpEndpoint)context.getEndpoint("http://localhost/test?authMethod=Basic&authPassword=RAW(pa&&word)&authUsername=usr");
        HttpClientConfigurer configurer = endpoint.getHttpClientConfigurer();
        assertTrue("Expect the CompositeHttpConfigurer", configurer instanceof CompositeHttpConfigurer);
        List<HttpClientConfigurer> configurers =  ((CompositeHttpConfigurer)configurer).getConfigurers();
        BasicAuthenticationHttpClientConfigurer basicAuthenticationConfigurer = null;
        for (HttpClientConfigurer config : configurers) {
            if (config instanceof BasicAuthenticationHttpClientConfigurer) {
                basicAuthenticationConfigurer = (BasicAuthenticationHttpClientConfigurer)config;
                break;
            }
        }
        assertNotNull("We should find the basicAuthenticationConfigurer", basicAuthenticationConfigurer);
        assertEquals("pa&&word", basicAuthenticationConfigurer.getPassword());
    }
    
    @Test
    public void testHttpEndpointURLWithIPv6() {
        HttpEndpoint endpoint = (HttpEndpoint)context.getEndpoint("http://[2a00:8a00:6000:40::1413]:30300/test?test=true");
        assertEquals("http://[2a00:8a00:6000:40::1413]:30300/test?test=true", endpoint.getHttpUri().toString());
    }

}
