1   /*
2    * Copyright 2004-2010 the Seasar Foundation and the Others.
3    *
4    * Licensed under the Apache License, Version 2.0 (the "License");
5    * you may not use this file except in compliance with the License.
6    * You may obtain a copy of the License at
7    *
8    *     http://www.apache.org/licenses/LICENSE-2.0
9    *
10   * Unless required by applicable law or agreed to in writing, software
11   * distributed under the License is distributed on an "AS IS" BASIS,
12   * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND,
13   * either express or implied. See the License for the specific language
14   * governing permissions and limitations under the License.
15   */
16  
17  package org.seasar.cubby.filter;
18  
19  import static org.easymock.EasyMock.createMock;
20  import static org.easymock.EasyMock.eq;
21  import static org.easymock.EasyMock.expect;
22  import static org.easymock.EasyMock.isA;
23  import static org.easymock.EasyMock.replay;
24  import static org.easymock.EasyMock.verify;
25  
26  import java.util.ArrayList;
27  import java.util.Collection;
28  import java.util.HashMap;
29  import java.util.List;
30  import java.util.Map;
31  
32  import javax.servlet.http.HttpServletRequest;
33  import javax.servlet.http.HttpServletResponse;
34  
35  import org.junit.After;
36  import org.junit.Before;
37  import org.junit.Test;
38  import org.seasar.cubby.CubbyConstants;
39  import org.seasar.cubby.action.ActionContext;
40  import org.seasar.cubby.action.ActionErrors;
41  import org.seasar.cubby.action.ActionResult;
42  import org.seasar.cubby.action.Direct;
43  import org.seasar.cubby.controller.RequestParser;
44  import org.seasar.cubby.controller.impl.DefaultRequestParser;
45  import org.seasar.cubby.mock.MockContainerProvider;
46  import org.seasar.cubby.plugin.PluginRegistry;
47  import org.seasar.cubby.plugins.BinderPlugin;
48  import org.seasar.cubby.routing.PathInfo;
49  import org.seasar.cubby.routing.Routing;
50  import org.seasar.cubby.spi.BeanDescProvider;
51  import org.seasar.cubby.spi.ContainerProvider;
52  import org.seasar.cubby.spi.RequestParserProvider;
53  import org.seasar.cubby.spi.beans.impl.DefaultBeanDescProvider;
54  import org.seasar.cubby.spi.container.Container;
55  import org.seasar.cubby.spi.container.LookupException;
56  import org.seasar.cubby.spi.impl.AbstractRequestParserProvider;
57  
58  public class CubbyFilterProcessRequestTest {
59  
60  	private final PluginRegistry pluginRegistry = PluginRegistry.getInstance();
61  
62  	private CubbyFilter cubbyFilter = new CubbyFilter();
63  
64  	private Object action = new MockAction();
65  
66  	@Before
67  	public void setupProvider() {
68  		final BinderPlugin binderPlugin = new BinderPlugin();
69  
70  		final List<RequestParser> requestParsers = new ArrayList<RequestParser>();
71  		requestParsers.add(new DefaultRequestParser());
72  		binderPlugin.bind(RequestParserProvider.class).toInstance(
73  				new AbstractRequestParserProvider() {
74  
75  					@Override
76  					protected Collection<RequestParser> getRequestParsers() {
77  						return requestParsers;
78  					}
79  
80  				});
81  		binderPlugin.bind(ContainerProvider.class).toInstance(
82  				new MockContainerProvider(new Container() {
83  
84  					public <T> T lookup(Class<T> type) throws LookupException {
85  						if (MockAction.class.equals(type)) {
86  							return type.cast(action);
87  						}
88  						throw new LookupException();
89  					}
90  
91  				}));
92  		binderPlugin.bind(BeanDescProvider.class).toInstance(
93  				new DefaultBeanDescProvider());
94  
95  		pluginRegistry.register(binderPlugin);
96  	}
97  
98  	@After
99  	public void teardownProvider() {
100 		pluginRegistry.clear();
101 	}
102 
103 	@Test
104 	@SuppressWarnings("unchecked")
105 	public void process() throws Exception {
106 		Map<String, Object[]> parameterMap = new HashMap<String, Object[]>();
107 		Routing routing = createMock(Routing.class);
108 		expect(routing.getActionClass()).andReturn(
109 				Class.class.cast(MockAction.class));
110 		expect(routing.getActionMethod()).andReturn(
111 				MockAction.class.getMethod("execute"));
112 		HttpServletRequest request = createMock(HttpServletRequest.class);
113 		expect(request.getParameterMap()).andReturn(parameterMap);
114 		expect(request.getRequestURI()).andReturn("/context/mock/execute");
115 		request.setAttribute(CubbyConstants.ATTR_PARAMS, parameterMap);
116 		expect(request.getAttribute(CubbyConstants.ATTR_ERRORS))
117 				.andReturn(null);
118 		request.setAttribute(eq(CubbyConstants.ATTR_ERRORS),
119 				isA(ActionErrors.class));
120 		expect(request.getAttribute(CubbyConstants.ATTR_FLASH)).andReturn(null);
121 		request.setAttribute(eq(CubbyConstants.ATTR_FLASH), isA(Map.class));
122 		expect(request.getAttribute(CubbyConstants.ATTR_ACTION)).andStubReturn(
123 				action);
124 		request.setAttribute(CubbyConstants.ATTR_ACTION, action);
125 		request.setAttribute(eq(CubbyConstants.ATTR_ACTION_CONTEXT),
126 				isA(ActionContext.class));
127 		expect(request.getSession(false)).andReturn(null);
128 		HttpServletResponse response = createMock(HttpServletResponse.class);
129 		PathInfo pathInfo = createMock(PathInfo.class);
130 		expect(pathInfo.dispatch(parameterMap)).andReturn(routing);
131 		expect(pathInfo.getURIParameters()).andReturn(
132 				new HashMap<String, String[]>());
133 		replay(routing, request, response, pathInfo);
134 
135 		cubbyFilter.processRequest(request, response, pathInfo);
136 
137 		verify(routing, request, response, pathInfo);
138 	}
139 
140 	public static class MockAction {
141 		public ActionResult execute() {
142 			return new Direct();
143 		}
144 	}
145 
146 }