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());
+       }
+}

Reply via email to