package lt.inventi.wicket.test;
import java.io.IOException;
import java.io.InputStream;
import java.net.URL;
import java.util.Locale;
import java.util.Properties;
import org.apache.wicket.Component;
import org.apache.wicket.Page;
import org.apache.wicket.Session;
import org.apache.wicket.resource.XmlFilePropertiesLoader;
import org.apache.wicket.resource.loader.IStringResourceLoader;
import org.apache.wicket.resource.loader.PackageStringResourceLoader;
import org.apache.wicket.util.tester.DummyHomePage;
import org.apache.wicket.util.tester.WicketTester;
import org.junit.After;
import org.junit.Before;
/**
* Base test using Wicket's tester.
*
* @author vplatonov
* @author mjurkus
*
*/
public abstract class BaseNonInjectedTest {
protected WicketTester tester;
@Before
public void startTester() {
tester = new WicketTester() {
@Override
protected Page createPage() {
Page testPage = createTestPage();
return testPage == null ? super.createPage() : testPage;
}
};
tester.startPage(DummyHomePage.class);
tester.getApplication().getResourceSettings().getStringResourceLoaders().clear();
tester.getApplication().getResourceSettings().getStringResourceLoaders().add(new TestResourceLoader());
}
@After
public void destroyTester() {
tester.destroy();
}
/**
* Enable resource loading until next test. Should be used before render
* takes its place, after that its to late as resources will be in cache
* already
*/
protected void enableResourceLoading() {
Session.get().setLocale(new Locale("lt", "LT"));
tester.getApplication().getResourceSettings().getStringResourceLoaders().clear();
tester.getApplication().getResourceSettings().getStringResourceLoaders().add(new PackageStringResourceLoader());
}
protected Page createTestPage() {
return null;
}
public static class TestResourceLoader implements IStringResourceLoader {
private final Properties props;
public TestResourceLoader() {
URL url = getResource("test_properties.xml");
if (url == null) {
props = new Properties();
return;
}
InputStream is = null;
try {
is = url.openStream();
props = new XmlFilePropertiesLoader(".xml").loadJavaProperties(is);
} catch (IOException e) {
throw new RuntimeException(e);
} finally {
if (is != null) {
try {
is.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
@Override
public String loadStringResource(Class<?> clazz, String key, Locale locale, String style, String variation) {
return key;
}
@Override
public String loadStringResource(Component component, String key, Locale locale, String style, String variation) {
String prop = props.getProperty(key);
return prop == null ? key : prop;
}
}
private static URL getResource(String resourceName) {
return BaseNonInjectedTest.class.getClassLoader().getResource(resourceName);
}
}