/*
* #%L
* Wisdom-Framework
* %%
* Copyright (C) 2013 - 2014 Wisdom Framework
* %%
* 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.
* #L%
*/
package router;
import com.google.common.collect.ImmutableMap;
import controllers.HelloController;
import controllers.ParameterController;
import controllers.UrlCodingController;
import org.junit.Test;
import org.wisdom.api.router.Router;
import org.wisdom.test.parents.WisdomTest;
import javax.inject.Inject;
import java.util.Collections;
import static org.assertj.core.api.Assertions.assertThat;
public class ReverseRouteIT extends WisdomTest {
@Inject
Router router;
@Test
public void testReverseRouteWithoutParams() {
// Path + uri.
assertThat(router.getReverseRouteFor(HelloController.class, "asText")).isEqualTo("/hello/plain");
// We don't provide the value of the argument.
assertThat(router.getReverseRouteFor(ParameterController.class, "takeLong")).isEqualTo("/parameter/long/{l}");
}
@Test
public void testReverseRouteWithParams() {
// Path + uri.
assertThat(router.getReverseRouteFor(HelloController.class, "asText", Collections.<String, Object>emptyMap()))
.isEqualTo("/hello/plain");
assertThat(router.getReverseRouteFor(ParameterController.class, "takeLong",
ImmutableMap.<String, Object>of("l", "1"))).isEqualTo("/parameter/long/1");
assertThat(router.getReverseRouteFor(ParameterController.class, "takeLong",
"l", "1")).isEqualTo("/parameter/long/1");
assertThat(router.getReverseRouteFor(ParameterController.class, "takeLongFromQuery",
"l", "1")).isEqualTo("/parameter/query/long?l=1");
assertThat(router.getReverseRouteFor(ParameterController.class, "takeLongFromQuery",
"l", "1", "a", "b")).contains("/parameter/query/long?").contains("l=1").contains("a=b");
}
@Test
public void testReverseRoutingUsingBooleanParameters() {
assertThat(router.getReverseRouteFor(ParameterController.class, "takeBoolean", "b",
true)).isEqualTo("/parameter/boolean/true");
assertThat(router.getReverseRouteFor(ParameterController.class, "takeBoolean", "b",
false)).isEqualTo("/parameter/boolean/false");
assertThat(router.getReverseRouteFor(ParameterController.class, "takeBooleanFromQuery", "b",
true)).isEqualTo("/parameter/query/boolean?b=true");
assertThat(router.getReverseRouteFor(ParameterController.class, "takeBooleanFromQuery", "b",
false)).isEqualTo("/parameter/query/boolean?b=false");
}
@Test
public void testReverseRoutingUsingIntegerParameters() {
assertThat(router.getReverseRouteFor(ParameterController.class, "takeInt", "i",
10)).isEqualTo("/parameter/integer/10");
assertThat(router.getReverseRouteFor(ParameterController.class, "takeIntFromQuery", "i",
10)).isEqualTo("/parameter/query/integer?i=10");
}
@Test
public void testReverseRoutingUsingLongParameters() {
assertThat(router.getReverseRouteFor(ParameterController.class, "takeLong", "l",
10)).isEqualTo("/parameter/long/10");
assertThat(router.getReverseRouteFor(ParameterController.class, "takeLongFromQuery", "l",
10)).isEqualTo("/parameter/query/long?l=10");
}
@Test
public void testReverseRoutingUsingStringParameters() {
assertThat(router.getReverseRouteFor(ParameterController.class, "takeString", "s",
"hello")).isEqualTo("/parameter/string/hello");
assertThat(router.getReverseRouteFor(ParameterController.class, "takeStringFromQuery", "s",
"hello")).isEqualTo("/parameter/query/string?s=hello");
}
@Test
public void testURLEncoding() throws Exception {
checkEncoding("123", "456", "789", "123", "456", "789");
checkEncoding("+", "+", "+", "+", "+", "%2B");
checkEncoding(" ", " ", " ", "%20", "%20", "+");
checkEncoding("&", "&", "&", "&", "&", "%26");
checkEncoding("=", "=", "=", "=", "=", "%3D");
checkEncoding("/", "/", "/", "%2F", "%2F", "%2F");
checkEncoding("~", "~", "~", "~", "~", "%7E");
}
public void checkEncoding(String decoded1, String decoded2, String decoded3,
String encoded1, String encoded2, String encoded3) throws Exception {
final String expected = "/urlcoding/" + encoded1 + "/" + encoded2 + "?q=" + encoded3;
final String computed = router.getReverseRouteFor(UrlCodingController.class, "coding", "p1", decoded1, "p2",
decoded2, "q", decoded3);
assertThat(computed).isEqualTo(expected);
}
}