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    }