/* vim: set ts=2 et sw=2 cindent fo=qroca: */
package com.globant.katari.core.sitemesh;
import java.io.File;
import java.io.FileReader;
import java.util.Hashtable;
import javax.servlet.ServletConfig;
import javax.servlet.ServletException;
import org.springframework.context.MessageSource;
import org.springframework.mock.web.MockHttpServletRequest;
import org.springframework.mock.web.MockHttpServletResponse;
import org.springframework.mock.web.MockServletConfig;
import org.springframework.mock.web.MockServletContext;
import org.springframework.web.context.WebApplicationContext;
import org.springframework.web.context.support.GenericWebApplicationContext;
import org.springframework.web.servlet.view.AbstractTemplateView;
import org.junit.Test;
import static org.junit.Assert.*;
import static org.hamcrest.CoreMatchers.*;
import freemarker.cache.TemplateLoader;
import freemarker.cache.MultiTemplateLoader;
import freemarker.cache.ClassTemplateLoader;
import freemarker.cache.FileTemplateLoader;
import freemarker.cache.WebappTemplateLoader;
import freemarker.template.SimpleHash;
import freemarker.template.Template;
import static org.easymock.EasyMock.*;
/** Tests the FreemarkerDecoratorServlet.
*/
public class FreemarkerDecoratorServletTest {
private MessageSource messageSource = createNiceMock(MessageSource.class);
/** Very naive subclass just to get access to the internal status.
*/
private class ServletWithTemplateLoader extends FreemarkerDecoratorServlet {
public ServletWithTemplateLoader() {
super(messageSource);
}
private static final long serialVersionUID = 1L;
public TemplateLoader[] loaders;
public TemplateLoader getTemplateLoader() {
return getConfiguration().getTemplateLoader();
}
protected TemplateLoader[] getLoaders() throws ServletException {
loaders = super.getLoaders();
return loaders;
}
}
/* Prepare the servlet to configure the template paths.
*/
private ServletConfig createServletConfig(final Hashtable<String, String>
parameters) {
// Mocks the servlet context.
MockServletContext context = new MockServletContext();
context.setServletContextName("/freemarker");
GenericWebApplicationContext applicationContext;
applicationContext = new GenericWebApplicationContext();
applicationContext.refresh();
context.setAttribute(
WebApplicationContext.ROOT_WEB_APPLICATION_CONTEXT_ATTRIBUTE,
applicationContext);
// Mocks the servlet config.
MockServletConfig config = new MockServletConfig(context);
for (String name: parameters.keySet()) {
config.addInitParameter(name, parameters.get(name));
}
return config;
}
/* Tests if the servlet is initialized correctly for one additional template
* path and no debug related attributes.
*/
@Test
public final void init_noDebug() throws Exception {
// Creates an enumeration with all the parameter names.
Hashtable<String, String> parameters = new Hashtable<String, String>();
parameters.put("TemplatePath", "class://com/globant/katari/sitemesh/url1");
parameters.put("AdditionalTemplatePaths", "file:///;/test");
// Tests the servlet.
ServletWithTemplateLoader servlet = new ServletWithTemplateLoader();
servlet.init(createServletConfig(parameters));
TemplateLoader defaultLoader = servlet.getTemplateLoader();
// The only possible thing to validate here is if the loader is a
// MultiTemplateLoader.
assertTrue("Not a MultiTemplateLoader",
defaultLoader instanceof MultiTemplateLoader);
assertEquals(3, servlet.loaders.length);
assertTrue(servlet.loaders[0] instanceof ClassTemplateLoader);
assertTrue(servlet.loaders[1] instanceof FileTemplateLoader);
assertTrue(servlet.loaders[2] instanceof WebappTemplateLoader);
}
/* Tests if the servlet is initialized correctly.
*/
@Test
public final void init_debugAndDebugPrefix() throws Exception {
// Creates an enumeration with all the parameter names.
Hashtable<String, String> parameters = new Hashtable<String, String>();
parameters.put("TemplatePath", "class://com/globant");
parameters.put("DebugPrefix", "../katari-core/src/main/resources");
parameters.put("debug", "true");
// Tests the servlet.
ServletWithTemplateLoader servlet = new ServletWithTemplateLoader();
servlet.init(createServletConfig(parameters));
TemplateLoader defaultLoader = servlet.getTemplateLoader();
// The only possible thing to validate here is if the loader is a
// MultiTemplateLoader.
assertTrue("Not a MultiTemplateLoader",
defaultLoader instanceof MultiTemplateLoader);
assertEquals(2, servlet.loaders.length);
assertTrue(servlet.loaders[0] instanceof FileTemplateLoader);
assertTrue(servlet.loaders[1] instanceof ClassTemplateLoader);
}
/* Tests if the servlet is initialized correctly with multiple additional
* template paths.
*/
@Test
public final void init_debug() throws Exception {
// Creates an enumeration with all the parameter names.
Hashtable<String, String> parameters = new Hashtable<String, String>();
parameters.put("TemplatePath", "class://com/globant/katari/sitemesh/url1");
parameters.put("AdditionalTemplatePaths",
" class://com/globant/katari/core/web;\n"
+ " class://com/globant/katari/core/spring\n"
+ " ");
parameters.put("AdditionalDebugPrefixes",
"src/main/resources;src/main/resources");
parameters.put("debug", "true");
// Tests the servlet.
ServletWithTemplateLoader servlet = new ServletWithTemplateLoader();
servlet.init(createServletConfig(parameters));
TemplateLoader defaultLoader = servlet.getTemplateLoader();
// The only possible thing to validate here is if the loader is a
// MultiTemplateLoader.
assertTrue(defaultLoader instanceof MultiTemplateLoader);
assertEquals(5, servlet.loaders.length);
assertTrue(servlet.loaders[0] instanceof ClassTemplateLoader);
assertTrue(servlet.loaders[1] instanceof FileTemplateLoader);
assertTrue(servlet.loaders[2] instanceof ClassTemplateLoader);
assertTrue(servlet.loaders[3] instanceof FileTemplateLoader);
assertTrue(servlet.loaders[4] instanceof ClassTemplateLoader);
}
/* Tests if the servlet is initialized correctly with multiple additional
* template paths.
*/
@Test
public final void init_debugFalse() throws Exception {
// Creates an enumeration with all the parameter names.
Hashtable<String, String> parameters = new Hashtable<String, String>();
parameters.put("TemplatePath", "class://com/globant/katari/sitemesh/url1");
parameters.put("DebugPrefix", "../katari-core/src/main/resources");
parameters.put("AdditionalTemplatePaths",
"class://com/globant/katari/core/web");
parameters.put("AdditionalDebugPrefixes",
"src/main/resources;src/main/resources");
parameters.put("debug", "false");
// Tests the servlet.
ServletWithTemplateLoader servlet = new ServletWithTemplateLoader();
servlet.init(createServletConfig(parameters));
TemplateLoader defaultLoader = servlet.getTemplateLoader();
// The only possible thing to validate here is if the loader is a
// MultiTemplateLoader.
assertTrue(defaultLoader instanceof MultiTemplateLoader);
assertEquals(2, servlet.loaders.length);
assertTrue(servlet.loaders[0] instanceof ClassTemplateLoader);
assertTrue(servlet.loaders[1] instanceof ClassTemplateLoader);
}
@Test
public void preTemplateProcess() throws Exception {
ServletWithTemplateLoader servlet = new ServletWithTemplateLoader();
servlet.init(createServletConfig(new Hashtable<String, String>()));
MockHttpServletRequest request = new MockHttpServletRequest();
MockHttpServletResponse response = new MockHttpServletResponse();
File ftl = new File(
"src/main/resources/com/globant/katari/core/web/katari.ftl");
Template template = new Template("t", new FileReader(ftl), null, null);
SimpleHash model = new SimpleHash();
servlet.preTemplateProcess(request, response, template, model);
assertThat(model.get(
AbstractTemplateView.SPRING_MACRO_REQUEST_CONTEXT_ATTRIBUTE),
is(notNullValue()));
}
}