/*
* Copyright 2008 Stichting JoiningTracks, The Netherlands
* Licensed 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.security.examples.springsecurity;
import java.io.File;
import java.util.Locale;
import junit.framework.TestCase;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.apache.wicket.protocol.http.WebApplication;
import org.apache.wicket.security.WaspSession;
import org.apache.wicket.security.examples.springsecurity.security.MockLoginPage;
import org.apache.wicket.security.examples.springsecurity.security.SpringSecureLoginContext;
import org.apache.wicket.security.hive.HiveMind;
import org.apache.wicket.util.tester.FormTester;
import org.apache.wicket.util.tester.WicketTester;
/**
* Abstract base page for testing wicket pages based on the ACEGI security setup. This
* base creates the WicketTester as a mock, usable by the testpages that extend this page.
* <p/>
* Two convenience methods are available to login and logoff
*
* @author Olger Warnier
*/
public abstract class AbstractSecureTestPage extends TestCase
{
private static final Log log = LogFactory.getLog(AbstractSecureTestPage.class);
/**
* The swarm application used for the test.
*/
protected WebApplication application;
/**
* Handle to the mock environment.
*/
protected WicketTester mock;
/**
* @see junit.framework.TestCase#setUp()
*/
@Override
protected void setUp() throws Exception
{
Locale.setDefault(Locale.UK);
String webAppLocation;
File currentDir = new File(".");
log.debug("CurrentDir:" + currentDir.getCanonicalPath());
if (currentDir.getCanonicalPath().endsWith("examples/spring-security"))
{
webAppLocation = "src/main/webapp";
}
else
{
webAppLocation = "examples/spring-security/src/main/webapp";
}
log.debug("start the testapplication with location: " + webAppLocation);
application = new SpringSecureWicketTestApplication();
mock = new WicketTester(application, webAppLocation);
}
/**
* @see junit.framework.TestCase#tearDown()
*/
@Override
protected void tearDown()
{
mock.setupRequestAndResponse();
mock.getWicketSession().invalidate();
mock.processRequestCycle();
mock.destroy();
mock = null;
application = null;
HiveMind.unregisterHive("test");
}
/**
* Convenience method to login to the application, mostly required as the whole is
* protected by ACEGI and Swarm The test structure makes us of the ACEGI
* TestingAuthentication provider, meaning that you can pass on any username (the
* password is the same).
* <p/>
* The user 'medical' has an additional role 'ROLE_MEDICAL'. All other users have
* 'ROLE_USER'
*
* @param userName
*/
protected void loginToApp(String userName)
{
mock.startPage(MockLoginPage.class);
mock.assertRenderedPage(MockLoginPage.class);
FormTester form = mock.newFormTester("form");
form.setValue("username", userName);
form.submit();
mock.assertRenderedPage(HomePage.class);
mock.processRequestCycle();
}
/**
* Convenience method to logout of the application.
*/
protected void logoutOfApp()
{
assertTrue(((WaspSession) mock.getWicketSession()).logoff(new SpringSecureLoginContext()));
mock.startPage(HomePage.class);
mock.assertRenderedPage(HomePage.class);
mock.processRequestCycle();
}
}