From 3ea8e8e3080d6eb66eabaae9aec11226e3025d54 Mon Sep 17 00:00:00 2001 From: Alexey Zarovny Date: Wed, 19 Apr 2017 15:47:25 +0300 Subject: [PATCH 1/2] Fix parametrization for FindBy and Description annotation. --- .../htmlelements/util/ReflectionUtils.java | 4 +- .../htmlelements/ParametrizationTest.java | 41 +++++++++++++++++++ .../qameta/htmlelements/example/TestData.java | 2 +- .../example/element/SearchArrow.java | 2 +- 4 files changed, 45 insertions(+), 4 deletions(-) create mode 100644 src/test/java/io/qameta/htmlelements/ParametrizationTest.java diff --git a/src/main/java/io/qameta/htmlelements/util/ReflectionUtils.java b/src/main/java/io/qameta/htmlelements/util/ReflectionUtils.java index 4277148..baa3567 100644 --- a/src/main/java/io/qameta/htmlelements/util/ReflectionUtils.java +++ b/src/main/java/io/qameta/htmlelements/util/ReflectionUtils.java @@ -74,7 +74,7 @@ public static String getSelector(Method method, Object[] args) { Map parameters = getParameters(method, args); String selector = method.getAnnotation(FindBy.class).value(); for (String key : parameters.keySet()) { - selector = selector.replaceAll("\\{\\{ " + key + " \\}\\}", parameters.get(key)); + selector = selector.replaceAll("\\{\\{" + key + "\\}\\}", parameters.get(key)); } return selector; } @@ -84,7 +84,7 @@ public static String getDescription(Method method, Object[] args) { Map parameters = getParameters(method, args); String name = method.getAnnotation(Description.class).value(); for (String key : parameters.keySet()) { - name = name.replaceAll("\\{\\{ " + key + " \\}\\}", parameters.get(key)); + name = name.replaceAll("\\{\\{" + key + "\\}\\}", parameters.get(key)); } return name; } else { diff --git a/src/test/java/io/qameta/htmlelements/ParametrizationTest.java b/src/test/java/io/qameta/htmlelements/ParametrizationTest.java new file mode 100644 index 0000000..742df6c --- /dev/null +++ b/src/test/java/io/qameta/htmlelements/ParametrizationTest.java @@ -0,0 +1,41 @@ +package io.qameta.htmlelements; + +import io.qameta.htmlelements.example.element.SearchArrow; +import io.qameta.htmlelements.util.ReflectionUtils; +import org.junit.Test; + +import java.lang.reflect.Method; + +import static org.junit.Assert.assertEquals; + +/** + * @author nogert + */ +public class ParametrizationTest { + + private static final String TEST_FORM_NAME = "test form name"; + private static final String[] SEARCH_FORM_PARAMETERS = {TEST_FORM_NAME}; + + @Test + public void elementWithParametrizedDescriptionShouldHasCorrectName() throws NoSuchMethodException { + Method searchForm = getSearchFormMethod(); + String description = ReflectionUtils.getDescription(searchForm, new String[]{TEST_FORM_NAME}); + assertEquals(String.format("Форма %s", TEST_FORM_NAME), description); + + } + + @Test + public void elementWithParametrizedFindByShouldHasCorrectXpath() throws NoSuchMethodException { + Method searchForm = getSearchFormMethod(); + String selector = ReflectionUtils.getSelector(searchForm, SEARCH_FORM_PARAMETERS); + + assertEquals(String.format("//div[@class='%s']", TEST_FORM_NAME), selector); + } + + private Method getSearchFormMethod() throws NoSuchMethodException { + return ReflectionUtils.getMethods(SearchArrow.class) + .stream() + .filter(m -> m.getName().equals("form")) + .findFirst().orElseThrow(NoSuchMethodException::new); + } +} diff --git a/src/test/java/io/qameta/htmlelements/example/TestData.java b/src/test/java/io/qameta/htmlelements/example/TestData.java index b8f9e4a..e14c085 100644 --- a/src/test/java/io/qameta/htmlelements/example/TestData.java +++ b/src/test/java/io/qameta/htmlelements/example/TestData.java @@ -28,7 +28,7 @@ public class TestData { public static final String SEARCH_FORM_XPATH = "//div[@class='form']"; - public static final String SEARCH_FORM_TEMPLATE = "//div[@class='{{ className }}']"; + public static final String SEARCH_FORM_TEMPLATE = "//div[@class='{{className}}']"; public static final String REQUEST_INPUT_XPATH = "//div[@class='input']"; diff --git a/src/test/java/io/qameta/htmlelements/example/element/SearchArrow.java b/src/test/java/io/qameta/htmlelements/example/element/SearchArrow.java index 526eb40..5c9042a 100644 --- a/src/test/java/io/qameta/htmlelements/example/element/SearchArrow.java +++ b/src/test/java/io/qameta/htmlelements/example/element/SearchArrow.java @@ -13,7 +13,7 @@ */ public interface SearchArrow extends WithSuggest, ExtendedWebElement { - @Description("Форма {{ className }}") + @Description("Форма {{className}}") @FindBy(TestData.SEARCH_FORM_TEMPLATE) SearchForm form(@Param("className") String className); From 8eb1b08939053ded65a0a39d76b91574abda7adc Mon Sep 17 00:00:00 2001 From: Alexey Zarovny Date: Thu, 27 Apr 2017 15:35:18 +0300 Subject: [PATCH 2/2] Add Handlebars as template engine for parametrization. --- pom.xml | 14 ++++-- .../htmlelements/util/HandlebarsUtils.java | 27 ++++++++++++ .../htmlelements/util/ReflectionUtils.java | 10 +---- .../qameta/htmlelements/HandleBarsTest.java | 44 +++++++++++++++++++ .../example/element/SearchArrow.java | 2 +- 5 files changed, 84 insertions(+), 13 deletions(-) create mode 100644 src/main/java/io/qameta/htmlelements/util/HandlebarsUtils.java create mode 100644 src/test/java/io/qameta/htmlelements/HandleBarsTest.java diff --git a/pom.xml b/pom.xml index 8a57c84..009af35 100644 --- a/pom.xml +++ b/pom.xml @@ -38,6 +38,7 @@ 1.8 2.53.0 + 4.0.6 @@ -57,11 +58,16 @@ 1.3 - com.google.inject - guice - 4.1.0 + com.github.jknack + handlebars + ${handlebars.version} + + + org.mozilla + rhino + + - org.mockito mockito-all diff --git a/src/main/java/io/qameta/htmlelements/util/HandlebarsUtils.java b/src/main/java/io/qameta/htmlelements/util/HandlebarsUtils.java new file mode 100644 index 0000000..f99d8ed --- /dev/null +++ b/src/main/java/io/qameta/htmlelements/util/HandlebarsUtils.java @@ -0,0 +1,27 @@ +package io.qameta.htmlelements.util; + +import com.github.jknack.handlebars.Handlebars; +import com.github.jknack.handlebars.Template; + +import java.util.Map; + +/** + * @author nogert + */ +public class HandlebarsUtils { + + private static Handlebars handlebars = new Handlebars(); + + private HandlebarsUtils() { + } + + public static String resolveVars(String original, Map parameters) { + try { + Template template = handlebars.compileInline(original); + original = template.apply(parameters); + } catch (Exception ignored) { + //do nothing + } + return original; + } +} diff --git a/src/main/java/io/qameta/htmlelements/util/ReflectionUtils.java b/src/main/java/io/qameta/htmlelements/util/ReflectionUtils.java index baa3567..55be444 100644 --- a/src/main/java/io/qameta/htmlelements/util/ReflectionUtils.java +++ b/src/main/java/io/qameta/htmlelements/util/ReflectionUtils.java @@ -73,20 +73,14 @@ public static String getDescription(Class clazz) { public static String getSelector(Method method, Object[] args) { Map parameters = getParameters(method, args); String selector = method.getAnnotation(FindBy.class).value(); - for (String key : parameters.keySet()) { - selector = selector.replaceAll("\\{\\{" + key + "\\}\\}", parameters.get(key)); - } - return selector; + return HandlebarsUtils.resolveVars(selector, parameters); } public static String getDescription(Method method, Object[] args) { if (method.isAnnotationPresent(Description.class)) { Map parameters = getParameters(method, args); String name = method.getAnnotation(Description.class).value(); - for (String key : parameters.keySet()) { - name = name.replaceAll("\\{\\{" + key + "\\}\\}", parameters.get(key)); - } - return name; + return HandlebarsUtils.resolveVars(name, parameters); } else { return splitCamelCase(method.getName()); } diff --git a/src/test/java/io/qameta/htmlelements/HandleBarsTest.java b/src/test/java/io/qameta/htmlelements/HandleBarsTest.java new file mode 100644 index 0000000..e57e09e --- /dev/null +++ b/src/test/java/io/qameta/htmlelements/HandleBarsTest.java @@ -0,0 +1,44 @@ +package io.qameta.htmlelements; + +import io.qameta.htmlelements.util.HandlebarsUtils; +import org.junit.Test; + +import java.util.HashMap; + +import static org.junit.Assert.assertEquals; + +/** + * @author nogert + */ +public class HandleBarsTest { + + @Test + public void resolveCorrectTemplate() { + String original = "{{template}} is correct"; + HashMap parameters = new HashMap() {{ + put("template", "Template"); + }}; + + assertEquals("Template is correct", HandlebarsUtils.resolveVars(original, parameters)); + } + + @Test + public void resolveCorrectTemplateWithSpaces() { + String original = "{{ template }} is correct"; + HashMap parameters = new HashMap() {{ + put("template", "Template"); + }}; + + assertEquals("Template is correct", HandlebarsUtils.resolveVars(original, parameters)); + } + + @Test + public void notResolveNotCorrectTemplate() { + String original = "{{template is not correct"; + HashMap parameters = new HashMap() {{ + put("template", "Template"); + }}; + + assertEquals("{{template is not correct", HandlebarsUtils.resolveVars(original, parameters)); + } +} diff --git a/src/test/java/io/qameta/htmlelements/example/element/SearchArrow.java b/src/test/java/io/qameta/htmlelements/example/element/SearchArrow.java index 5c9042a..526eb40 100644 --- a/src/test/java/io/qameta/htmlelements/example/element/SearchArrow.java +++ b/src/test/java/io/qameta/htmlelements/example/element/SearchArrow.java @@ -13,7 +13,7 @@ */ public interface SearchArrow extends WithSuggest, ExtendedWebElement { - @Description("Форма {{className}}") + @Description("Форма {{ className }}") @FindBy(TestData.SEARCH_FORM_TEMPLATE) SearchForm form(@Param("className") String className);