/* * 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.core.request.handler; import static org.hamcrest.Matchers.is; import java.io.IOException; import java.text.ParseException; import org.apache.wicket.MarkupContainer; import org.apache.wicket.Page; import org.apache.wicket.Session; import org.apache.wicket.WicketRuntimeException; import org.apache.wicket.ajax.AjaxRequestTarget; import org.apache.wicket.ajax.markup.html.AjaxLink; import org.apache.wicket.core.request.mapper.MountedMapper; import org.apache.wicket.markup.IMarkupFragment; import org.apache.wicket.markup.IMarkupResourceStreamProvider; import org.apache.wicket.markup.Markup; import org.apache.wicket.markup.html.WebPage; import org.apache.wicket.markup.html.link.Link; import org.apache.wicket.markup.html.link.StatelessLink; import org.apache.wicket.request.Url; import org.apache.wicket.request.mapper.parameter.PageParameters; import org.apache.wicket.resource.DummyPage; import org.apache.wicket.util.resource.IResourceStream; import org.apache.wicket.util.resource.ResourceStreamNotFoundException; import org.apache.wicket.util.resource.StringResourceStream; import org.apache.wicket.util.tester.WicketTestCase; import org.junit.Test; /** * Tests for {@link ListenerRequestHandler} */ public class ListenerRequestHandlerTest extends WicketTestCase { /** * WICKET-5466 */ @Test public void removedComponent() { // non-existing component on fresh page is ignored PageAndComponentProvider freshPage = new PageAndComponentProvider(DummyPage.class, null, "foo"); new ListenerRequestHandler(freshPage).respond(tester .getRequestCycle()); // non-existing component on old page fails PageAndComponentProvider oldPage = new PageAndComponentProvider(new DummyPage(), "foo"); try { new ListenerRequestHandler(oldPage) .respond(tester.getRequestCycle()); fail(); } catch (WicketRuntimeException ex) { assertEquals("Component 'foo' has been removed from page.", ex.getMessage()); } } /** * https://issues.apache.org/jira/browse/WICKET-4116 * * @throws Exception */ @Test public void recreateThePageWhenListenereInterfaceIsExecutedOnExpiredPage() throws Exception { tester.getApplication().mountPage("ajaxLink", AjaxLinkExpirePage.class); AjaxLinkExpirePage page = tester.startPage(AjaxLinkExpirePage.class); int initialPageId = page.getPageId(); Url urlToAjaxLink = tester.urlFor(page.link); Session session = tester.getSession(); session.clear(); // fire a request to the ajax link on the expired page executeAjaxUrlWithLastBaseUrl(urlToAjaxLink); Page lastRenderedPage = tester.getLastRenderedPage(); int lastRenderedPageId = lastRenderedPage.getPageId(); assertTrue("A new page must be create ", lastRenderedPageId > initialPageId); } private void executeAjaxUrlWithLastBaseUrl(Url url) throws IOException, ResourceStreamNotFoundException, ParseException { tester.getRequest().setUrl(url); tester.getRequest().addHeader("Wicket-Ajax-BaseURL", tester.getWicketAjaxBaseUrlEncodedInLastResponse()); tester.getRequest().addHeader("Wicket-Ajax", "true"); tester.processRequest(); } /** * Test page for #recreateThePageWhenListenereInterfaceIsExecutedOnExpiredPage() */ public static class AjaxLinkExpirePage extends WebPage implements IMarkupResourceStreamProvider { private static final long serialVersionUID = 1L; private AjaxLink<Void> link; /** * Constructor. */ public AjaxLinkExpirePage() { add(link = new AjaxLink<Void>("test") { private static final long serialVersionUID = 1L; @Override public void onClick(AjaxRequestTarget target) { System.err.println("clicked"); } }); } @Override public IResourceStream getMarkupResourceStream(MarkupContainer container, Class<?> containerClass) { return new StringResourceStream( "<html><body><a wicket:id='test'>Link</a></body></html>"); } } /** * Testcase for WICKET-4185 */ @Test public void isPageInstanceCreatedOnClassLinks() { PageAndComponentProvider provider = new PageAndComponentProvider(Page.class, "link"); ListenerRequestHandler handler = new ListenerRequestHandler(provider); assertFalse("Handler should not report a page instance is available ", handler.isPageInstanceCreated()); } @Test public void executeStatelessLinkInAFreshPage() { tester.startPage(StatelessPage.class); tester.clickLink("statelessLink"); StatelessPage page = (StatelessPage)tester.getLastRenderedPage(); assertThat(page.invoked, is(true)); assertThat(page.executedInAnFreshPage, is(true)); } @Test public void executeStatelessLinkInAFreshPageAtASegment() { tester.getApplication().getRootRequestMapperAsCompound() .add(new MountedMapper("/segment", TemporarilyStateful.class)); tester.startPage(TemporarilyStateful.class); tester.clickLink("statelessLink"); TemporarilyStateful page = (TemporarilyStateful)tester.getLastRenderedPage(); assertThat(page.invoked, is(true)); assertThat(page.executedInAnFreshPage, is(true)); } public static class StatelessPage extends WebPage { public boolean invoked; public boolean executedInAnFreshPage; private boolean initialState = true; public StatelessPage(PageParameters pageParameters) { super(pageParameters); add(new StatelessLink<Object>("statelessLink") { public void onClick() { invoked = true; executedInAnFreshPage = initialState; } }); } @Override public IMarkupFragment getMarkup() { return Markup.of( "<html><body><a wicket:id=\"statelessLink\"></a></body></html>"); } @Override protected void onBeforeRender() { initialState = false; super.onBeforeRender(); } } public static class TemporarilyStateful extends StatelessPage { public TemporarilyStateful(PageParameters pageParameters) { super(pageParameters); setStatelessHint(false); } @Override protected void onBeforeRender() { setStatelessHint(true); super.onBeforeRender(); } } }