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.internal.controller.impl;
18  
19  import static org.easymock.EasyMock.createMock;
20  import static org.easymock.EasyMock.createNiceMock;
21  import static org.easymock.EasyMock.eq;
22  import static org.easymock.EasyMock.expect;
23  import static org.easymock.EasyMock.expectLastCall;
24  import static org.easymock.EasyMock.isA;
25  import static org.easymock.EasyMock.replay;
26  import static org.easymock.EasyMock.verify;
27  import static org.junit.Assert.assertEquals;
28  import static org.junit.Assert.assertFalse;
29  import static org.junit.Assert.assertNotNull;
30  import static org.junit.Assert.assertNull;
31  import static org.junit.Assert.assertSame;
32  import static org.junit.Assert.assertTrue;
33  import static org.junit.Assert.fail;
34  
35  import java.lang.reflect.Method;
36  import java.util.Map;
37  
38  import javax.servlet.http.HttpServletRequest;
39  import javax.servlet.http.HttpSession;
40  
41  import org.junit.After;
42  import org.junit.Before;
43  import org.junit.Test;
44  import org.seasar.cubby.action.Action;
45  import org.seasar.cubby.action.ActionContext;
46  import org.seasar.cubby.action.ActionErrors;
47  import org.seasar.cubby.action.ActionException;
48  import org.seasar.cubby.action.ActionResult;
49  import org.seasar.cubby.action.Form;
50  import org.seasar.cubby.action.InitializeMethod;
51  import org.seasar.cubby.action.PostRenderMethod;
52  import org.seasar.cubby.action.PreRenderMethod;
53  import org.seasar.cubby.action.RequestParameterBindingType;
54  import org.seasar.cubby.internal.controller.impl.ActionContextImpl;
55  import org.seasar.cubby.internal.controller.impl.FlashMapImpl;
56  import org.seasar.cubby.plugin.PluginRegistry;
57  import org.seasar.cubby.plugins.BinderPlugin;
58  import org.seasar.cubby.spi.BeanDescProvider;
59  import org.seasar.cubby.spi.beans.impl.DefaultBeanDescProvider;
60  
61  public class ActionContextImplTest {
62  
63  	private final PluginRegistry pluginRegistry = PluginRegistry.getInstance();
64  
65  	@Before
66  	public void setupProvider() {
67  		final BinderPlugin binderPlugin = new BinderPlugin();
68  		binderPlugin.bind(BeanDescProvider.class).toInstance(
69  				new DefaultBeanDescProvider());
70  		pluginRegistry.register(binderPlugin);
71  	}
72  
73  	@After
74  	public void teardownProvider() {
75  		pluginRegistry.clear();
76  	}
77  
78  	@Test
79  	public void constructWithNormalAction() throws Exception {
80  		final HttpServletRequest request = createNiceMock(HttpServletRequest.class);
81  		replay(request);
82  
83  		final Action action = new NormalAction();
84  		final Class<?> actionClass = action.getClass();
85  		final Method method = action.getClass().getMethod("method1");
86  		final ActionErrors actionErrors = new ActionErrorsImpl();
87  		final Map<String, Object> flashMap = new FlashMapImpl(request);
88  		final ActionContext actionContext = new ActionContextImpl(request,
89  				action, actionClass, method, actionErrors, flashMap);
90  		assertSame(action, actionContext.getAction());
91  		assertEquals(actionClass, actionContext.getActionClass());
92  		assertEquals(method, actionContext.getActionMethod());
93  		assertNotNull(actionErrors);
94  		assertNotNull(flashMap);
95  
96  		System.out.println(actionContext);
97  		verify(request);
98  	}
99  
100 	@Test
101 	public void invokeWithNormalAction() throws Exception {
102 		final HttpServletRequest request = createNiceMock(HttpServletRequest.class);
103 		replay(request);
104 
105 		final NormalAction action = new NormalAction();
106 		final Class<?> actionClass = action.getClass();
107 		final Method method = action.getClass().getMethod("method1");
108 		final ActionErrors actionErrors = new ActionErrorsImpl();
109 		final Map<String, Object> flashMap = new FlashMapImpl(request);
110 		final ActionContext actionContext = new ActionContextImpl(request,
111 				action, actionClass, method, actionErrors, flashMap);
112 
113 		assertFalse(action.isInitialized());
114 		assertFalse(action.isPrerendered());
115 		assertFalse(action.isPostrendered());
116 
117 		actionContext.invokeInitializeMethod();
118 		assertTrue(action.isInitialized());
119 		assertFalse(action.isPrerendered());
120 		assertFalse(action.isPostrendered());
121 
122 		actionContext.invokePreRenderMethod();
123 		assertTrue(action.isInitialized());
124 		assertTrue(action.isPrerendered());
125 		assertFalse(action.isPostrendered());
126 
127 		actionContext.invokePostRenderMethod();
128 		assertTrue(action.isInitialized());
129 		assertTrue(action.isPrerendered());
130 		assertTrue(action.isPostrendered());
131 
132 		verify(request);
133 	}
134 
135 	@Test
136 	public void constructWithPojoAction() throws Exception {
137 		final HttpServletRequest request = createNiceMock(HttpServletRequest.class);
138 		replay(request);
139 
140 		final PojoAction action = new PojoAction();
141 		final Class<?> actionClass = action.getClass();
142 		final Method method = action.getClass().getMethod("method1");
143 		final ActionErrors actionErrors = new ActionErrorsImpl();
144 		final Map<String, Object> flashMap = new FlashMapImpl(request);
145 		final ActionContext actionContext = new ActionContextImpl(request,
146 				action, actionClass, method, actionErrors, flashMap);
147 		assertSame(action, actionContext.getAction());
148 		assertEquals(actionClass, actionContext.getActionClass());
149 		assertEquals(method, actionContext.getActionMethod());
150 		assertSame(actionErrors, actionContext.getActionErrors());
151 		assertSame(flashMap, actionContext.getFlashMap());
152 
153 		System.out.println(actionContext);
154 		verify(request);
155 	}
156 
157 	@Test
158 	public void invokeWithPojoAction() throws Exception {
159 		final HttpServletRequest request = createNiceMock(HttpServletRequest.class);
160 		replay(request);
161 
162 		final PojoAction action = new PojoAction();
163 		final Class<?> actionClass = action.getClass();
164 		final Method method = action.getClass().getMethod("method2");
165 		final ActionErrors actionErrors = new ActionErrorsImpl();
166 		final Map<String, Object> flashMap = new FlashMapImpl(request);
167 		final ActionContext actionContext = new ActionContextImpl(request,
168 				action, actionClass, method, actionErrors, flashMap);
169 
170 		assertFalse(action.isInitialized());
171 		assertFalse(action.isPrerendered());
172 		assertFalse(action.isPostrendered());
173 
174 		actionContext.invokeInitializeMethod();
175 		assertTrue(action.isInitialized());
176 		assertFalse(action.isPrerendered());
177 		assertFalse(action.isPostrendered());
178 
179 		actionContext.invokePreRenderMethod();
180 		assertTrue(action.isInitialized());
181 		assertTrue(action.isPrerendered());
182 		assertFalse(action.isPostrendered());
183 
184 		actionContext.invokePostRenderMethod();
185 		assertTrue(action.isInitialized());
186 		assertTrue(action.isPrerendered());
187 		assertTrue(action.isPostrendered());
188 
189 		verify(request);
190 	}
191 
192 	@Test
193 	public void getForm_noAnnotateMethod() throws Exception {
194 		final HttpServletRequest request = createNiceMock(HttpServletRequest.class);
195 		replay(request);
196 
197 		final FormAction action = new FormAction();
198 		final Class<?> actionClass = action.getClass();
199 		final Method method = FormAction.class.getMethod("noAnnotate");
200 		final ActionErrors actionErrors = new ActionErrorsImpl();
201 		final Map<String, Object> flashMap = new FlashMapImpl(request);
202 		final ActionContext actionContext = new ActionContextImpl(request,
203 				action, actionClass, method, actionErrors, flashMap);
204 
205 		assertSame(action, actionContext.getFormBean());
206 		assertFalse(actionContext.isBindRequestParameterToAllProperties());
207 
208 		verify(request);
209 	}
210 
211 	@Test
212 	public void getForm_annotateValidFormName() throws Exception {
213 		final HttpServletRequest request = createNiceMock(HttpServletRequest.class);
214 		replay(request);
215 
216 		final FormAction action = new FormAction();
217 		final Class<?> actionClass = action.getClass();
218 		final Method method = FormAction.class
219 				.getMethod("annotateValidFormName");
220 		final ActionErrors actionErrors = new ActionErrorsImpl();
221 		final Map<String, Object> flashMap = new FlashMapImpl(request);
222 		final ActionContext actionContext = new ActionContextImpl(request,
223 				action, actionClass, method, actionErrors, flashMap);
224 
225 		assertSame(action.getMyForm(), actionContext.getFormBean());
226 		assertTrue(actionContext.isBindRequestParameterToAllProperties());
227 		verify(request);
228 	}
229 
230 	@Test
231 	public void getForm_annotateAllPropertiesBindingType() throws Exception {
232 		final HttpServletRequest request = createNiceMock(HttpServletRequest.class);
233 		replay(request);
234 
235 		final FormAction action = new FormAction();
236 		final Class<?> actionClass = action.getClass();
237 		final Method method = FormAction.class
238 				.getMethod("annotateAllPropertiesBindingType");
239 		final ActionErrors actionErrors = new ActionErrorsImpl();
240 		final Map<String, Object> flashMap = new FlashMapImpl(request);
241 		final ActionContext actionContext = new ActionContextImpl(request,
242 				action, actionClass, method, actionErrors, flashMap);
243 
244 		assertSame(action, actionContext.getFormBean());
245 		assertTrue(actionContext.isBindRequestParameterToAllProperties());
246 		verify(request);
247 	}
248 
249 	@Test
250 	public void getForm_annotateOnlySpecifiedPropertiesBindingType()
251 			throws Exception {
252 		final HttpServletRequest request = createNiceMock(HttpServletRequest.class);
253 		replay(request);
254 
255 		final FormAction action = new FormAction();
256 		final Class<?> actionClass = action.getClass();
257 		final Method method = FormAction.class
258 				.getMethod("annotateOnlySpecifiedPropertiesBindingType");
259 		final ActionErrors actionErrors = new ActionErrorsImpl();
260 		final Map<String, Object> flashMap = new FlashMapImpl(request);
261 		final ActionContext actionContext = new ActionContextImpl(request,
262 				action, actionClass, method, actionErrors, flashMap);
263 
264 		assertSame(action.getMyForm(), actionContext.getFormBean());
265 		assertFalse(actionContext.isBindRequestParameterToAllProperties());
266 	}
267 
268 	@Test
269 	public void getForm_annotateNoneBindingType() throws Exception {
270 		final HttpServletRequest request = createNiceMock(HttpServletRequest.class);
271 		replay(request);
272 
273 		final FormAction action = new FormAction();
274 		final Class<?> actionClass = action.getClass();
275 		final Method method = FormAction.class
276 				.getMethod("annotateNoneBindingType");
277 		final ActionErrors actionErrors = new ActionErrorsImpl();
278 		final Map<String, Object> flashMap = new FlashMapImpl(request);
279 		final ActionContext actionContext = new ActionContextImpl(request,
280 				action, actionClass, method, actionErrors, flashMap);
281 
282 		assertNull(actionContext.getFormBean());
283 		try {
284 			actionContext.isBindRequestParameterToAllProperties();
285 			fail();
286 		} catch (final IllegalStateException e) {
287 			// ok
288 		}
289 
290 		verify(request);
291 	}
292 
293 	@Test
294 	public void getForm_annotateNullFormName() throws Exception {
295 		final HttpServletRequest request = createNiceMock(HttpServletRequest.class);
296 		replay(request);
297 
298 		final FormAction action = new FormAction();
299 		final Class<?> actionClass = action.getClass();
300 		final Method method = FormAction.class
301 				.getMethod("annotateNullFormName");
302 		final ActionErrors actionErrors = new ActionErrorsImpl();
303 		final Map<String, Object> flashMap = new FlashMapImpl(request);
304 		final ActionContext actionContext = new ActionContextImpl(request,
305 				action, actionClass, method, actionErrors, flashMap);
306 
307 		try {
308 			assertNull(actionContext.getFormBean());
309 			fail();
310 		} catch (final ActionException e) {
311 			// ok
312 		}
313 
314 		verify(request);
315 	}
316 
317 	@Test
318 	public void getForm_annotateNotExistFormName() throws Exception {
319 		final HttpServletRequest request = createNiceMock(HttpServletRequest.class);
320 		replay(request);
321 
322 		final FormAction action = new FormAction();
323 		final Class<?> actionClass = action.getClass();
324 		final Method method = FormAction.class
325 				.getMethod("annotateNotExistFormName");
326 		final ActionErrors actionErrors = new ActionErrorsImpl();
327 		final Map<String, Object> flashMap = new FlashMapImpl(request);
328 		final ActionContext actionContext = new ActionContextImpl(request,
329 				action, actionClass, method, actionErrors, flashMap);
330 
331 		try {
332 			assertNull(actionContext.getFormBean());
333 			fail();
334 		} catch (final ActionException e) {
335 			// ok
336 		}
337 
338 		verify(request);
339 	}
340 
341 	@Test
342 	public void getForm_annotateThisFormName() throws Exception {
343 		final HttpServletRequest request = createNiceMock(HttpServletRequest.class);
344 		replay(request);
345 
346 		final FormAction action = new FormAction();
347 		final Class<?> actionClass = action.getClass();
348 		final Method method = FormAction.class
349 				.getMethod("annotateThisFormName");
350 		final ActionErrors actionErrors = new ActionErrorsImpl();
351 		final Map<String, Object> flashMap = new FlashMapImpl(request);
352 		final ActionContext actionContext = new ActionContextImpl(request,
353 				action, actionClass, method, actionErrors, flashMap);
354 
355 		assertSame(action, actionContext.getFormBean());
356 		assertTrue(actionContext.isBindRequestParameterToAllProperties());
357 
358 		verify(request);
359 	}
360 
361 	@Test
362 	public void clearFlash() throws Exception {
363 		final HttpSession session = createMock(HttpSession.class);
364 		session.setAttribute(eq(FlashMapImpl.class.getName() + ".MAP"),
365 				isA(Map.class));
366 		expectLastCall();
367 		final HttpServletRequest request = createMock(HttpServletRequest.class);
368 		expect(request.getSession(false)).andStubReturn(null);
369 		expect(request.getSession()).andStubReturn(session);
370 		replay(session, request);
371 
372 		final Object action = new NormalAction();
373 		final Class<?> actionClass = action.getClass();
374 		final Method method = action.getClass().getMethod("method1");
375 		final ActionErrors actionErrors = new ActionErrorsImpl();
376 		final Map<String, Object> flashMap = new FlashMapImpl(request);
377 		final ActionContext actionContext = new ActionContextImpl(request,
378 				action, actionClass, method, actionErrors, flashMap);
379 
380 		flashMap.put("key", "value");
381 		assertFalse(flashMap.isEmpty());
382 		actionContext.clearFlash();
383 		assertTrue(flashMap.isEmpty());
384 
385 		verify(session, request);
386 	}
387 
388 	public static class PojoAction {
389 		public ActionResult method1() {
390 			return null;
391 		}
392 
393 		@InitializeMethod("initialize")
394 		@PreRenderMethod("prerender")
395 		@PostRenderMethod("postrender")
396 		public ActionResult method2() {
397 			return null;
398 		}
399 
400 		private boolean initialized = false;
401 
402 		private boolean prerendered = false;
403 
404 		private boolean postrendered = false;
405 
406 		public void initialize() {
407 			initialized = true;
408 		}
409 
410 		public void prerender() {
411 			prerendered = true;
412 		}
413 
414 		public void postrender() {
415 			postrendered = true;
416 		}
417 
418 		public boolean isInitialized() {
419 			return initialized;
420 		}
421 
422 		public boolean isPrerendered() {
423 			return prerendered;
424 		}
425 
426 		public boolean isPostrendered() {
427 			return postrendered;
428 		}
429 
430 	}
431 
432 	public static class NormalAction extends Action {
433 		public ActionResult method1() {
434 			return null;
435 		}
436 
437 		private boolean initialized = false;
438 
439 		private boolean prerendered = false;
440 
441 		private boolean postrendered = false;
442 
443 		@Override
444 		public void initialize() {
445 			initialized = true;
446 		}
447 
448 		@Override
449 		public void prerender() {
450 			prerendered = true;
451 		}
452 
453 		@Override
454 		public void postrender() {
455 			postrendered = true;
456 		}
457 
458 		public boolean isInitialized() {
459 			return initialized;
460 		}
461 
462 		public boolean isPrerendered() {
463 			return prerendered;
464 		}
465 
466 		public boolean isPostrendered() {
467 			return postrendered;
468 		}
469 
470 	}
471 
472 	public static class FormAction {
473 
474 		private final Object myForm = new Object();
475 
476 		public Object getMyForm() {
477 			return myForm;
478 		}
479 
480 		public Object getNullForm() {
481 			return null;
482 		}
483 
484 		public ActionResult noAnnotate() {
485 			return null;
486 		}
487 
488 		@Form("myForm")
489 		public ActionResult annotateValidFormName() {
490 			return null;
491 		}
492 
493 		@Form(bindingType = RequestParameterBindingType.ALL_PROPERTIES)
494 		public ActionResult annotateAllPropertiesBindingType() {
495 			return null;
496 		}
497 
498 		@Form(value = "myForm", bindingType = RequestParameterBindingType.ONLY_SPECIFIED_PROPERTIES)
499 		public ActionResult annotateOnlySpecifiedPropertiesBindingType() {
500 			return null;
501 		}
502 
503 		@Form(bindingType = RequestParameterBindingType.NONE)
504 		public ActionResult annotateNoneBindingType() {
505 			return null;
506 		}
507 
508 		@Form("nullForm")
509 		public ActionResult annotateNullFormName() {
510 			return null;
511 		}
512 
513 		@Form("illegal")
514 		public ActionResult annotateNotExistFormName() {
515 			return null;
516 		}
517 
518 		@Form("this")
519 		public ActionResult annotateThisFormName() {
520 			return null;
521 		}
522 
523 	}
524 
525 }