Author: jbq Date: Mon Jun 25 13:45:31 2007 New Revision: 550598 URL: http://svn.apache.org/viewvc?view=rev&rev=550598 Log: WICKET-254 Allow to set field values before submitting a form with Ajax in WicketTester
Added: incubator/wicket/trunk/jdk-1.4/wicket/src/test/java/org/apache/wicket/util/tester/MockAjaxFormPage.html (with props) incubator/wicket/trunk/jdk-1.4/wicket/src/test/java/org/apache/wicket/util/tester/MockAjaxFormPage.java (with props) Modified: incubator/wicket/trunk/jdk-1.4/wicket/src/main/java/org/apache/wicket/Component.java incubator/wicket/trunk/jdk-1.4/wicket/src/main/java/org/apache/wicket/protocol/http/MockWebApplication.java incubator/wicket/trunk/jdk-1.4/wicket/src/main/java/org/apache/wicket/util/tester/BaseWicketTester.java incubator/wicket/trunk/jdk-1.4/wicket/src/test/java/org/apache/wicket/util/tester/MockFormPage.html incubator/wicket/trunk/jdk-1.4/wicket/src/test/java/org/apache/wicket/util/tester/MockFormPage.java incubator/wicket/trunk/jdk-1.4/wicket/src/test/java/org/apache/wicket/util/tester/WicketTesterTest.java Modified: incubator/wicket/trunk/jdk-1.4/wicket/src/main/java/org/apache/wicket/Component.java URL: http://svn.apache.org/viewvc/incubator/wicket/trunk/jdk-1.4/wicket/src/main/java/org/apache/wicket/Component.java?view=diff&rev=550598&r1=550597&r2=550598 ============================================================================== --- incubator/wicket/trunk/jdk-1.4/wicket/src/main/java/org/apache/wicket/Component.java (original) +++ incubator/wicket/trunk/jdk-1.4/wicket/src/main/java/org/apache/wicket/Component.java Mon Jun 25 13:45:31 2007 @@ -1410,7 +1410,13 @@ */ public final Request getRequest() { - return getRequestCycle().getRequest(); + RequestCycle requestCycle = getRequestCycle(); + if (requestCycle == null) + { + // Happens often with WicketTester when one forgets to call createRequestCycle() + throw new WicketRuntimeException("No RequestCycle is currently set!"); + } + return requestCycle.getRequest(); } /** Modified: incubator/wicket/trunk/jdk-1.4/wicket/src/main/java/org/apache/wicket/protocol/http/MockWebApplication.java URL: http://svn.apache.org/viewvc/incubator/wicket/trunk/jdk-1.4/wicket/src/main/java/org/apache/wicket/protocol/http/MockWebApplication.java?view=diff&rev=550598&r1=550597&r2=550598 ============================================================================== --- incubator/wicket/trunk/jdk-1.4/wicket/src/main/java/org/apache/wicket/protocol/http/MockWebApplication.java (original) +++ incubator/wicket/trunk/jdk-1.4/wicket/src/main/java/org/apache/wicket/protocol/http/MockWebApplication.java Mon Jun 25 13:45:31 2007 @@ -30,6 +30,7 @@ import org.apache.wicket.IRequestTarget; import org.apache.wicket.Page; import org.apache.wicket.PageParameters; +import org.apache.wicket.RequestCycle; import org.apache.wicket.Session; import org.apache.wicket.markup.html.pages.ExceptionErrorPage; import org.apache.wicket.request.target.component.BookmarkablePageRequestTarget; @@ -499,7 +500,7 @@ * the necessary wicket request, response and session objects. The request * and response objects can be accessed and initialised at this point. */ - public void setupRequestAndResponse() + public WebRequestCycle setupRequestAndResponse() { servletRequest.initialize(); servletResponse.initialize(); @@ -507,9 +508,10 @@ parametersForNextRequest.clear(); this.wicketRequest = this.application.newWebRequest(servletRequest); this.wicketResponse = this.application.newWebResponse(servletResponse); - createRequestCycle(); + WebRequestCycle requestCycle = createRequestCycle(); this.application.getSessionStore().bind(wicketRequest, wicketSession); wicketResponse.setAjax(wicketRequest.isAjax()); + return requestCycle; } /** Modified: incubator/wicket/trunk/jdk-1.4/wicket/src/main/java/org/apache/wicket/util/tester/BaseWicketTester.java URL: http://svn.apache.org/viewvc/incubator/wicket/trunk/jdk-1.4/wicket/src/main/java/org/apache/wicket/util/tester/BaseWicketTester.java?view=diff&rev=550598&r1=550597&r2=550598 ============================================================================== --- incubator/wicket/trunk/jdk-1.4/wicket/src/main/java/org/apache/wicket/util/tester/BaseWicketTester.java (original) +++ incubator/wicket/trunk/jdk-1.4/wicket/src/main/java/org/apache/wicket/util/tester/BaseWicketTester.java Mon Jun 25 13:45:31 2007 @@ -1067,8 +1067,12 @@ + " which matches the event: " + event.toString(); notNull(failMessage, ajaxEventBehavior); - setupRequestAndResponse(); - RequestCycle requestCycle = createRequestCycle(); + // initialize the request only if needed to allow the user to pass request parameters, see WICKET-254 + WebRequestCycle requestCycle; + if (RequestCycle.get() == null) + requestCycle = setupRequestAndResponse(); + else + requestCycle = (WebRequestCycle)RequestCycle.get(); // If the event is an FormSubmitBehavior then also "submit" the form if (ajaxEventBehavior instanceof AjaxFormSubmitBehavior) @@ -1080,7 +1084,7 @@ ajaxEventBehavior.onRequest(); // process the request target - requestCycle.getRequestTarget().respond(requestCycle); + processRequestCycle(requestCycle); } /** @@ -1146,7 +1150,9 @@ String name = formComponent.getInputName(); String value = formComponent.getValue(); - getServletRequest().setParameter(name, value); + // Set request parameter with the field value, but do not modify an existing request parameter explicitly set using FormTester.setValue() + if (getServletRequest().getParameterMap().get(name) == null) + getServletRequest().setParameter(name, value); } } }); Added: incubator/wicket/trunk/jdk-1.4/wicket/src/test/java/org/apache/wicket/util/tester/MockAjaxFormPage.html URL: http://svn.apache.org/viewvc/incubator/wicket/trunk/jdk-1.4/wicket/src/test/java/org/apache/wicket/util/tester/MockAjaxFormPage.html?view=auto&rev=550598 ============================================================================== --- incubator/wicket/trunk/jdk-1.4/wicket/src/test/java/org/apache/wicket/util/tester/MockAjaxFormPage.html (added) +++ incubator/wicket/trunk/jdk-1.4/wicket/src/test/java/org/apache/wicket/util/tester/MockAjaxFormPage.html Mon Jun 25 13:45:31 2007 @@ -0,0 +1,14 @@ +<?xml version="1.0" encoding="UTF-8" ?> +<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> +<html xmlns="http://www.w3.org/1999/xhtml" xmlns:wicket="http://www.wicketframework.org"> +<head> +<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" /> +<title>Mock Ajax Form</title> +</head> +<body> + <form wicket:id="form"> + <input wicket:id="text" type="text"/> + <input wicket:id="submit" type="submit"/> + </form> +</body> +</html> Propchange: incubator/wicket/trunk/jdk-1.4/wicket/src/test/java/org/apache/wicket/util/tester/MockAjaxFormPage.html ------------------------------------------------------------------------------ svn:eol-style = native Added: incubator/wicket/trunk/jdk-1.4/wicket/src/test/java/org/apache/wicket/util/tester/MockAjaxFormPage.java URL: http://svn.apache.org/viewvc/incubator/wicket/trunk/jdk-1.4/wicket/src/test/java/org/apache/wicket/util/tester/MockAjaxFormPage.java?view=auto&rev=550598 ============================================================================== --- incubator/wicket/trunk/jdk-1.4/wicket/src/test/java/org/apache/wicket/util/tester/MockAjaxFormPage.java (added) +++ incubator/wicket/trunk/jdk-1.4/wicket/src/test/java/org/apache/wicket/util/tester/MockAjaxFormPage.java Mon Jun 25 13:45:31 2007 @@ -0,0 +1,88 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.apache.wicket.util.tester; + +import java.io.Serializable; + +import org.apache.wicket.ajax.AjaxRequestTarget; +import org.apache.wicket.ajax.form.AjaxFormValidatingBehavior; +import org.apache.wicket.markup.html.WebPage; +import org.apache.wicket.markup.html.form.Button; +import org.apache.wicket.markup.html.form.Form; +import org.apache.wicket.markup.html.form.TextField; +import org.apache.wicket.model.CompoundPropertyModel; +import org.apache.wicket.validation.validator.StringValidator; + +/** + * Web page that contains a form with ajax functionality. + * + * @author Kare Nuorteva + */ +public class MockAjaxFormPage extends WebPage +{ + private static final class MockDomainObject implements Serializable { + private static final long serialVersionUID = 1L; + + private String text; + + /** + * Gets text. + * @return text Text entered in the text field + */ + public String getText() + { + return text; + } + + /** + * Sets text. + * @param text New value for the text field + */ + public void setText(String text) + { + this.text = text; + } + } + + private static final long serialVersionUID = 1L; + + /** + * Construct. + */ + public MockAjaxFormPage() { + Form form = new Form("form", new CompoundPropertyModel(new MockDomainObject())); + add(form); + final Button submit = new Button("submit"); + submit.setOutputMarkupId(true); + submit.setEnabled(false); + form.add(submit); + final TextField text = new TextField("text"); + text.setRequired(true); + text.add(StringValidator.minimumLength(4)); + text.add(new AjaxFormValidatingBehavior(form, "onkeyup") { + private static final long serialVersionUID = 1L; + + protected void onEvent(AjaxRequestTarget target) + { + text.validate(); + submit.setEnabled(text.isValid()); + target.addComponent(submit); + } + }); + form.add(text); + } +} Propchange: incubator/wicket/trunk/jdk-1.4/wicket/src/test/java/org/apache/wicket/util/tester/MockAjaxFormPage.java ------------------------------------------------------------------------------ svn:eol-style = native Propchange: incubator/wicket/trunk/jdk-1.4/wicket/src/test/java/org/apache/wicket/util/tester/MockAjaxFormPage.java ------------------------------------------------------------------------------ svn:keywords = Id Modified: incubator/wicket/trunk/jdk-1.4/wicket/src/test/java/org/apache/wicket/util/tester/MockFormPage.html URL: http://svn.apache.org/viewvc/incubator/wicket/trunk/jdk-1.4/wicket/src/test/java/org/apache/wicket/util/tester/MockFormPage.html?view=diff&rev=550598&r1=550597&r2=550598 ============================================================================== --- incubator/wicket/trunk/jdk-1.4/wicket/src/test/java/org/apache/wicket/util/tester/MockFormPage.html (original) +++ incubator/wicket/trunk/jdk-1.4/wicket/src/test/java/org/apache/wicket/util/tester/MockFormPage.html Mon Jun 25 13:45:31 2007 @@ -10,6 +10,7 @@ <input type="text" wicket:id="text" /> <input type="checkbox" wicket:id="checkbox" /> <textarea wicket:id="textarea"></textarea> +<input wicket:id="submit" type="submit"/> </form> </body> </html> Modified: incubator/wicket/trunk/jdk-1.4/wicket/src/test/java/org/apache/wicket/util/tester/MockFormPage.java URL: http://svn.apache.org/viewvc/incubator/wicket/trunk/jdk-1.4/wicket/src/test/java/org/apache/wicket/util/tester/MockFormPage.java?view=diff&rev=550598&r1=550597&r2=550598 ============================================================================== --- incubator/wicket/trunk/jdk-1.4/wicket/src/test/java/org/apache/wicket/util/tester/MockFormPage.java (original) +++ incubator/wicket/trunk/jdk-1.4/wicket/src/test/java/org/apache/wicket/util/tester/MockFormPage.java Mon Jun 25 13:45:31 2007 @@ -17,6 +17,7 @@ package org.apache.wicket.util.tester; import org.apache.wicket.markup.html.WebPage; +import org.apache.wicket.markup.html.form.Button; import org.apache.wicket.markup.html.form.CheckBox; import org.apache.wicket.markup.html.form.Form; import org.apache.wicket.markup.html.form.TextArea; @@ -104,6 +105,7 @@ form.add(new TextField("text")); form.add(new CheckBox("checkbox")); form.add(new TextArea("textarea")); + form.add(new Button("submit")); } /** Modified: incubator/wicket/trunk/jdk-1.4/wicket/src/test/java/org/apache/wicket/util/tester/WicketTesterTest.java URL: http://svn.apache.org/viewvc/incubator/wicket/trunk/jdk-1.4/wicket/src/test/java/org/apache/wicket/util/tester/WicketTesterTest.java?view=diff&rev=550598&r1=550597&r2=550598 ============================================================================== --- incubator/wicket/trunk/jdk-1.4/wicket/src/test/java/org/apache/wicket/util/tester/WicketTesterTest.java (original) +++ incubator/wicket/trunk/jdk-1.4/wicket/src/test/java/org/apache/wicket/util/tester/WicketTesterTest.java Mon Jun 25 13:45:31 2007 @@ -30,6 +30,7 @@ import org.apache.wicket.ajax.markup.html.AjaxLink; import org.apache.wicket.markup.html.PackageResource.PackageResourceBlockedException; import org.apache.wicket.markup.html.basic.Label; +import org.apache.wicket.markup.html.form.Button; import org.apache.wicket.markup.html.form.TextField; import org.apache.wicket.markup.html.link.Link; import org.apache.wicket.request.target.coding.IRequestTargetUrlCodingStrategy; @@ -370,5 +371,55 @@ IRequestTargetUrlCodingStrategy getRequestCodingStrategy() { String relativePath = tester.getApplication().getWicketFilter().getRelativePath(tester.getServletRequest()); return tester.getApplication().getRequestCycleProcessor().getRequestCodingStrategy().urlCodingStrategyForPath(relativePath); + } + + /** + * Toggle submit button to disabled state. + */ + public void testToggleButtonEnabledState() + { + tester.startPage(MockFormPage.class); + Component submit = tester.getComponentFromLastRenderedPage("form:submit"); + assertTrue(submit.isEnabled()); + tester.createRequestCycle(); + submit.setEnabled(false); + assertFalse(submit.isEnabled()); + } + + /** + * Toggle submit button to enabled when text field validates. + */ + public void testToggleAjaxFormButton() + { + tester.startPage(new MockAjaxFormPage()); + Button submit = getSubmitButton(); + assertFalse(submit.isEnabled()); + FormTester form = tester.newFormTester("form"); + + tester.setupRequestAndResponse(); + form.setValue("text", "XX"); + setTextFieldAndAssertSubmit(false); + Session.get().cleanupFeedbackMessages(); + + tester.setupRequestAndResponse(); + form.setValue("text", "XXXYYYXXX"); + setTextFieldAndAssertSubmit(true); + + tester.setupRequestAndResponse(); + form.setValue("text", ""); + setTextFieldAndAssertSubmit(false); + } + + private void setTextFieldAndAssertSubmit(boolean expected) + { + tester.executeAjaxEvent("form:text", "onkeyup"); + Button submit = getSubmitButton(); + System.out.println(Session.get().getFeedbackMessages()); + assertEquals(expected, submit.isEnabled()); + } + + private Button getSubmitButton() + { + return (Button) tester.getComponentFromLastRenderedPage("form:submit"); } }