/******************************************************************************* * Copyright (c) 2012-2016 Codenvy, S.A. * All rights reserved. This program and the accompanying materials * are made available under the terms of the Eclipse Public License v1.0 * which accompanies this distribution, and is available at * http://www.eclipse.org/legal/epl-v10.html * * Contributors: * Codenvy, S.A. - initial API and implementation *******************************************************************************/ package org.everrest.core.impl.uri; import com.google.common.collect.ImmutableMap; import com.tngtech.java.junit.dataprovider.DataProvider; import com.tngtech.java.junit.dataprovider.DataProviderRunner; import com.tngtech.java.junit.dataprovider.UseDataProvider; import org.junit.Rule; import org.junit.Test; import org.junit.rules.ExpectedException; import org.junit.runner.RunWith; import javax.ws.rs.GET; import javax.ws.rs.POST; import javax.ws.rs.Path; import javax.ws.rs.core.UriBuilder; import java.net.URI; import java.util.HashMap; import java.util.Map; import static org.junit.Assert.assertEquals; @RunWith(DataProviderRunner.class) public class UriBuilderImplTest { @Rule public ExpectedException thrown = ExpectedException.none(); @Test public void replacesScheme() { URI uri = UriBuilder.fromUri("http://localhost:8080/a/b/c").scheme("https").build(); assertEquals(URI.create("https://localhost:8080/a/b/c"), uri); } @Test public void removesScheme() { URI uri = UriBuilder.fromUri("http://localhost:8080/a/b/c").scheme(null).build(); assertEquals(URI.create("//localhost:8080/a/b/c"), uri); } @Test public void replacesUserInfo() { URI uri = UriBuilder.fromUri("http://exo@localhost:8080/a/b/c").userInfo("andrew").build(); assertEquals(URI.create("http://andrew@localhost:8080/a/b/c"), uri); } @Test public void removesUserInfo() { URI uri = UriBuilder.fromUri("http://exo@localhost:8080/a/b/c").userInfo(null).build(); assertEquals(URI.create("http://localhost:8080/a/b/c"), uri); } @Test public void replacesHost() { URI uri = UriBuilder.fromUri("http://localhost:8080/a/b/c").host("exoplatform.org").build(); assertEquals(URI.create("http://exoplatform.org:8080/a/b/c"), uri); } @Test public void replacesEncodedHost() { URI uri = UriBuilder.fromUri("http://localhost:8080/a/b/c").host("te st.org").build(); assertEquals(URI.create("http://te%20st.org:8080/a/b/c"), uri); } @Test public void removesHost() { URI uri = UriBuilder.fromUri("http://localhost:8080/a/b/c").host(null).build(); assertEquals(URI.create("http://:8080/a/b/c"), uri); } @Test public void replacesPort() { URI uri = UriBuilder.fromUri("http://localhost:8080/a/b/c").port(9000).build(); assertEquals(URI.create("http://localhost:9000/a/b/c"), uri); } @Test public void removesPort() { URI uri = UriBuilder.fromUri("http://localhost:8080/a/b/c").port(-1).build(); assertEquals(URI.create("http://localhost/a/b/c"), uri); } @Test @UseDataProvider("forAddsPath") public void addsPath(String source, String path, String expected) { URI uri = UriBuilder.fromUri(source).path(path).build(); assertEquals(URI.create(expected), uri); } @DataProvider public static Object[][] forAddsPath() { return new Object[][]{ {"http://localhost:8080/x", "a/b/c", "http://localhost:8080/x/a/b/c"}, {"http://localhost:8080/x/", "a/b/c", "http://localhost:8080/x/a/b/c"}, {"http://localhost:8080/x", "/a/b/c", "http://localhost:8080/x/a/b/c"}, {"http://localhost:8080/x/", "/a/b/c", "http://localhost:8080/x/a/b/c"}, {"http://localhost:8080/a/b/c/", "/", "http://localhost:8080/a/b/c/"}, {"http://localhost:8080/a/b/c", "/", "http://localhost:8080/a/b/c/"}, {"http://localhost:8080/a/b/c%20", "/x/y /z", "http://localhost:8080/a/b/c%20/x/y%20/z"} }; } @Test public void addsPathFromResource() { URI uri = UriBuilder.fromUri("http://localhost:8080/base").path(R.class).build(); assertEquals(URI.create("http://localhost:8080/base/resource"), uri); } @Test public void addsPathFromSubResourceMethod() throws Exception { URI uri = UriBuilder.fromUri("http://localhost:8080/base").path(R.class.getMethod("get")).build(); assertEquals(URI.create("http://localhost:8080/base/method1"), uri); } @Test public void addsPathFromResourceMethod() throws Exception { URI uri = UriBuilder.fromUri("http://localhost:8080/base").path(R.class.getMethod("post")).build(); assertEquals(URI.create("http://localhost:8080/base"), uri); } @Test public void addsPathFromResourceClassAndSubResourceMethod() { URI u = UriBuilder.fromUri("http://localhost:8080/base").path(R.class).path(R.class, "get").build(); assertEquals(URI.create("http://localhost:8080/base/resource/method1"), u); } @Test public void addsPathFromResourceClassAndResourceMethod() { URI u = UriBuilder.fromUri("http://localhost:8080/base").path(R.class).path(R.class, "post").build(); assertEquals(URI.create("http://localhost:8080/base/resource"), u); } @Test public void replacesPath() { URI uri = UriBuilder.fromUri("http://localhost:8080/a/b/c").replacePath("/x/y/z").build(); assertEquals(URI.create("http://localhost:8080/x/y/z"), uri); } @Test @UseDataProvider("forAddsSegment") public void addsSegment(String source, String[] segments, String expected) { URI uri = UriBuilder.fromUri(source).segment(segments).build(); assertEquals(URI.create(expected), uri); } @DataProvider public static Object[][] forAddsSegment() { return new Object[][]{ {"http://localhost:8080", new String[]{"a/b/c"}, "http://localhost:8080/a%2Fb%2Fc"}, {"http://localhost:8080", new String[]{"a/b/c", "/x/y/z"}, "http://localhost:8080/a%2Fb%2Fc/%2Fx%2Fy%2Fz"}, {"http://localhost:8080", new String[]{"/a/b/c/", "/x/y/z"}, "http://localhost:8080/%2Fa%2Fb%2Fc%2F/%2Fx%2Fy%2Fz"}, {"http://localhost:8080", new String[]{"/a/b/c", "x/y/z"}, "http://localhost:8080/%2Fa%2Fb%2Fc/x%2Fy%2Fz"} }; } @Test @UseDataProvider("forAddsMatrixParam") public void addsMatrixParams(String source, String matrixParamName, String[] matrixParamValues, String expected) { URI uri = UriBuilder.fromUri(source).matrixParam(matrixParamName, matrixParamValues).build(); assertEquals(URI.create(expected), uri); } @DataProvider public static Object[][] forAddsMatrixParam() { return new Object[][]{ {"http://localhost:8080/a/b/c;a=x;b=y", "c", new String[]{"z"}, "http://localhost:8080/a/b/c;a=x;b=y;c=z"}, {"http://localhost:8080/a/b/c;a=x;b=y", " c", new String[]{"z"}, "http://localhost:8080/a/b/c;a=x;%20c=z;b=y"}, {"http://localhost:8080/a/b/c;a=x;b=y", " c", new String[]{"%z"}, "http://localhost:8080/a/b/c;a=x;%20c=%25z;b=y"}, {"http://localhost:8080/a/b/c;a=x;b=y", "a", new String[]{"z"}, "http://localhost:8080/a/b/c;a=x;a=z;b=y"} }; } @Test public void addsPathAndMatrixParams() { URI u = UriBuilder.fromUri("http://localhost:8080/").path("a").matrixParam("x", " foo").matrixParam("y", "%20bar") .path("b").matrixParam("x", "f o%20o").build(); assertEquals(URI.create("http://localhost:8080/a;x=%20foo;y=%20bar/b;x=f%20o%20o"), u); } @Test @UseDataProvider("forReplacesMatrixParam") public void replacesMatrixParam(String source, String matrixParamName, String[] matrixParamValues, String expected) { URI uri = UriBuilder.fromUri(source).replaceMatrixParam(matrixParamName, matrixParamValues).build(); assertEquals(URI.create(expected), uri); } @DataProvider public static Object[][] forReplacesMatrixParam() { return new Object[][]{ {"http://localhost:8080/a/b/c;a=x;b=y;a=z", "a", new String[]{"b", "c"}, "http://localhost:8080/a/b/c;a=b;a=c;b=y"}, {"http://localhost:8080/a/b/c;a=x;b=y;a=z", "a", new String[]{"b", "c"}, "http://localhost:8080/a/b/c;a=b;a=c;b=y"}, {"http://localhost:8080/a/b/c;a=x;b=y;a=z", "a", new String[]{"%b", " c"}, "http://localhost:8080/a/b/c;a=%25b;a=%20c;b=y"}, {"http://localhost:8080/a/b/c;%25a=x;b=y;%25a=z", "%a", new String[]{"%b", " c"}, "http://localhost:8080/a/b/c;b=y;%25a=%25b;%25a=%20c"}, {"http://localhost:8080/a;b=y;c=z", "a", new String[]{"b", "c"}, "http://localhost:8080/a;a=b;a=c;b=y;c=z"}, {"http://localhost:8080/a/b/c;y=b;a=x;b=y;a=z", "b", null, "http://localhost:8080/a/b/c;a=x;a=z;y=b"}, {"http://localhost:8080/a/b/c;y=b;a=x;b=y;a=z", "b", new String[0], "http://localhost:8080/a/b/c;a=x;a=z;y=b"}, {"http://localhost:8080/a/b;a=x;b=y;a=z/c;a=x;b=y;a=z", "a", new String[]{"b", "c"}, "http://localhost:8080/a/b;a=x;b=y;a=z/c;a=b;a=c;b=y"} }; } @Test @UseDataProvider("forReplacesMatrix") public void replacesMatrix(String source, String matrix, String expected) { URI uri = UriBuilder.fromUri(source).replaceMatrix(matrix).build(); assertEquals(URI.create(expected), uri); } @DataProvider public static Object[][] forReplacesMatrix() { return new Object[][]{ {"http://localhost:8080/a/b/c;a=x;b=y", "x=a;y=b", "http://localhost:8080/a/b/c;x=a;y=b"}, {"http://localhost:8080/a/b/c", "x=a;y=b", "http://localhost:8080/a/b/c;x=a;y=b"}, {"http://localhost:8080/a/b/c", null, "http://localhost:8080/a/b/c"} }; } @Test @UseDataProvider("forAddsQueryParam") public void addsQueryParam(String source, String queryParamName, String[] queryParamValues, String expected) { URI u = UriBuilder.fromUri(source).queryParam(queryParamName, queryParamValues).build(); assertEquals(URI.create(expected), u); } @DataProvider public static Object[][] forAddsQueryParam() { return new Object[][]{ {"http://localhost:8080/a/b/c", "a", new String[]{"x"}, "http://localhost:8080/a/b/c?a=x"}, {"http://localhost:8080/a/b/c?a=x&b=y", "c ", new String[]{"%25z"}, "http://localhost:8080/a/b/c?a=x&b=y&c%20=%25z"}, {"http://localhost:8080/a/b/c?a=x&b=y", "a", new String[]{"z"}, "http://localhost:8080/a/b/c?a=x&b=y&a=z"} }; } @Test @UseDataProvider("forReplacesQueryParam") public void replacesQueryParam(String source, String queryParamName, String[] queryParamValues, String expected) { URI uri = UriBuilder.fromUri(source).replaceQueryParam(queryParamName, queryParamValues).build(); assertEquals(URI.create(expected), uri); } @DataProvider public static Object[][] forReplacesQueryParam() { return new Object[][]{ {"http://localhost:8080/a/b/c?a=x&b=y&a=z", "a", new String[]{"b", "c"}, "http://localhost:8080/a/b/c?b=y&a=b&a=c"}, {"http://localhost:8080/a/b/c?a=x&a=z&b=y", "a", new String[]{"b", "c"}, "http://localhost:8080/a/b/c?b=y&a=b&a=c"}, {"http://localhost:8080/a/b/c?b=y&a=x&y=b&a=z", "a", new String[]{"b%20", "c%"}, "http://localhost:8080/a/b/c?b=y&y=b&a=b%20&a=c%25"}, {"http://localhost:8080/a/b/c?b=y&a=x&y=b&a=z", "x", new String[]{"b"}, "http://localhost:8080/a/b/c?b=y&a=x&y=b&a=z&x=b"}, {"http://localhost:8080/a/b/c?b=y&a=x&b=&y=b&a=z", "b", null, "http://localhost:8080/a/b/c?a=x&y=b&a=z"}, {"http://localhost:8080/a/b/c?b=y&a=x&b=&y=b&a=z", "b", new String[0], "http://localhost:8080/a/b/c?a=x&y=b&a=z"} }; } @Test @UseDataProvider("forReplacesQueryParamsWithQueryString") public void replacesQueryParamsWithQueryString(String source, String queryString, String expected) { URI uri = UriBuilder.fromUri(source).replaceQuery(queryString).build(); assertEquals(URI.create(expected), uri); } @DataProvider public static Object[][] forReplacesQueryParamsWithQueryString() { return new Object[][]{ {"http://localhost:8080/a/b/c?a=x&b=y", "x=a&y=b&zzz=", "http://localhost:8080/a/b/c?x=a&y=b&zzz="}, {"http://localhost:8080/a/b/c?a=x&b=y", "", "http://localhost:8080/a/b/c"}, {"http://localhost:8080/a/b/c?a=x&b=y", null, "http://localhost:8080/a/b/c"} }; } @Test public void replacesFragment() { URI u = UriBuilder.fromUri("http://localhost:8080/a/b/c?a=x&b=y#hi").fragment("hel lo").build(); assertEquals(URI.create("http://localhost:8080/a/b/c?a=x&b=y#hel%20lo"), u); } @DataProvider public static Object[][] forCopiesComponentFromOtherUri() { return new Object[][]{ {"http://exo@localhost:8080/a/b/c?a=x&b=y#fragment", "https://exo@localhost:8080", "https://exo@localhost:8080/a/b/c?a=x&b=y#fragment"}, {"http://exo@localhost:8080/a/b/c?a=x&b=y#fragment", "http://andrew@localhost:8080", "http://andrew@localhost:8080/a/b/c?a=x&b=y#fragment"}, {"http://exo@localhost:8080/a/b/c?a=x&b=y#fragment", "/x/y/z", "http://exo@localhost:8080/x/y/z?a=x&b=y#fragment"}, {"http://exo@localhost:8080/a/b/c?a=x&b=y#fragment", "?x=a&b=y", "http://exo@localhost:8080/a/b/c?x=a&b=y#fragment"}, {"http://exo@localhost:8080/a/b/c?a=x&b=y#fragment", "#new_fragment", "http://exo@localhost:8080/a/b/c?a=x&b=y#new_fragment"} }; } @Test @UseDataProvider("forCopiesComponentFromOtherUri") public void copiesComponentFromOtherUri(String source, String otherUri, String expected) { URI uri = UriBuilder.fromUri(source).uri(otherUri).build(); assertEquals(URI.create(expected), uri); } @Test public void replacesSchemeSpecificPart() { URI uri1 = URI.create("http://exo@localhost:8080/a/b/c?a=x&b=y#fragment"); URI uri2 = UriBuilder.fromUri(uri1).schemeSpecificPart("//andrew@exoplatform.org:9000/x /y/z?x= a&y=b").build(); assertEquals(URI.create("http://andrew@exoplatform.org:9000/x%20/y/z?x=%20a&y=b#fragment"), uri2); } @Test public void failsSetInvalidScheme() { thrown.expect(IllegalArgumentException.class); UriBuilder.fromUri("http://localhost:8080/a/b/c").scheme("htt\tp").build(); } @Test public void failsSetInvalidPort() { thrown.expect(IllegalArgumentException.class); UriBuilder.fromUri("http://localhost:8080/a/b/c").port(-10).build(); } @Test public void failsSetNullUri() { URI origin = URI.create("http://exo@localhost:8080/a/b/c?a=x&b=y#fragment"); thrown.expect(IllegalArgumentException.class); UriBuilder.fromUri(origin).uri((String)null).build(); } @Test public void failsSetNullSchemeSpecificPart() { thrown.expect(IllegalArgumentException.class); UriBuilder.fromUri("http://localhost:8080/a/b/c").schemeSpecificPart(null).build(); } @Test public void failsAddNullPath() { thrown.expect(IllegalArgumentException.class); UriBuilder.fromUri("http://localhost:8080/").path((String)null).build(); } @Test public void failsAddPathFromNotResourceClass() { thrown.expect(IllegalArgumentException.class); UriBuilder.fromUri("http://localhost:8080/base").path(Object.class).build(); } @Test public void failsAddPathFromNotExistedMethod() { thrown.expect(IllegalArgumentException.class); UriBuilder.fromUri("http://localhost:8080/base").path(R.class).path(R.class, "wrong").build(); } @Test public void failsAddPathWhenClassContainsMoreThenOneMethodWithTheSameName() { thrown.expect(IllegalArgumentException.class); UriBuilder.fromUri("http://localhost:8080/base").path(R.class).path(R2.class, "get").build(); } @Test public void failsAddNullSegment() { thrown.expect(IllegalArgumentException.class); UriBuilder.fromUri("http://localhost:8080/").segment((String[])null).build(); } @Test public void failsAddSegmentsWhenOneOfThemIsNull() { thrown.expect(IllegalArgumentException.class); UriBuilder.fromUri("http://localhost:8080/").segment("a", null, "b").build(); } @Test public void failsAddMatrixParamWhenNameIsNull() { thrown.expect(IllegalArgumentException.class); UriBuilder.fromUri("http://localhost:8080/a/b/c").matrixParam(null, "x").build(); } @Test public void failsReplaceMatrixParamWhenNameIsNull() { thrown.expect(IllegalArgumentException.class); UriBuilder.fromUri("http://localhost:8080/a/b/c;y=b;a=x;b=y;a=z").replaceMatrixParam(null, "a").build(); } @Test public void failsAddMatrixParamWhenValueIsNull() { thrown.expect(IllegalArgumentException.class); UriBuilder.fromUri("http://localhost:8080/a/b/c").matrixParam("a", (String[])null).build(); } @Test public void failsAddMatrixParamWhenOneValueIsNull() { thrown.expect(IllegalArgumentException.class); UriBuilder.fromUri("http://localhost:8080/a/b/c").matrixParam("a", new String[]{"x", null}).build(); } @Test public void failsAddQueryParamWhenNameIsNull() { thrown.expect(IllegalArgumentException.class); UriBuilder.fromUri("http://localhost:8080/a/b/c?a=x&b=y").queryParam(null, "z").build(); } @Test public void failsReplaceQueryParamWhenNameIsNull() { thrown.expect(IllegalArgumentException.class); UriBuilder.fromUri("http://localhost:8080/a/b/c?b=y&a=x&y=b&a=z").replaceQueryParam(null, "b", "c").build(); } @Test public void failsAddQueryParamWhenValuesIsNull() { thrown.expect(IllegalArgumentException.class); UriBuilder.fromUri("http://localhost:8080/a/b/c?a=x&b=y").queryParam("c", (String[])null).build(); } @Test public void failsAddQueryParamWhenOneValueIsNull() { thrown.expect(IllegalArgumentException.class); UriBuilder.fromUri("http://localhost:8080/a/b/c?a=x&b=y").queryParam("c", new String[]{"z", null}).build(); } @Test public void failsSetInvalidQueryString() { thrown.expect(IllegalArgumentException.class); UriBuilder.fromUri("http://localhost:8080/a/b/c?a=x&b=y").replaceQuery("x=a&=zzz&y=b").build(); } @UseDataProvider("forBuildsUriFromMap") @Test public void buildsUriFromMap(String source, Map<String, Object> map, String expected) { URI uri = UriBuilder.fromUri(source).buildFromMap(map); assertEquals(URI.create(expected), uri); } @DataProvider public static Object[][] forBuildsUriFromMap() { return new Object[][]{ {"http://localhost:8080/a/b/c/{foo}/{bar}/{baz}/{foo}", ImmutableMap.of("foo", "%25x", "bar", "%y", "baz", "z"), "http://localhost:8080/a/b/c/%2525x/%25y/z/%2525x"}, {"http://localhost:8080/a/b/c/{foo}/{bar}/baz/foo", ImmutableMap.of("foo", "%25x", "bar", "%y"), "http://localhost:8080/a/b/c/%2525x/%25y/baz/foo"}, {"http://localhost:8080/a/b/c/{foo}/{bar}/{foo}/baz", ImmutableMap.of("foo", "%25x", "bar", "%y"), "http://localhost:8080/a/b/c/%2525x/%25y/%2525x/baz"} }; } @UseDataProvider("forBuildsUriFromEncodedMap") @Test public void buildsUriFromEncodedMap(String source, Map<String, Object> map, String expected) { URI uri = UriBuilder.fromUri(source).buildFromEncodedMap(map); assertEquals(URI.create(expected), uri); } @DataProvider public static Object[][] forBuildsUriFromEncodedMap() { return new Object[][]{ {"http://localhost:8080/a/b/c/{foo}/{bar}/{baz}/{foo}", ImmutableMap.of("foo", "%25x", "bar", "%y", "baz", "z"), "http://localhost:8080/a/b/c/%25x/%25y/z/%25x"}, {"http://localhost:8080/a/b/c/{foo}/{bar}/baz/foo", ImmutableMap.of("foo", "%25x", "bar", "%y"), "http://localhost:8080/a/b/c/%25x/%25y/baz/foo"}, {"http://localhost:8080/a/b/c/{foo}/{bar}/{foo}/baz", ImmutableMap.of("foo", "%25x", "bar", "%y"), "http://localhost:8080/a/b/c/%25x/%25y/%25x/baz"} }; } @UseDataProvider("forBuildsUriFromArray") @Test public void buildsUriFromArray(String source, Object[] array, String expected) { URI uri = UriBuilder.fromUri(source).build(array); assertEquals(URI.create(expected), uri); } @DataProvider public static Object[][] forBuildsUriFromArray() { return new Object[][]{ {"http://localhost:8080/a/b/c/{foo}/{bar}/{baz}/{foo}", new Object[]{"%25x", "%y", "z", "wrong"}, "http://localhost:8080/a/b/c/%2525x/%25y/z/%2525x"}, {"http://localhost:8080/a/b/c/{foo}/{bar}/baz/foo", new Object[]{"z", "y"}, "http://localhost:8080/a/b/c/z/y/baz/foo"}, {"http://localhost:8080/a/b/c/{foo}/{bar}/{foo}/baz", new Object[]{"z", "y"}, "http://localhost:8080/a/b/c/z/y/z/baz"} }; } @UseDataProvider("forBuildsUriFromArrayEncodeSlashInPath") @Test public void buildsUriFromArrayEncodeSlashInPath(String source, boolean encodeSlashInPath, Object[] array, String expected) { URI uri = UriBuilder.fromUri(source).build(array, encodeSlashInPath); assertEquals(URI.create(expected), uri); } @DataProvider public static Object[][] forBuildsUriFromArrayEncodeSlashInPath() { return new Object[][]{ {"http://localhost:8080/a/b/c/{foo}/{bar}/baz/foo", false, new Object[]{"z", "y"}, "http://localhost:8080/a/b/c/z/y/baz/foo"}, {"http://localhost:8080/a/b/c/{foo}/{bar}/baz/foo", true, new Object[]{"z", "y"}, "http://localhost:8080/a/b/c/z/y/baz/foo"}, {"http://localhost:8080/a/b/c/{foo}/{bar}/{foo}/baz", false, new Object[]{"z", "y"}, "http://localhost:8080/a/b/c/z/y/z/baz"}, {"http://localhost:8080/a/b/c/{foo}/{bar}/{foo}/baz", true, new Object[]{"z", "y"}, "http://localhost:8080/a/b/c/z/y/z/baz"}, {"http://localhost:8080/a/b/c/{foo}/{bar}", false, new Object[]{"x/z", "y/x"}, "http://localhost:8080/a/b/c/x/z/y/x"}, {"http://localhost:8080/a/b/c/{foo}/{bar}", false, new Object[]{"x%2Fz", "y%2Fx"}, "http://localhost:8080/a/b/c/x%252Fz/y%252Fx"} }; } @UseDataProvider("forBuildsUriFromEncodedArray") @Test public void buildsUriFromEncodedArray(String source, Object[] array, String expected) { URI uri = UriBuilder.fromUri(source).buildFromEncoded(array); assertEquals(URI.create(expected), uri); } @DataProvider public static Object[][] forBuildsUriFromEncodedArray() { return new Object[][]{ {"http://localhost:8080/a/b/c/{foo}/{bar}/{baz}/{foo}", new Object[]{"%25x", "%y", "z", "wrong"}, "http://localhost:8080/a/b/c/%25x/%25y/z/%25x"}, {"http://localhost:8080/a/b/c/{foo}/{bar}/baz/foo", new Object[]{"%25x", "%y", "wrong"}, "http://localhost:8080/a/b/c/%25x/%25y/baz/foo"}, {"http://localhost:8080/a/b/c/{foo}/{bar}/{foo}/baz", new Object[]{"%25x", "%y", "wrong"}, "http://localhost:8080/a/b/c/%25x/%25y/%25x/baz"}, {"http://localhost:8080/a/b/c/{foo}/{bar}", new Object[]{"x/z", "y/x"}, "http://localhost:8080/a/b/c/x/z/y/x"}, {"http://localhost:8080/a/b/c/{foo}/{bar}", new Object[]{"x%2Fz", "y%2Fx"}, "http://localhost:8080/a/b/c/x%2Fz/y%2Fx"} }; } @UseDataProvider("forResolvesTemplateWithOneParameter") @Test public void resolvesTemplateWithOneParameter(String source, String paramName, Object paramValue, String expected) { String template = UriBuilder.fromUri(source).resolveTemplate(paramName, paramValue).toTemplate(); assertEquals(expected, template); } @DataProvider public static Object[][] forResolvesTemplateWithOneParameter() { return new Object[][] { {"{scheme}://{host}:{port}/a/{path}?{query}#{fragment}", "scheme", "https", "https://{host}:{port}/a/{path}?{query}#{fragment}"}, {"{scheme}://{host}:{port}/a/{path}?{query}#{fragment}", "host", "localhost", "{scheme}://localhost:{port}/a/{path}?{query}#{fragment}"}, {"{scheme}://{host}:{port}/a/{path}?{query}#{fragment}", "port", "8080", "{scheme}://{host}:8080/a/{path}?{query}#{fragment}"}, {"{scheme}://{host}:{port}/a/{path}?{query}#{fragment}", "path", "b/c", "{scheme}://{host}:{port}/a/b/c?{query}#{fragment}"}, {"{scheme}://{host}:{port}/a/{path}?{query}#{fragment}", "query", "qqq", "{scheme}://{host}:{port}/a/{path}?qqq#{fragment}"}, {"{scheme}://{host}:{port}/a/{path}?{query}#{fragment}", "fragment", "fff", "{scheme}://{host}:{port}/a/{path}?{query}#fff"} }; } @Test public void resolvesTemplateWithOneParameterEncodeSlashInPath() { String template = "{scheme}://{host}/a/{path}?{q}={v}#{fragment}"; UriBuilder builder = UriBuilder.fromUri(template); builder.resolveTemplate("path", "b/c", true); assertEquals("{scheme}://{host}/a/b%2Fc?{q}={v}#{fragment}", builder.toTemplate()); } @Test public void resolvesTemplateWithOneParameterFromEncoded() { String template = "http://localhost/a/{path}"; UriBuilder builder = UriBuilder.fromUri(template); builder.resolveTemplateFromEncoded("path", "b%2fc"); assertEquals("http://localhost/a/b%2fc", builder.toTemplate()); } @Test public void resolvesTemplateWithMap() { String template = "{scheme}://{host}/a/{path}?{q}={v}#{fragment}"; UriBuilder builder = UriBuilder.fromUri(template); Map<String, Object> templateValues = new HashMap<>(8); templateValues.put("scheme", "https"); templateValues.put("host", "localhost"); templateValues.put("path", "b/c"); templateValues.put("q", "test"); templateValues.put("v", "hello"); templateValues.put("fragment", "hello_fragment"); builder.resolveTemplates(templateValues); assertEquals("https://localhost/a/b/c?test=hello#hello_fragment", builder.toTemplate()); } @Test public void resolvesTemplateWithMapEncodeSlashInPath() { String template = "{scheme}://{host}/a/{path}?{q}={v}#{fragment}"; UriBuilder builder = UriBuilder.fromUri(template); builder.resolveTemplate("path", "b/c", true); assertEquals("{scheme}://{host}/a/b%2Fc?{q}={v}#{fragment}", builder.toTemplate()); } @Test public void resolvesTemplateWithMapFromEncoded() { String template = "http://localhost/a/{path}"; UriBuilder builder = UriBuilder.fromUri(template); builder.resolveTemplateFromEncoded("path", "b%2fc"); assertEquals("http://localhost/a/b%2fc", builder.toTemplate()); } @Test public void clones() { UriBuilder builder = UriBuilder.fromUri("http://user@localhost:8080/a?query#fragment"); assertEquals(URI.create("http://user@localhost:8080/a?query#fragment"), builder.build()); assertEquals(URI.create("http://user@localhost:8080/a/b?query#fragment"), builder.clone().path("b").build()); } @Path("resource") class R { @GET @Path("method1") public void get() { } @POST public void post() { } } @Path("resource2") class R2 { @GET @Path("method1") public void get() { } @GET @Path("method2") public void get(String s) { } } }