Author: dmorozov
Date: 2008-08-28 05:55:02 -0400 (Thu, 28 Aug 2008)
New Revision: 10215
Modified:
trunk/framework/test/src/main/java/org/ajax4jsf/tests/AbstractAjax4JsfTestCase.java
Log:
Fix problem in unit tests with not rendered scripts and links due to this work is executed
by A4J filter in real web application.
Modified:
trunk/framework/test/src/main/java/org/ajax4jsf/tests/AbstractAjax4JsfTestCase.java
===================================================================
---
trunk/framework/test/src/main/java/org/ajax4jsf/tests/AbstractAjax4JsfTestCase.java 2008-08-28
00:39:59 UTC (rev 10214)
+++
trunk/framework/test/src/main/java/org/ajax4jsf/tests/AbstractAjax4JsfTestCase.java 2008-08-28
09:55:02 UTC (rev 10215)
@@ -48,10 +48,17 @@
import javax.faces.context.FacesContext;
import javax.faces.render.RenderKitFactory;
import javax.faces.render.Renderer;
+import javax.servlet.FilterChain;
+import javax.servlet.ServletException;
+import javax.servlet.ServletRequest;
+import javax.servlet.ServletResponse;
+import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.ajax4jsf.context.AjaxContext;
import org.ajax4jsf.context.AjaxContextImpl;
+import org.ajax4jsf.context.ViewResources;
+import org.ajax4jsf.io.parser.FastHtmlParser;
import org.ajax4jsf.renderkit.AjaxViewRootRenderer;
import org.ajax4jsf.renderkit.ChameleonRenderKitImpl;
import org.ajax4jsf.resource.InternetResource;
@@ -59,6 +66,8 @@
import org.ajax4jsf.resource.ResourceBuilderImpl;
import org.ajax4jsf.resource.image.ImageInfo;
import org.ajax4jsf.tests.org.apache.shale.test.config.ConfigParser;
+import org.ajax4jsf.webapp.BaseXMLFilter;
+import org.ajax4jsf.webapp.HtmlParser;
import org.ajax4jsf.webapp.WebXml;
import org.apache.shale.test.base.AbstractJsfTestCase;
import org.apache.shale.test.mock.MockApplication;
@@ -554,11 +563,80 @@
*/
protected HtmlPage renderView() throws Exception {
setupResponseWriter();
- renderChild(facesContext, facesContext.getViewRoot());
+
+ // Emulate A4J web filter chaining like in real web application.
+ TestXMLFilter filter = new TestXMLFilter();
+ try {
+ filter.processFilter(new FilterChain() {
+ public void doFilter(ServletRequest request, ServletResponse response) throws
IOException, ServletException {
+ response.setContentType("text/html");
+ facesContext.setResponseWriter((MockResponseWriter)
renderKit.createResponseWriter(response.getWriter(),"text/html",null));
+
+ ViewResources viewResources = new ViewResources();
+ viewResources.initialize(facesContext);
+
//viewResources.setStyleStrategy(InternetResourceBuilder.LOAD_ALL);
+
//viewResources.setScriptStrategy(InternetResourceBuilder.LOAD_ALL);
+ viewResources.setUseStdControlsSkinning(false);
+ viewResources.setUseStdControlsSkinningClasses(false);
+
+ renderChild(facesContext, facesContext.getViewRoot());
+
+ viewResources.processHeadResources(facesContext);
+ Object[] headEvents = (Object[]) viewResources.getHeadEvents();
+ request.setAttribute(AjaxContext.HEAD_EVENTS_PARAMETER, headEvents);
+
+ facesContext.setResponseWriter(writer);
+ }
+ }, request, response);
+ } catch (Exception e) {
+ throw e;
+ }
+
return processResponseWriter();
}
/**
+ * Implements default XML filter to emulate A4J filter that invoked while
+ * http request in web application.
+ *
+ * Needed to make sure that all processed (web page generation) like in real
+ * web application. Additionally now all RF components styles and scripts generated
+ * by A4J filter only, so we need the same in out unit tests.
+ * Fast filter used now by default.
+ * TODO: we can make it configurable like org.ajax4jsf.webapp.ConfigurableXMLFilter
+ *
+ * @author dmorozov
+ */
+ private class TestXMLFilter extends BaseXMLFilter {
+ private HtmlParser parser = null;
+ public TestXMLFilter() {}
+
+ public void processFilter(FilterChain chain, HttpServletRequest request,
+ final HttpServletResponse response) throws IOException,
+ ServletException {
+ super.doXmlFilter(chain, request, response);
+ }
+
+ @Override
+ protected HtmlParser getParser(String mimetype, boolean isAjax, String viewId) {
+ HtmlParser parser = this.parser;
+ if (parser == null) {
+ parser = new FastHtmlParser();
+ }
+ return parser;
+ }
+
+ /**
+ * Peturn parser to pool
+ * @param parser
+ */
+ @Override
+ protected void reuseParser(HtmlParser parser) {
+ this.parser = parser;
+ }
+ }
+
+ /**
* Finish response processing by call {@link
javax.faces.context.ResponseWriter#endDocument()} and parse
* result to htmlunit {@link HtmlPage}
* @return
Show replies by date