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.plugins;
18  
19  import static org.easymock.EasyMock.createMock;
20  import static org.easymock.EasyMock.expect;
21  import static org.easymock.EasyMock.replay;
22  import static org.easymock.EasyMock.verify;
23  import static org.junit.Assert.assertEquals;
24  import static org.junit.Assert.assertSame;
25  import static org.junit.Assert.assertTrue;
26  
27  import java.lang.reflect.Method;
28  import java.util.LinkedHashMap;
29  import java.util.Map;
30  
31  import javax.servlet.http.HttpServletRequest;
32  import javax.servlet.http.HttpServletResponse;
33  
34  import org.junit.After;
35  import org.junit.Before;
36  import org.junit.Test;
37  import org.seasar.cubby.CubbyConstants;
38  import org.seasar.cubby.action.ActionContext;
39  import org.seasar.cubby.action.ActionErrors;
40  import org.seasar.cubby.action.ActionResult;
41  import org.seasar.cubby.action.Forward;
42  import org.seasar.cubby.action.Validation;
43  import org.seasar.cubby.plugin.ActionInvocation;
44  import org.seasar.cubby.plugin.PluginRegistry;
45  import org.seasar.cubby.spi.BeanDescProvider;
46  import org.seasar.cubby.spi.beans.impl.DefaultBeanDescProvider;
47  import org.seasar.cubby.validator.DefaultValidationRules;
48  import org.seasar.cubby.validator.ValidationException;
49  import org.seasar.cubby.validator.ValidationRules;
50  
51  public class ValidationPluginTest {
52  
53  	private final PluginRegistry pluginRegistry = PluginRegistry.getInstance();
54  
55  	@Before
56  	public void setupProvider() {
57  		final BinderPlugin binderPlugin = new BinderPlugin();
58  		binderPlugin.bind(BeanDescProvider.class).toInstance(
59  				new DefaultBeanDescProvider());
60  		pluginRegistry.register(binderPlugin);
61  	}
62  
63  	@After
64  	public void teardownProvider() {
65  		pluginRegistry.clear();
66  	}
67  
68  	public ValidationRules rules = new DefaultValidationRules() {
69  	};
70  
71  	@Validation(rules = "rules", errorPage = "index.jsp")
72  	public ActionResult dummyActionMethod() {
73  		return null;
74  	}
75  
76  	@Test
77  	public void invokeActionWithNoError() throws Exception {
78  		Map<String, Object[]> params = new LinkedHashMap<String, Object[]>();
79  		Method actionMethod = this.getClass().getMethod("dummyActionMethod");
80  
81  		HttpServletRequest request = createMock(HttpServletRequest.class);
82  		expect(request.getAttribute(CubbyConstants.ATTR_PARAMS)).andReturn(
83  				params);
84  		HttpServletResponse response = createMock(HttpServletResponse.class);
85  		ActionErrors actionErrors = createMock(ActionErrors.class);
86  		expect(actionErrors.isEmpty()).andStubReturn(true);
87  		ActionContext actionContext = createMock(ActionContext.class);
88  		expect(actionContext.getFormBean()).andStubReturn(null);
89  		expect(actionContext.getActionMethod()).andStubReturn(actionMethod);
90  		expect(actionContext.getAction()).andStubReturn(this);
91  		expect(actionContext.getActionErrors()).andStubReturn(actionErrors);
92  		replay(request, response, actionContext, actionErrors);
93  
94  		final ValidationPlugin plugin = new ValidationPlugin();
95  		final ActionResult actionResult = new Forward("foo");
96  		final TestAction testAction = new TestAction() {
97  
98  			public ActionResult invoke() {
99  				return actionResult;
100 			}
101 		};
102 		final ActionInvocation invocation = new MActionInvocation(request,
103 				response, actionContext, testAction);
104 		ActionResult actual = plugin.invokeAction(invocation);
105 
106 		assertSame(actionResult, actual);
107 
108 		verify(request, response, actionContext, actionErrors);
109 	}
110 
111 	@Test
112 	public void invokeActionWithValidationException() throws Exception {
113 		Map<String, Object[]> params = new LinkedHashMap<String, Object[]>();
114 		Method actionMethod = this.getClass().getMethod("dummyActionMethod");
115 
116 		HttpServletRequest request = createMock(HttpServletRequest.class);
117 		expect(request.getAttribute(CubbyConstants.ATTR_PARAMS)).andReturn(
118 				params);
119 		request.setAttribute(CubbyConstants.ATTR_VALIDATION_FAIL, Boolean.TRUE);
120 		HttpServletResponse response = createMock(HttpServletResponse.class);
121 		ActionErrors actionErrors = createMock(ActionErrors.class);
122 		expect(actionErrors.isEmpty()).andStubReturn(true);
123 		ActionContext actionContext = createMock(ActionContext.class);
124 		expect(actionContext.getFormBean()).andStubReturn(null);
125 		expect(actionContext.getActionMethod()).andStubReturn(actionMethod);
126 		expect(actionContext.getAction()).andStubReturn(this);
127 		expect(actionContext.getActionErrors()).andStubReturn(actionErrors);
128 		replay(request, response, actionContext, actionErrors);
129 
130 		final ValidationPlugin plugin = new ValidationPlugin();
131 		final TestAction testAction = new TestAction() {
132 
133 			public ActionResult invoke() {
134 				throw new ValidationException();
135 			}
136 		};
137 		final ActionInvocation invocation = new MActionInvocation(request,
138 				response, actionContext, testAction);
139 		ActionResult actual = plugin.invokeAction(invocation);
140 
141 		assertTrue(actual instanceof Forward);
142 		Forward forward = (Forward) actual;
143 		assertEquals("index.jsp", forward.getPath("UTF-8"));
144 
145 		verify(request, response, actionContext, actionErrors);
146 	}
147 
148 	class MActionInvocation implements ActionInvocation {
149 
150 		/** 要求。 */
151 		private final HttpServletRequest request;
152 
153 		/** 応答。 */
154 		private final HttpServletResponse response;
155 
156 		/** アクションのコンテキスト。 */
157 		private final ActionContext actionContext;
158 
159 		//
160 		// /** プラグインのイテレータ。 */
161 		// private final Iterator<Plugin> pluginsIterator;
162 
163 		private final TestAction testAction;
164 
165 		/**
166 		 * インスタンス化します。
167 		 * 
168 		 * @param request
169 		 *            要求
170 		 * @param response
171 		 *            応答
172 		 * @param actionContext
173 		 *            アクションのコンテキスト
174 		 */
175 		public MActionInvocation(final HttpServletRequest request,
176 				final HttpServletResponse response,
177 				final ActionContext actionContext, final TestAction testAction) {
178 			this.request = request;
179 			this.response = response;
180 			this.actionContext = actionContext;
181 			this.testAction = testAction;
182 			// final PluginRegistry pluginRegistry =
183 			// PluginRegistry.getInstance();
184 			// this.pluginsIterator = pluginRegistry.getPlugins().iterator();
185 		}
186 
187 		/**
188 		 * {@inheritDoc}
189 		 */
190 		public ActionResult proceed() throws Exception {
191 			return testAction.invoke();
192 		}
193 
194 		/**
195 		 * {@inheritDoc}
196 		 */
197 		public HttpServletRequest getRequest() {
198 			return request;
199 		}
200 
201 		/**
202 		 * {@inheritDoc}
203 		 */
204 		public HttpServletResponse getResponse() {
205 			return response;
206 		}
207 
208 		/**
209 		 * {@inheritDoc}
210 		 */
211 		public ActionContext getActionContext() {
212 			return actionContext;
213 		}
214 
215 	}
216 
217 	interface TestAction {
218 		ActionResult invoke();
219 	}
220 }