org.soybeanMilk.test.unit.web.TestDispatchServlet.java Source code

Java tutorial

Introduction

Here is the source code for org.soybeanMilk.test.unit.web.TestDispatchServlet.java

Source

/**
 * 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 org.soybeanMilk.test.unit.web;

import java.io.Serializable;
import java.util.HashMap;
import java.util.Map;

import javax.servlet.ServletContext;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import org.junit.Assert;
import org.junit.Before;
import org.junit.Test;
import org.soybeanMilk.core.exe.support.DefaultResolverObjectFactory;
import org.soybeanMilk.core.exe.support.ResolverObjectFactory;
import org.soybeanMilk.web.WebConstants;
import org.soybeanMilk.web.WebObjectSource;
import org.soybeanMilk.web.exe.th.AbstractTargetHandler;
import org.soybeanMilk.web.os.DefaultWebObjectSource;
import org.soybeanMilk.web.servlet.WebObjectSourceFactory;
import org.springframework.mock.web.MockHttpServletRequest;
import org.springframework.mock.web.MockHttpServletResponse;
import org.springframework.mock.web.MockServletContext;

/**
 * @author earthangry@gmail.com
 * @date 2012-5-10
 */
public class TestDispatchServlet {
    private static ResolverObjectFactory myExternalResolverObjectFactory = new MyResolverObjectFactory();

    private static String myExternalResolverKey = "myExternalResolver";
    private static String myEncoding = "GBK";
    private static String myExecutorKey = "myExecutorKey";
    private static String mySoybeanMilkFile = "org/soybeanMilk/test/unit/web/TestDispatchServlet.xml";
    private static String myWebObjectSourceFactoryClass = "org.soybeanMilk.test.unit.web.TestDispatchServlet$MyWebObjectSourceFactory";

    private static String CONTEXT_PATH = "/testContext";

    private MockServletContext servletContext;
    private Map<String, String> servletInitParameters;

    @Before
    public void setUp() {
        servletContext = new MockServletContext();
        servletInitParameters = new HashMap<String, String>();
        servletInitParameters.put(WebConstants.ServletInitParams.SOYBEAN_MILK_CONFIG, mySoybeanMilkFile);
    }

    @Test
    public void initEncoding_userSet() {
        servletInitParameters.put(WebConstants.ServletInitParams.ENCODING, myEncoding);

        MockDispathServlet servlet = new MockDispathServlet(servletContext, servletInitParameters);
        initServlet(servlet);

        Assert.assertEquals(myEncoding, servlet.getEncoding());
    }

    @Test
    public void initEncoding_userSetEmpty() {
        servletInitParameters.put(WebConstants.ServletInitParams.ENCODING, "");

        MockDispathServlet servlet = new MockDispathServlet(servletContext, servletInitParameters);
        initServlet(servlet);

        Assert.assertEquals(WebConstants.DEFAULT_ENCODING, servlet.getEncoding());
    }

    @Test
    public void initEncoding_userNotSet() {
        MockDispathServlet servlet = new MockDispathServlet(servletContext, servletInitParameters);
        initServlet(servlet);

        Assert.assertEquals(WebConstants.DEFAULT_ENCODING, servlet.getEncoding());
    }

    @Test
    public void initAppExecutorKey_userSet() {
        servletInitParameters.put(WebConstants.ServletInitParams.APPLICATION_EXECUTOR_KEY, myExecutorKey);

        MockDispathServlet servlet = new MockDispathServlet(servletContext, servletInitParameters);
        initServlet(servlet);

        Assert.assertEquals(myExecutorKey, servlet.getAppExecutorKey());
    }

    @Test
    public void initAppExecutorKey_userSetEmpty() {
        servletInitParameters.put(WebConstants.ServletInitParams.APPLICATION_EXECUTOR_KEY, "");

        MockDispathServlet servlet = new MockDispathServlet(servletContext, servletInitParameters);
        initServlet(servlet);

        Assert.assertNull(servlet.getAppExecutorKey());
    }

    @Test
    public void initAppExecutorKey_userNotSet() {
        MockDispathServlet servlet = new MockDispathServlet(servletContext, servletInitParameters);
        initServlet(servlet);

        Assert.assertNull(servlet.getAppExecutorKey());
    }

    @Test
    public void initWebObjectSourceFactory_userSet() {
        servletInitParameters.put(WebConstants.ServletInitParams.WEB_OBJECT_SOURCE_FACTORY_CLASS,
                myWebObjectSourceFactoryClass);

        MockDispathServlet servlet = new MockDispathServlet(servletContext, servletInitParameters);
        initServlet(servlet);

        Assert.assertEquals(MyWebObjectSource.class,
                servlet.getWebObjectSourceFactory().create(null, null, null).getClass());
    }

    @Test
    public void initWebObjectSourceFactory_userSetEmpty() {
        servletInitParameters.put(WebConstants.ServletInitParams.WEB_OBJECT_SOURCE_FACTORY_CLASS, "");

        MockDispathServlet servlet = new MockDispathServlet(servletContext, servletInitParameters);
        initServlet(servlet);

        Assert.assertEquals(DefaultWebObjectSource.class,
                servlet.getWebObjectSourceFactory().create(null, null, null).getClass());
    }

    @Test
    public void initWebObjectSourceFactory_userNotSet() {
        MockDispathServlet servlet = new MockDispathServlet(servletContext, servletInitParameters);
        initServlet(servlet);

        Assert.assertEquals(DefaultWebObjectSource.class,
                servlet.getWebObjectSourceFactory().create(null, null, null).getClass());
    }

    @Test
    public void initExternalResolverFactory_userSet() {
        servletContext.setAttribute(myExternalResolverKey, myExternalResolverObjectFactory);
        servletInitParameters.put(WebConstants.ServletInitParams.EXTERNAL_RESOLVER_OBJECT_FACTORY,
                myExternalResolverKey);

        MockDispathServlet servlet = new MockDispathServlet(servletContext, servletInitParameters);
        initServlet(servlet);

        Assert.assertTrue(((DefaultResolverObjectFactory) servlet.getWebExecutor().getConfiguration()
                .getResolverObjectFactory()).getExternalResolverObjectFactory() == myExternalResolverObjectFactory);
    }

    @Test
    public void initExternalResolverFactory_userSetNull() {
        servletInitParameters.put(WebConstants.ServletInitParams.EXTERNAL_RESOLVER_OBJECT_FACTORY,
                "myExternalResolverObjectFactory");
        servletContext.setAttribute("myExternalResolverObjectFactory", null);

        MockDispathServlet servlet = new MockDispathServlet(servletContext, servletInitParameters);
        initServlet(servlet);

        Assert.assertNull(((DefaultResolverObjectFactory) servlet.getWebExecutor().getConfiguration()
                .getResolverObjectFactory()).getExternalResolverObjectFactory());
    }

    @Test
    public void initExternalResolverFactory_userNotSet() {
        MockDispathServlet servlet = new MockDispathServlet(servletContext, servletInitParameters);
        initServlet(servlet);

        Assert.assertNull(((DefaultResolverObjectFactory) servlet.getWebExecutor().getConfiguration()
                .getResolverObjectFactory()).getExternalResolverObjectFactory());
    }

    @Test
    public void getRequestExecutableName_userRequest_urlPath() throws Exception {
        MockDispathServlet servlet = new MockDispathServlet(servletContext, servletInitParameters);
        initServlet(servlet);

        MockHttpServletRequest request = new MockHttpServletRequest();
        MockHttpServletResponse response = new MockHttpServletResponse();

        request.setMethod("POST");
        request.setContextPath(CONTEXT_PATH);

        request.setPathInfo("/test/test");
        request.setServletPath("");

        servlet.service(request, response);

        Assert.assertEquals(TestResolver.RESULT, (String) request.getAttribute("result"));
    }

    @Test
    public void getRequestExecutableName_userRequest_urlSuffix() throws Exception {
        MockDispathServlet servlet = new MockDispathServlet(servletContext, servletInitParameters);
        initServlet(servlet);

        MockHttpServletRequest request = new MockHttpServletRequest();
        MockHttpServletResponse response = new MockHttpServletResponse();

        request.setMethod("POST");
        request.setContextPath(CONTEXT_PATH);

        request.setPathInfo("/test/test.do");
        request.setServletPath("");

        servlet.service(request, response);

        Assert.assertEquals(TestResolver.RESULT, (String) request.getAttribute("result"));
    }

    @Test
    public void getRequestExecutableName_include_urlPath_noServletPath() throws Exception {
        MockDispathServlet servlet = new MockDispathServlet(servletContext, servletInitParameters);
        initServlet(servlet);

        MockHttpServletRequest request = new MockHttpServletRequest();
        MockHttpServletResponse response = new MockHttpServletResponse();

        request.setMethod("POST");
        request.setContextPath(CONTEXT_PATH);
        request.setAttribute(AbstractTargetHandler.INCLUDE_PATH_INFO_ATTRIBUTE, "/test/test");

        servlet.service(request, response);

        Assert.assertEquals(TestResolver.RESULT, (String) request.getAttribute("result"));
    }

    @Test
    public void getRequestExecutableName_include_urlPath_withServletPath() throws Exception {
        MockDispathServlet servlet = new MockDispathServlet(servletContext, servletInitParameters);
        initServlet(servlet);

        MockHttpServletRequest request = new MockHttpServletRequest();
        MockHttpServletResponse response = new MockHttpServletResponse();

        request.setMethod("POST");
        request.setContextPath(CONTEXT_PATH);
        request.setAttribute(AbstractTargetHandler.INCLUDE_PATH_INFO_ATTRIBUTE, "/test");
        request.setAttribute(AbstractTargetHandler.INCLUDE_SERVLET_PATH_ATTRIBUTE, "/test");

        servlet.service(request, response);

        Assert.assertEquals(TestResolver.RESULT, (String) request.getAttribute("result"));
    }

    @Test
    public void getRequestExecutableName_endBackslash() throws Exception {
        MockDispathServlet servlet = new MockDispathServlet(servletContext, servletInitParameters);
        initServlet(servlet);

        MockHttpServletRequest request = new MockHttpServletRequest();
        MockHttpServletResponse response = new MockHttpServletResponse();

        request.setMethod("POST");
        request.setContextPath(CONTEXT_PATH);
        request.setAttribute(AbstractTargetHandler.INCLUDE_PATH_INFO_ATTRIBUTE, "/test/test/");

        servlet.service(request, response);

        Assert.assertEquals(TestResolver.RESULT, (String) request.getAttribute("result"));
    }

    @Test
    public void getRequestExecutableName_include_urlSuffix() throws Exception {
        MockDispathServlet servlet = new MockDispathServlet(servletContext, servletInitParameters);
        initServlet(servlet);

        {
            MockHttpServletRequest request = new MockHttpServletRequest();
            MockHttpServletResponse response = new MockHttpServletResponse();

            request.setMethod("POST");
            request.setContextPath(CONTEXT_PATH);
            request.setAttribute(AbstractTargetHandler.INCLUDE_SERVLET_PATH_ATTRIBUTE, "/test/test.do");

            servlet.service(request, response);

            Assert.assertEquals(TestResolver.RESULT, (String) request.getAttribute("result"));
        }
    }

    protected void initServlet(HttpServlet servlet) {
        try {
            servlet.init();
        } catch (Exception e) {
            throw new RuntimeException(e);
        }
    }

    public static class MyResolverObjectFactory implements ResolverObjectFactory {
        //@Override
        public Object getResolverObject(Serializable resolverId) {
            return null;
        }

        public void addResolverObject(Serializable resolverObjectId, Object resolverObject) {

        }
    }

    public static class MyWebObjectSourceFactory implements WebObjectSourceFactory {
        //@Override
        public WebObjectSource create(HttpServletRequest request, HttpServletResponse response,
                ServletContext application) {
            return new MyWebObjectSource(request, response, application);
        }
    }

    protected static class MyWebObjectSource extends DefaultWebObjectSource {
        public MyWebObjectSource(HttpServletRequest request, HttpServletResponse response,
                ServletContext application) {
            super(request, response, application);
        }
    }

    public static class TestResolver {
        public static final String RESULT = "success";

        public String test() {
            return RESULT;
        }
    }
}