package org.fluentlenium.core.url; import org.junit.Test; import java.util.stream.Collectors; import static org.assertj.core.api.Assertions.assertThat; import static org.assertj.core.api.Assertions.assertThatThrownBy; public class UrlTemplateTest { @Test public void testRender() { UrlTemplate urlParametersTemplate = new UrlTemplate("/abc/{param1}/def/{param2}/{param3}"); String url = urlParametersTemplate.add("test1").add("test2").add("test3").render(); assertThat(urlParametersTemplate.getParameters().stream().map(UrlParameter::getName).collect(Collectors.toList())) .containsExactly("param1", "param2", "param3"); assertThat(urlParametersTemplate.getParameters().stream().map(UrlParameter::isOptional).collect(Collectors.toList())) .containsExactly(false, false, false); assertThat(url).isEqualTo("/abc/test1/def/test2/test3"); } @Test public void testRenderOptionalParameter() { UrlTemplate urlParametersTemplate = new UrlTemplate("/abc/{param1}/def{?/param2}/ghi{?/param3}"); String url = urlParametersTemplate.add("test1").add("test2").render(); assertThat(urlParametersTemplate.getParameters().stream().map(UrlParameter::getName).collect(Collectors.toList())) .containsExactly("param1", "param2", "param3"); assertThat(urlParametersTemplate.getParameters().stream().map(UrlParameter::isOptional).collect(Collectors.toList())) .containsExactly(false, true, true); assertThat(url).isEqualTo("/abc/test1/def/test2/ghi"); urlParametersTemplate.clear(); assertThatThrownBy(() -> urlParametersTemplate.render()).isInstanceOf(IllegalArgumentException.class) .hasMessageContaining("Value for parameter param1 is missing"); } @Test public void testRenderNullOptionalParameter() { UrlTemplate urlParametersTemplate = new UrlTemplate("/abc/{param1}/def{?/param2}/ghi{?/param3}"); String url = urlParametersTemplate.add("test1").add(null).add("test3").render(); assertThat(urlParametersTemplate.getParameters().stream().map(UrlParameter::getName).collect(Collectors.toList())) .containsExactly("param1", "param2", "param3"); assertThat(urlParametersTemplate.getParameters().stream().map(UrlParameter::isOptional).collect(Collectors.toList())) .containsExactly(false, true, true); assertThat(url).isEqualTo("/abc/test1/def/ghi/test3"); } @Test public void testRenderNullOptionalPathParameter() { UrlTemplate urlParametersTemplate = new UrlTemplate("/abc/{param1}{?/def/param2}{?/ghi/param3}"); String url = urlParametersTemplate.add("test1").add(null).add("test3").render(); assertThat(urlParametersTemplate.getParameters().stream().map(UrlParameter::getName).collect(Collectors.toList())) .containsExactly("param1", "param2", "param3"); assertThat(urlParametersTemplate.getParameters().stream().map(UrlParameter::isOptional).collect(Collectors.toList())) .containsExactly(false, true, true); assertThat(url).isEqualTo("/abc/test1/ghi/test3"); } @Test public void testParse() { UrlTemplate urlParametersTemplate = new UrlTemplate("/abc/{param1}/def/{param2}/{param3}"); assertThat(urlParametersTemplate.getParameters().stream().map(UrlParameter::getName).collect(Collectors.toList())) .containsExactly("param1", "param2", "param3"); assertThat(urlParametersTemplate.getParameters().stream().map(UrlParameter::isOptional).collect(Collectors.toList())) .containsExactly(false, false, false); ParsedUrlTemplate parsed = urlParametersTemplate.parse("/abc/v1/def/v2/v3"); assertThat(parsed.matches()).isTrue(); assertThat(parsed.parameters()).hasSize(3); assertThat(parsed.parameters().keySet()).containsExactly("param1", "param2", "param3"); assertThat(parsed.parameters().values()).containsExactly("v1", "v2", "v3"); } @Test public void testParseOptionalParameter() { UrlTemplate urlParametersTemplate = new UrlTemplate("/abc/{param1}/def/{param2}{?/param3}"); assertThat(urlParametersTemplate.getParameters().stream().map(UrlParameter::getName).collect(Collectors.toList())) .containsExactly("param1", "param2", "param3"); assertThat(urlParametersTemplate.getParameters().stream().map(UrlParameter::isOptional).collect(Collectors.toList())) .containsExactly(false, false, true); ParsedUrlTemplate parsed = urlParametersTemplate.parse("/abc/v1/def/v2"); assertThat(parsed.matches()).isTrue(); assertThat(parsed.parameters()).hasSize(2); assertThat(parsed.parameters().keySet()).containsExactly("param1", "param2"); assertThat(parsed.parameters().values()).containsExactly("v1", "v2"); } @Test public void testParseOptionalPathParameter() { UrlTemplate urlParametersTemplate = new UrlTemplate("/abc/{param1}{?/def/param2}{?/param3}"); assertThat(urlParametersTemplate.getParameters().stream().map(UrlParameter::getName).collect(Collectors.toList())) .containsExactly("param1", "param2", "param3"); assertThat(urlParametersTemplate.getParameters().stream().map(UrlParameter::isOptional).collect(Collectors.toList())) .containsExactly(false, true, true); ParsedUrlTemplate parsed = urlParametersTemplate.parse("/abc/v1/def/v2"); assertThat(parsed.matches()).isTrue(); assertThat(parsed.parameters()).hasSize(2); assertThat(parsed.parameters().keySet()).containsExactly("param1", "param2"); assertThat(parsed.parameters().values()).containsExactly("v1", "v2"); } @Test public void testParseOptionalMiddleParameter() { UrlTemplate urlParametersTemplate = new UrlTemplate("/abc/{param1}/def{?/param2}/ghi/{param3}"); assertThat(urlParametersTemplate.getParameters().stream().map(UrlParameter::getName).collect(Collectors.toList())) .containsExactly("param1", "param2", "param3"); assertThat(urlParametersTemplate.getParameters().stream().map(UrlParameter::isOptional).collect(Collectors.toList())) .containsExactly(false, true, false); ParsedUrlTemplate parsed = urlParametersTemplate.parse("/abc/v1/def/ghi/v3"); assertThat(parsed.matches()).isTrue(); assertThat(parsed.parameters()).hasSize(2); assertThat(parsed.parameters().keySet()).containsExactly("param1", "param3"); assertThat(parsed.parameters().values()).containsExactly("v1", "v3"); } @Test public void testParseOptionalPathMiddleParameter() { UrlTemplate urlParametersTemplate = new UrlTemplate("/abc/{param1}{?/def/param2}{/ghi/param3}"); assertThat(urlParametersTemplate.getParameters().stream().map(UrlParameter::getName).collect(Collectors.toList())) .containsExactly("param1", "param2", "param3"); assertThat(urlParametersTemplate.getParameters().stream().map(UrlParameter::isOptional).collect(Collectors.toList())) .containsExactly(false, true, false); ParsedUrlTemplate parsed = urlParametersTemplate.parse("/abc/v1/ghi/v3"); assertThat(parsed.matches()).isTrue(); assertThat(parsed.parameters()).hasSize(2); assertThat(parsed.parameters().keySet()).containsExactly("param1", "param3"); assertThat(parsed.parameters().values()).containsExactly("v1", "v3"); } @Test public void testParseNotMatchingOptionalMiddleParameter() { UrlTemplate urlParametersTemplate = new UrlTemplate("/abc/{param1}/def{?/param2}/ghi/{param3}"); assertThat(urlParametersTemplate.getParameters().stream().map(UrlParameter::getName).collect(Collectors.toList())) .containsExactly("param1", "param2", "param3"); assertThat(urlParametersTemplate.getParameters().stream().map(UrlParameter::isOptional).collect(Collectors.toList())) .containsExactly(false, true, false); ParsedUrlTemplate parsed = urlParametersTemplate.parse("/abc/v1/def/ghi"); assertThat(parsed.matches()).isFalse(); assertThat(parsed.parameters()).hasSize(0); } @Test public void testParseNotMatchingUrl() { UrlTemplate urlParametersTemplate = new UrlTemplate("/abc/{param1}/def/{param2}{?/param3}"); assertThat(urlParametersTemplate.getParameters().stream().map(UrlParameter::getName).collect(Collectors.toList())) .containsExactly("param1", "param2", "param3"); assertThat(urlParametersTemplate.getParameters().stream().map(UrlParameter::isOptional).collect(Collectors.toList())) .containsExactly(false, false, true); ParsedUrlTemplate parsed = urlParametersTemplate.parse("/abc/v1/abc/v2"); assertThat(parsed.matches()).isFalse(); assertThat(parsed.parameters()).hasSize(0); } @Test public void testParseNotMatchingStartingUrl() { UrlTemplate urlParametersTemplate = new UrlTemplate("/abc/{param1}/def/{param2}{?/param3}"); assertThat(urlParametersTemplate.getParameters().stream().map(UrlParameter::getName).collect(Collectors.toList())) .containsExactly("param1", "param2", "param3"); assertThat(urlParametersTemplate.getParameters().stream().map(UrlParameter::isOptional).collect(Collectors.toList())) .containsExactly(false, false, true); ParsedUrlTemplate parsed = urlParametersTemplate.parse("/abc/v1/def/v2/v3/ghi"); assertThat(parsed.matches()).isFalse(); assertThat(parsed.parameters()).hasSize(0); } @Test public void testParseMatchingWithTrailingSlash() { UrlTemplate urlParametersTemplate = new UrlTemplate("/abc/{param1}/def/{param2}{?/param3}"); assertThat(urlParametersTemplate.getParameters().stream().map(UrlParameter::getName).collect(Collectors.toList())) .containsExactly("param1", "param2", "param3"); assertThat(urlParametersTemplate.getParameters().stream().map(UrlParameter::isOptional).collect(Collectors.toList())) .containsExactly(false, false, true); ParsedUrlTemplate parsed = urlParametersTemplate.parse("/abc/v1/def/v2/v3/"); assertThat(parsed.matches()).isTrue(); assertThat(parsed.parameters()).hasSize(3); assertThat(parsed.parameters().keySet()).containsExactly("param1", "param2", "param3"); assertThat(parsed.parameters().values()).containsExactly("v1", "v2", "v3"); } @Test public void testDuplicateParameters() { assertThatThrownBy(() -> new UrlTemplate("/abc/{param1}{?/def/param1}{?/ghi/param3}")) .isInstanceOf(IllegalStateException.class) .hasMessage("Multiple parameters are defined with the same name (param1)."); } }