package org.codefaces.ui;
import static org.junit.Assert.*;
import java.net.MalformedURLException;
import java.net.URLDecoder;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import org.junit.Test;
public class SCMURLConfigurationsTest {
private static final String[][] NORMAL_HTML_QUERY_PARAMETERS = {
{SCMConfigurableElement.REPO_URL.toString().toLowerCase(), "http://testing/url"},
{SCMConfigurableElement.SCM_KIND.toString().toLowerCase(), "test_kind"},
{SCMConfigurableElement.USER.toString().toLowerCase(), "test_user"},
{SCMConfigurableElement.PASSWORD.toString().toLowerCase(), "test_password"},
{SCMConfigurableElement.BASE_DIRECTORY.toString().toLowerCase(), "test/base/dir"}
};
private static final Object[][] HTML_QUERY_PARAMETERS_WITH_2_URLS = {
{
SCMConfigurableElement.REPO_URL.toString().toLowerCase(),
new String[] { "http://testing/url1", "http://testing/url1"}
}
};
private static final String[][] HTML_QUERY_PARAMETERS_WITH_UNKNOWN_PARAMETERS = {
{"unknowParameter1", "unknowValue1"},
{SCMConfigurableElement.REPO_URL.toString().toLowerCase(), "http://testing/url"},
{"unknowParameter2", "unknowValue2"}
};
private static final String TEST_URL = "http://test/url";
private static final String TEST_KIND = "GitHub";
@Test
public void configurationsShouldBeCorrectlyCreatedFormNormalHTMLQueryParameters()
throws MalformedURLException {
Map<String, String[]> parameters = new HashMap<String, String[]>();
for(int i=0; i<NORMAL_HTML_QUERY_PARAMETERS.length ; i++){
parameters.put(NORMAL_HTML_QUERY_PARAMETERS[i][0],
new String[] { NORMAL_HTML_QUERY_PARAMETERS[i][1] });
}
SCMURLConfiguration configuration = SCMURLConfiguration.fromHTTPParametersMap(parameters);
assertEquals(NORMAL_HTML_QUERY_PARAMETERS[0][1], configuration.get(SCMConfigurableElement.REPO_URL));
assertEquals(NORMAL_HTML_QUERY_PARAMETERS[1][1], configuration.get(SCMConfigurableElement.SCM_KIND));
assertEquals(NORMAL_HTML_QUERY_PARAMETERS[2][1], configuration.get(SCMConfigurableElement.USER));
assertEquals(NORMAL_HTML_QUERY_PARAMETERS[3][1], configuration.get(SCMConfigurableElement.PASSWORD));
assertEquals(NORMAL_HTML_QUERY_PARAMETERS[4][1], configuration.get(SCMConfigurableElement.BASE_DIRECTORY));
}
@Test(expected=MalformedURLException.class)
public void exceptionShouldBeThrownWhenKnownParametersContainsMultipleValues() throws MalformedURLException{
Map<String, String[]> parameters = new HashMap<String, String[]>();
parameters.put((String)HTML_QUERY_PARAMETERS_WITH_2_URLS[0][0],
(String[])HTML_QUERY_PARAMETERS_WITH_2_URLS[0][1]);
SCMURLConfiguration.fromHTTPParametersMap(parameters);
}
@Test
public void configurationsShouldSimplyIgnoreUnknownHTMLQueryParamerters() throws MalformedURLException{
Map<String, String[]> parameters = new HashMap<String, String[]>();
for(int i=0; i<HTML_QUERY_PARAMETERS_WITH_UNKNOWN_PARAMETERS.length ; i++){
parameters.put(HTML_QUERY_PARAMETERS_WITH_UNKNOWN_PARAMETERS[i][0],
new String[] { HTML_QUERY_PARAMETERS_WITH_UNKNOWN_PARAMETERS[i][1] });
}
SCMURLConfiguration configuration = SCMURLConfiguration.fromHTTPParametersMap(parameters);
assertEquals(1, configuration.getConfigurationsMap().size());
assertEquals(HTML_QUERY_PARAMETERS_WITH_UNKNOWN_PARAMETERS[1][1], configuration.get(SCMConfigurableElement.REPO_URL));
}
@Test
public void queryStringFromedShouldContainsParametersAsExpected() throws Exception{
SCMURLConfiguration configurations = new SCMURLConfiguration();
configurations.put(SCMConfigurableElement.REPO_URL, TEST_URL);
configurations.put(SCMConfigurableElement.SCM_KIND, TEST_KIND);
String queryString = configurations.toHTTPQueryString();
Map<String, List<String>> parsedQueryParametersMap = getParametersMap(queryString);
assertEquals(
TEST_URL,
parsedQueryParametersMap.get(
SCMConfigurableElement.REPO_URL.toString().toLowerCase()).get(0));
assertEquals(
TEST_KIND,
parsedQueryParametersMap.get(
SCMConfigurableElement.SCM_KIND.toString().toLowerCase()).get(0));
}
@Test
public void queryStringShouldBeNullForEmptyConfiguratin(){
SCMURLConfiguration configurations = new SCMURLConfiguration();
String queryString = configurations.toHTTPQueryString();
assertNull(queryString);
}
private Map<String, List<String>> getParametersMap(String url) throws Exception{
Map<String, List<String>> params = new HashMap<String, List<String>>();
String[] urlParts = url.split("\\?");
if (urlParts.length > 1) {
String query = urlParts[1];
for (String param : query.split("&")) {
String[] pair = param.split("=");
String key = URLDecoder.decode(pair[0], "UTF-8");
String value = URLDecoder.decode(pair[1], "UTF-8");
List<String> values = params.get(key);
if (values == null) {
values = new ArrayList<String>();
params.put(key, values);
}
values.add(value);
}
}
return params;
}
}