001 // Copyright May 9, 2006 The Apache Software Foundation 002 // 003 // Licensed under the Apache License, Version 2.0 (the "License"); 004 // you may not use this file except in compliance with the License. 005 // You may obtain a copy of the License at 006 // 007 // http://www.apache.org/licenses/LICENSE-2.0 008 // 009 // Unless required by applicable law or agreed to in writing, software 010 // distributed under the License is distributed on an "AS IS" BASIS, 011 // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 012 // See the License for the specific language governing permissions and 013 // limitations under the License. 014 package org.apache.tapestry.services.impl; 015 016 import java.io.CharArrayWriter; 017 import java.io.PrintWriter; 018 019 import org.apache.tapestry.BaseComponentTestCase; 020 import org.apache.tapestry.IComponent; 021 import org.apache.tapestry.IMarkupWriter; 022 import org.apache.tapestry.IRender; 023 import org.apache.tapestry.IRequestCycle; 024 import org.apache.tapestry.engine.NullWriter; 025 import org.apache.tapestry.markup.MarkupFilter; 026 import org.apache.tapestry.markup.MarkupWriterImpl; 027 import org.apache.tapestry.markup.UTFMarkupFilter; 028 import org.apache.tapestry.services.ResponseBuilder; 029 import org.testng.annotations.AfterClass; 030 import org.testng.annotations.Test; 031 032 033 /** 034 * Tests functionality of {@link DefaultResponseBuilder}. 035 * 036 * @author jkuhnert 037 */ 038 @SuppressWarnings("cast") 039 @Test(sequential=true) 040 public class DefaultResponseBuilderTest extends BaseComponentTestCase 041 { 042 043 private static CharArrayWriter _writer; 044 045 private static String LINE_SEPARATOR = (String)java.security.AccessController.doPrivileged( 046 new sun.security.action.GetPropertyAction("line.separator")); 047 048 private PrintWriter newPrintWriter() 049 { 050 _writer = new CharArrayWriter(); 051 052 return new PrintWriter(_writer); 053 } 054 055 @AfterClass(alwaysRun=true) 056 protected void cleanup() throws Exception 057 { 058 _writer = null; 059 } 060 061 private void assertOutput(String expected) 062 { 063 assertEquals(_writer.toString(), expected); 064 065 _writer.reset(); 066 } 067 068 public void test_Null_Render() 069 { 070 IRender render = (IRender)newMock(IRender.class); 071 IRequestCycle cycle = (IRequestCycle)newMock(IRequestCycle.class); 072 073 ResponseBuilder builder = new DefaultResponseBuilder(null); 074 075 render.render(null, cycle); 076 077 replay(); 078 079 builder.render(null, render, cycle); 080 081 verify(); 082 083 assertSame(builder.getWriter(), NullWriter.getSharedInstance()); 084 } 085 086 public void test_Normal_Render() 087 { 088 IRender render = (IRender)newMock(IRender.class); 089 IRequestCycle cycle = (IRequestCycle)newMock(IRequestCycle.class); 090 IMarkupWriter writer = (IMarkupWriter)newMock(IMarkupWriter.class); 091 092 ResponseBuilder builder = new DefaultResponseBuilder(writer); 093 094 render.render(writer, cycle); 095 096 replay(); 097 098 builder.render(null, render, cycle); 099 100 verify(); 101 102 assertSame(builder.getWriter(), writer); 103 } 104 105 public void test_Get_Writer_Type() 106 { 107 IMarkupWriter writer = (IMarkupWriter)newMock(IMarkupWriter.class); 108 ResponseBuilder builder = new DefaultResponseBuilder(writer); 109 110 assertSame(builder.getWriter("test", "type"), writer); 111 } 112 113 public void test_Allowed_Scripts() 114 { 115 IComponent component = (IComponent)newMock(IComponent.class); 116 ResponseBuilder builder = new DefaultResponseBuilder(null); 117 118 assertTrue(builder.isBodyScriptAllowed(component)); 119 assertTrue(builder.isExternalScriptAllowed(component)); 120 assertTrue(builder.isInitializationScriptAllowed(component)); 121 } 122 123 public void test_Write_Body_Script() 124 { 125 MarkupFilter filter = new UTFMarkupFilter(); 126 PrintWriter writer = newPrintWriter(); 127 IRequestCycle cycle = (IRequestCycle)newMock(IRequestCycle.class); 128 129 replay(); 130 131 IMarkupWriter mw = new MarkupWriterImpl("text/html", writer, filter); 132 ResponseBuilder builder = new DefaultResponseBuilder(mw); 133 134 String bscript = "var e=4;"; 135 String imageInit = "image initializations"; 136 String preload = "preloadedvarname"; 137 138 verify(); 139 replay(); 140 141 builder.beginBodyScript(mw, cycle); 142 143 assertOutput("<script type=\"text/javascript\"><!--"+LINE_SEPARATOR); 144 145 builder.writeImageInitializations(mw, imageInit, preload, cycle); 146 147 assertOutput(LINE_SEPARATOR 148 + "tapestry.addOnLoad(function(e) {\n" 149 + preload + " = [];\n" 150 + "if (document.images)\n" 151 + "{\n" + imageInit + "}\n" 152 + "});"); 153 154 builder.writeBodyScript(mw, bscript, cycle); 155 156 assertOutput(bscript); 157 158 builder.endBodyScript(mw, cycle); 159 160 assertOutput(LINE_SEPARATOR + "// --></script>"); 161 162 verify(); 163 } 164 165 public void test_Write_External_Scripts() 166 { 167 MarkupFilter filter = new UTFMarkupFilter(); 168 PrintWriter writer = newPrintWriter(); 169 IRequestCycle cycle = (IRequestCycle)newMock(IRequestCycle.class); 170 171 replay(); 172 173 IMarkupWriter mw = new MarkupWriterImpl("text/html", writer, filter); 174 ResponseBuilder builder = new DefaultResponseBuilder(mw); 175 176 String script1 = "http://noname/js/package.js"; 177 String script2 = "http://noname/js/package.js"; 178 179 verify(); 180 replay(); 181 182 builder.writeExternalScript(mw, script1, cycle); 183 184 assertOutput("<script type=\"text/javascript\" src=\"" 185 + script1 + "\"></script>" + LINE_SEPARATOR); 186 187 builder.writeExternalScript(mw, script2, cycle); 188 189 assertOutput("<script type=\"text/javascript\" src=\"" 190 + script2 + "\"></script>" + LINE_SEPARATOR); 191 192 verify(); 193 } 194 195 public void test_Write_Initialization_Script() 196 { 197 MarkupFilter filter = new UTFMarkupFilter(); 198 PrintWriter writer = newPrintWriter(); 199 200 replay(); 201 202 IMarkupWriter mw = new MarkupWriterImpl("text/html", writer, filter); 203 ResponseBuilder builder = new DefaultResponseBuilder(mw); 204 205 String script = "doThisInInit();"; 206 207 verify(); 208 replay(); 209 210 builder.writeInitializationScript(mw, script); 211 212 assertOutput("<script type=\"text/javascript\"><!--\n" 213 + "tapestry.addOnLoad(function(e) {\n" 214 + script 215 + "});" 216 + "\n// -->" 217 + "</script>"); 218 219 verify(); 220 } 221 }