br.com.caelum.vraptor.ioc.spring.SpringBasedContainerTest.java Source code

Java tutorial

Introduction

Here is the source code for br.com.caelum.vraptor.ioc.spring.SpringBasedContainerTest.java

Source

/***
 * Copyright (c) 2009 Caelum - www.caelum.com.br/opensource
 * All rights reserved.
 *
 * Licensed 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 br.com.caelum.vraptor.ioc.spring;

import static br.com.caelum.vraptor.VRaptorMatchers.canHandle;
import static java.util.Collections.enumeration;
import static org.hamcrest.MatcherAssert.assertThat;
import static org.hamcrest.Matchers.hasItem;
import static org.hamcrest.Matchers.instanceOf;
import static org.hamcrest.Matchers.is;
import static org.hamcrest.Matchers.notNullValue;
import static org.junit.Assert.assertFalse;
import static org.junit.Assert.assertNotNull;
import static org.junit.Assert.assertTrue;
import static org.mockito.Matchers.anyString;
import static org.mockito.Mockito.mock;
import static org.mockito.Mockito.when;

import java.util.Collections;
import java.util.Enumeration;

import javax.servlet.FilterChain;
import javax.servlet.ServletContext;
import javax.servlet.ServletRequest;

import org.hamcrest.Matcher;
import org.junit.After;
import org.junit.Before;
import org.junit.Test;
import org.springframework.web.context.request.RequestContextHolder;
import org.springframework.web.context.request.ServletRequestAttributes;

import br.com.caelum.vraptor.Converter;
import br.com.caelum.vraptor.config.BasicConfiguration;
import br.com.caelum.vraptor.core.Converters;
import br.com.caelum.vraptor.core.RequestInfo;
import br.com.caelum.vraptor.http.MutableRequest;
import br.com.caelum.vraptor.http.MutableResponse;
import br.com.caelum.vraptor.http.UrlToResourceTranslator;
import br.com.caelum.vraptor.http.route.Route;
import br.com.caelum.vraptor.http.route.Router;
import br.com.caelum.vraptor.interceptor.InterceptorRegistry;
import br.com.caelum.vraptor.ioc.Container;
import br.com.caelum.vraptor.ioc.spring.components.ConstructorInjection;
import br.com.caelum.vraptor.ioc.spring.components.CustomTranslator;
import br.com.caelum.vraptor.ioc.spring.components.DummyComponent;
import br.com.caelum.vraptor.ioc.spring.components.DummyConverter;
import br.com.caelum.vraptor.ioc.spring.components.DummyImplementation;
import br.com.caelum.vraptor.ioc.spring.components.DummyInterceptor;
import br.com.caelum.vraptor.ioc.spring.components.DummyResource;
import br.com.caelum.vraptor.ioc.spring.components.Foo;
import br.com.caelum.vraptor.ioc.spring.components.LifecycleComponent;
import br.com.caelum.vraptor.ioc.spring.components.RequestScopedComponent;
import br.com.caelum.vraptor.ioc.spring.components.RequestScopedContract;
import br.com.caelum.vraptor.ioc.spring.components.SameName;
import br.com.caelum.vraptor.ioc.spring.components.SpecialImplementation;
import br.com.caelum.vraptor.scan.WebAppBootstrapFactory;
import br.com.caelum.vraptor.test.HttpServletRequestMock;
import br.com.caelum.vraptor.test.HttpSessionMock;

/**
 * @author Fabio Kung
 */
public class SpringBasedContainerTest {
    private SpringBasedContainer container;
    private MutableRequest request;
    private HttpSessionMock session;
    private ServletContext servletContext;
    private MutableResponse response;

    @Before
    public void initContainer() {
        servletContext = mock(ServletContext.class);

        when(servletContext.getInitParameter(BasicConfiguration.BASE_PACKAGES_PARAMETER_NAME))
                .thenReturn("br.com.caelum.vraptor.ioc.spring");

        when(servletContext.getRealPath(anyString()))
                .thenReturn(SpringBasedContainer.class.getResource(".").getFile());

        when(servletContext.getInitParameter(BasicConfiguration.SCANNING_PARAM)).thenReturn("enabled");

        when(servletContext.getClassLoader()).thenReturn(Thread.currentThread().getContextClassLoader());

        Enumeration<String> emptyEnumeration = enumeration(Collections.<String>emptyList());
        when(servletContext.getInitParameterNames()).thenReturn(emptyEnumeration);
        when(servletContext.getAttributeNames()).thenReturn(emptyEnumeration);

        session = new HttpSessionMock(servletContext, "session");
        request = new HttpServletRequestMock(session, mock(MutableRequest.class));
        response = mock(MutableResponse.class);

        FilterChain chain = mock(FilterChain.class);
        VRaptorRequestHolder.setRequestForCurrentThread(new RequestInfo(servletContext, chain, request, response));
        RequestContextHolder.setRequestAttributes(new ServletRequestAttributes(request));
        BasicConfiguration config = new BasicConfiguration(servletContext);
        container = new SpringBasedContainer(new DefaultSpringLocator().getApplicationContext(servletContext));
        new WebAppBootstrapFactory().create(config).configure(container);
        container.start(servletContext);
    }

    @After
    public void destroyContainer() {
        container.stop();
        container = null;
        RequestContextHolder.resetRequestAttributes();
        VRaptorRequestHolder.resetRequestForCurrentThread();
    }

    @Test
    public void twoClassesWithSameNameButDifferentPackages() throws Exception {
        SameName instance1 = container.instanceFor(SameName.class);
        br.com.caelum.vraptor.ioc.spring.components.sub.SameName instance2 = container
                .instanceFor(br.com.caelum.vraptor.ioc.spring.components.sub.SameName.class);
        assertNotNull(instance1);
        assertNotNull(instance2);
    }

    @Test
    public void shouldScanAndRegisterAnnotatedBeans() {
        DummyComponent component = container.instanceFor(DummyComponent.class);
        assertNotNull("can instantiate", component);
        assertTrue("is the right implementation", component instanceof DummyImplementation);
    }

    @Test
    public void shouldRunPostConstructMethodOfApplicationScopedComponentsAtContainerStart() {
        assertTrue("should have called init", LifecycleComponent.initialized);
    }

    static class NotRegisterd {
    }

    @Test
    public void shouldProvideOnlyIfBeanIsRegistered() {
        assertTrue(container.canProvide(DummyComponent.class));
        assertFalse(container.canProvide(NotRegisterd.class));
    }

    @Test
    public void shouldNotProvidePrimitiveValues() {
        assertFalse(container.canProvide(Long.class));
        assertFalse(container.canProvide(long.class));
        assertFalse(container.canProvide(long[].class));
        assertFalse(container.canProvide(Long[].class));
    }

    @Test
    public void shouldSupportOtherStereotypeAnnotations() {
        SpecialImplementation component = container.instanceFor(SpecialImplementation.class);
        assertNotNull("can instantiate", component);
    }

    @Test
    public void shouldSupportConstructorInjection() {
        ConstructorInjection component = container.instanceFor(ConstructorInjection.class);
        assertNotNull("can instantiate", component);
        assertNotNull("inject dependencies", component.getDependecy());
    }

    @Test
    public void shouldProvideCurrentHttpRequest() {
        ServletRequest httpRequest = container.instanceFor(ServletRequest.class);
        assertNotNull("can provide request", httpRequest);
    }

    @Test
    public void shouldProvideCurrentVRaptorRequest() {
        RequestInfo vraptorRequest = container.instanceFor(RequestInfo.class);
        assertNotNull("can provide request", vraptorRequest);
    }

    @Test
    public void shouldProvideServletContext() {
        ServletContext context = container.instanceFor(ServletContext.class);
        assertNotNull("can provide ServletContext", context);
    }

    @Test
    public void shouldProvideTheContainer() {
        Container itself = this.container.instanceFor(Container.class);
        assertNotNull("can provide the container", itself);
    }

    @Test
    public void shouldSupportManualRegistration() {
        this.container.register(RequestScopedContract.class, RequestScopedComponent.class);
        RequestScopedContract requestScopedContract = this.container.instanceFor(RequestScopedContract.class);
        assertNotNull("can provide manual registered components", requestScopedContract);
    }

    @Test
    public void shoudSupportCustomImplementationsForAlreadyRegisteredComponents() {
        this.container.register(UrlToResourceTranslator.class, CustomTranslator.class);
        UrlToResourceTranslator translator = this.container.instanceFor(UrlToResourceTranslator.class);
        assertThat(translator, is(notNullValue()));
        assertThat(translator, is(instanceOf(CustomTranslator.class)));

    }

    @Test
    public void shoudRegisterResourcesInRouter() {
        Router router = container.instanceFor(Router.class);
        Matcher<Iterable<? super Route>> hasItem = hasItem(
                canHandle(DummyResource.class, DummyResource.class.getDeclaredMethods()[0]));
        assertThat(router.allRoutes(), hasItem);
    }

    @Test
    public void shoudRegisterConvertersInConverters() {
        Converters converters = container.instanceFor(Converters.class);
        Converter<?> converter = converters.to(Foo.class);
        assertThat(converter, is(instanceOf(DummyConverter.class)));
    }

    @Test
    public void shoudRegisterInterceptorsInInterceptorRegistry() {
        InterceptorRegistry registry = container.instanceFor(InterceptorRegistry.class);
        assertThat(registry.all(), hasItem(DummyInterceptor.class));
    }
}