blob: ca59d80536b1d0b5936af19dc03d89f76f172e83 [file] [log] [blame]
/*
* 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 java.util.concurrent.atomic.AtomicBoolean;
import org.apache.wicket.ajax.AjaxEventBehavior;
import org.apache.wicket.behavior.Behavior;
import org.apache.wicket.markup.html.WebComponent;
import org.apache.wicket.markup.html.link.Link;
import org.apache.wicket.model.IModel;
import org.apache.wicket.model.Model;
import org.apache.wicket.util.tester.WicketTestCase;
import org.junit.Test;
/**
* Test for ajax handler.
*
* @author Juergen Donnerstag
*/
public class ComponentTest extends WicketTestCase
{
/**
* Tests the number of detach calls on a Page, Component, Behavior and Model during a normal
* request.
*
* @throws Exception
*/
@Test
public void detachPage() throws Exception
{
executeTest(TestDetachPage.class, "TestDetachPageExpectedResult.html");
TestDetachPage page = (TestDetachPage)tester.getLastRenderedPage();
assertTrue(page.getNrComponentDetachModelCalls() > 0);
assertTrue(page.getNrComponentDetachModelsCalls() > 0);
assertTrue(page.getNrComponentOnDetachCalls() > 0);
assertTrue(page.getNrPageDetachModelCalls() > 0);
assertTrue(page.getNrPageDetachModelsCalls() > 0);
assertTrue(page.getNrPageOnDetachCalls() > 0);
assertTrue(page.getNrModelDetachCalls() > 0);
assertTrue(page.getNrAjaxBehaviorDetachModelCalls() > 0);
}
/**
* Tests the number of detach calls on a Page, Component, Behavior and Model during an Ajax
* request.
*
* @throws Exception
*/
@Test
public void detachPageAjaxRequest() throws Exception
{
executeTest(TestDetachPage.class, "TestDetachPageExpectedResult.html");
TestDetachPage page = (TestDetachPage)tester.getLastRenderedPage();
assertTrue(page.getNrComponentDetachModelCalls() > 0);
assertTrue(page.getNrComponentDetachModelsCalls() > 0);
assertTrue(page.getNrComponentOnDetachCalls() > 0);
assertTrue(page.getNrPageDetachModelCalls() > 0);
assertTrue(page.getNrPageDetachModelsCalls() > 0);
assertTrue(page.getNrPageOnDetachCalls() > 0);
assertTrue(page.getNrModelDetachCalls() > 0);
assertTrue(page.getNrAjaxBehaviorDetachModelCalls() > 0);
AjaxEventBehavior behavior = page.getAjaxBehavior();
executeBehavior(behavior, "TestDetachPageAjaxResult.html");
assertTrue(1 <= page.getNrComponentDetachModelCalls());
assertTrue(1 <= page.getNrComponentDetachModelsCalls());
assertTrue(1 <= page.getNrComponentOnDetachCalls());
assertTrue(1 <= page.getNrPageDetachModelCalls());
assertTrue(1 <= page.getNrPageDetachModelsCalls());
assertTrue(1 <= page.getNrPageOnDetachCalls());
assertTrue(1 <= page.getNrModelDetachCalls());
assertTrue(1 <= page.getNrAjaxBehaviorDetachModelCalls());
}
/**
* @throws Exception
*/
@Test
public void renderHomePage_1() throws Exception
{
executeTest(TestPage_1.class, "TestPageExpectedResult_1.html");
}
/**
* https://issues.apache.org/jira/browse/WICKET-4468
*
* Verifies that a stateful component can pretend to be stateless if both conditions are
* fulfilled:
* <ol>
* <li>it is either invisible or disabled (or both)</li>
* <li>it cannot call any listener interface method while invisible/disabled</li>
* </ol>
*/
@Test
public void isStateless()
{
Behavior statefulBehavior = new Behavior()
{
@Override
public boolean getStatelessHint(Component component)
{
return false;
}
};
WebComponent component = new WebComponent("someId");
// by default every component is stateless
assertTrue(component.isStateless());
// make the component stateful
component.add(statefulBehavior);
assertFalse(component.isStateless());
// invisible component cannot be requested by default so it
// can pretend being stateless
component.setVisible(false);
assertTrue(component.isStateless());
// same for disabled component
component.setVisible(true).setEnabled(false);
assertTrue(component.isStateless());
// make the component such that it can call listener interface
// methods no matter whether it is visible or enabled
component = new WebComponent("someId") {
@Override
public boolean canCallListenerInterface()
{
return true;
}
};
component.add(statefulBehavior);
component.setVisible(false);
assertFalse(component.isStateless());
// do the same set of tests on a component that is stateful "by itself"
// rather than from a behavior
Link<Void> link = new Link<Void>("someId") {
@Override
public void onClick()
{
}
};
// Links are stateful by default
assertFalse(link.isStateless());
//make the link invisible
link.setVisible(false);
// invisible link cannot be requested by default so it
// can pretend being stateless
assertTrue(link.isStateless());
// same for disabled link
link.setVisible(true).setEnabled(false);
assertTrue(link.isStateless());
// make the link such that it can call listener interface
// methods no matter whether it is visible or enabled
link = new Link<Void>("someId") {
@Override
public boolean canCallListenerInterface() {
return true;
}
@Override
public void onClick() {
}
};
link.setVisible(false);
assertFalse(link.isStateless());
}
/**
* https://issues.apache.org/jira/browse/WICKET-4483
*
* setDefaultModel() should call modelChanging/modelChanged only if the new model
* is different that the old one. The same as setDefaultModelObject().
*/
@Test
public void modelChange()
{
final AtomicBoolean modelChanging = new AtomicBoolean(false);
final AtomicBoolean modelChanged = new AtomicBoolean(false);
WebComponent component = new WebComponent("someId")
{
@Override
protected void onModelChanging()
{
super.onModelChanging();
modelChanging.set(true);
}
@Override
protected void onModelChanged()
{
super.onModelChanged();
modelChanged.set(true);
}
};
assertNull(component.getDefaultModel());
IModel<Integer> model = Model.of(1);
// set a model which is different that the old one (old = null, new = non-null)
component.setDefaultModel(model);
assertTrue(modelChanging.getAndSet(false));
assertTrue(modelChanged.getAndSet(false));
// set the same instance - no change notifications should happen
component.setDefaultModel(model);
assertFalse(modelChanging.get());
assertFalse(modelChanged.get());
}
@Test
public void pageIsInitiallyStateless()
{
FlagReserved5Component component = new FlagReserved5Component("test");
assertTrue(component.getFlagReserved5());
}
/**
* Component#FLAG_RESERVED5 (Page's STATELESS_HINT) must be initially set to true
*/
private static class FlagReserved5Component extends Component
{
public FlagReserved5Component(final String id) {
super(id);
}
private boolean getFlagReserved5()
{
return getFlag(FLAG_RESERVED5);
}
@Override
protected void onRender() {
}
}
}