1
2
3
4
5
6
7
8
9
10
11
12
13
14
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
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
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
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 }