1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16 package org.seasar.cubby.tags;
17
18 import static org.junit.Assert.assertEquals;
19 import static org.junit.Assert.assertNull;
20
21 import java.util.Arrays;
22 import java.util.List;
23
24 import javax.servlet.jsp.PageContext;
25 import javax.servlet.jsp.tagext.JspTag;
26
27 import org.jdom.Element;
28 import org.junit.Before;
29 import org.junit.Test;
30 import org.seasar.cubby.CubbyConstants;
31 import org.seasar.cubby.action.RequestMethod;
32 import org.seasar.cubby.controller.FormatPattern;
33 import org.seasar.cubby.controller.impl.DefaultFormatPattern;
34 import org.seasar.cubby.internal.controller.impl.FormWrapperFactoryImpl;
35 import org.seasar.cubby.mock.MockContainerProvider;
36 import org.seasar.cubby.mock.MockConverterProvider;
37 import org.seasar.cubby.mock.MockPathResolverProvider;
38 import org.seasar.cubby.plugin.PluginRegistry;
39 import org.seasar.cubby.plugins.BinderPlugin;
40 import org.seasar.cubby.routing.PathResolver;
41 import org.seasar.cubby.routing.impl.PathResolverImpl;
42 import org.seasar.cubby.routing.impl.PathTemplateParserImpl;
43 import org.seasar.cubby.spi.ContainerProvider;
44 import org.seasar.cubby.spi.ConverterProvider;
45 import org.seasar.cubby.spi.PathResolverProvider;
46 import org.seasar.cubby.spi.container.Container;
47 import org.seasar.cubby.spi.container.LookupException;
48
49 public class FormTagTest extends AbstractStandardTagTestCase {
50
51 private final PluginRegistry pluginRegistry = PluginRegistry.getInstance();
52
53 private FormTag tag;
54
55 @Before
56 public void setupProvider() {
57 final BinderPlugin binderPlugin = new BinderPlugin();
58 final PathResolver pathResolver = new PathResolverImpl(
59 new PathTemplateParserImpl());
60 pathResolver.add("/mockFormTagTest/foo", MockFormTagTestAction.class,
61 "foo", RequestMethod.GET, null, 0);
62 pathResolver.add("/mockFormTagTest/bar/{id}",
63 MockFormTagTestAction.class, "bar", RequestMethod.GET, null, 0);
64 binderPlugin.bind(PathResolverProvider.class).toInstance(
65 new MockPathResolverProvider(pathResolver));
66 final FormatPattern formatPattern = new DefaultFormatPattern();
67 binderPlugin.bind(ContainerProvider.class).toInstance(
68 new MockContainerProvider(new Container() {
69
70 public <T> T lookup(Class<T> type) {
71 if (FormatPattern.class.equals(type)) {
72 return type.cast(formatPattern);
73 }
74 throw new LookupException(type.getName());
75 }
76
77 }));
78 binderPlugin.bind(ConverterProvider.class).toInstance(
79 new MockConverterProvider());
80 pluginRegistry.register(binderPlugin);
81 }
82
83 @Before
84 public void setUp() throws Exception {
85 tag = new FormTag();
86 setupBodyTag(tag);
87 setupErrors(context);
88 context.setAttribute(CubbyConstants.ATTR_CONTEXT_PATH, "/brabra",
89 PageContext.REQUEST_SCOPE);
90 context.setAttribute(CubbyConstants.ATTR_FORM_WRAPPER_FACTORY,
91 new FormWrapperFactoryImpl(), PageContext.REQUEST_SCOPE);
92 }
93
94 @Test
95 public void doTagNoChild() throws Exception {
96 FormDto form = new FormDto();
97 form.setStringField("value1");
98
99 tag.setValue(form);
100 tag.setDynamicAttribute(null, "action", "/todo/save");
101 doLifecycle(tag);
102
103 System.out.println(context.getResult());
104
105
106 Element element = getResultAsElementFromContext();
107 String message = "フォームオブジェクトが指定";
108 assertEquals(message, 1, element.getAttributes().size());
109 assertEquals(message, "/todo/save", element.getAttributeValue("action"));
110 assertNull("フォームオブジェクトは除去されていること", context.findAttribute("__form"));
111 }
112
113 @Test
114 public void doTagEmptyBody() throws Exception {
115 FormDto form = new FormDto();
116 form.setStringField("value1");
117
118 tag.setValue(form);
119 tag.setDynamicAttribute(null, "action", "/todo/save");
120
121 doLifecycle(tag);
122
123 System.out.println(context.getResult());
124
125
126 Element element = getResultAsElementFromContext();
127 String message = "Bodyが空の場合";
128 assertEquals(message, 1, element.getAttributes().size());
129 assertEquals(message, "/todo/save", element.getAttributeValue("action"));
130 }
131
132 @Test
133 public void doTagWithTextAreaTag() throws Exception {
134 FormDto form = new FormDto();
135 form.setStringField("value1");
136
137 tag.setValue(form);
138 tag.setDynamicAttribute(null, "action", "/todo/save");
139 doLifecycle(tag, new ChildrenFactory() {
140
141 public List<JspTag> create() {
142 TextareaTag textareaTag = new TextareaTag();
143 textareaTag.setName("stringField");
144 return Arrays.asList(new JspTag[] { textareaTag });
145 }
146
147 });
148
149 System.out.println(context.getResult());
150
151
152
153
154 Element element = getResultAsElementFromContext();
155 String message = "フォームオブジェクトが指定、子要素がある場合";
156 assertEquals(message, 1, element.getAttributes().size());
157 assertEquals(message, "/todo/save", element.getAttributeValue("action"));
158 assertEquals(message, 1, element.getChildren().size());
159 Element child = element.getChild("textarea");
160 assertEquals(message, 1, child.getAttributes().size());
161 assertEquals(message, "stringField", child.getAttributeValue("name"));
162 assertEquals(message, "value1", child.getValue());
163 }
164
165 @Test
166 public void doTagWithSpecifiedAction() throws Exception {
167 FormDto form = new FormDto();
168 form.setStringField("value1");
169
170 tag.setValue(form);
171 tag.setActionClass(MockFormTagTestAction.class.getCanonicalName());
172 tag.setActionMethod("foo");
173 doLifecycle(tag);
174
175 System.out.println(context.getResult());
176
177
178
179 Element element = getResultAsElementFromContext();
180 String message = "アクションクラス、メソッド指定";
181 assertEquals(message, 1, element.getAttributes().size());
182 assertEquals(message, "/brabra/mockFormTagTest/foo", element
183 .getAttributeValue("action"));
184 assertEquals(message, 0, element.getChildren().size());
185 }
186
187 @Test
188 public void doTagWithSpecifiedActionAndParam() throws Exception {
189 FormDto form = new FormDto();
190 form.setStringField("value1");
191
192 tag.setValue(form);
193 tag.setActionClass(MockFormTagTestAction.class.getCanonicalName());
194 tag.setActionMethod("bar");
195 doLifecycle(tag, new ChildrenFactory() {
196
197 public List<JspTag> create() {
198 ParamTag paramTag1 = new ParamTag();
199 paramTag1.setName("id");
200 paramTag1.setValue("123");
201 ParamTag paramTag2 = new ParamTag();
202 paramTag2.setName("token");
203 paramTag2.setValue("abc");
204 return Arrays.asList(new JspTag[] { paramTag1, paramTag2 });
205 }
206
207 });
208
209 System.out.println(context.getResult());
210
211
212
213 Element element = getResultAsElementFromContext();
214 String message = "アクションクラス、メソッド指定、paramタグあり";
215 assertEquals(message, 1, element.getAttributes().size());
216 assertEquals(message, "/brabra/mockFormTagTest/bar/123?token=abc",
217 element.getAttributeValue("action"));
218 assertEquals(message, 0, element.getChildren().size());
219 }
220
221 @Test
222 public void doTagWithTextAreaAndSpecifiedActionAndParam() throws Exception {
223 FormDto form = new FormDto();
224 form.setStringField("value1");
225
226 tag.setValue(form);
227 tag.setActionClass(MockFormTagTestAction.class.getCanonicalName());
228 tag.setActionMethod("bar");
229 doLifecycle(tag, new ChildrenFactory() {
230
231 public List<JspTag> create() {
232 ParamTag paramTag1 = new ParamTag();
233 paramTag1.setName("id");
234 paramTag1.setValue("123");
235 ParamTag paramTag2 = new ParamTag();
236 paramTag2.setName("token");
237 paramTag2.setValue("abc");
238 InputTag inputTag = new InputTag();
239 inputTag.setType("text");
240 inputTag.setName("stringField");
241 return Arrays.asList(new JspTag[] { paramTag1, paramTag2,
242 inputTag });
243 }
244
245 });
246
247 System.out.println(context.getResult());
248
249
250
251 Element element = getResultAsElementFromContext();
252 String message = "アクションクラス、メソッド指定、paramタグあり";
253 assertEquals(message, 1, element.getAttributes().size());
254 assertEquals(message, "/brabra/mockFormTagTest/bar/123?token=abc",
255 element.getAttributeValue("action"));
256 assertEquals(message, 1, element.getChildren().size());
257 Element child = element.getChild("input");
258 assertEquals(message, 3, child.getAttributes().size());
259 assertEquals(message, "text", child.getAttributeValue("type"));
260 assertEquals(message, "stringField", child.getAttributeValue("name"));
261 assertEquals(message, "value1", child.getAttributeValue("value"));
262 assertEquals(message, "", child.getValue());
263 }
264
265 public void testDoTagProtocol() throws Exception {
266 FormDto form = new FormDto();
267 form.setStringField("value1");
268
269 tag.setValue(form);
270 tag.setDynamicAttribute(null, "action", "/todo/save");
271 tag.setProtocol("https");
272 doLifecycle(tag);
273
274 System.out.println(context.getResult());
275
276
277 Element element = getResultAsElementFromContext();
278 String message = "フォームオブジェクトが指定";
279 assertEquals(message, 1, element.getAttributes().size());
280 assertEquals(message, "https://localhost/todo/save", element
281 .getAttributeValue("action"));
282 assertNull("フォームオブジェクトは除去されていること", context.findAttribute("__form"));
283 }
284
285 public void testDoTagPort() throws Exception {
286 FormDto form = new FormDto();
287 form.setStringField("value1");
288
289 tag.setValue(form);
290 tag.setDynamicAttribute(null, "action", "/todo/save");
291 tag.setPort(8080);
292 doLifecycle(tag);
293
294 System.out.println(context.getResult());
295
296
297 Element element = getResultAsElementFromContext();
298 String message = "フォームオブジェクトが指定";
299 assertEquals(message, 1, element.getAttributes().size());
300 assertEquals(message, "http://localhost:8080/todo/save", element
301 .getAttributeValue("action"));
302 assertNull("フォームオブジェクトは除去されていること", context.findAttribute("__form"));
303 }
304
305 public void testDoTagProtocolAndPort() throws Exception {
306 FormDto form = new FormDto();
307 form.setStringField("value1");
308
309 tag.setValue(form);
310 tag.setDynamicAttribute(null, "action", "/todo/save");
311 tag.setProtocol("https");
312 tag.setPort(8080);
313 doLifecycle(tag);
314
315 System.out.println(context.getResult());
316
317
318 Element element = getResultAsElementFromContext();
319 String message = "フォームオブジェクトが指定";
320 assertEquals(message, 1, element.getAttributes().size());
321 assertEquals(message, "https://localhost:8080/todo/save", element
322 .getAttributeValue("action"));
323 assertNull("フォームオブジェクトは除去されていること", context.findAttribute("__form"));
324 }
325 }