From b6af5dc5fc44dbe8c535d7a9a457eaf9f485565f Mon Sep 17 00:00:00 2001 From: Hdebbech Date: Sat, 10 Jun 2017 15:07:55 +0100 Subject: [PATCH 1/3] Unit test --- .../java/io/asfjava/ui/core/GeneratorFactoryInitializer.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/io/asfjava/ui/core/GeneratorFactoryInitializer.java b/src/main/java/io/asfjava/ui/core/GeneratorFactoryInitializer.java index 09de369..a1ec7e1 100644 --- a/src/main/java/io/asfjava/ui/core/GeneratorFactoryInitializer.java +++ b/src/main/java/io/asfjava/ui/core/GeneratorFactoryInitializer.java @@ -5,7 +5,7 @@ import javax.servlet.annotation.WebListener; @WebListener -class GeneratorFactoryInitializer implements ServletContextListener { +public class GeneratorFactoryInitializer implements ServletContextListener { @Override public final void contextInitialized(final ServletContextEvent sce) { From 0a5110831c68e8325b7ca6a3269a9c8bd85c6f83 Mon Sep 17 00:00:00 2001 From: Hdebbech Date: Sat, 10 Jun 2017 15:12:27 +0100 Subject: [PATCH 2/3] Unit Test --- .../decorator/NumberSchemaDecorator.java | 22 ++ .../ui/core/schema/CivilStateValues.java | 21 ++ .../ui/core/schema/GenderTitleMap.java | 18 ++ .../ui/core/schema/MyCheckBoxValues.java | 18 ++ .../schema/UiFormSchemaGeneratorTest.java | 264 ++++++++++++++++++ .../io/asfjava/ui/test/JsonNodeAssert.java | 55 ++++ 6 files changed, 398 insertions(+) create mode 100644 src/main/java/io/asfjava/ui/schema/decorator/NumberSchemaDecorator.java create mode 100644 src/test/java/io/asfjava/ui/core/schema/CivilStateValues.java create mode 100644 src/test/java/io/asfjava/ui/core/schema/GenderTitleMap.java create mode 100644 src/test/java/io/asfjava/ui/core/schema/MyCheckBoxValues.java create mode 100644 src/test/java/io/asfjava/ui/core/schema/UiFormSchemaGeneratorTest.java create mode 100644 src/test/java/io/asfjava/ui/test/JsonNodeAssert.java diff --git a/src/main/java/io/asfjava/ui/schema/decorator/NumberSchemaDecorator.java b/src/main/java/io/asfjava/ui/schema/decorator/NumberSchemaDecorator.java new file mode 100644 index 0000000..73e3a68 --- /dev/null +++ b/src/main/java/io/asfjava/ui/schema/decorator/NumberSchemaDecorator.java @@ -0,0 +1,22 @@ +package io.asfjava.ui.schema.decorator; + +import com.fasterxml.jackson.databind.BeanProperty; +import com.fasterxml.jackson.module.jsonSchema.JsonSchema; +import com.fasterxml.jackson.module.jsonSchema.types.StringSchema; + +public class NumberSchemaDecorator implements SchemaDecorator{ + + @Override + public void customizeSchema(BeanProperty property, JsonSchema jsonschema) { + io.asfjava.ui.core.form.Number annotation = property.getAnnotation(io.asfjava.ui.core.form.Number.class); + if (annotation != null && annotation.title() != null) { + ((StringSchema) jsonschema).setTitle(annotation.title()); + } + } + + @Override + public String getAnnotation() { + return io.asfjava.ui.core.form.Number.class.getName(); + } + +} diff --git a/src/test/java/io/asfjava/ui/core/schema/CivilStateValues.java b/src/test/java/io/asfjava/ui/core/schema/CivilStateValues.java new file mode 100644 index 0000000..e54aff0 --- /dev/null +++ b/src/test/java/io/asfjava/ui/core/schema/CivilStateValues.java @@ -0,0 +1,21 @@ +package io.asfjava.ui.core.schema; + +import java.util.HashMap; +import java.util.Map; + +import io.asfjava.ui.core.form.ValuesContainer; + +public class CivilStateValues implements ValuesContainer { + + @Override + public Map getValues() { + + HashMap myMap = new HashMap<>(); + + myMap.put("Maried", "COMMITTED"); + myMap.put("Single", "HAPPY"); + myMap.put("Divorced", "RELEASED"); + + return myMap; + } +} diff --git a/src/test/java/io/asfjava/ui/core/schema/GenderTitleMap.java b/src/test/java/io/asfjava/ui/core/schema/GenderTitleMap.java new file mode 100644 index 0000000..8a2bea3 --- /dev/null +++ b/src/test/java/io/asfjava/ui/core/schema/GenderTitleMap.java @@ -0,0 +1,18 @@ +package io.asfjava.ui.core.schema; + +import java.util.HashMap; +import java.util.Map; + +import io.asfjava.ui.core.form.ValuesContainer; + +public class GenderTitleMap implements ValuesContainer { + + @Override + public Map getValues() { + HashMap values = new HashMap<>(); + values.put("Male", "male"); + values.put("Female", "female"); + return values; + } + +} diff --git a/src/test/java/io/asfjava/ui/core/schema/MyCheckBoxValues.java b/src/test/java/io/asfjava/ui/core/schema/MyCheckBoxValues.java new file mode 100644 index 0000000..8eff4b2 --- /dev/null +++ b/src/test/java/io/asfjava/ui/core/schema/MyCheckBoxValues.java @@ -0,0 +1,18 @@ +package io.asfjava.ui.core.schema; + +import java.util.HashMap; +import java.util.Map; + +import io.asfjava.ui.core.form.ValuesContainer; + +public class MyCheckBoxValues implements ValuesContainer { + + @Override + public Map getValues() { + Map values = new HashMap<>(); + values.put("Red", "red"); + values.put("Green", "green"); + values.put("Blue", "blue"); + return values; + } +} diff --git a/src/test/java/io/asfjava/ui/core/schema/UiFormSchemaGeneratorTest.java b/src/test/java/io/asfjava/ui/core/schema/UiFormSchemaGeneratorTest.java new file mode 100644 index 0000000..f1be8e7 --- /dev/null +++ b/src/test/java/io/asfjava/ui/core/schema/UiFormSchemaGeneratorTest.java @@ -0,0 +1,264 @@ +package io.asfjava.ui.core.schema; + +import java.io.Serializable; + +import org.junit.BeforeClass; +import org.junit.Test; + +import com.fasterxml.jackson.core.JsonProcessingException; +import com.fasterxml.jackson.databind.JsonNode; +import com.fasterxml.jackson.databind.ObjectMapper; + +import io.asfjava.ui.core.GeneratorFactoryInitializer; +import io.asfjava.ui.core.form.CheckBox; +import io.asfjava.ui.core.form.ComboBox; +import io.asfjava.ui.core.form.Number; +import io.asfjava.ui.core.form.Password; +import io.asfjava.ui.core.form.RadioBox; +import io.asfjava.ui.core.form.TextArea; +import io.asfjava.ui.core.form.TextField; +import io.asfjava.ui.dto.UiForm; +import io.asfjava.ui.test.JsonNodeAssert; + +public class UiFormSchemaGeneratorTest { + + @BeforeClass + public static void init() { + new GeneratorFactoryInitializer().contextInitialized(null); + } + + @Test + public void testGenerate_textField() throws JsonProcessingException { + UiForm ui = UiFormSchemaGenerator.get().generate(TextFieldForm.class); + JsonNode json = new ObjectMapper().valueToTree(ui); + JsonNodeAssert asserter = new JsonNodeAssert(json); + asserter.assertEquals("schema.properties.firstName.title", "First Name"); + asserter.assertEquals("schema.properties.firstName.pattern", "[a-z]"); + asserter.assertEquals("form.0.key", "firstName"); + asserter.assertTrue("form.0.notitle"); + asserter.assertEquals("form.0.validationMessage", "this is a validation msg"); + asserter.assertEquals("form.0.description", "This is a description for your first name field"); + asserter.assertEquals("form.0.placeholder", "Your first name"); + } + + @Test + public void testGenerate_Number() throws JsonProcessingException { + UiForm ui = UiFormSchemaGenerator.get().generate(NumberForm.class); + JsonNode json = new ObjectMapper().valueToTree(ui); + JsonNodeAssert asserter = new JsonNodeAssert(json); + asserter.assertEquals("schema.properties.number.title", "Number of children"); + asserter.assertEquals("form.0.key", "number"); + asserter.assertTrue("form.0.notitle"); + asserter.assertTrue("form.0.readonly"); + asserter.assertEquals("form.0.validationMessage", "this is a validation msg"); + asserter.assertEquals("form.0.description", "This is a number"); + asserter.assertEquals("form.0.placeholder", "Number of children"); + } + + @Test + public void testGenerate_Password() throws JsonProcessingException { + UiForm ui = UiFormSchemaGenerator.get().generate(PasswordForm.class); + JsonNode json = new ObjectMapper().valueToTree(ui); + JsonNodeAssert asserter = new JsonNodeAssert(json); + asserter.assertEquals("schema.properties.password.title", "Password"); + asserter.assertEquals("form.0.key", "password"); + asserter.assertTrue("form.0.notitle"); + asserter.assertTrue("form.0.readonly"); + asserter.assertEquals("form.0.validationMessage", "this is a validation msg"); + asserter.assertEquals("form.0.description", "This is password"); + asserter.assertEquals("form.0.placeholder", "Please set you password"); + } + + @Test + public void testGenerate_TextArea() throws JsonProcessingException { + UiForm ui = UiFormSchemaGenerator.get().generate(TextAreaForm.class); + JsonNode json = new ObjectMapper().valueToTree(ui); + JsonNodeAssert asserter = new JsonNodeAssert(json); + asserter.assertEquals("schema.properties.address.title", "Address"); + asserter.assertEquals("form.0.key", "address"); + asserter.assertTrue("form.0.notitle"); + asserter.assertTrue("form.0.readonly"); + asserter.assertEquals("form.0.validationMessage", "this is a validation msg"); + asserter.assertEquals("form.0.description", "This is textarea"); + asserter.assertEquals("form.0.placeholder", "Fill your address please"); + } + + @Test + public void testGenerate_CheckBox() throws JsonProcessingException { + UiForm ui = UiFormSchemaGenerator.get().generate(CheckBoxForm.class); + JsonNode json = new ObjectMapper().valueToTree(ui); + JsonNodeAssert asserter = new JsonNodeAssert(json); + asserter.assertEquals("schema.properties.color.title", "Color"); + asserter.assertEquals("form.0.key", "color"); + asserter.assertFalse("form.0.multiple"); + asserter.assertTrue("form.0.required"); + asserter.assertEquals("form.0.titleMap.0.name", "Red"); + asserter.assertEquals("form.0.titleMap.0.value", "red"); + asserter.assertEquals("form.0.titleMap.1.name", "Blue"); + asserter.assertEquals("form.0.titleMap.1.value", "blue"); + asserter.assertEquals("form.0.titleMap.2.name", "Green"); + asserter.assertEquals("form.0.titleMap.2.value", "green"); + } + + @Test + public void testGenerate_CheckBox_WithCustomValuesContainer() throws JsonProcessingException { + UiForm ui = UiFormSchemaGenerator.get().generate(CheckBoxForm2.class); + JsonNode json = new ObjectMapper().valueToTree(ui); + JsonNodeAssert asserter = new JsonNodeAssert(json); + asserter.assertEquals("schema.properties.color.title", "Color"); + asserter.assertEquals("form.0.key", "color"); + asserter.assertTrue("form.0.multiple"); + asserter.assertFalse("form.0.required"); + asserter.assertEquals("form.0.titleMap.0.name", "Red"); + asserter.assertEquals("form.0.titleMap.0.value", "red"); + asserter.assertEquals("form.0.titleMap.1.name", "Blue"); + asserter.assertEquals("form.0.titleMap.1.value", "blue"); + asserter.assertEquals("form.0.titleMap.2.name", "Green"); + asserter.assertEquals("form.0.titleMap.2.value", "green"); + } + + @Test + public void testGenerate_RadioBox() throws JsonProcessingException { + UiForm ui = UiFormSchemaGenerator.get().generate(RadioBoxForm.class); + JsonNode json = new ObjectMapper().valueToTree(ui); + JsonNodeAssert asserter = new JsonNodeAssert(json); + asserter.assertEquals("schema.properties.civilState.title", "Civil State"); + asserter.assertEquals("form.0.key", "civilState"); + asserter.assertFalse("form.0.readonly"); + asserter.assertEquals("form.0.titleMap.0.name", "Maried"); + asserter.assertEquals("form.0.titleMap.0.value", "COMMITTED"); + asserter.assertEquals("form.0.titleMap.1.name", "Single"); + asserter.assertEquals("form.0.titleMap.1.value", "HAPPY"); + asserter.assertEquals("form.0.titleMap.2.name", "Divorced"); + asserter.assertEquals("form.0.titleMap.2.value", "RELEASED"); + } + + @Test + public void testGenerate_ComboBox() throws JsonProcessingException { + UiForm ui = UiFormSchemaGenerator.get().generate(ComboBoxForm.class); + JsonNode json = new ObjectMapper().valueToTree(ui); + JsonNodeAssert asserter = new JsonNodeAssert(json); + asserter.assertEquals("schema.properties.currency.title", "Currency"); + asserter.assertEquals("form.0.key", "currency"); + asserter.assertFalse("form.0.autofocus"); + asserter.assertFalse("form.0.disabled"); + asserter.assertFalse("form.0.multiple"); + asserter.assertTrue("form.0.required"); + asserter.assertEquals("form.0.titleMap.0.name", "Euro"); + asserter.assertEquals("form.0.titleMap.0.value", "euro"); + asserter.assertEquals("form.0.titleMap.1.name", "Dollar"); + asserter.assertEquals("form.0.titleMap.1.value", "dollar"); + } + + @Test + public void testGenerate_ComboBox_WithCustomValuesContainer() throws JsonProcessingException { + UiForm ui = UiFormSchemaGenerator.get().generate(ComboBoxForm2.class); + JsonNode json = new ObjectMapper().valueToTree(ui); + JsonNodeAssert asserter = new JsonNodeAssert(json); + asserter.assertEquals("schema.properties.gender.title", "Gender"); + asserter.assertEquals("form.0.key", "currency"); + asserter.assertFalse("form.0.autofocus"); + asserter.assertFalse("form.0.disabled"); + asserter.assertFalse("form.0.multiple"); + asserter.assertFalse("form.0.required"); + asserter.assertEquals("form.0.titleMap.0.name", "Male"); + asserter.assertEquals("form.0.titleMap.0.value", "male"); + asserter.assertEquals("form.0.titleMap.1.name", "Female"); + asserter.assertEquals("form.0.titleMap.1.value", "female"); + } + + + +} + +class TextFieldForm implements Serializable { + + @TextField(title = "First Name", placeHolder = "Your first name", pattern = "[a-z]", noTitle = true, validationMessage = "this is a validation msg", description = "This is a description for your first name field") + private String firstName; + + public String getFirstName() { + return firstName; + } + +} + +class NumberForm implements Serializable { + + @Number(title = "Number of children", placeHolder = "Number of children", description = "This is a number", noTitle = true, validationMessage = "this is a validation msg", readOnly = true) + private Integer number; + + public Integer getNumber() { + return number; + } +} + +class PasswordForm implements Serializable { + + @Password(title = "Password", placeHolder = "Please set you password", description = "This is password", noTitle = true, validationMessage = "this is a validation msg", readOnly = true) + private String password; + + public String getPassword() { + return password; + } +} + +class TextAreaForm implements Serializable { + + @TextArea(title = "Address", placeHolder = "Fill your address please", description = "This is textarea", noTitle = true, validationMessage = "this is a validation msg", readOnly = true) + private String address; + + public String getAddress() { + return address; + } +} + +class CheckBoxForm implements Serializable{ + + @CheckBox(title = "Color", values = { "red", "blue", "green" }, defaultvalue = "red",required=true) + private String color; + + public String getColor(){ + return color; + } +} + +class CheckBoxForm2 implements Serializable{ + + @CheckBox(title = "Color", titleMap=MyCheckBoxValues.class, defaultvalue = "red",multiple=true) + private String color; + + public String getColor(){ + return color; + } +} + +class RadioBoxForm implements Serializable{ + + @RadioBox(title = "Civil State", titleMap = CivilStateValues.class) + private String civilState; + + public String getCivilState(){ + return civilState; + } +} + +class ComboBoxForm implements Serializable{ + + @ComboBox(title = "Currency", values = { "euro", "dollar" }, required=true) + private String currency; + + public String getCurrency(){ + return currency; + } +} + +class ComboBoxForm2 implements Serializable{ + + @ComboBox(title = "Gender", titleMap = GenderTitleMap.class) + private String gender; + + public String getGender(){ + return gender; + } +} + diff --git a/src/test/java/io/asfjava/ui/test/JsonNodeAssert.java b/src/test/java/io/asfjava/ui/test/JsonNodeAssert.java new file mode 100644 index 0000000..3c307e2 --- /dev/null +++ b/src/test/java/io/asfjava/ui/test/JsonNodeAssert.java @@ -0,0 +1,55 @@ +package io.asfjava.ui.test; + +import java.util.Arrays; +import java.util.Iterator; + +import org.junit.Assert; + +import com.fasterxml.jackson.databind.JsonNode; + +public class JsonNodeAssert { + + JsonNode actual; + + public JsonNodeAssert(JsonNode node) { + this.actual = node; + } + + public void assertEquals(String path, String expected){ + Assert.assertEquals(expected, traverse(actual, path).asText()); + } + + public void assertTrue(String path){ + Assert.assertTrue(traverse(actual, path).asBoolean()); + } + + public void assertFalse(String path){ + Assert.assertFalse(traverse(actual, path).asBoolean()); + } + + private JsonNode traverse(JsonNode node, String path) { + if (path == null || path.isEmpty()) { + return node; + } + String[] tokens = path.split("\\."); + Iterator itr = Arrays.asList(tokens).iterator(); + while (itr.hasNext()) { + String token = itr.next(); + if (isIndex(token)) { + node = node.path(Integer.parseInt(token)); + } else { + node = node.path(token); + } + if (node.isMissingNode()) { + Assert.fail("path: " + path + " does not exist in the given json node"); + } + } + + return node; + } + + private boolean isIndex(String path){ + return path.matches("\\d+"); + } + +} From fa523254f30b22ce5251806cbdc6def51cf93195 Mon Sep 17 00:00:00 2001 From: Hdebbech Date: Sat, 10 Jun 2017 18:02:49 +0100 Subject: [PATCH 3/3] fix compilation error --- .../decorator/NumberSchemaDecorator.java | 22 ------------------- 1 file changed, 22 deletions(-) delete mode 100644 src/main/java/io/asfjava/ui/schema/decorator/NumberSchemaDecorator.java diff --git a/src/main/java/io/asfjava/ui/schema/decorator/NumberSchemaDecorator.java b/src/main/java/io/asfjava/ui/schema/decorator/NumberSchemaDecorator.java deleted file mode 100644 index 73e3a68..0000000 --- a/src/main/java/io/asfjava/ui/schema/decorator/NumberSchemaDecorator.java +++ /dev/null @@ -1,22 +0,0 @@ -package io.asfjava.ui.schema.decorator; - -import com.fasterxml.jackson.databind.BeanProperty; -import com.fasterxml.jackson.module.jsonSchema.JsonSchema; -import com.fasterxml.jackson.module.jsonSchema.types.StringSchema; - -public class NumberSchemaDecorator implements SchemaDecorator{ - - @Override - public void customizeSchema(BeanProperty property, JsonSchema jsonschema) { - io.asfjava.ui.core.form.Number annotation = property.getAnnotation(io.asfjava.ui.core.form.Number.class); - if (annotation != null && annotation.title() != null) { - ((StringSchema) jsonschema).setTitle(annotation.title()); - } - } - - @Override - public String getAnnotation() { - return io.asfjava.ui.core.form.Number.class.getName(); - } - -}