package com.onelogin.saml2.http;
import static java.util.Collections.singletonList;
import static java.util.Collections.singletonMap;
import static org.hamcrest.CoreMatchers.equalTo;
import static org.hamcrest.CoreMatchers.nullValue;
import static org.junit.Assert.assertNull;
import static org.junit.Assert.assertThat;
import static org.junit.Assert.assertTrue;
import java.util.Arrays;
import java.util.Collections;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import org.junit.Test;
import com.onelogin.saml2.test.NaiveUrlEncoder;
import com.onelogin.saml2.util.Util;
public class HttpRequestTest {
@Test
public void testConstructorWithNoQueryParams() throws Exception {
final String url = "url";
final HttpRequest request = new HttpRequest(url);
assertThat(request.getRequestURL(), equalTo(url));
assertThat(request.getParameters(), equalTo(Collections.<String, List<String>>emptyMap()));
assertThat(request.getParameters("x"), equalTo(Collections.<String>emptyList()));
assertThat(request.getParameter("x"), nullValue());
}
@Test
public void testConstructorWithQueryParams() throws Exception {
final String url = "url";
final String name = "name";
final String value1 = "val1";
final String value2 = "val2";
final List<String> values = Arrays.asList(value1, value2);
final Map<String, List<String>> parametersMap = singletonMap(name, values);
final HttpRequest request = new HttpRequest(url, parametersMap);
assertThat(request.getRequestURL(), equalTo(url));
assertThat(request.getParameters(), equalTo(parametersMap));
assertThat(request.getParameters(name), equalTo(values));
assertThat(request.getParameter(name), equalTo(value1));
}
@Test
public void testAddParameter() throws Exception {
final String url = "some_url";
final String name = "name";
final String value = "value";
final HttpRequest request = new HttpRequest(url).addParameter(name, value);
assertThat(request.getRequestURL(), equalTo(url));
assertThat(request.getParameters(), equalTo(singletonMap(name, singletonList(value))));
assertThat(request.getParameters(name), equalTo(singletonList(value)));
assertThat(request.getParameter(name), equalTo(value));
final HttpRequest request2 = request.addParameter(name, value);
assertThat(request2.getParameters(name), equalTo(Arrays.asList(value, value)));
}
@Test
public void testRemoveParameter() throws Exception {
final String url = "some_url";
final String name = "name";
final String value = "value";
HttpRequest request = new HttpRequest(url).addParameter(name, value);
assertThat(request.getRequestURL(), equalTo(url));
assertThat(request.getParameters(), equalTo(singletonMap(name, singletonList(value))));
assertThat(request.getParameters(name), equalTo(singletonList(value)));
assertThat(request.getParameter(name), equalTo(value));
request = request.removeParameter(name);
assertThat(request.getRequestURL(), equalTo(url));
assertTrue(request.getParameters().isEmpty());
assertTrue(request.getParameters(name).isEmpty());
assertNull(request.getParameter(name));
}
@Test
public void testGetEncodedParameter_encodesParametersNotOnQueryString() throws Exception {
final String url = "url";
final String name = "name";
final String value1 = "val/1!";
final String addedName = "added";
final String addedValue = "added#value!";
final List<String> values = Arrays.asList(value1);
final Map<String, List<String>> parametersMap = singletonMap(name, values);
final HttpRequest request = new HttpRequest(url, parametersMap).addParameter(addedName, addedValue);
assertThat(request.getEncodedParameter(name), equalTo(Util.urlEncoder(value1)));
assertThat(request.getEncodedParameter(addedName), equalTo(Util.urlEncoder(addedValue)));
}
@Test
public void testGetEncodedParameter_prefersValueFromQueryString() throws Exception {
final String url = "url";
final String name = "name";
final String value1 = "value1";
final String urlValue1 = "onUrl1";
final String queryString = name + "=" + urlValue1;
final List<String> values = Arrays.asList(value1);
final Map<String, List<String>> parametersMap = singletonMap(name, values);
final HttpRequest request = new HttpRequest(url, parametersMap, queryString);
assertThat(request.getEncodedParameter(name), equalTo(urlValue1));
assertThat(request.getParameter(name), equalTo(value1));
}
@Test
public void testGetEncodedParameter_returnsExactAsGivenInQueryString() throws Exception {
final String url = "url";
final String name = "name";
String encodedValue1 = NaiveUrlEncoder.encode("do not alter!");
final String queryString = name + "=" + encodedValue1;
final HttpRequest request = new HttpRequest(url, queryString);
assertThat(request.getEncodedParameter(name), equalTo(encodedValue1));
}
@Test
public void testGetEncodedParameter_handlesMultipleValuesOnQueryString() throws Exception {
final String url = "url";
final String queryString = "k1=v1&k2=v2&k3=v3";
final Map<String, List<String>> parametersMap = new HashMap<>();
final HttpRequest request = new HttpRequest(url, parametersMap, queryString);
assertThat(request.getEncodedParameter("k1"), equalTo("v1"));
assertThat(request.getEncodedParameter("k2"), equalTo("v2"));
assertThat(request.getEncodedParameter("k3"), equalTo("v3"));
}
@Test
public void testGetEncodedParameter_stopsAtUrlFragment() throws Exception {
final String url = "url";
final String queryString = "first=&foo=bar#ignore";
final HttpRequest request = new HttpRequest(url, queryString);
assertThat(request.getEncodedParameter("foo"), equalTo("bar"));
}
@Test
public void testGetEncodedParameter_withDefault_usesDefaultWhenParameterMissing() throws Exception {
final String url = "url";
final String foobar = "foo/bar!";
final HttpRequest request = new HttpRequest(url);
assertThat(request.getEncodedParameter("missing", foobar), equalTo(Util.urlEncoder(foobar)));
}
@Test
public void testAddParameter_preservesQueryString() throws Exception {
final String url = "url";
final String name = "name";
final String value1 = "val/1!";
String encodedValue1 = NaiveUrlEncoder.encode(value1);
final String queryString = name + "=" + encodedValue1;
final Map<String, List<String>> parametersMap = new HashMap<>();
final HttpRequest request = new HttpRequest(url, parametersMap, queryString).addParameter(name, value1);
assertThat(request.getEncodedParameter(name), equalTo(encodedValue1));
}
@Test
public void testRemoveParameter_preservesQueryString() throws Exception {
final String url = "url";
final String name = "name";
final String value1 = "val/1!";
String encodedValue1 = NaiveUrlEncoder.encode(value1);
final String queryString = name + "=" + encodedValue1;
final List<String> values = Arrays.asList(value1);
final Map<String, List<String>> parametersMap = singletonMap(name, values);
final HttpRequest request = new HttpRequest(url, parametersMap, queryString).removeParameter(name);
assertThat(request.getEncodedParameter(name), equalTo(encodedValue1));
}
}