diff --git a/src/main/java/com/whatsapp/api/domain/messages/Parameter.java b/src/main/java/com/whatsapp/api/domain/messages/Parameter.java index 65e90e858..cf1865426 100644 --- a/src/main/java/com/whatsapp/api/domain/messages/Parameter.java +++ b/src/main/java/com/whatsapp/api/domain/messages/Parameter.java @@ -1,14 +1,22 @@ package com.whatsapp.api.domain.messages; -import com.fasterxml.jackson.annotation.JsonInclude; -import com.fasterxml.jackson.annotation.JsonProperty; +import com.fasterxml.jackson.annotation.*; import com.whatsapp.api.domain.messages.type.ParameterType; /** * The type Parameter. */ + @JsonInclude(JsonInclude.Include.NON_NULL) +@JsonTypeInfo(use = JsonTypeInfo.Id.NAME, property = "type", visible = true) +@JsonSubTypes({@JsonSubTypes.Type(value = TextParameter.class, name = "text"), + @JsonSubTypes.Type(value = CurrencyParameter.class, name = "currency"), + @JsonSubTypes.Type(value = DateTimeParameter.class, name = "date_time"), + @JsonSubTypes.Type(value = ImageParameter.class, name = "image"), + @JsonSubTypes.Type(value = VideoParameter.class, name = "video"), + @JsonSubTypes.Type(value = DocumentParameter.class, name = "document"), + @JsonSubTypes.Type(value = ButtonPayloadParameter.class, name = "payload")}) public class Parameter { @JsonProperty("type") private final ParameterType type; @@ -18,6 +26,7 @@ public class Parameter { * * @param type the type */ + @JsonCreator protected Parameter(ParameterType type) { this.type = type; } diff --git a/src/main/java/com/whatsapp/api/domain/messages/TextParameter.java b/src/main/java/com/whatsapp/api/domain/messages/TextParameter.java index 7ff839383..4ae3ab50d 100644 --- a/src/main/java/com/whatsapp/api/domain/messages/TextParameter.java +++ b/src/main/java/com/whatsapp/api/domain/messages/TextParameter.java @@ -12,9 +12,13 @@ @JsonInclude(JsonInclude.Include.NON_NULL) public class TextParameter extends Parameter { @JsonProperty("text") - private final String text; + private String text; + public TextParameter() { + super(ParameterType.TEXT); + } + /** * Instantiates a new Text parameter. * diff --git a/src/test/java/com/whatsapp/api/domain/messages/ParameterDeserializationTest.java b/src/test/java/com/whatsapp/api/domain/messages/ParameterDeserializationTest.java new file mode 100644 index 000000000..e0ad8b42d --- /dev/null +++ b/src/test/java/com/whatsapp/api/domain/messages/ParameterDeserializationTest.java @@ -0,0 +1,80 @@ +package com.whatsapp.api.domain.messages; + +import com.fasterxml.jackson.databind.ObjectMapper; +import com.whatsapp.api.domain.messages.type.ParameterType; +import org.junit.jupiter.api.Test; + +import static org.junit.jupiter.api.Assertions.*; + +public class ParameterDeserializationTest { + + @Test + public void testTextParameterDeserialization() throws Exception { + String json = "{\"type\":\"text\", \"text\": \"hello\"}"; + ObjectMapper objectMapper = new ObjectMapper(); + Parameter parameter = objectMapper.readValue(json, Parameter.class); + + assertInstanceOf(TextParameter.class, parameter); + assertEquals(ParameterType.TEXT, parameter.getType()); + } + + @Test + public void testCurrencyParameterDeserialization() throws Exception { + String json = "{\"type\":\"currency\"}"; + ObjectMapper objectMapper = new ObjectMapper(); + Parameter parameter = objectMapper.readValue(json, Parameter.class); + + assertInstanceOf(CurrencyParameter.class, parameter); + assertEquals(ParameterType.CURRENCY, parameter.getType()); + } + + @Test + public void testVideoParameterDeserialization() throws Exception { + String json = "{\"type\":\"video\", \"video\": {\"id\": \"21\", \"link\": \"http://example.com/video.mp4\"}}"; + ObjectMapper objectMapper = new ObjectMapper(); + Parameter parameter = objectMapper.readValue(json, Parameter.class); + + assertInstanceOf(VideoParameter.class, parameter); + assertEquals(ParameterType.VIDEO, parameter.getType()); + } + + @Test + public void testDateTimeParameterDeserialization() throws Exception { + String json = "{\"type\":\"date_time\", \"date_time\": {\"minute\": \"12\"}}"; + ObjectMapper objectMapper = new ObjectMapper(); + Parameter parameter = objectMapper.readValue(json, Parameter.class); + + assertInstanceOf(DateTimeParameter.class, parameter); + assertEquals(ParameterType.DATE_TIME, parameter.getType()); + } + + @Test + public void testImageParameterDeserialization() throws Exception { + String json = "{\"type\":\"image\", \"image\": {\"id\": \"21\", \"link\": \"http://example.com/image.jpg\"}}"; + ObjectMapper objectMapper = new ObjectMapper(); + Parameter parameter = objectMapper.readValue(json, Parameter.class); + + assertInstanceOf(ImageParameter.class, parameter); + assertEquals(ParameterType.IMAGE, parameter.getType()); + } + + @Test + public void testDocumentParameterDeserialization() throws Exception { + String json = "{\"type\":\"document\", \"document\": {\"id\": \"21\", \"link\": \"http://example.com/document.pdf\", \"filename\":\"hello.doc\" }}"; + ObjectMapper objectMapper = new ObjectMapper(); + Parameter parameter = objectMapper.readValue(json, Parameter.class); + + assertInstanceOf(DocumentParameter.class, parameter); + assertEquals(ParameterType.DOCUMENT, parameter.getType()); + } + + @Test + public void testButtonPayloadParameterDeserialization() throws Exception { + String json = "{\"type\":\"payload\", \"payload\": \"button_payload\"}"; + ObjectMapper objectMapper = new ObjectMapper(); + Parameter parameter = objectMapper.readValue(json, Parameter.class); + + assertInstanceOf(ButtonPayloadParameter.class, parameter); + assertEquals(ParameterType.PAYLOAD, parameter.getType()); + } +}