Package com.alibaba.citrus.service.moduleloader.impl.dataresolver

Source Code of com.alibaba.citrus.service.moduleloader.impl.dataresolver.ParamBindingTests

/*
* Copyright (c) 2002-2012 Alibaba Group Holding Limited.
* 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 com.alibaba.citrus.service.moduleloader.impl.dataresolver;

import static com.alibaba.citrus.test.TestUtil.*;
import static org.hamcrest.Matchers.*;
import static org.junit.Assert.*;

import com.alibaba.citrus.service.moduleloader.AbstractModuleLoaderTests;
import com.alibaba.citrus.service.moduleloader.ModuleLoaderService;
import com.alibaba.citrus.service.moduleloader.UnadaptableModuleException;
import com.alibaba.citrus.service.moduleloader.impl.adapter.ActionEventAdapter;
import com.alibaba.citrus.service.moduleloader.impl.adapter.DataBindingAdapter;
import com.alibaba.test2.module.action.MyParameterizedAction;
import com.alibaba.test2.module.screen.MyParameterizedScreen;
import org.hamcrest.Matcher;
import org.junit.BeforeClass;
import org.junit.Test;
import org.springframework.context.ApplicationContext;

public class ParamBindingTests extends AbstractModuleLoaderTests {
    @BeforeClass
    public static void initServlet() throws Exception {
        prepareServlet();
        factory = createContext("dataresolver/services-with-dataresolver-default-adapters.xml", false);
    }

    @Test
    public void noDataResolver() throws Exception {
        ApplicationContext factory = createContext("dataresolver/services-no-dataresolver.xml", false);
        moduleLoaderService = (ModuleLoaderService) factory.getBean("moduleLoaderService");

        getInvocationContext("/app1?event_submit_do_my_event=yes");
        initRequestContext(factory);

        // screen.execute(无参数) - 正常执行
        DataBindingAdapter dbAdapter = (DataBindingAdapter) moduleLoaderService.getModule("screen", "myScreen");
        dbAdapter.execute();

        // screen.execute(带参数)
        try {
            moduleLoaderService.getModule("screen", "myParameterizedScreen");
            fail();
        } catch (UnadaptableModuleException e) {
            assertThat(e, exception("Could not adapt object to module: type=screen, name=MyParameterizedScreen, class="
                                    + MyParameterizedScreen.class.getName()
                                    + ": method execute has 2 parameters, but no DataResolvers defined."));
        }

        // action.doMyEvent(无参数) - 正常执行
        ActionEventAdapter aeAdapter = (ActionEventAdapter) moduleLoaderService.getModule("action", "myAction");
        aeAdapter.execute();

        // action.doMyEvent(带参数)
        try {
            moduleLoaderService.getModule("action", "myParameterizedAction");
            fail();
        } catch (UnadaptableModuleException e) {
            Matcher<Throwable> case1 = exception("Could not adapt object to module: type=action, name=MyParameterizedAction, class="
                                                 + MyParameterizedAction.class.getName()
                                                 + ": method doMyEvent has 2 parameters, but no DataResolvers defined.");

            Matcher<Throwable> case2 = exception("Could not adapt object to module: type=action, name=MyParameterizedAction, class="
                                                 + MyParameterizedAction.class.getName()
                                                 + ": method doMyEventPrimitive has 2 parameters, but no DataResolvers defined.");

            @SuppressWarnings("unchecked")
            Matcher<Throwable> any = anyOf(case1, case2);

            assertThat(e, any);
        }
    }

    @Test
    public void withDataResolver_default_adapters() throws Exception {
        assertWithDataResolver(factory);
    }

    @Test
    public void withDataResolver_defined_adapters() throws Exception {
        assertWithDataResolver(createContext("dataresolver/services-with-dataresolver-defined-adapters.xml", false));
    }

    @Test
    public void withDataResolver_defined_adapters_default_resolverRef() throws Exception {
        assertWithDataResolver(createContext(
                "dataresolver/services-with-dataresolver-defined-adapters-default-resolver-ref.xml", false));
    }

    private void assertWithDataResolver(ApplicationContext factory) throws Exception {
        moduleLoaderService = (ModuleLoaderService) factory.getBean("moduleLoaderService");

        getInvocationContext("/app1?event_submit_do_my_event=yes");
        initRequestContext(factory);

        // screen.execute(无参数)
        DataBindingAdapter dbAdapter = (DataBindingAdapter) moduleLoaderService.getModule("screen", "myScreen");
        dbAdapter.execute();
        assertEquals("MyScreen.execute()", request.getAttribute("screenLog"));

        // screen.execute(带参数)
        dbAdapter = (DataBindingAdapter) moduleLoaderService.getModule("screen", "myParameterizedScreen");
        dbAdapter.execute();
        assertEquals("MyParameterizedScreen.execute(request, 111)", request.getAttribute("screenLog"));

        // action.doMyEvent(无参数) - 正常执行
        ActionEventAdapter aeAdapter = (ActionEventAdapter) moduleLoaderService.getModule("action", "myAction");
        aeAdapter.execute();
        assertEquals("MyAction.doMyEvent()", request.getAttribute("actionLog"));

        // action.doMyEvent(带参数)
        aeAdapter = (ActionEventAdapter) moduleLoaderService.getModule("action", "myParameterizedAction");
        aeAdapter.execute();
        assertEquals("MyParameterizedAction.doMyEvent(request, 222)", request.getAttribute("actionLog"));

        // action.doMyEvent(带primitive参数)
        getInvocationContext("/app1?event_submit_do_my_event_primitive=yes");
        initRequestContext(factory);

        aeAdapter = (ActionEventAdapter) moduleLoaderService.getModule("action", "myParameterizedAction");
        aeAdapter.execute();
        assertEquals("MyParameterizedAction.doMyEventPrimitive(request, 0)", request.getAttribute("actionLog"));
    }

    @Test
    public void skipScreen() throws Exception {
        moduleLoaderService = (ModuleLoaderService) factory.getBean("moduleLoaderService");

        getInvocationContext("/app1?event_submit_do_my_event=yes");
        initRequestContext(factory);

        // screen.execute(@skip) - 不会真的skip,只是参数为null
        DataBindingAdapter dbAdapter = (DataBindingAdapter) moduleLoaderService
                .getModule("screen", "mySkippableScreen");
        dbAdapter.execute();

        assertEquals("result is haha", request.getAttribute("screenLog"));

        // screen.execute(@skip primitive type) - 不会真的skip,只是参数为false
        dbAdapter = (DataBindingAdapter) moduleLoaderService.getModule("screen", "mySkippableScreen2");
        dbAdapter.execute();

        assertEquals("result is false", request.getAttribute("screenLog"));
    }

    @Test
    public void skipActionEvent() throws Exception {
        moduleLoaderService = (ModuleLoaderService) factory.getBean("moduleLoaderService");

        getInvocationContext("/app1?event_submit_do_my_event=yes");
        initRequestContext(factory);

        // action.doMyEvent(@skip) - 被skip后,不执行,但before/afterExecution仍执行。
        ActionEventAdapter aeAdapter = (ActionEventAdapter) moduleLoaderService
                .getModule("action", "mySkippableAction");
        aeAdapter.execute();

        assertEquals(null /* 不是"result is null" */, request.getAttribute("actionLog"));
        assertEquals("result is haha", request.getAttribute("actionLog.before"));
        assertEquals("result is haha", request.getAttribute("actionLog.after"));
    }

    @Test
    public void skipAction() throws Exception {
        moduleLoaderService = (ModuleLoaderService) factory.getBean("moduleLoaderService");

        getInvocationContext("/app1?event_submit_do_my_event=yes");
        initRequestContext(factory);

        // action.execute(@skip) - 被skip后,不执行。
        DataBindingAdapter dbAdapter = (DataBindingAdapter) moduleLoaderService.getModule("action",
                                                                                          "mySkippableAction2");
        dbAdapter.execute();

        assertEquals(null /* 不是"result is null" */, request.getAttribute("actionLog"));
    }
}
TOP

Related Classes of com.alibaba.citrus.service.moduleloader.impl.dataresolver.ParamBindingTests

TOP
Copyright © 2018 www.massapi.com. All rights reserved.
All source code are property of their respective owners. Java is a trademark of Sun Microsystems, Inc and owned by ORACLE Inc. Contact coftware#gmail.com.