001    // Copyright 2004, 2005 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    
015    package org.apache.tapestry.engine;
016    
017    import org.apache.commons.codec.net.URLCodec;
018    import org.apache.tapestry.BaseComponentTestCase;
019    import org.apache.tapestry.services.ServiceConstants;
020    import org.apache.tapestry.util.QueryParameterMap;
021    import org.apache.tapestry.web.WebRequest;
022    import org.testng.annotations.Test;
023    
024    import java.util.HashMap;
025    import java.util.Map;
026    
027    /**
028     * Tests for {@link org.apache.tapestry.engine.EngineServiceLink}.
029     * 
030     * @author Howard Lewis Ship
031     * @since 3.0
032     */
033    @Test
034    public class EngineServiceLinkTest extends BaseComponentTestCase
035    {
036        private URLCodec _urlCodec = new URLCodec();
037    
038        private static final String ENCODING = "utf-8";
039    
040        private QueryParameterMap buildParameters(String serviceName, String[] serviceParameters)
041        {
042            Map result = new HashMap();
043    
044            result.put(ServiceConstants.SERVICE, serviceName);
045            result.put(ServiceConstants.PARAMETER, serviceParameters);
046    
047            return new QueryParameterMap(result);
048        }
049    
050        /** @since 4.0 */
051        public void testGetURLWithParameters()
052        {
053            WebRequest request = newRequest();
054    
055            EngineServiceLink l = new EngineServiceLink("/context/servlet", ENCODING, _urlCodec,
056                    request, buildParameters("myservice", null), true);
057    
058            replay();
059    
060            assertEquals("/context/servlet?service=myservice", l.getURL());
061    
062            verify();
063    
064            assertListEquals(new String[]
065            { ServiceConstants.SERVICE, ServiceConstants.PARAMETER }, l.getParameterNames());
066    
067        }
068    
069        public void testGetURLWithServiceParameters()
070        {
071            WebRequest request = newRequest();
072    
073            EngineServiceLink l = new EngineServiceLink("/ctx/app", ENCODING, _urlCodec, request,
074                    buildParameters("foo", new String[]
075                    { "godzilla", "frodo" }), false);
076            
077            replay();
078    
079            assertEquals("/ctx/app?service=foo&sp=godzilla&sp=frodo", l.getURL());
080    
081            verify();
082        }
083    
084        /** @since 4.0 */
085    
086        public void testGetURLSansParameters()
087        {
088            WebRequest request = newRequest();
089    
090            EngineServiceLink l = new EngineServiceLink("/context/servlet", ENCODING, _urlCodec,
091                    request, buildParameters("myservice", null), true);
092    
093            replay();
094            
095            assertEquals("/context/servlet", l.getURL(null, false));
096    
097            verify();
098        }
099    
100        /** @since 4.0 */
101    
102        public void testGetURLWithAnchor()
103        {
104            WebRequest request = newRequest();
105    
106            EngineServiceLink l = new EngineServiceLink("/context/servlet", ENCODING, _urlCodec,
107                    request, buildParameters("myservice", null), false);
108            
109            replay();
110    
111            assertEquals("/context/servlet#anchor", l.getURL("anchor", false));
112    
113            verify();
114        }
115    
116        public void testGetURLWithAnchorAndParameters() throws Exception
117        {
118            WebRequest request = newRequest();
119    
120            EngineServiceLink l = new EngineServiceLink("/context/servlet", ENCODING, _urlCodec,
121                    request, buildParameters("myservice", null), false);
122            
123            replay();
124    
125            assertEquals("/context/servlet?service=myservice#anchor", l.getURL("anchor", true));
126    
127            verify();
128        }
129    
130        public void testGetAbsoluteURL() throws Exception
131        {
132            WebRequest request = newRequest();
133    
134            EngineServiceLink l = new EngineServiceLink("/ctx/app", ENCODING, _urlCodec, request,
135                    buildParameters("myservice", null), false);
136    
137            trainGetServerPort(request, 9187);
138            
139            trainGetScheme(request, "HTTP");
140            
141            trainGetServerName(request, "TESTSERVER.COM");
142            
143            replay();
144            
145            assertEquals("HTTP://TESTSERVER.COM:9187/ctx/app?service=myservice", l.getAbsoluteURL());
146    
147            verify();
148        }
149    
150        public void testGetAbsoluteURLWithOverrides() throws Exception
151        {
152            WebRequest request = newRequest();
153    
154            EngineServiceLink l = new EngineServiceLink("/ctx/app", ENCODING, _urlCodec, request,
155                    buildParameters("myservice", null), false);
156            
157            replay();
158    
159            assertEquals("https://myserver.net:9100/ctx/app?service=myservice", l.getAbsoluteURL(
160                    "https",
161                    "myserver.net",
162                    9100,
163                    null,
164                    true));
165    
166            verify();
167        }
168    
169        public void testGetURLNotAbsolute()
170        {
171            WebRequest request = newRequest();
172    
173            trainGetScheme(request, "http");
174            trainGetServerName(request, "myserver.net");
175            trainGetServerPort(request, 80);
176            
177            replay();
178    
179            EngineServiceLink l = new EngineServiceLink("/ctx/app", ENCODING, _urlCodec, request,
180                    buildParameters("myservice", null), false);
181    
182            assertEquals("/ctx/app?service=myservice#myanchor", l.getURL(
183                    "http",
184                    "myserver.net",
185                    80,
186                    "myanchor",
187                    true));
188    
189            verify();
190        }
191    
192        public void testGetURLAbsolute()
193        {
194            WebRequest request = newRequest();
195    
196            trainGetScheme(request, "http");
197            
198            replay();
199    
200            EngineServiceLink l = new EngineServiceLink("/ctx/app", ENCODING, _urlCodec, request,
201                    buildParameters("myservice", null), false);
202    
203            assertEquals("https://override.net:8080/ctx/app?service=myservice#myanchor", l.getURL(
204                    "https",
205                    "override.net",
206                    8080,
207                    "myanchor",
208                    true));
209    
210            verify();
211        }
212    }