WICKET-5068 PageParameters missing from re-created Page WICKET-5070 Optionally execute Callback Behavior on Re-construction after Expiry WICKET-5001 Recovery of bookmarkable Page after Session Expiry
Add unit tests Project: http://git-wip-us.apache.org/repos/asf/wicket/repo Commit: http://git-wip-us.apache.org/repos/asf/wicket/commit/565346ca Tree: http://git-wip-us.apache.org/repos/asf/wicket/tree/565346ca Diff: http://git-wip-us.apache.org/repos/asf/wicket/diff/565346ca Branch: refs/heads/master Commit: 565346ca9ac147b2360880f5147d016443f2197a Parents: a1f8626 Author: Martin Tzvetanov Grigorov <mgrigo...@apache.org> Authored: Mon Jan 13 18:37:48 2014 +0200 Committer: Martin Tzvetanov Grigorov <mgrigo...@apache.org> Committed: Mon Jan 13 18:37:48 2014 +0200 ---------------------------------------------------------------------- .../apache/wicket/settings/PageSettings.java | 2 +- .../wicket/util/tester/BaseWicketTester.java | 4 +- .../ExpirationRecoveryPage.html | 34 ++++ .../ExpirationRecoveryPage.java | 124 +++++++++++++ .../PageExpirationRecoveryTest.java | 176 +++++++++++++++++++ 5 files changed, 337 insertions(+), 3 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/wicket/blob/565346ca/wicket-core/src/main/java/org/apache/wicket/settings/PageSettings.java ---------------------------------------------------------------------- diff --git a/wicket-core/src/main/java/org/apache/wicket/settings/PageSettings.java b/wicket-core/src/main/java/org/apache/wicket/settings/PageSettings.java index 6096d1d..9fafe1d 100644 --- a/wicket-core/src/main/java/org/apache/wicket/settings/PageSettings.java +++ b/wicket-core/src/main/java/org/apache/wicket/settings/PageSettings.java @@ -124,7 +124,7 @@ public class PageSettings public boolean canCallListenerInterfaceAfterExpiry() { - return canCallListenerInterfaceAfterExpiry; + return recreateMountedPagesAfterExpiry && canCallListenerInterfaceAfterExpiry; } public void setCanCallListenerInterfaceAfterExpiry(boolean canCallListenerInterfaceAfterExpiry) http://git-wip-us.apache.org/repos/asf/wicket/blob/565346ca/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 1603d08..50678d5 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 @@ -1793,7 +1793,7 @@ public class BaseWicketTester } List<AjaxEventBehavior> behaviors = WicketTesterHelper.findAjaxEventBehaviors( - linkComponent, "onclick"); + linkComponent, "click"); for (AjaxEventBehavior behavior : behaviors) { executeBehavior(behavior); @@ -1805,7 +1805,7 @@ public class BaseWicketTester else if (linkComponent instanceof AjaxFallbackLink && isAjax) { List<AjaxEventBehavior> behaviors = WicketTesterHelper.findAjaxEventBehaviors( - linkComponent, "onclick"); + linkComponent, "click"); for (AjaxEventBehavior behavior : behaviors) { executeBehavior(behavior); http://git-wip-us.apache.org/repos/asf/wicket/blob/565346ca/wicket-core/src/test/java/org/apache/wicket/page/expirationrecovery/ExpirationRecoveryPage.html ---------------------------------------------------------------------- diff --git a/wicket-core/src/test/java/org/apache/wicket/page/expirationrecovery/ExpirationRecoveryPage.html b/wicket-core/src/test/java/org/apache/wicket/page/expirationrecovery/ExpirationRecoveryPage.html new file mode 100644 index 0000000..339a336 --- /dev/null +++ b/wicket-core/src/test/java/org/apache/wicket/page/expirationrecovery/ExpirationRecoveryPage.html @@ -0,0 +1,34 @@ +<!DOCTYPE html> +<html xmlns:wicket="http://wicket.apache.org"> +<head> + <meta charset="utf-8" /> + <title>Apache Wicket Quickstart</title> + <link href='http://fonts.googleapis.com/css?family=Yanone+Kaffeesatz:regular,bold' rel='stylesheet' type='text/css' /> + <link rel="stylesheet" href="style.css" type="text/css" media="screen" title="Stylesheet" /> +</head> +<body> +<div id="hd"> + <div id="logo"> + <img src="logo.png" width="50px" height="50px" alt="Wicket Logo" /> + <h1>Apache Wicket</h1> + </div> +</div> +<div id="bd"> + <h2>Congratulations!</h2> + + <form wicket:id="f"> + <input type="text" wicket:id="text"/> + <a wicket:id="sl">Submit link</a> + <a wicket:id="asl">Ajax Submit link</a> + </form> + + <br><br><br><br> + <a wicket:id="link">Link</a> + + <br><br><br><br> + <a wicket:id="alink">Ajax Link</a> +</div> +<div id="ft"> +</div> +</body> +</html> http://git-wip-us.apache.org/repos/asf/wicket/blob/565346ca/wicket-core/src/test/java/org/apache/wicket/page/expirationrecovery/ExpirationRecoveryPage.java ---------------------------------------------------------------------- diff --git a/wicket-core/src/test/java/org/apache/wicket/page/expirationrecovery/ExpirationRecoveryPage.java b/wicket-core/src/test/java/org/apache/wicket/page/expirationrecovery/ExpirationRecoveryPage.java new file mode 100644 index 0000000..889a69e --- /dev/null +++ b/wicket-core/src/test/java/org/apache/wicket/page/expirationrecovery/ExpirationRecoveryPage.java @@ -0,0 +1,124 @@ +/* + * 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.page.expirationrecovery; + +import java.util.concurrent.atomic.AtomicBoolean; + +import org.apache.wicket.Component; +import org.apache.wicket.ajax.AjaxRequestTarget; +import org.apache.wicket.ajax.markup.html.AjaxLink; +import org.apache.wicket.ajax.markup.html.form.AjaxSubmitLink; +import org.apache.wicket.markup.html.WebPage; +import org.apache.wicket.markup.html.form.Form; +import org.apache.wicket.markup.html.form.SubmitLink; +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.model.Model; +import org.apache.wicket.request.mapper.parameter.PageParameters; + +/** + * Test page for PageExpirationRecoveryTest + */ +public class ExpirationRecoveryPage extends WebPage +{ + final IModel<String> textModel = Model.of("texttt"); + final AtomicBoolean formSubmitted = new AtomicBoolean(false); + final AtomicBoolean submitLinkSubmitted = new AtomicBoolean(false); + // Execution of Ajax callbacks doesn't record the newly created page in + // org.apache.wicket.util.tester.BaseWicketTester.LastPageRecordingPageRendererProvider + // so we need to use static fields + static final AtomicBoolean ajaxSubmitLinkSubmitted = new AtomicBoolean(false); + static final AtomicBoolean ajaxLinkClicked = new AtomicBoolean(false); + final AtomicBoolean linkClicked = new AtomicBoolean(false); + + public ExpirationRecoveryPage(final PageParameters parameters) + { + super(parameters); + + Form f; + add(f = createForm("f"), createLink("link"), createAjaxLink("alink")); + + f.add(new TextField<>("text", textModel), createSubmitLink("sl"), createAjaxSubmitLink("asl")); + } + + private Form createForm(String id) + { + return new Form(id) + { + @Override + protected void onSubmit() + { + super.onSubmit(); + + formSubmitted.set(true); + } + }; + } + + private AjaxSubmitLink createAjaxSubmitLink(String id) + { + return new AjaxSubmitLink(id) + { + @Override + protected void onSubmit(AjaxRequestTarget target, Form<?> form) + { + super.onSubmit(target, form); + ajaxSubmitLinkSubmitted.set(true); + } + + }; + } + + private SubmitLink createSubmitLink(String id) + { + return new SubmitLink(id) + { + @Override + public void onSubmit() + { + super.onSubmit(); + submitLinkSubmitted.set(true); + } + + }; + } + + private Component createAjaxLink(String id) + { + return new AjaxLink<Void>(id) + { + @Override + public void onClick(AjaxRequestTarget target) + { + ajaxLinkClicked.set(true); + } + }; + } + + private Link<Void> createLink(String id) + { + return new Link<Void>(id) + { + @Override + public void onClick() + { + linkClicked.set(true); + } + }; + } +} http://git-wip-us.apache.org/repos/asf/wicket/blob/565346ca/wicket-core/src/test/java/org/apache/wicket/page/expirationrecovery/PageExpirationRecoveryTest.java ---------------------------------------------------------------------- diff --git a/wicket-core/src/test/java/org/apache/wicket/page/expirationrecovery/PageExpirationRecoveryTest.java b/wicket-core/src/test/java/org/apache/wicket/page/expirationrecovery/PageExpirationRecoveryTest.java new file mode 100644 index 0000000..ef929fae --- /dev/null +++ b/wicket-core/src/test/java/org/apache/wicket/page/expirationrecovery/PageExpirationRecoveryTest.java @@ -0,0 +1,176 @@ +/* + * 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.page.expirationrecovery; + +import org.apache.wicket.WicketTestCase; +import org.apache.wicket.protocol.http.PageExpiredException; +import org.apache.wicket.request.mapper.parameter.PageParameters; +import org.apache.wicket.settings.PageSettings; +import org.apache.wicket.util.tester.FormTester; +import org.junit.Before; +import org.junit.Test; + +/** + * Tests for + * WICKET-5068 PageParameters missing from re-created Page + * WICKET-5070 Optionally execute Callback Behavior on Re-construction after Expiry + * WICKET-5001 Recovery of bookmarkable Page after Session Expiry + */ +public class PageExpirationRecoveryTest extends WicketTestCase +{ + + private final PageParameters parameters = new PageParameters().set("a", "b").set("c", "d"); + + @Before + public void before() + { + tester.getApplication().mountPage("under/test", ExpirationRecoveryPage.class); + + // Execution of Ajax callbacks doesn't record the newly created page in + // org.apache.wicket.util.tester.BaseWicketTester.LastPageRecordingPageRendererProvider + // so we need to use static fields + ExpirationRecoveryPage.ajaxLinkClicked.set(false); + ExpirationRecoveryPage.ajaxSubmitLinkSubmitted.set(false); + } + + @Test(expected = PageExpiredException.class) + public void cannotRecreatePageShouldThrowPEE() + { + PageSettings pageSettings = tester.getApplication().getPageSettings(); + pageSettings.setRecreateMountedPagesAfterExpiry(false); // CANNOT recreate + + ExpirationRecoveryPage page = tester.startPage(ExpirationRecoveryPage.class, parameters); + assertEquals(parameters, page.getPageParameters()); + + tester.getSession().invalidateNow(); + + assertFalse(page.linkClicked.get()); + tester.clickLink("link", false); // leads to PageExpiredException + } + + @Test + public void cannotExecuteListenerInterface() + { + PageSettings pageSettings = tester.getApplication().getPageSettings(); + pageSettings.setRecreateMountedPagesAfterExpiry(true); // CAN recreate + pageSettings.setCanCallListenerInterfaceAfterExpiry(false); // CANNOT execute listener interfaces + + ExpirationRecoveryPage page = tester.startPage(ExpirationRecoveryPage.class, parameters); + assertEquals(parameters, page.getPageParameters()); + + + tester.getSession().invalidateNow(); + assertFalse(page.linkClicked.get()); + tester.clickLink("link", false); + page = (ExpirationRecoveryPage) tester.getLastRenderedPage(); + // the page is properly recreated + assertEquals("PageParameters should be preserved", parameters, page.getPageParameters()); + // but the listener interface is not executed + assertFalse("Link should not be clicked!", page.linkClicked.get()); + + + tester.getSession().invalidateNow(); + assertFalse(page.ajaxLinkClicked.get()); + tester.clickLink("alink", true); + page = (ExpirationRecoveryPage) tester.getLastRenderedPage(); + assertFalse("AjaxLink should not be clicked!", page.ajaxLinkClicked.get()); + assertEquals("PageParameters should be preserved", parameters, page.getPageParameters()); + + + tester.getSession().invalidateNow(); + assertFalse(page.submitLinkSubmitted.get()); + tester.clickLink("f:sl", false); + page = (ExpirationRecoveryPage) tester.getLastRenderedPage(); + assertFalse("SubmitLink should not be submitted!", page.submitLinkSubmitted.get()); + assertEquals("PageParameters should be preserved", parameters, page.getPageParameters()); + + + tester.getSession().invalidateNow(); + assertFalse(page.ajaxSubmitLinkSubmitted.get()); + tester.clickLink("f:asl", true); + page = (ExpirationRecoveryPage) tester.getLastRenderedPage(); + assertFalse("AjaxSubmitLink should not be submitted", page.ajaxSubmitLinkSubmitted.get()); + assertEquals("PageParameters should be preserved", parameters, page.getPageParameters()); + + + tester.getSession().invalidateNow(); + assertFalse(page.formSubmitted.get()); + String textOldValue = page.textModel.getObject(); + FormTester formTester = tester.newFormTester("f"); + formTester.setValue("text", "newValue"); + formTester.submit(); + page = (ExpirationRecoveryPage) tester.getLastRenderedPage(); + assertFalse("Form should not be submitted", page.formSubmitted.get()); + assertEquals("TextField's value should not be modified", textOldValue, page.textModel.getObject()); + assertEquals("PageParameters should be preserved", parameters, page.getPageParameters()); + } + + @Test + public void canExecuteListenerInterface() + { + PageSettings pageSettings = tester.getApplication().getPageSettings(); + pageSettings.setCanCallListenerInterfaceAfterExpiry(true); + pageSettings.setRecreateMountedPagesAfterExpiry(true); + + ExpirationRecoveryPage page = tester.startPage(ExpirationRecoveryPage.class, parameters); + assertEquals(parameters, page.getPageParameters()); + + + tester.getSession().invalidateNow(); + assertFalse(page.linkClicked.get()); + tester.clickLink("link", false); + page = (ExpirationRecoveryPage) tester.getLastRenderedPage(); + assertTrue("Link should be clicked!", page.linkClicked.get()); + assertEquals("PageParameters should be preserved", parameters, page.getPageParameters()); + + + tester.getSession().invalidateNow(); + assertFalse(page.ajaxLinkClicked.get()); + tester.clickLink("alink", true); + page = (ExpirationRecoveryPage) tester.getLastRenderedPage(); + assertTrue("AjaxLink should be clicked!", page.ajaxLinkClicked.get()); + assertEquals("PageParameters should be preserved", parameters, page.getPageParameters()); + + + tester.getSession().invalidateNow(); + assertFalse(page.formSubmitted.get()); + FormTester formTester = tester.newFormTester("f"); + String newValue = "newValue"; + formTester.setValue("text", newValue); + formTester.submit(); + page = (ExpirationRecoveryPage) tester.getLastRenderedPage(); + assertTrue("Form should be submitted", page.formSubmitted.get()); + assertEquals("TextField's value should be modified", newValue, page.textModel.getObject()); + assertEquals("PageParameters should be preserved", parameters, page.getPageParameters()); + + + tester.getSession().invalidateNow(); + assertFalse(page.submitLinkSubmitted.get()); + tester.clickLink("f:sl", false); + page = (ExpirationRecoveryPage) tester.getLastRenderedPage(); + assertTrue("SubmitLink should be submitted!", page.submitLinkSubmitted.get()); + assertEquals("PageParameters should be preserved", parameters, page.getPageParameters()); + + + tester.getSession().invalidateNow(); + assertFalse(page.ajaxSubmitLinkSubmitted.get()); + tester.clickLink("f:asl", true); + page = (ExpirationRecoveryPage) tester.getLastRenderedPage(); + assertTrue("AjaxSubmitLink should be submitted", page.ajaxSubmitLinkSubmitted.get()); + assertEquals("PageParameters should be preserved", parameters, page.getPageParameters()); + } +}