001 // Copyright 2005 The Apache Software Foundation 002 // 003 // Licensed under the Apache License, Version 2.0 (the "License"); 004 // you may not use this file except in compliance with the License. 005 // You may obtain a copy of the License at 006 // 007 // http://www.apache.org/licenses/LICENSE-2.0 008 // 009 // Unless required by applicable law or agreed to in writing, software 010 // distributed under the License is distributed on an "AS IS" BASIS, 011 // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 012 // See the License for the specific language governing permissions and 013 // limitations under the License. 014 015 package org.apache.tapestry.form; 016 017 import static org.easymock.EasyMock.checkOrder; 018 import static org.easymock.EasyMock.expect; 019 020 import java.awt.Point; 021 022 import org.apache.hivemind.util.PropertyUtils; 023 import org.apache.tapestry.IAsset; 024 import org.apache.tapestry.IBinding; 025 import org.apache.tapestry.IForm; 026 import org.apache.tapestry.IMarkupWriter; 027 import org.apache.tapestry.IRequestCycle; 028 import org.apache.tapestry.test.Creator; 029 import org.apache.tapestry.valid.IValidationDelegate; 030 import org.apache.tapestry.valid.ValidationConstants; 031 import org.testng.annotations.Test; 032 033 /** 034 * Tests for {@link org.apache.tapestry.form.ImageSubmit}. 035 * 036 * @author Howard M. Lewis Ship 037 * @since 4.0 038 */ 039 @Test 040 public class TestImageSubmit extends BaseFormComponentTestCase 041 { 042 protected IAsset newAsset(IRequestCycle cycle, String imageURL) 043 { 044 IAsset asset = newMock(IAsset.class); 045 checkOrder(asset, false); 046 047 expect(asset.buildURL()).andReturn(imageURL); 048 049 return asset; 050 } 051 052 public void testPrerendered() 053 { 054 Creator creator = new Creator(); 055 ImageSubmit submit = (ImageSubmit) creator.newInstance(ImageSubmit.class); 056 057 IForm form = newMock(IForm.class); 058 IRequestCycle cycle = newCycle(); 059 IMarkupWriter writer = newWriter(); 060 061 trainGetForm(cycle, form); 062 063 trainWasPrerendered(form, writer, submit, true); 064 065 replay(); 066 067 submit.renderComponent(writer, cycle); 068 069 verify(); 070 } 071 072 public void testRender() 073 { 074 IValidationDelegate delegate = newDelegate(); 075 IForm form = newForm(); 076 IRequestCycle cycle = newCycle(); 077 IMarkupWriter writer = newWriter(); 078 IAsset image = newAsset(cycle, "image-url"); 079 080 Creator creator = new Creator(); 081 ImageSubmit submit = (ImageSubmit) creator.newInstance(ImageSubmit.class, new Object[] 082 { "image", image , "submitType", "submit"}); 083 084 trainGetForm(cycle, form); 085 086 trainWasPrerendered(form, writer, submit, false); 087 088 trainGetDelegate(form, delegate); 089 090 delegate.setFormComponent(submit); 091 092 trainGetElementId(form, submit, "fred"); 093 094 trainIsRewinding(form, false); 095 096 trainIsRewinding(cycle, false); 097 098 form.setFormFieldUpdating(true); 099 100 writer.beginEmpty("input"); 101 writer.attribute("type", "image"); 102 writer.attribute("name", "fred"); 103 writer.attribute("src", "image-url"); 104 105 writer.attribute("id", "fred"); 106 107 writer.closeTag(); 108 109 trainIsInError(delegate, false); 110 111 delegate.registerForFocus(submit, ValidationConstants.NORMAL_FIELD); 112 113 replay(); 114 115 submit.renderComponent(writer, cycle); 116 117 verify(); 118 } 119 120 public void testRenderDisabled() 121 { 122 IValidationDelegate delegate = newDelegate(); 123 IForm form = newForm(); 124 IRequestCycle cycle = newCycle(); 125 IMarkupWriter writer = newWriter(); 126 127 IAsset image = newAsset(cycle, "disabled-image-url"); 128 129 Creator creator = new Creator(); 130 ImageSubmit submit = (ImageSubmit) creator.newInstance(ImageSubmit.class, new Object[] 131 { "disabledImage", image, "disabled", Boolean.TRUE, "submitType", "submit" }); 132 133 trainGetForm(cycle, form); 134 135 trainWasPrerendered(form, writer, submit, false); 136 137 expect(form.getDelegate()).andReturn(delegate); 138 139 delegate.setFormComponent(submit); 140 141 trainGetElementId(form, submit, "fred"); 142 143 trainIsRewinding(form, false); 144 145 trainIsRewinding(cycle, false); 146 147 form.setFormFieldUpdating(true); 148 149 writer.beginEmpty("input"); 150 writer.attribute("type", "image"); 151 writer.attribute("name", "fred"); 152 writer.attribute("disabled", "disabled"); 153 writer.attribute("src", "disabled-image-url"); 154 155 writer.attribute("id", "fred"); 156 157 writer.closeTag(); 158 159 replay(); 160 161 submit.renderComponent(writer, cycle); 162 163 verify(); 164 } 165 166 public void testRenderDisabledNoDisabledImage() 167 { 168 IValidationDelegate delegate = newDelegate(); 169 IForm form = newForm(); 170 IRequestCycle cycle = newCycle(); 171 IMarkupWriter writer = newWriter(); 172 173 IAsset image = newAsset(cycle, "image-url"); 174 175 Creator creator = new Creator(); 176 ImageSubmit submit = (ImageSubmit) creator.newInstance(ImageSubmit.class, new Object[] 177 { "image", image, "disabled", Boolean.TRUE, "submitType", "submit" }); 178 179 trainGetForm(cycle, form); 180 181 trainWasPrerendered(form, writer, submit, false); 182 183 expect(form.getDelegate()).andReturn(delegate); 184 185 delegate.setFormComponent(submit); 186 187 trainGetElementId(form, submit, "fred"); 188 189 trainIsRewinding(form, false); 190 191 trainIsRewinding(cycle, false); 192 193 form.setFormFieldUpdating(true); 194 195 writer.beginEmpty("input"); 196 writer.attribute("type", "image"); 197 writer.attribute("name", "fred"); 198 writer.attribute("disabled", "disabled"); 199 writer.attribute("src", "image-url"); 200 201 writer.attribute("id", "fred"); 202 203 writer.closeTag(); 204 205 replay(); 206 207 submit.renderComponent(writer, cycle); 208 209 verify(); 210 } 211 212 public void testRenderWithNameOverride() 213 { 214 IValidationDelegate delegate = newDelegate(); 215 IForm form = newForm(); 216 IRequestCycle cycle = newCycle(); 217 IMarkupWriter writer = newWriter(); 218 219 IAsset image = newAsset(cycle, "image-url"); 220 221 Creator creator = new Creator(); 222 ImageSubmit submit = (ImageSubmit) creator.newInstance(ImageSubmit.class, new Object[] 223 { "image", image, "nameOverride", "barney", "submitType", "submit" }); 224 225 trainGetForm(cycle, form); 226 227 trainWasPrerendered(form, writer, submit, false); 228 229 expect(form.getDelegate()).andReturn(delegate); 230 231 delegate.setFormComponent(submit); 232 233 expect(form.getElementId(submit, "barney")).andReturn("barney$0"); 234 235 trainIsRewinding(form, false); 236 237 trainIsRewinding(cycle, false); 238 239 form.setFormFieldUpdating(true); 240 241 writer.beginEmpty("input"); 242 writer.attribute("type", "image"); 243 writer.attribute("name", "barney$0"); 244 writer.attribute("src", "image-url"); 245 writer.closeTag(); 246 247 trainIsInError(delegate, false); 248 249 delegate.registerForFocus(submit, ValidationConstants.NORMAL_FIELD); 250 251 replay(); 252 253 submit.renderComponent(writer, cycle); 254 255 verify(); 256 } 257 258 public void testRewindingDisabled() 259 { 260 Creator creator = new Creator(); 261 ImageSubmit submit = (ImageSubmit) creator.newInstance(ImageSubmit.class, new Object[] 262 { "disabled", Boolean.TRUE }); 263 264 IValidationDelegate delegate = newDelegate(); 265 IForm form = newForm(); 266 IRequestCycle cycle = newCycle(); 267 IMarkupWriter writer = newWriter(); 268 269 trainGetForm(cycle, form); 270 271 trainWasPrerendered(form, writer, submit, false); 272 273 expect(form.getDelegate()).andReturn(delegate); 274 275 delegate.setFormComponent(submit); 276 277 trainGetElementId(form, submit, "fred"); 278 279 trainIsRewinding(form, true); 280 281 replay(); 282 283 submit.renderComponent(writer, cycle); 284 285 verify(); 286 } 287 288 public void testRewindNotTrigger() 289 { 290 Creator creator = new Creator(); 291 ImageSubmit submit = (ImageSubmit) creator.newInstance(ImageSubmit.class); 292 293 IValidationDelegate delegate = newDelegate(); 294 IForm form = newForm(); 295 IRequestCycle cycle = newCycle(); 296 IMarkupWriter writer = newWriter(); 297 298 trainGetForm(cycle, form); 299 300 trainWasPrerendered(form, writer, submit, false); 301 302 expect(form.getDelegate()).andReturn(delegate); 303 304 delegate.setFormComponent(submit); 305 306 trainGetElementId(form, submit, "fred"); 307 308 trainIsRewinding(form, true); 309 310 trainGetParameter(cycle, "fred.x", null); 311 trainGetParameter(cycle, FormConstants.SUBMIT_NAME_PARAMETER, "peebles"); 312 313 replay(); 314 315 submit.renderComponent(writer, cycle); 316 317 verify(); 318 } 319 320 public void testRewindTrigger() 321 { 322 Creator creator = new Creator(); 323 ImageSubmit submit = (ImageSubmit) creator.newInstance(ImageSubmit.class, new Object[] 324 { "tag", "clicked" }); 325 326 IBinding binding = newBinding(); 327 submit.setBinding("selected", binding); 328 329 IValidationDelegate delegate = newDelegate(); 330 IForm form = newForm(); 331 IRequestCycle cycle = newCycle(); 332 IMarkupWriter writer = newWriter(); 333 334 trainGetForm(cycle, form); 335 336 trainWasPrerendered(form, writer, submit, false); 337 338 expect(form.getDelegate()).andReturn(delegate); 339 340 delegate.setFormComponent(submit); 341 342 trainGetElementId(form, submit, "fred"); 343 344 trainIsRewinding(form, true); 345 346 trainGetParameter(cycle, "fred.x", "33"); 347 trainGetParameter(cycle, FormConstants.SUBMIT_NAME_PARAMETER, "fred"); 348 349 replay(); 350 351 submit.renderComponent(writer, cycle); 352 353 assertEquals("clicked", PropertyUtils.read(submit, "selected")); 354 355 // Note: we rely on the fact that ImageSubmit subclasses 356 // from Submit to test some of the extra logic about 357 // notifying listeners (deferred or not). 358 // This test "proves" that Submit.handleClick() is invoked. 359 360 verify(); 361 } 362 363 public void testRewindTriggerAsync() 364 { 365 Creator creator = new Creator(); 366 ImageSubmit submit = (ImageSubmit) creator.newInstance(ImageSubmit.class, new Object[] 367 { "tag", "clicked" }); 368 369 IBinding binding = newBinding(); 370 submit.setBinding("selected", binding); 371 372 IValidationDelegate delegate = newDelegate(); 373 IForm form = newForm(); 374 IRequestCycle cycle = newCycle(); 375 IMarkupWriter writer = newWriter(); 376 377 trainGetForm(cycle, form); 378 379 trainWasPrerendered(form, writer, submit, false); 380 381 expect(form.getDelegate()).andReturn(delegate); 382 383 delegate.setFormComponent(submit); 384 385 trainGetElementId(form, submit, "fred"); 386 387 trainIsRewinding(form, true); 388 389 trainGetParameter(cycle, "fred.x", null); 390 trainGetParameter(cycle, FormConstants.SUBMIT_NAME_PARAMETER, "fred"); 391 392 replay(); 393 394 submit.renderComponent(writer, cycle); 395 396 assertEquals("clicked", PropertyUtils.read(submit, "selected")); 397 398 verify(); 399 } 400 401 public void testRewindTriggeredWithPointBound() 402 { 403 // Note: because there isn't a real Form to set the name, we'll do it here. 404 405 Creator creator = new Creator(); 406 ImageSubmit submit = (ImageSubmit) creator.newInstance(ImageSubmit.class, new Object[] 407 { "tag", "clicked", "name", "fred" }); 408 409 IBinding binding = newBinding(); 410 submit.setBinding("selected", binding); 411 submit.setBinding("point", binding); 412 413 IValidationDelegate delegate = newDelegate(); 414 IForm form = newForm(); 415 IRequestCycle cycle = newCycle(); 416 IMarkupWriter writer = newWriter(); 417 418 trainGetForm(cycle, form); 419 420 trainWasPrerendered(form, writer, submit, false); 421 422 expect(form.getDelegate()).andReturn(delegate); 423 424 delegate.setFormComponent(submit); 425 426 trainGetElementId(form, submit, "fred"); 427 428 trainIsRewinding(form, true); 429 430 trainGetParameter(cycle, "fred.x", "33"); 431 trainGetParameter(cycle, "fred.x", "33"); 432 trainGetParameter(cycle, "fred.y", "19"); 433 trainGetParameter(cycle, FormConstants.SUBMIT_NAME_PARAMETER, "fred"); 434 435 replay(); 436 437 submit.renderComponent(writer, cycle); 438 439 assertEquals("clicked", PropertyUtils.read(submit, "selected")); 440 assertEquals(new Point(33, 19), PropertyUtils.read(submit, "point")); 441 442 verify(); 443 } 444 }