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

import org.apache.cxf.Bus;
import org.apache.cxf.binding.soap.SoapBindingFactory;
import org.junit.Test;

public class SpringBusFactoryBeanTest extends AbstractSpringBeanTestSupport {

    @Override
    protected String[] getApplicationContextFiles() {
        return new String[]{"org/apache/camel/component/cxf/spring/SpringBusFactoryBeans.xml"};
    }
    
    @Test
    public void getTheBusInstance() {
        Bus bus = ctx.getBean("cxfBus", Bus.class);
        assertNotNull("The bus should not be null", bus);
        
        bus = ctx.getBean("myBus", Bus.class);
        assertNotNull("The bus should not be null", bus);

        SoapBindingFactory soapBindingFactory = bus.getExtension(SoapBindingFactory.class);
        assertNotNull("You should find the factory here", soapBindingFactory);
    }

}
