| package org.apache.tapestry.scriptaculous; |
| |
| import org.apache.hivemind.ApplicationRuntimeException; |
| import org.apache.hivemind.Location; |
| import org.apache.tapestry.*; |
| import static org.apache.tapestry.Capturer.capture; |
| import static org.apache.tapestry.Capturer.newCapturer; |
| import org.apache.tapestry.coerce.ValueConverter; |
| import org.apache.tapestry.engine.DirectServiceParameter; |
| import org.apache.tapestry.engine.IEngineService; |
| import org.apache.tapestry.engine.ILink; |
| import org.apache.tapestry.form.MockForm; |
| import org.apache.tapestry.form.TranslatedFieldSupport; |
| import org.apache.tapestry.form.ValidatableFieldSupport; |
| import org.apache.tapestry.services.ResponseBuilder; |
| import org.apache.tapestry.spec.ComponentSpecification; |
| import org.apache.tapestry.valid.IValidationDelegate; |
| import org.apache.tapestry.valid.ValidationDelegate; |
| import static org.easymock.EasyMock.*; |
| import org.testng.annotations.Test; |
| |
| import java.util.ArrayList; |
| import java.util.Iterator; |
| import java.util.List; |
| import java.util.Map; |
| |
| /** |
| * Tests core functionality of {@link Suggest} component. |
| */ |
| @Test |
| public class TestSuggest extends BaseComponentTestCase { |
| |
| public void test_Render_Component() |
| { |
| IRequestCycle cycle = newMock(IRequestCycle.class); |
| checkOrder(cycle, false); |
| |
| ResponseBuilder resp = newMock(ResponseBuilder.class); |
| IEngineService engine = newMock(IEngineService.class); |
| IEngine cengine = newMock(IEngine.class); |
| ILink link = newMock(ILink.class); |
| IScript script = newMock(IScript.class); |
| PageRenderSupport prs = newMock(PageRenderSupport.class); |
| |
| TranslatedFieldSupport translator = newMock(TranslatedFieldSupport.class); |
| ValidatableFieldSupport validator = newMock(ValidatableFieldSupport.class); |
| |
| IValidationDelegate delegate = new ValidationDelegate(); |
| IForm form = newMock(IForm.class); |
| IMarkupWriter writer = newBufferWriter(); |
| |
| Suggest comp = newInstance(Suggest.class, |
| "response", resp, |
| "templateTagName", "input", |
| "name", "suggest", |
| "clientId", "suggest", |
| "form", form, |
| "translatedFieldSupport", translator, |
| "validatableFieldSupport", validator, |
| "engineService", engine, |
| "script", script); |
| |
| expect(cycle.isRewinding()).andReturn(false).anyTimes(); |
| expect(resp.isDynamic()).andReturn(false); |
| expect(cycle.getAttribute(TapestryUtils.FORM_ATTRIBUTE)).andReturn(form).anyTimes(); |
| |
| expect(form.wasPrerendered(writer, comp)).andReturn(false).anyTimes(); |
| expect(form.getDelegate()).andReturn(delegate).anyTimes(); |
| expect(form.getElementId(comp)).andReturn("suggest"); |
| expect(form.isRewinding()).andReturn(false).anyTimes(); |
| |
| form.setFormFieldUpdating(true); |
| |
| expect(translator.format(comp, null)).andReturn("r2d2"); |
| translator.renderContributions(comp, writer, cycle); |
| validator.renderContributions(comp, writer, cycle); |
| |
| expect(cycle.getEngine()).andReturn(cengine); |
| expect(cengine.getOutputEncoding()).andReturn("utf-8"); |
| expect(engine.getLink(eq(false), isA(DirectServiceParameter.class))).andReturn(link); |
| expect(link.getURL()).andReturn("http://url"); |
| |
| Capturer<Map> parm = newCapturer(Map.class); |
| |
| trainGetAttribute(cycle, TapestryUtils.PAGE_RENDER_SUPPORT_ATTRIBUTE, prs); |
| script.execute(eq(comp), eq(cycle), eq(prs), capture(parm)); |
| |
| replay(); |
| |
| comp.renderComponent(writer, cycle); |
| |
| verify(); |
| |
| assert parm.getCaptured() != null; |
| Map parms = parm.getCaptured(); |
| |
| assertEquals(parms.size(), 4); |
| assertEquals(parms.get("inputId"), "suggest"); |
| assertEquals(parms.get("updateId"), "suggestchoices"); |
| assertEquals(parms.get("options"), "{\"onFailure\":tapestry.error,\"encoding\":\"utf-8\"}"); |
| assertEquals(parms.get("updateUrl"), "http://url"); |
| |
| assertBuffer("<input type=\"text\" autocomplete=\"off\" " + |
| "id=\"suggest\" name=\"suggest\" value=\"r2d2\" />" + |
| "<div id=\"suggestchoices\" class=\"\"></div>"); |
| } |
| |
| public void test_Render_TextArea_Component() |
| { |
| IRequestCycle cycle = newMock(IRequestCycle.class); |
| checkOrder(cycle, false); |
| |
| ResponseBuilder resp = newMock(ResponseBuilder.class); |
| IEngineService engine = newMock(IEngineService.class); |
| IEngine cengine = newMock(IEngine.class); |
| ILink link = newMock(ILink.class); |
| IScript script = newMock(IScript.class); |
| PageRenderSupport prs = newMock(PageRenderSupport.class); |
| |
| TranslatedFieldSupport translator = newMock(TranslatedFieldSupport.class); |
| ValidatableFieldSupport validator = newMock(ValidatableFieldSupport.class); |
| |
| IValidationDelegate delegate = new ValidationDelegate(); |
| IForm form = newMock(IForm.class); |
| IMarkupWriter writer = newBufferWriter(); |
| |
| Suggest comp = newInstance(Suggest.class, |
| "response", resp, |
| "templateTagName", "textarea", |
| "name", "suggest", |
| "clientId", "suggest", |
| "form", form, |
| "translatedFieldSupport", translator, |
| "validatableFieldSupport", validator, |
| "engineService", engine, |
| "script", script, |
| "options", "{afterUpdateElement:myapp.processUpdate,other:other}"); |
| |
| expect(cycle.isRewinding()).andReturn(false).anyTimes(); |
| expect(resp.isDynamic()).andReturn(false); |
| expect(cycle.getAttribute(TapestryUtils.FORM_ATTRIBUTE)).andReturn(form).anyTimes(); |
| |
| expect(form.wasPrerendered(writer, comp)).andReturn(false).anyTimes(); |
| expect(form.getDelegate()).andReturn(delegate).anyTimes(); |
| expect(form.getElementId(comp)).andReturn("suggest"); |
| expect(form.isRewinding()).andReturn(false).anyTimes(); |
| |
| form.setFormFieldUpdating(true); |
| |
| expect(translator.format(comp, null)).andReturn("r2d2"); |
| translator.renderContributions(comp, writer, cycle); |
| validator.renderContributions(comp, writer, cycle); |
| |
| expect(cycle.getEngine()).andReturn(cengine); |
| expect(cengine.getOutputEncoding()).andReturn("utf-8"); |
| expect(engine.getLink(eq(false), isA(DirectServiceParameter.class))).andReturn(link); |
| expect(link.getURL()).andReturn("http://url"); |
| |
| Capturer<Map> parm = newCapturer(Map.class); |
| |
| trainGetAttribute(cycle, TapestryUtils.PAGE_RENDER_SUPPORT_ATTRIBUTE, prs); |
| script.execute(eq(comp), eq(cycle), eq(prs), capture(parm)); |
| |
| replay(); |
| |
| comp.renderComponent(writer, cycle); |
| |
| verify(); |
| |
| assert parm.getCaptured() != null; |
| Map parms = parm.getCaptured(); |
| |
| assertEquals(parms.size(), 4); |
| assertEquals(parms.get("inputId"), "suggest"); |
| assertEquals(parms.get("updateId"), "suggestchoices"); |
| assertEquals(parms.get("options"), |
| "{\"afterUpdateElement\":myapp.processUpdate,\"other\":\"other\"," + |
| "\"onFailure\":tapestry.error,\"encoding\":\"utf-8\"}"); |
| assertEquals(parms.get("updateUrl"), "http://url"); |
| |
| assertBuffer("<textarea id=\"suggest\" name=\"suggest\">r2d2</textarea>" + |
| "<div id=\"suggestchoices\" class=\"\"></div>"); |
| } |
| |
| public void test_Render_Invalid_Options_JSON_Syntax() |
| { |
| IRequestCycle cycle = newMock(IRequestCycle.class); |
| checkOrder(cycle, false); |
| ResponseBuilder resp = newMock(ResponseBuilder.class); |
| |
| TranslatedFieldSupport translator = newMock(TranslatedFieldSupport.class); |
| ValidatableFieldSupport validator = newMock(ValidatableFieldSupport.class); |
| |
| IValidationDelegate delegate = new ValidationDelegate(); |
| IForm form = new MockForm(delegate); |
| IMarkupWriter writer = newBufferWriter(); |
| |
| IBinding binding = newMock(IBinding.class); |
| Location l = newLocation(); |
| ComponentSpecification spec = new ComponentSpecification(); |
| |
| Suggest comp = newInstance(Suggest.class, |
| "response", resp, |
| "templateTagName", "input", |
| "name", "suggest", |
| "clientId", "suggest", |
| "form", form, |
| "translatedFieldSupport", translator, |
| "validatableFieldSupport", validator, |
| "options", "{thisisinvalid:true", |
| "specification", spec); |
| |
| expect(cycle.isRewinding()).andReturn(false).anyTimes(); |
| expect(resp.isDynamic()).andReturn(false); |
| expect(cycle.getAttribute(TapestryUtils.FORM_ATTRIBUTE)).andReturn(form).anyTimes(); |
| |
| expect(translator.format(comp, null)).andReturn("r2d2"); |
| translator.renderContributions(comp, writer, cycle); |
| validator.renderContributions(comp, writer, cycle); |
| |
| expect(binding.getObject()).andReturn("{thisisinvalid:true"); |
| expect(binding.getLocation()).andReturn(l); |
| |
| replay(); |
| |
| try { |
| |
| comp.setBinding("options", binding); |
| |
| comp.renderComponent(writer, cycle); |
| |
| unreachable(); |
| } catch (ApplicationRuntimeException ex) { |
| |
| assertEquals(ex.getMessage(), "Invalid JSON options string given: {thisisinvalid:true. " + |
| "The options parameter must be properly formatted according to JSON object syntax rules. " + |
| "Expected a ',' or '}' at character 19 of {thisisinvalid:true>>missing value<<"); |
| } |
| |
| verify(); |
| } |
| |
| public void test_Render_List() |
| { |
| IRequestCycle cycle = newMock(IRequestCycle.class); |
| checkOrder(cycle, false); |
| ResponseBuilder resp = newMock(ResponseBuilder.class); |
| |
| IValidationDelegate delegate = new ValidationDelegate(); |
| IForm form = newMock(IForm.class); |
| IMarkupWriter writer = newBufferWriter(); |
| |
| ValueConverter converter = newMock(ValueConverter.class); |
| |
| List<String> source = new ArrayList<String>(); |
| source.add("Foo"); |
| source.add("Stimpy"); |
| source.add("Cat"); |
| |
| Suggest comp = newInstance(Suggest.class, |
| "response", resp, |
| "templateTagName", "input", |
| "name", "suggest", |
| "clientId", "suggest", |
| "form", form, |
| "searchTriggered", true, |
| "listSource", source, |
| "valueConverter", converter, |
| "listItemRenderer", DefaultListItemRenderer.SHARED_INSTANCE); |
| |
| expect(form.isRewinding()).andReturn(false); |
| expect(cycle.isRewinding()).andReturn(false).anyTimes(); |
| expect(resp.isDynamic()).andReturn(true); |
| trainGetAttribute(cycle, TapestryUtils.FORM_ATTRIBUTE, form); |
| expect(form.wasPrerendered(writer, comp)).andReturn(false); |
| |
| expect(form.getElementId(comp)).andReturn("suggest"); |
| expect(cycle.getParameter("suggest")).andReturn("b"); |
| expect(converter.coerceValue(source, Iterator.class)).andReturn(source.iterator()); |
| |
| replay(); |
| |
| comp.renderComponent(writer, cycle); |
| |
| verify(); |
| |
| assertBuffer("<ul><li>Foo</li><li>Stimpy</li><li>Cat</li></ul>"); |
| } |
| } |