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    }