You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@wicket.apache.org by pe...@apache.org on 2011/01/04 11:27:00 UTC

svn commit: r1054961 - in /wicket/trunk: wicket-core/src/main/java/org/apache/wicket/protocol/http/mock/ wicket-core/src/main/java/org/apache/wicket/util/tester/ wicket-core/src/test/java/org/apache/wicket/ wicket-core/src/test/java/org/apache/wicket/u...

Author: pedro
Date: Tue Jan  4 10:26:59 2011
New Revision: 1054961

URL: http://svn.apache.org/viewvc?rev=1054961&view=rev
Log:
changing MockHttpServletRequest to maintain users parameters set on request when setting an URL, and assemble an query string with all parameters values
Issue: WICKET-3272

Added:
    wicket/trunk/wicket-core/src/test/java/org/apache/wicket/MockPageParametersAware.java
Modified:
    wicket/trunk/wicket-core/src/main/java/org/apache/wicket/protocol/http/mock/MockHttpServletRequest.java
    wicket/trunk/wicket-core/src/main/java/org/apache/wicket/util/tester/BaseWicketTester.java
    wicket/trunk/wicket-core/src/test/java/org/apache/wicket/util/tester/WicketTesterTest.java
    wicket/trunk/wicket-util/src/main/java/org/apache/wicket/util/string/StringValue.java

Modified: wicket/trunk/wicket-core/src/main/java/org/apache/wicket/protocol/http/mock/MockHttpServletRequest.java
URL: http://svn.apache.org/viewvc/wicket/trunk/wicket-core/src/main/java/org/apache/wicket/protocol/http/mock/MockHttpServletRequest.java?rev=1054961&r1=1054960&r2=1054961&view=diff
==============================================================================
--- wicket/trunk/wicket-core/src/main/java/org/apache/wicket/protocol/http/mock/MockHttpServletRequest.java (original)
+++ wicket/trunk/wicket-core/src/main/java/org/apache/wicket/protocol/http/mock/MockHttpServletRequest.java Tue Jan  4 10:26:59 2011
@@ -742,17 +742,24 @@ public class MockHttpServletRequest impl
 			for (Iterator<String> iterator = parameters.keySet().iterator(); iterator.hasNext();)
 			{
 				final String name = iterator.next();
-				final String value = getParameter(name);
-				if (name != null)
+				final String[] values = getParameterValues(name);
+				for (int i = 0; i < values.length; i++)
 				{
-					buf.append(UrlEncoder.QUERY_INSTANCE.encode(name,
-						Charset.forName(getCharacterEncoding())));
-				}
-				buf.append('=');
-				if (value != null)
-				{
-					buf.append(UrlEncoder.QUERY_INSTANCE.encode(value,
-						Charset.forName(getCharacterEncoding())));
+					if (name != null)
+					{
+						buf.append(UrlEncoder.QUERY_INSTANCE.encode(name,
+							Charset.forName(getCharacterEncoding())));
+					}
+					buf.append('=');
+					if (values[i] != null)
+					{
+						buf.append(UrlEncoder.QUERY_INSTANCE.encode(values[i],
+							Charset.forName(getCharacterEncoding())));
+					}
+					if (i + 1 < values.length)
+					{
+						buf.append('&');
+					}
 				}
 				if (iterator.hasNext())
 				{
@@ -1283,8 +1290,11 @@ public class MockHttpServletRequest impl
 			setPath(url.substring(0, index));
 
 			String queryString = url.substring(index + 1);
-
-			parameters.clear();
+/*
+ * We can't clear the parameters here because users may have set custom parameters in request. An
+ * better place to clear they is when tester setups the next request cycle
+ */
+// parameters.clear();
 			for (QueryParameter parameter : Url.parse("?" + queryString,
 				Charset.forName(getCharacterEncoding())).getQueryParameters())
 			{

Modified: wicket/trunk/wicket-core/src/main/java/org/apache/wicket/util/tester/BaseWicketTester.java
URL: http://svn.apache.org/viewvc/wicket/trunk/wicket-core/src/main/java/org/apache/wicket/util/tester/BaseWicketTester.java?rev=1054961&r1=1054960&r2=1054961&view=diff
==============================================================================
--- wicket/trunk/wicket-core/src/main/java/org/apache/wicket/util/tester/BaseWicketTester.java (original)
+++ wicket/trunk/wicket-core/src/main/java/org/apache/wicket/util/tester/BaseWicketTester.java Tue Jan  4 10:26:59 2011
@@ -310,9 +310,9 @@ public class BaseWicketTester
 	/**
 	 * @return last rendered page
 	 */
-	public Page getLastRenderedPage()
+	public <T extends Page> T getLastRenderedPage()
 	{
-		return lastRenderedPage;
+		return (T)lastRenderedPage;
 	}
 
 	/**

Added: wicket/trunk/wicket-core/src/test/java/org/apache/wicket/MockPageParametersAware.java
URL: http://svn.apache.org/viewvc/wicket/trunk/wicket-core/src/test/java/org/apache/wicket/MockPageParametersAware.java?rev=1054961&view=auto
==============================================================================
--- wicket/trunk/wicket-core/src/test/java/org/apache/wicket/MockPageParametersAware.java (added)
+++ wicket/trunk/wicket-core/src/test/java/org/apache/wicket/MockPageParametersAware.java Tue Jan  4 10:26:59 2011
@@ -0,0 +1,99 @@
+/*
+ * 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;
+
+import org.apache.wicket.markup.IMarkupResourceStreamProvider;
+import org.apache.wicket.markup.html.WebPage;
+import org.apache.wicket.markup.html.form.Form;
+import org.apache.wicket.markup.html.form.TextField;
+import org.apache.wicket.model.Model;
+import org.apache.wicket.request.IRequestParameters;
+import org.apache.wicket.request.component.IRequestableComponent;
+import org.apache.wicket.util.resource.IResourceStream;
+import org.apache.wicket.util.resource.StringResourceStream;
+
+
+/**
+ * Mock Page to maintain the request parameters after the request cycle end
+ */
+public class MockPageParametersAware extends WebPage
+	implements
+		IMarkupResourceStreamProvider,
+		IRequestableComponent
+{
+	private static final long serialVersionUID = 1L;
+
+	private IRequestParameters lastQueryParameters;
+	private IRequestParameters lastPostParameters;
+
+	/** */
+	public MockPageParametersAware()
+	{
+		Form<Void> form = new Form<Void>("form");
+		TextField<String> textField = new TextField<String>("textfield", Model.of(""));
+		form.add(textField);
+		add(form);
+	}
+
+	@Override
+	protected void onDetach()
+	{
+		super.onDetach();
+		lastQueryParameters = getRequest().getQueryParameters();
+		lastPostParameters = getRequest().getPostParameters();
+	}
+
+	/**
+	 * @return IRequestParameters query parameters used on last request
+	 */
+	public IRequestParameters getLastQueryParameters()
+	{
+		return lastQueryParameters;
+	}
+
+
+	/**
+	 * @return IRequestParameters POST parameters used on last request
+	 */
+	public IRequestParameters getLastPostParameters()
+	{
+		return lastPostParameters;
+	}
+
+	/**
+	 * just an utility
+	 */
+	public void printParameters()
+	{
+		for (String n : lastPostParameters.getParameterNames())
+		{
+			System.out.println("post: " + n + " : " + lastPostParameters.getParameterValues(n));
+		}
+		for (String n : lastQueryParameters.getParameterNames())
+		{
+			System.out.println("query: " + n + " : " + lastQueryParameters.getParameterValues(n));
+		}
+	}
+
+
+	public IResourceStream getMarkupResourceStream(MarkupContainer container,
+		Class<?> containerClass)
+	{
+		return new StringResourceStream(
+			"<html><body><form wicket:id=\"form\"><input wicket:id=\"textfield\"/></form></body></html>");
+	}
+}

Modified: wicket/trunk/wicket-core/src/test/java/org/apache/wicket/util/tester/WicketTesterTest.java
URL: http://svn.apache.org/viewvc/wicket/trunk/wicket-core/src/test/java/org/apache/wicket/util/tester/WicketTesterTest.java?rev=1054961&r1=1054960&r2=1054961&view=diff
==============================================================================
--- wicket/trunk/wicket-core/src/test/java/org/apache/wicket/util/tester/WicketTesterTest.java (original)
+++ wicket/trunk/wicket-core/src/test/java/org/apache/wicket/util/tester/WicketTesterTest.java Tue Jan  4 10:26:59 2011
@@ -17,6 +17,7 @@
 package org.apache.wicket.util.tester;
 
 import java.util.Collection;
+import java.util.List;
 import java.util.Locale;
 
 import javax.servlet.http.Cookie;
@@ -25,6 +26,7 @@ import junit.framework.AssertionFailedEr
 import junit.framework.TestCase;
 
 import org.apache.wicket.Component;
+import org.apache.wicket.MockPageParametersAware;
 import org.apache.wicket.MockPageWithLink;
 import org.apache.wicket.MockPageWithOneComponent;
 import org.apache.wicket.Page;
@@ -39,7 +41,15 @@ import org.apache.wicket.markup.html.for
 import org.apache.wicket.markup.html.form.TextField;
 import org.apache.wicket.markup.html.link.Link;
 import org.apache.wicket.model.IModel;
+import org.apache.wicket.request.IRequestHandler;
+import org.apache.wicket.request.IRequestParameters;
+import org.apache.wicket.request.Url;
+import org.apache.wicket.request.handler.BookmarkablePageRequestHandler;
+import org.apache.wicket.request.handler.IPageProvider;
+import org.apache.wicket.request.handler.PageProvider;
+import org.apache.wicket.request.mapper.parameter.PageParameters;
 import org.apache.wicket.request.resource.PackageResource.PackageResourceBlockedException;
+import org.apache.wicket.util.string.StringValue;
 import org.apache.wicket.util.tester.MockPageParameterPage.MockInnerClassPage;
 import org.apache.wicket.util.tester.MockPageWithFormAndAjaxFormSubmitBehavior.Pojo;
 import org.apache.wicket.util.tester.apps_1.Book;
@@ -710,6 +720,108 @@ public class WicketTesterTest extends Te
 	}
 
 	/**
+	 * Asserting that parameters set by user in request make part of the processed request
+	 * parameters
+	 */
+	public void testSetQueryParameter()
+	{
+		tester.getRequest().setParameter("p1", "v1");
+
+		tester.startPage(MockPageParametersAware.class);
+
+		MockPageParametersAware page = tester.getLastRenderedPage();
+		assertEquals("v1", page.getLastQueryParameters().getParameterValue("p1").toString());
+	}
+
+	/**
+	 * Asserting that parameters set in request get processed, even if the request URL already has
+	 * query parameters
+	 */
+	public void testSetQueryParameterWhenRequestHasAnQueryUrl()
+	{
+		PageParameters parameters = new PageParameters();
+		parameters.set("q_1", "q_1_value");
+		IPageProvider testPageProvider = new PageProvider(MockPageParametersAware.class, parameters);
+		IRequestHandler pageRequestHandler = new BookmarkablePageRequestHandler(testPageProvider);
+		Url url = tester.getApplication().getRootRequestMapper().mapHandler(pageRequestHandler);
+		tester.getRequest().setParameter("q_2", "q_2_value");
+		tester.getRequest().setUrl(url);
+
+		tester.processRequest();
+
+		MockPageParametersAware page = tester.getLastRenderedPage();
+		assertEquals("q_1_value", page.getLastQueryParameters().getParameterValue("q_1").toString());
+		assertEquals("q_2_value", page.getLastQueryParameters().getParameterValue("q_2").toString());
+	}
+
+	/**
+	 * Asserting that multiple parameters added in request and PageParameters get processed
+	 */
+	public void testSetMultiValueQueryParameter()
+	{
+		PageParameters parameters = new PageParameters();
+		parameters.add("q_1", "q_1_value_1");
+		parameters.add("q_1", "q_1_value_2");
+		IPageProvider testPageProvider = new PageProvider(MockPageParametersAware.class, parameters);
+		IRequestHandler pageRequestHandler = new BookmarkablePageRequestHandler(testPageProvider);
+		Url url = tester.getApplication().getRootRequestMapper().mapHandler(pageRequestHandler);
+		tester.getRequest().addParameter("q_2", "q_2_value_1");
+		tester.getRequest().addParameter("q_2", "q_2_value_2");
+		tester.getRequest().setUrl(url);
+
+		tester.processRequest();
+
+		MockPageParametersAware page = tester.getLastRenderedPage();
+		IRequestParameters lastQueryParameter = page.getLastQueryParameters();
+		List<StringValue> q1ParameterValues = lastQueryParameter.getParameterValues("q_1");
+		assertTrue(q1ParameterValues.contains(StringValue.valueOf("q_1_value_1")));
+		assertTrue(q1ParameterValues.contains(StringValue.valueOf("q_1_value_2")));
+		List<StringValue> q2ParameterValues = lastQueryParameter.getParameterValues("q_2");
+		assertTrue(q2ParameterValues.contains(StringValue.valueOf("q_2_value_1")));
+		assertTrue(q2ParameterValues.contains(StringValue.valueOf("q_2_value_2")));
+	}
+
+	/**
+	 * Asserting the parameters set by user in request get processed when submitting a form
+	 */
+	public void testParametersOnFormSubmit()
+	{
+		tester.startPage(MockPageParametersAware.class);
+
+		FormTester formTester = tester.newFormTester("form");
+		formTester.setValue("textfield", "v1");
+		tester.getRequest().getPostParameters().setParameterValue("p_1", "p_1_value");
+		tester.getRequest().setParameter("q_1", "q_1_value");
+
+		formTester.submit();
+
+		MockPageParametersAware page = tester.getLastRenderedPage();
+		assertEquals("v1", page.getLastPostParameters().getParameterValue("textfield").toString());
+		assertEquals("p_1_value", page.getLastPostParameters().getParameterValue("p_1").toString());
+		assertEquals("q_1_value", page.getLastQueryParameters().getParameterValue("q_1").toString());
+	}
+
+	/**
+	 * Asserting the parameters set by user on request get processed when submitting a form
+	 */
+	public void testMultiValueParametersOnFormSubmit()
+	{
+		tester.startPage(MockPageParametersAware.class);
+
+		FormTester formTester = tester.newFormTester("form");
+		formTester.setValue("textfield", "v1");
+		tester.getRequest().getPostParameters().setParameterValue("p_1", "p_1_value");
+		tester.getRequest().setParameter("q_1", "q_1_value");
+
+		formTester.submit();
+
+		MockPageParametersAware page = tester.getLastRenderedPage();
+		assertEquals("v1", page.getLastPostParameters().getParameterValue("textfield").toString());
+		assertEquals("p_1_value", page.getLastPostParameters().getParameterValue("p_1").toString());
+		assertEquals("q_1_value", page.getLastQueryParameters().getParameterValue("q_1").toString());
+	}
+
+	/**
 	 * Test that clickLink on a ResourceLink with a ResourceReference on it works.
 	 * 
 	 * <p>

Modified: wicket/trunk/wicket-util/src/main/java/org/apache/wicket/util/string/StringValue.java
URL: http://svn.apache.org/viewvc/wicket/trunk/wicket-util/src/main/java/org/apache/wicket/util/string/StringValue.java?rev=1054961&r1=1054960&r2=1054961&view=diff
==============================================================================
--- wicket/trunk/wicket-util/src/main/java/org/apache/wicket/util/string/StringValue.java (original)
+++ wicket/trunk/wicket-util/src/main/java/org/apache/wicket/util/string/StringValue.java Tue Jan  4 10:26:59 2011
@@ -23,6 +23,7 @@ import java.text.ParseException;
 import java.util.Locale;
 
 import org.apache.wicket.IClusterable;
+import org.apache.wicket.util.lang.Objects;
 import org.apache.wicket.util.time.Duration;
 import org.apache.wicket.util.time.Time;
 
@@ -751,4 +752,24 @@ public class StringValue implements IClu
 		return Strings.isEmpty(text);
 	}
 
+	@Override
+	public int hashCode()
+	{
+		return Objects.hashCode(locale, text);
+	}
+
+	@Override
+	public boolean equals(Object obj)
+	{
+		if (obj instanceof StringValue)
+		{
+			StringValue stringValue = (StringValue)obj;
+			return Objects.isEqual(text, stringValue.text) &&
+				Objects.isEqual(locale, stringValue.locale);
+		}
+		else
+		{
+			return false;
+		}
+	}
 }