blob: 9b4ee638cf6b8d882ec970193e66837da868d7e0 [file] [log] [blame]
/*
* $Id$
*
* 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.tiles.request.freemarker.render;
import static org.easymock.EasyMock.*;
import static org.easymock.classextension.EasyMock.*;
import static org.junit.Assert.*;
import java.io.IOException;
import java.io.PrintWriter;
import java.io.StringWriter;
import java.net.URL;
import javax.servlet.GenericServlet;
import javax.servlet.ServletConfig;
import javax.servlet.ServletContext;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.apache.tiles.request.ApplicationContext;
import org.apache.tiles.request.render.CannotRenderException;
import org.apache.tiles.request.servlet.ServletApplicationContext;
import org.apache.tiles.request.servlet.ServletRequest;
import org.junit.Before;
import org.junit.Test;
import freemarker.ext.servlet.HttpRequestHashModel;
import freemarker.ext.servlet.HttpRequestParametersHashModel;
import freemarker.ext.servlet.ServletContextHashModel;
import freemarker.template.ObjectWrapper;
/**
* Tests {@link FreemarkerRenderer}.
*
* @version $Rev$ $Date$
*/
public class FreemarkerRendererTest {
/**
* The attribute name of the application model.
*/
private static final String ATTR_APPLICATION_MODEL =
".freemarker.Application";
/**
* The attribute name of the JSP taglibs model.
*/
private static final String ATTR_JSP_TAGLIBS_MODEL =
".freemarker.JspTaglibs";
/**
* The attribute name of the request model.
*/
private static final String ATTR_REQUEST_MODEL = ".freemarker.Request";
/**
* The attribute name of the request parameters model.
*/
private static final String ATTR_REQUEST_PARAMETERS_MODEL =
".freemarker.RequestParameters";
/**
* The renderer to test.
*/
private FreemarkerRenderer renderer;
/**
* The application context.
*/
private ApplicationContext applicationContext;
/**
* The servlet context.
*/
private ServletContext servletContext;
/**
* Sets up the test.
*/
@Before
public void setUp() {
applicationContext = createMock(ServletApplicationContext.class);
servletContext = createMock(ServletContext.class);
expect(applicationContext.getContext()).andReturn(servletContext);
replay(applicationContext, servletContext);
renderer = FreemarkerRendererBuilder.createInstance()
.setApplicationContext(applicationContext)
.setParameter("TemplatePath", "/")
.setParameter("NoCache", "true")
.setParameter("ContentType", "text/html")
.setParameter("template_update_delay", "0")
.setParameter("default_encoding", "ISO-8859-1")
.setParameter("number_format", "0.##########").build();
}
/**
* Tests {@link FreemarkerRenderer#render(String, org.apache.tiles.request.Request)}.
* @throws IOException If something goes wrong.
* @throws ServletException If something goes wrong.
*/
@Test
public void testWrite() throws IOException, ServletException {
ApplicationContext applicationContext = createMock(ServletApplicationContext.class);
ServletContext servletContext = createMock(ServletContext.class);
GenericServlet servlet = createMockBuilder(GenericServlet.class).createMock();
ServletConfig servletConfig = createMock(ServletConfig.class);
ObjectWrapper objectWrapper = createMock(ObjectWrapper.class);
expect(servletConfig.getServletContext()).andReturn(servletContext);
replay(servlet, servletConfig);
servlet.init(servletConfig);
ServletContextHashModel servletContextHashModel = new ServletContextHashModel(servlet, objectWrapper);
expect(applicationContext.getContext()).andReturn(servletContext).anyTimes();
expect(servletContext.getRealPath(isA(String.class))).andReturn(null).anyTimes();
URL resource = getClass().getResource("/test.ftl");
expect(servletContext.getResource(isA(String.class))).andReturn(resource).anyTimes();
expect(servletContext.getAttribute(ATTR_APPLICATION_MODEL)).andReturn(servletContextHashModel);
expect(servletContext.getAttribute(ATTR_JSP_TAGLIBS_MODEL)).andReturn(null);
replay(applicationContext, servletContext, objectWrapper);
FreemarkerRenderer renderer = FreemarkerRendererBuilder
.createInstance().setApplicationContext(applicationContext)
.setParameter("TemplatePath", "/")
.setParameter("NoCache", "true")
.setParameter("ContentType", "text/html")
.setParameter("template_update_delay", "0")
.setParameter("default_encoding", "ISO-8859-1")
.setParameter("number_format", "0.##########").build();
ServletRequest request = createMock(ServletRequest.class);
HttpServletRequest httpRequest = createMock(HttpServletRequest.class);
HttpServletResponse response = createMock(HttpServletResponse.class);
StringWriter stringWriter = new StringWriter();
PrintWriter printWriter = new PrintWriter(stringWriter);
HttpRequestHashModel requestModel = new HttpRequestHashModel(httpRequest, response, objectWrapper);
HttpRequestParametersHashModel parametersModel = new HttpRequestParametersHashModel(httpRequest);
expect(request.getRequest()).andReturn(httpRequest);
expect(request.getResponse()).andReturn(response);
expect(request.getPrintWriter()).andReturn(printWriter);
expect(httpRequest.getSession(false)).andReturn(null);
expect(httpRequest.getAttribute(ATTR_REQUEST_MODEL)).andReturn(requestModel);
expect(httpRequest.getAttribute(ATTR_REQUEST_PARAMETERS_MODEL)).andReturn(parametersModel);
response.setContentType("text/html; charset=ISO-8859-1");
response.setHeader(eq("Cache-Control"), isA(String.class));
response.setHeader("Pragma", "no-cache");
response.setHeader(eq("Expires"), isA(String.class));
replay(request, httpRequest, response);
renderer.render("hello", request);
stringWriter.close();
assertTrue(stringWriter.toString().startsWith("Hello!"));
verify(applicationContext, servletContext, request, httpRequest,
response, servlet, servletConfig, objectWrapper);
}
/**
* Tests {@link FreemarkerRenderer#render(String, org.apache.tiles.request.Request)}.
* @throws IOException If something goes wrong.
* @throws ServletException If something goes wrong.
*/
@Test(expected = CannotRenderException.class)
public void testRenderException1() throws IOException, ServletException {
ApplicationContext applicationContext = createMock(ServletApplicationContext.class);
ServletContext servletContext = createMock(ServletContext.class);
GenericServlet servlet = createMockBuilder(GenericServlet.class).createMock();
ServletConfig servletConfig = createMock(ServletConfig.class);
ObjectWrapper objectWrapper = createMock(ObjectWrapper.class);
replay(servlet, servletConfig);
servlet.init(servletConfig);
expect(applicationContext.getContext()).andReturn(servletContext).anyTimes();
expect(servletContext.getRealPath(isA(String.class))).andReturn(null).anyTimes();
URL resource = getClass().getResource("/test.ftl");
expect(servletContext.getResource(isA(String.class))).andReturn(resource).anyTimes();
replay(applicationContext, servletContext, objectWrapper);
FreemarkerRenderer renderer = FreemarkerRendererBuilder
.createInstance().setApplicationContext(applicationContext)
.setParameter("TemplatePath", "/")
.setParameter("NoCache", "true")
.setParameter("ContentType", "text/html")
.setParameter("template_update_delay", "0")
.setParameter("default_encoding", "ISO-8859-1")
.setParameter("number_format", "0.##########").build();
ServletRequest request = createMock(ServletRequest.class);
replay(request);
try {
renderer.render(null, request);
} finally {
verify(applicationContext, servletContext, request, servlet,
servletConfig, objectWrapper);
}
}
/**
* Test method for
* {@link FreemarkerRenderer
* #isRenderable(Object, org.apache.tiles.Attribute, org.apache.tiles.context.TilesRequestContext)}
* .
*/
@Test
public void testIsRenderable() {
assertTrue(renderer.isRenderable("/my/template.ftl", null));
assertFalse(renderer.isRenderable("my/template.ftl", null));
assertFalse(renderer.isRenderable("/my/template.jsp", null));
verify(applicationContext, servletContext);
}
}