/*
* #!
* Ontopia Webed
* #-
* Copyright (C) 2001 - 2013 The Ontopia Project
* #-
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
* !#
*/
package net.ontopia.topicmaps.webed.utils;
import java.io.IOException;
import java.util.HashMap;
import java.util.Hashtable;
import java.util.Iterator;
import java.util.Map;
import javax.servlet.ServletRequest;
import net.ontopia.topicmaps.webed.impl.utils.Parameters;
import net.ontopia.topicmaps.webed.impl.utils.ReqParamUtils;
import net.ontopia.utils.ontojsp.FakeServletRequest;
import junit.framework.TestCase;
public class ReqParamUtilsTest extends TestCase {
public ReqParamUtilsTest(String name) {
super(name);
}
public void setUp() throws Exception {
super.setUp();
}
private String params2URLQuery(ServletRequest req) {
return params2URLQuery(req, new HashMap());
}
private String params2URLQuery(Map wantedParams) {
return params2URLQuery(null, wantedParams);
}
private String params2URLQuery(ServletRequest req, Map wantedParams) {
Parameters params = new Parameters();
if (req != null) {
Map map = req.getParameterMap();
Iterator it = map.keySet().iterator();
while (it.hasNext()) {
String key = (String) it.next();
params.addParameter(key, (String) map.get(key));
}
}
try {
return ReqParamUtils.params2URLQuery(wantedParams, params, "utf-8");
} catch (IOException e) {
fail("Couldn't encode parameters");
return null;
}
}
// Tests
public void testReversible() throws IOException {
Map params = new HashMap();
params.put("topic_id", "42");
params.put("topicmap_id", "opera.xtm");
Map parsed = ReqParamUtils.parseURLQuery(params2URLQuery(params));
assertTrue("Parsed map is not like input map: " + parsed,
parsed.equals(params));
}
public void testParseURLQuery() {
Map parsed = ReqParamUtils.parseURLQuery("a=b&cde=fgh&d=h");
assertTrue("result does not have three parameters",
parsed.size() == 3);
assertTrue("result does not have 'a' set to 'b'",
parsed.get("a").equals("b"));
assertTrue("result does not have 'cde' set to 'fgh'",
parsed.get("cde").equals("fgh"));
assertTrue("result does not have 'd' set to 'h'",
parsed.get("d").equals("h"));
}
public void testEndsInAmpersand() {
Map parsed = ReqParamUtils.parseURLQuery("a=b&cde=fgh&d=h&");
assertTrue("result does not have three parameters",
parsed.size() == 3);
assertTrue("result does not have 'a' set to 'b'",
parsed.get("a").equals("b"));
assertTrue("result does not have 'cde' set to 'fgh'",
parsed.get("cde").equals("fgh"));
assertTrue("result does not have 'd' set to 'h'",
parsed.get("d").equals("h"));
}
public void testParseURLQuerySingleParam() {
Map parsed = ReqParamUtils.parseURLQuery("foo=bar");
assertTrue("result does not have one parameter",
parsed.size() == 1);
assertTrue("result does not have 'foo' set to 'bar'",
parsed.get("foo").equals("bar"));
}
public void testParams2URLQueryUnrestricted() {
ServletRequest fakeRequest;
String queryURL;
Hashtable params = new Hashtable();
// (1) setup servlet mockup environ
params.clear();
params.put("foo_bar_42", "Kroyt");
fakeRequest = new FakeServletRequest(params);
queryURL = params2URLQuery(fakeRequest);
assertTrue("Generated String is not like expected one (1): '" + queryURL + "'",
queryURL.equals(""));
// (2) setup servlet mockup environ
Map keep = new HashMap();
keep.put("add_something_42", null);
params.clear();
params.put("add_something_42", "langer dumpf backen Garden");
fakeRequest = new FakeServletRequest(params);
queryURL = params2URLQuery(fakeRequest, keep);
assertTrue("Generated string is not like expected one (2).",
queryURL.equals("add_something_42=langer+dumpf+backen+Garden"));
// (3) setup servlet mockup environ
keep.clear();
keep.put("topic_id", null);
keep.put("topicmap_id", null);
params.clear();
params.put("topic_id", "42");
params.put("topicmap_id", "opera.xtm");
fakeRequest = new FakeServletRequest(params);
queryURL = params2URLQuery(fakeRequest, keep);
assertTrue("Generated String is not like expected one (3): '" + queryURL + "'",
queryURL.equals("topic_id=42&topicmap_id=opera.xtm") ||
queryURL.equals("topicmap_id=opera.xtm&topic_id=42"));
}
public void testParams2URLQueryRestricted() {
ServletRequest fakeRequest;
String queryURL;
Hashtable params = new Hashtable();
Map wantedParamNames = new HashMap();
// (1) setup servlet mockup environ
params.clear();
params.put("foo_bar_42", "Kr\u00f8yt");
fakeRequest = new FakeServletRequest(params);
queryURL = params2URLQuery(fakeRequest, wantedParamNames);
assertTrue("Generated String is not like expected one (1): '" + queryURL + "'",
queryURL.equals(""));
// (2) setup servlet mockup environ
wantedParamNames.put("id", null);
params.clear();
params.put("add_something_42", "langer dumpf backen Garden");
params.put("id", "42");
fakeRequest = new FakeServletRequest(params);
queryURL = params2URLQuery(fakeRequest, wantedParamNames);
assertTrue("Generated String is not like expected one (2).",
queryURL.equals("id=42"));
// (3) setup servlet mockup environ
wantedParamNames.put("tm", null);
params.clear();
params.put("id", "42");
params.put("add_something_42", "langer dumpf backen Garden");
params.put("tm", "opera.xtm");
fakeRequest = new FakeServletRequest(params);
queryURL = params2URLQuery(fakeRequest, wantedParamNames);
assertTrue("Generated String is not like expected one (3).",
queryURL.equals("id=42&tm=opera.xtm") ||
queryURL.equals("tm=opera.xtm&id=42"));
}
public void testParams2URLQueryNonAscii() {
ServletRequest fakeRequest;
String queryURL;
Hashtable params = new Hashtable();
Map wantedParamNames = new HashMap();
wantedParamNames.put("foo_bar_42", null);
String correct = "foo_bar_42=Kr%C3%B8yt";
// NOTE: the following is no longer reproducible on 1.3. It looks
// like Sun has fixed the problem.
//
// // need to account for JDK 1.3
// if (System.getProperty("java.vm.version").startsWith("1.3"))
// correct = "foo_bar_42=Kr%C3%B8yt";
// (1) setup servlet mockup environ
params.clear();
params.put("foo_bar_42", "Kr\u00f8yt");
fakeRequest = new FakeServletRequest(params);
queryURL = params2URLQuery(fakeRequest, wantedParamNames);
assertTrue("Generated string not like expected (1): '" + queryURL + "'",
queryURL.equals(correct));
// (2) setup servlet mockup environ
wantedParamNames.clear();
wantedParamNames.put("id", null);
params.clear();
params.put("add_something_42", "langer dumpf backen Garden");
params.put("id", "42");
fakeRequest = new FakeServletRequest(params);
queryURL = params2URLQuery(fakeRequest, wantedParamNames);
assertTrue("Generated String is not like expected one (2): '" + queryURL + "'",
queryURL.equals("id=42"));
// (3) setup servlet mockup environ
wantedParamNames.put("tm", null);
params.clear();
params.put("id", "42");
params.put("add_something_42", "langer dumpf backen Garden");
params.put("tm", "opera.xtm");
fakeRequest = new FakeServletRequest(params);
queryURL = params2URLQuery(fakeRequest, wantedParamNames);
assertTrue("Generated String is not like expected one (3).",
queryURL.equals("id=42&tm=opera.xtm") ||
queryURL.equals("tm=opera.xtm&id=42"));
}
public void testParams2URLQueryMap() throws IOException {
String queryURL;
Map params = new HashMap();
params.put("topic_id", "42");
params.put("topicmap_id", "opera.xtm");
queryURL = params2URLQuery(params);
assertTrue("Generated String is not like expected one.",
queryURL.equals("topic_id=42&topicmap_id=opera.xtm") ||
queryURL.equals("topicmap_id=opera.xtm&topic_id=42"));
}
}