001: /*
002: * Copyright (c) 2002-2006 by OpenSymphony
003: * All rights reserved.
004: */
005: package com.opensymphony.webwork.views.sitemesh;
006:
007: import java.io.IOException;
008: import java.io.StringReader;
009: import java.io.StringWriter;
010: import java.io.Writer;
011:
012: import javax.servlet.ServletConfig;
013: import javax.servlet.ServletContext;
014: import javax.servlet.http.HttpServletRequest;
015: import javax.servlet.http.HttpServletResponse;
016:
017: import org.easymock.MockControl;
018: import org.springframework.mock.web.MockHttpServletRequest;
019: import org.springframework.mock.web.MockHttpServletResponse;
020: import org.springframework.mock.web.MockServletConfig;
021: import org.springframework.mock.web.MockServletContext;
022:
023: import com.opensymphony.module.sitemesh.Decorator;
024: import com.opensymphony.module.sitemesh.DecoratorMapper;
025: import com.opensymphony.module.sitemesh.Factory;
026: import com.opensymphony.module.sitemesh.Page;
027: import com.opensymphony.module.sitemesh.PageParser;
028: import com.opensymphony.webwork.views.JspSupportServlet;
029: import com.opensymphony.xwork.ActionContext;
030: import com.opensymphony.xwork.ActionInvocation;
031: import com.opensymphony.xwork.XWorkTestCase;
032: import com.opensymphony.xwork.util.OgnlValueStack;
033:
034: import freemarker.template.ObjectWrapper;
035: import freemarker.template.SimpleHash;
036: import freemarker.template.Template;
037: import freemarker.template.TemplateException;
038: import freemarker.template.TemplateNodeModel;
039:
040: /**
041: * @author tmjee
042: * @version $Date$ $Id$
043: */
044: public class ApplyDecoratorBeanTest extends XWorkTestCase {
045:
046: private ServletConfig servletConfig;
047: private ServletContext servletContext;
048: private MockControl actionInvocationControl;
049: private ActionInvocation invocation;
050: private HttpServletRequest request;
051: private HttpServletResponse response;
052: private StringWriter writer;
053: private OgnlValueStack stack;
054:
055: private MockPage page;
056: private MockDecorator decorator;
057: private MockFactory factory;
058: private MockControl pageParserControl;
059: private PageParser pageParser;
060: private MockControl decoratorMapperControl;
061: private DecoratorMapper decoratorMapper;
062:
063: private SimpleHash model;
064:
065: private ApplyDecoratorBean bean;
066:
067: private boolean processed = false;
068:
069: /**
070: * A simple test case that test when teh applydecorator tag is used with
071: * name and page attribute, of which name is to be the name of the decorator
072: * while page is the page to be decorated.
073: *
074: * <p/>
075: *
076: * It basically just test that if we get a sitemesh Page object it's properties eg.
077: * head, title, body, page.properties etc. is put into the freemarker model
078: * generated by FreemarkerManager, before the Freemarker template is processed.
079: *
080: * <p/>
081: *
082: * It doesn't test methods hook like
083: * <ul>
084: * <li>getFreemarkerTemplate</li>
085: * <li>parsePageFromContent</li>
086: * <li>parsePageFromAbsoluteUrl</li>
087: * <li>parsePageFromRelativeUrlPath</li>
088: * <li>getSitemeshFactory</li>
089: * <li>getPageParser</li>
090: * <li>getDecoratorMapper</li>
091: * <li>deduceLocale</li>
092: * <li>createModel</li>
093: * </ul>
094: *
095: * cause they belongs to Sitemesh and FreemarkerManager, not really
096: * related to ApplyDecoratorBean.
097: *
098: * @throws Exception
099: */
100: public void testApplyDecorator() throws Exception {
101:
102: assertFalse(processed);
103:
104: page.setTitle("someTitle");
105: page.setBody("someBody");
106: page.setHead("someHead");
107:
108: bean.setPage("somePageToBeDecorated.ftl");
109: bean.setName("someDecoratorName");
110: bean.start(writer);
111: bean.end(writer, "");
112:
113: actionInvocationControl.verify();
114: pageParserControl.verify();
115: decoratorMapperControl.verify();
116:
117: assertTrue(processed);
118: assertNotNull(model);
119: assertNotNull(model.get("page"));
120: assertNotNull(model.get("title"));
121: assertNotNull(model.get("body"));
122: assertNotNull(model.get("page.properties"));
123: }
124:
125: protected void setUp() throws Exception {
126: super .setUp();
127:
128: writer = new StringWriter();
129:
130: servletContext = new MockServletContext();
131: servletConfig = new MockServletConfig(servletContext);
132:
133: JspSupportServlet.jspSupportServlet = new JspSupportServlet();
134: JspSupportServlet.jspSupportServlet.init(servletConfig);
135:
136: actionInvocationControl = MockControl
137: .createControl(ActionInvocation.class);
138: invocation = (ActionInvocation) actionInvocationControl
139: .getMock();
140: actionInvocationControl.replay();
141:
142: request = new MockHttpServletRequest();
143: response = new MockHttpServletResponse();
144: stack = ActionContext.getContext().getValueStack();
145:
146: page = new MockPage();
147: decorator = new MockDecorator();
148: factory = new MockFactory();
149:
150: pageParserControl = MockControl.createControl(PageParser.class);
151: pageParser = (PageParser) pageParserControl.getMock();
152: pageParserControl.replay();
153:
154: decoratorMapperControl = MockControl
155: .createControl(DecoratorMapper.class);
156: decoratorMapper = (DecoratorMapper) decoratorMapperControl
157: .getMock();
158: decoratorMapperControl.replay();
159:
160: factory.setPageParser(pageParser);
161: factory.setDecoratorMapper(decoratorMapper);
162:
163: model = new SimpleHash();
164:
165: bean = new ApplyDecoratorBean(stack, request, response) {
166: protected Factory getSitemeshFactory() {
167: return factory;
168: }
169:
170: protected Page parsePageObjectFromRelativeUrlPath(
171: String relativeUrl) throws TemplateException,
172: IOException {
173: return page;
174: }
175:
176: protected Decorator getDecorator(
177: HttpServletRequest request, String decoratorName) {
178: return decorator;
179: }
180:
181: protected SimpleHash createModel() throws TemplateException {
182: return model;
183: }
184:
185: protected Template getFreemarkerTemplate(String templatePath)
186: throws IOException, TemplateException {
187: StringReader reader = new StringReader("");
188: return new Template("", reader) {
189: public void process(Object arg0, Writer arg1)
190: throws TemplateException, IOException {
191: processed = true;
192: }
193:
194: public void process(Object arg0, Writer arg1,
195: ObjectWrapper arg2)
196: throws TemplateException, IOException {
197: processed = true;
198: }
199:
200: public void process(Object arg0, Writer arg1,
201: ObjectWrapper arg2, TemplateNodeModel arg3)
202: throws TemplateException, IOException {
203: processed = true;
204: }
205: };
206: }
207: };
208: }
209:
210: protected void tearDown() throws Exception {
211: super .tearDown();
212:
213: servletContext = null;
214: servletConfig = null;
215: request = null;
216: response = null;
217: invocation = null;
218: writer = null;
219: stack = null;
220: bean = null;
221: page = null;
222: decorator = null;
223: model = null;
224: factory = null;
225: pageParser = null;
226: decoratorMapper = null;
227: processed = false;
228: }
229:
230: }
|