1   package org.seasar.cubby.action;
2   
3   import java.lang.reflect.Method;
4   
5   import javax.servlet.RequestDispatcher;
6   import javax.servlet.http.HttpServletRequest;
7   import javax.servlet.http.HttpServletRequestWrapper;
8   
9   import org.seasar.cubby.controller.ActionContext;
10  import org.seasar.cubby.controller.ActionDef;
11  import org.seasar.extension.unit.S2TestCase;
12  import org.seasar.framework.container.ComponentDef;
13  import org.seasar.framework.mock.servlet.MockHttpServletRequest;
14  import org.seasar.framework.mock.servlet.MockHttpServletResponse;
15  import org.seasar.framework.mock.servlet.MockServletContext;
16  
17  public class ForwardTest extends S2TestCase {
18  
19  	public ActionContext context;
20  
21  	@Override
22  	protected void setUp() throws Exception {
23  		include(this.getClass().getName().replaceAll("\\.", "/") + ".dicon");
24  	}
25  
26  	public void testBasicSequence() throws Exception {
27  		MockServletContext servletContext = this.getServletContext();
28  		servletContext.setServletContextName("/cubby");
29  		MockHttpServletRequest request = this.getRequest();
30  		MockHttpServletResponse response = this.getResponse();
31  		ComponentDef componentDef = this.getComponentDef(MockAction.class);
32  		context.initialize(new MockActionDef(componentDef));
33  		MockAction action = (MockAction) context.getAction();
34  
35  		Forward forward = new Forward("path.jsp");
36  		forward.prerender(context);
37  		assertTrue(action.isPrerendered());
38  		forward.execute(context, new RequestDispatcherAssertionWrapper(request,
39  				new Asserter() {
40  					public void assertDispatchPath(String path) {
41  						assertEquals("/mock/path.jsp", path);
42  					}
43  				}), response);
44  		assertTrue(action.isPostrendered());
45  	}
46  
47  	public void testRelativePath() throws Exception {
48  		MockServletContext servletContext = this.getServletContext();
49  		servletContext.setServletContextName("/cubby");
50  		MockHttpServletRequest request = this.getRequest();
51  		MockHttpServletResponse response = this.getResponse();
52  		ComponentDef componentDef = this.getComponentDef(MockAction.class);
53  		context.initialize(new MockActionDef(componentDef));
54  
55  		Forward forward = new Forward("page.jsp");
56  		forward.execute(context, new RequestDispatcherAssertionWrapper(request,
57  				new Asserter() {
58  					public void assertDispatchPath(String path) {
59  						assertEquals("/mock/page.jsp", path);
60  					}
61  				}), response);
62  	}
63  
64  	public void testAbsolutePath() throws Exception {
65  		MockServletContext servletContext = this.getServletContext();
66  		servletContext.setServletContextName("/cubby");
67  		MockHttpServletRequest request = this.getRequest();
68  		MockHttpServletResponse response = this.getResponse();
69  		ComponentDef componentDef = this.getComponentDef(MockAction.class);
70  		context.initialize(new MockActionDef(componentDef));
71  
72  		Forward forward = new Forward("/absolute/path.jsp");
73  		forward.execute(context, new RequestDispatcherAssertionWrapper(request,
74  				new Asserter() {
75  					public void assertDispatchPath(String path) {
76  						assertEquals("/absolute/path.jsp", path);
77  					}
78  				}), response);
79  	}
80  
81  	interface Asserter {
82  		void assertDispatchPath(String path);
83  	}
84  
85  	class RequestDispatcherAssertionWrapper extends HttpServletRequestWrapper {
86  
87  		private Asserter asserter;
88  
89  		public RequestDispatcherAssertionWrapper(HttpServletRequest request,
90  				Asserter asserter) {
91  			super(request);
92  			this.asserter = asserter;
93  		}
94  
95  		@Override
96  		public RequestDispatcher getRequestDispatcher(String path) {
97  			asserter.assertDispatchPath(path);
98  			return super.getRequestDispatcher(path);
99  		}
100 
101 	}
102 
103 	class MockActionDef implements ActionDef {
104 
105 		private ComponentDef componentDef;
106 
107 		public MockActionDef(ComponentDef componentDef) {
108 			this.componentDef = componentDef;
109 		}
110 
111 		public ComponentDef getComponentDef() {
112 			return componentDef;
113 		}
114 
115 		public Method getMethod() {
116 			return null;
117 		}
118 
119 	}
120 
121 	public static class MockAction extends Action {
122 
123 		private boolean prerendered = false;
124 
125 		private boolean postrendered = false;
126 
127 		@Override
128 		public void prerender() {
129 			super.prerender();
130 			prerendered = true;
131 		}
132 
133 		@Override
134 		public void postrender() {
135 			super.postrender();
136 			postrendered = true;
137 		}
138 
139 		public boolean isPrerendered() {
140 			return prerendered;
141 		}
142 
143 		public boolean isPostrendered() {
144 			return postrendered;
145 		}
146 
147 	}
148 
149 }