Updated Branches: refs/heads/wicket-1.5.x 8b32c3d62 -> 0c7903420
WICKET-4558 WicketTester shouldn't fail on external redirects Project: http://git-wip-us.apache.org/repos/asf/wicket/repo Commit: http://git-wip-us.apache.org/repos/asf/wicket/commit/0c790342 Tree: http://git-wip-us.apache.org/repos/asf/wicket/tree/0c790342 Diff: http://git-wip-us.apache.org/repos/asf/wicket/diff/0c790342 Branch: refs/heads/wicket-1.5.x Commit: 0c790342081abedc3677c3a5bd258664ebb96f88 Parents: 8b32c3d Author: Carl-Eric Menzel <[email protected]> Authored: Mon May 14 17:54:20 2012 +0200 Committer: Carl-Eric Menzel <[email protected]> Committed: Mon May 14 17:54:20 2012 +0200 ---------------------------------------------------------------------- .../wicket/util/tester/BaseWicketTester.java | 84 +++++++++---- .../apache/wicket/util/tester/WicketTester.java | 17 ++- .../wicket/util/tester/WicketTesterTest.java | 96 ++++++++++++--- 3 files changed, 152 insertions(+), 45 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/wicket/blob/0c790342/wicket-core/src/main/java/org/apache/wicket/util/tester/BaseWicketTester.java ---------------------------------------------------------------------- diff --git a/wicket-core/src/main/java/org/apache/wicket/util/tester/BaseWicketTester.java b/wicket-core/src/main/java/org/apache/wicket/util/tester/BaseWicketTester.java index 3ee10e2..2ab8058 100644 --- a/wicket-core/src/main/java/org/apache/wicket/util/tester/BaseWicketTester.java +++ b/wicket-core/src/main/java/org/apache/wicket/util/tester/BaseWicketTester.java @@ -16,8 +16,7 @@ */ package org.apache.wicket.util.tester; -import static junit.framework.Assert.assertNotNull; -import static junit.framework.Assert.fail; +import static junit.framework.Assert.*; import java.io.IOException; import java.io.Serializable; @@ -33,7 +32,6 @@ import java.util.List; import java.util.Map; import java.util.Set; import java.util.UUID; -import java.util.regex.Matcher; import java.util.regex.Pattern; import javax.servlet.FilterConfig; @@ -662,6 +660,14 @@ public class BaseWicketTester Url newUrl = Url.parse(lastResponse.getRedirectLocation(), Charset.forName(request.getCharacterEncoding())); + if (isExternalRedirect(lastRequest.getUrl(), newUrl)) + { + // we can't handle external redirects here + // just bail out here and let the user's test code + // check #assertRedirectUrl + return true; + } + if (newUrl.isAbsolute()) { request.setUrl(newUrl); @@ -708,6 +714,35 @@ public class BaseWicketTester } /** + * Determine whether a given response contains a redirect leading to an external site (which + * cannot be replicated in WicketTester). This is done by comparing the previous request's + * hostname with the hostname given in the redirect. + * + * @param requestUrl + * request... + * @param newUrl + * ...and the redirect generated in its response + * @return true if there is a redirect and it is external, false otherwise + */ + private boolean isExternalRedirect(Url requestUrl, Url newUrl) + { + String originalHost = requestUrl.getHost(); + String redirectHost = newUrl.getHost(); + if (originalHost == redirectHost) + { + return false; // identical or both null + } + else if (redirectHost == null) + { + return false; // no new host + } + else + { + return !(redirectHost.equals(originalHost)); + } + } + + /** * Allows to set Request header value any time. They'll be applied (add/modify) on process * execution {@link #processRequest(MockHttpServletRequest, IRequestHandler, boolean)}. They are * reset immediately after and thus are not re-used for a sequence of requests. @@ -1266,10 +1301,10 @@ public class BaseWicketTester * Process a component. A web page will be automatically created with the markup created in * {@link #createPageMarkup(String)}. * <p> - * <strong>Note</strong>: the instantiated component will have an auto-generated id. To - * reach any of its children use their relative path to the component itself. For example - * if the started component has a child a Link component with id "link" then after starting - * the component you can click it with: <code>tester.clickLink("link")</code> + * <strong>Note</strong>: the instantiated component will have an auto-generated id. To reach + * any of its children use their relative path to the component itself. For example if the + * started component has a child a Link component with id "link" then after starting the + * component you can click it with: <code>tester.clickLink("link")</code> * </p> * * @param <C> @@ -1289,10 +1324,10 @@ public class BaseWicketTester * provided. In case pageMarkup is null, the markup will be automatically created with * {@link #createPageMarkup(String)}. * <p> - * <strong>Note</strong>: the instantiated component will have an auto-generated id. To - * reach any of its children use their relative path to the component itself. For example - * if the started component has a child a Link component with id "link" then after starting - * the component you can click it with: <code>tester.clickLink("link")</code> + * <strong>Note</strong>: the instantiated component will have an auto-generated id. To reach + * any of its children use their relative path to the component itself. For example if the + * started component has a child a Link component with id "link" then after starting the + * component you can click it with: <code>tester.clickLink("link")</code> * </p> * * @param <C> @@ -1322,7 +1357,8 @@ public class BaseWicketTester catch (Exception e) { log.error(e.getMessage(), e); - fail(String.format("Cannot instantiate component with type '%s' because of '%s'", componentClass.getName(), e.getMessage())); + fail(String.format("Cannot instantiate component with type '%s' because of '%s'", + componentClass.getName(), e.getMessage())); } // process the component @@ -1333,10 +1369,10 @@ public class BaseWicketTester * Process a component. A web page will be automatically created with markup created by the * {@link #createPageMarkup(String)}. * <p> - * <strong>Note</strong>: the component id is set by the user. To - * reach any of its children use this id + their relative path to the component itself. For example - * if the started component has id <em>compId</em> and a Link child component component with id "link" - * then after starting the component you can click it with: <code>tester.clickLink("compId:link")</code> + * <strong>Note</strong>: the component id is set by the user. To reach any of its children use + * this id + their relative path to the component itself. For example if the started component + * has id <em>compId</em> and a Link child component component with id "link" then after + * starting the component you can click it with: <code>tester.clickLink("compId:link")</code> * </p> * * @param <C> @@ -1356,10 +1392,10 @@ public class BaseWicketTester * provided. In case {@code pageMarkup} is null, the markup will be automatically created with * {@link #createPageMarkup(String)}. * <p> - * <strong>Note</strong>: the component id is set by the user. To - * reach any of its children use this id + their relative path to the component itself. For example - * if the started component has id <em>compId</em> and a Link child component component with id "link" - * then after starting the component you can click it with: <code>tester.clickLink("compId:link")</code> + * <strong>Note</strong>: the component id is set by the user. To reach any of its children use + * this id + their relative path to the component itself. For example if the started component + * has id <em>compId</em> and a Link child component component with id "link" then after + * starting the component you can click it with: <code>tester.clickLink("compId:link")</code> * </p> * * @param <C> @@ -1546,7 +1582,7 @@ public class BaseWicketTester String componentIdPageId = componentInPage.component.getId() + ':'; if (path.startsWith(componentIdPageId) == false) { - path = componentIdPageId + path; + path = componentIdPageId + path; } } @@ -2129,8 +2165,8 @@ public class BaseWicketTester /** * Tests that a <code>Component</code> has been added to a <code>AjaxRequestTarget</code>, using - * {@link AjaxRequestTarget#add(org.apache.wicket.Component...)}. This method actually tests that a - * <code>Component</code> is on the Ajax response sent back to the client. + * {@link AjaxRequestTarget#add(org.apache.wicket.Component...)}. This method actually tests + * that a <code>Component</code> is on the Ajax response sent back to the client. * <p> * PLEASE NOTE! This method doesn't actually insert the <code>Component</code> in the client DOM * tree, using JavaScript. But it shouldn't be needed because you have to trust that the Wicket @@ -2215,7 +2251,7 @@ public class BaseWicketTester * Simulates the firing of all ajax timer behaviors on the page * * @param page - * the page which timers will be executed + * the page which timers will be executed */ public void executeAllTimerBehaviors(final MarkupContainer page) { http://git-wip-us.apache.org/repos/asf/wicket/blob/0c790342/wicket-core/src/main/java/org/apache/wicket/util/tester/WicketTester.java ---------------------------------------------------------------------- diff --git a/wicket-core/src/main/java/org/apache/wicket/util/tester/WicketTester.java b/wicket-core/src/main/java/org/apache/wicket/util/tester/WicketTester.java index 01c70b8..c4098de 100644 --- a/wicket-core/src/main/java/org/apache/wicket/util/tester/WicketTester.java +++ b/wicket-core/src/main/java/org/apache/wicket/util/tester/WicketTester.java @@ -16,10 +16,7 @@ */ package org.apache.wicket.util.tester; -import static junit.framework.Assert.assertEquals; -import static junit.framework.Assert.assertNotNull; -import static junit.framework.Assert.assertTrue; -import static junit.framework.Assert.fail; +import static junit.framework.Assert.*; import java.io.Serializable; import java.util.ArrayList; @@ -733,6 +730,18 @@ public class WicketTester extends BaseWicketTester } /** + * Assert that the last request redirected to the given Url. + * + * @param expectedRedirectUrl + * expected + */ + public void assertRedirectUrl(String expectedRedirectUrl) + { + String actualRedirectUrl = getLastResponse().getRedirectLocation(); + assertEquals(expectedRedirectUrl, actualRedirectUrl); + } + + /** * Returns the current Maven build directory taken from the <tt>basedir</tt> system property, or * null if not set * http://git-wip-us.apache.org/repos/asf/wicket/blob/0c790342/wicket-core/src/test/java/org/apache/wicket/util/tester/WicketTesterTest.java ---------------------------------------------------------------------- diff --git a/wicket-core/src/test/java/org/apache/wicket/util/tester/WicketTesterTest.java b/wicket-core/src/test/java/org/apache/wicket/util/tester/WicketTesterTest.java index 729ed9f..f3657e0 100644 --- a/wicket-core/src/test/java/org/apache/wicket/util/tester/WicketTesterTest.java +++ b/wicket-core/src/test/java/org/apache/wicket/util/tester/WicketTesterTest.java @@ -53,6 +53,7 @@ import org.apache.wicket.request.IRequestHandler; import org.apache.wicket.request.IRequestParameters; import org.apache.wicket.request.Url; import org.apache.wicket.request.component.IRequestableComponent; +import org.apache.wicket.request.flow.RedirectToUrlException; import org.apache.wicket.request.handler.BookmarkablePageRequestHandler; import org.apache.wicket.request.handler.IPageProvider; import org.apache.wicket.request.handler.PageProvider; @@ -450,7 +451,7 @@ public class WicketTesterTest extends WicketTestCase } /** - * + * */ @Test public void assertComponentOnAjaxResponse() @@ -684,7 +685,7 @@ public class WicketTesterTest extends WicketTestCase } /** - * + * */ @Test public void submittingFormWithAjaxEventSubmitsFormValues() @@ -701,7 +702,7 @@ public class WicketTesterTest extends WicketTestCase } /** - * + * */ @Test public void redirectWithPageParameters() @@ -832,7 +833,8 @@ public class WicketTesterTest extends WicketTestCase @Test(expected = PackageResourceBlockedException.class) public void loadPageMarkupTemplate() { - String url = "wicket/resource/"+BlockedResourceLinkPage.class.getName()+"/"+BlockedResourceLinkPage.class.getSimpleName()+".html"; + String url = "wicket/resource/" + BlockedResourceLinkPage.class.getName() + "/" + + BlockedResourceLinkPage.class.getSimpleName() + ".html"; tester.executeUrl(url); } @@ -842,21 +844,23 @@ public class WicketTesterTest extends WicketTestCase @Test public void loadNonPageMarkupTemplate() { - String url = "wicket/resource/"+BlockedResourceLinkPage.class.getName()+"/test.html"; + String url = "wicket/resource/" + BlockedResourceLinkPage.class.getName() + "/test.html"; tester.executeUrl(url); assertEquals("This is a test!\n", tester.getLastResponseAsString()); } /** - * Comma separated extensions should not be allowed. - * The result is kinda error code 404 (resource not found) + * Comma separated extensions should not be allowed. The result is kinda error code 404 + * (resource not found) */ @Test public void clickResourceLinkWithSomeCommaAppendedUrl() { - String url = "wicket/resource/"+BlockedResourceLinkPage.class.getName()+"/"+BlockedResourceLinkPage.class.getSimpleName()+".html,xml"; + String url = "wicket/resource/" + BlockedResourceLinkPage.class.getName() + "/" + + BlockedResourceLinkPage.class.getSimpleName() + ".html,xml"; tester.executeUrl(url); - assertNull("Comma separated extensions are not supported and wont find any resource", tester.getLastResponse()); + assertNull("Comma separated extensions are not supported and wont find any resource", + tester.getLastResponse()); } /** @@ -895,7 +899,7 @@ public class WicketTesterTest extends WicketTestCase } /** - * + * */ @Test public void cookieIsFoundWhenAddedToRequest() @@ -905,7 +909,7 @@ public class WicketTesterTest extends WicketTestCase } /** - * + * */ @Test public void cookieIsFoundWhenAddedToResponse() @@ -917,7 +921,7 @@ public class WicketTesterTest extends WicketTestCase } /** - * + * */ @Test public void cookieIsFoundOnNextRequestWhenAddedToResponse() @@ -1152,7 +1156,7 @@ public class WicketTesterTest extends WicketTestCase /** * https://issues.apache.org/jira/browse/WICKET-4437 - * + * * Clicking on ResourceLink should deliver the resource content */ @Test @@ -1160,7 +1164,8 @@ public class WicketTesterTest extends WicketTestCase { MockPageWithLink page = new MockPageWithLink(); String content = "content"; - ByteArrayResource resource = new ByteArrayResource("text/plain", content.getBytes(), "fileName.txt"); + ByteArrayResource resource = new ByteArrayResource("text/plain", content.getBytes(), + "fileName.txt"); ResourceLink<Void> link = new ResourceLink<Void>(MockPageWithLink.LINK_ID, resource); page.add(link); tester.startPage(page); @@ -1171,9 +1176,9 @@ public class WicketTesterTest extends WicketTestCase /** * https://issues.apache.org/jira/browse/WICKET-4507 - * - * When WicketTester#startComponentInPage() is used then #getLastResponseAsString() - * should return only the component's markup, without the autogenerated markup for the page + * + * When WicketTester#startComponentInPage() is used then #getLastResponseAsString() should + * return only the component's markup, without the autogenerated markup for the page */ @Test public void renderOnlyComponentsMarkup() @@ -1193,4 +1198,61 @@ public class WicketTesterTest extends WicketTestCase assertEquals("<span wicket:id=\"label\" test=\"123\">content</span>", tester.getLastResponseAsString()); } + + @Test + public void catchExternalRedirect() throws Exception + { + class RedirectPage extends WebPage + { + @Override + protected void onConfigure() + { + throw new RedirectToUrlException( + "https://issues.apache.org/jira/browse/WICKET-4558"); + } + } + tester.startPage(new RedirectPage()); + tester.assertRedirectUrl("https://issues.apache.org/jira/browse/WICKET-4558"); + } + + @Test + public void catchExternalRedirectFailure() throws Exception + { + class RedirectPage extends WebPage + { + @Override + protected void onConfigure() + { + throw new RedirectToUrlException("http://some.url/"); + } + } + tester.startPage(new RedirectPage()); + boolean caught; + try + { + tester.assertRedirectUrl("http://this.did.not.happen"); + caught = false; + } + catch (AssertionFailedError e) + { + caught = true; + } + assertTrue(caught); + } + + @Test + public void dontCatchInternalRedirect() throws Exception + { + class RedirectPage extends WebPage + { + @Override + protected void onConfigure() + { + throw new RedirectToUrlException("wicket/bookmarkable/" + + CreateBook.class.getName()); + } + } + tester.startPage(new RedirectPage()); + tester.assertRenderedPage(CreateBook.class); + } }
