001 // Copyright 2007, 2008, 2009, 2010, 2011 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.tapestry5.internal.test;
016
017 import org.apache.tapestry5.ioc.annotations.Inject;
018 import org.apache.tapestry5.ioc.internal.util.CollectionFactory;
019 import org.apache.tapestry5.ioc.internal.util.InternalUtils;
020 import org.apache.tapestry5.services.Session;
021
022 import java.util.*;
023
024 public class TestableRequestImpl implements TestableRequest
025 {
026 private final String contextPath;
027
028 private final Map<String, Object> parameters = CollectionFactory.newMap();
029
030 private final Map<String, Object> attributes = CollectionFactory.newMap();
031
032 private Session session;
033
034 private String path = "/";
035
036 private Locale locale = Locale.getDefault();
037
038 @Inject
039 public TestableRequestImpl()
040 {
041 this("/foo");
042 }
043
044 public TestableRequestImpl(String contextPath)
045 {
046 this.contextPath = contextPath;
047 }
048
049 public TestableRequest clear()
050 {
051 parameters.clear();
052
053 return this;
054 }
055
056 public TestableRequest setPath(String path)
057 {
058 this.path = path;
059
060 return this;
061 }
062
063 public TestableRequest setLocale(Locale locale)
064 {
065 this.locale = locale;
066
067 return this;
068 }
069
070 public TestableRequest loadParameter(String parameterName, String parameterValue)
071 {
072 Object existing = parameters.get(parameterName);
073
074 if (existing == null)
075 {
076 parameters.put(parameterName, parameterValue);
077 return this;
078 }
079
080 if (existing instanceof List)
081 {
082 ((List) existing).add(parameterValue);
083 return this;
084 }
085
086 // Convert from a single String to a List of Strings.
087
088 List list = new ArrayList();
089 list.add(existing);
090 list.add(parameterValue);
091
092 parameters.put(parameterName, list);
093
094 return this;
095 }
096
097 public TestableRequest overrideParameter(String parameterName, String parameterValue)
098 {
099 parameters.put(parameterName, parameterValue);
100
101 return this;
102 }
103
104 public long getDateHeader(String name)
105 {
106 return 0;
107 }
108
109 /**
110 * Returns null.
111 */
112 public String getHeader(String name)
113 {
114 return null;
115 }
116
117 /**
118 * Returns an empty list.
119 */
120 public List<String> getHeaderNames()
121 {
122 return Collections.emptyList();
123 }
124
125 public Locale getLocale()
126 {
127 return locale;
128 }
129
130 public List<String> getParameterNames()
131 {
132 return InternalUtils.sortedKeys(parameters);
133 }
134
135 public String[] getParameters(String name)
136 {
137 Object value = parameters.get(name);
138
139 if (value == null)
140 return null;
141
142 if (value instanceof String)
143 return new String[]
144 { (String) value };
145
146 List list = (List) value;
147
148 return (String[]) list.toArray(new String[list.size()]);
149 }
150
151 public String getPath()
152 {
153 return path;
154 }
155
156 public String getContextPath()
157 {
158 return contextPath;
159 }
160
161 public String getParameter(String name)
162 {
163 Object value = parameters.get(name);
164
165 if (value == null || value instanceof String)
166 return (String) value;
167
168 List<String> list = (List<String>) value;
169
170 return list.get(0);
171 }
172
173 public Session getSession(boolean create)
174 {
175 if (!create)
176 return session;
177
178 if (session == null)
179 session = new PageTesterSession();
180
181 return session;
182 }
183
184 public void setEncoding(String requestEncoding)
185 {
186 }
187
188 /**
189 * Always returns false. If you need to test Ajax functionality, you need to be using Selenium.
190 */
191 public boolean isXHR()
192 {
193 return false;
194 }
195
196 public boolean isSecure()
197 {
198 return false;
199 }
200
201 /**
202 * Always returns true.
203 */
204 public boolean isRequestedSessionIdValid()
205 {
206 return true;
207 }
208
209 public Object getAttribute(String name)
210 {
211 return attributes.get(name);
212 }
213
214 public void setAttribute(String name, Object value)
215 {
216 attributes.put(name, value);
217 }
218
219 /**
220 * Returns "localhost" which is sufficient for testing purposes.
221 */
222 public String getServerName()
223 {
224 return "localhost";
225 }
226
227 /**
228 * Always returns POST, to keep the Form component happy.
229 */
230 public String getMethod()
231 {
232 return "POST";
233 }
234
235 /**
236 * Always returns 80.
237 */
238 public int getLocalPort()
239 {
240 return 80;
241 }
242
243 /**
244 * Always returns 80.
245 *
246 * @since 5.2.5
247 */
248 public int getServerPort()
249 {
250 return 80;
251 }
252
253 /**
254 * Always returns "localhost".
255 *
256 * @since 5.3
257 */
258 public String getRemoteHost()
259 {
260 return "localhost";
261 }
262 }