diff --git a/iterableapi/src/main/java/com/iterable/iterableapi/IterableConstants.java b/iterableapi/src/main/java/com/iterable/iterableapi/IterableConstants.java index 7ab0627cd..4b8fb9391 100644 --- a/iterableapi/src/main/java/com/iterable/iterableapi/IterableConstants.java +++ b/iterableapi/src/main/java/com/iterable/iterableapi/IterableConstants.java @@ -172,6 +172,7 @@ public final class IterableConstants { public static final String LOCATION_HEADER_FIELD = "Location"; //Embedded Message Constants + public static final String ITERABLE_EMBEDDED_MESSAGE_PLACEMENTS = "placements"; public static final String ITERABLE_EMBEDDED_MESSAGE = "embeddedMessages"; public static final String ITERABLE_EMBEDDED_MESSAGE_METADATA = "metadata"; public static final String ITERABLE_EMBEDDED_MESSAGE_ELEMENTS = "elements"; diff --git a/iterableapi/src/main/java/com/iterable/iterableapi/IterableEmbeddedMessage.kt b/iterableapi/src/main/java/com/iterable/iterableapi/IterableEmbeddedPlacement.kt similarity index 87% rename from iterableapi/src/main/java/com/iterable/iterableapi/IterableEmbeddedMessage.kt rename to iterableapi/src/main/java/com/iterable/iterableapi/IterableEmbeddedPlacement.kt index cb584dd81..849dc9276 100644 --- a/iterableapi/src/main/java/com/iterable/iterableapi/IterableEmbeddedMessage.kt +++ b/iterableapi/src/main/java/com/iterable/iterableapi/IterableEmbeddedPlacement.kt @@ -1,10 +1,53 @@ package com.iterable.iterableapi -import com.iterable.iterableapi.EmbeddedMessageElements.Companion.TAG import org.json.JSONArray import org.json.JSONException import org.json.JSONObject +data class IterableEmbeddedPlacement( + val placementId: String, + val messages: List +) { + companion object { + val TAG = "ItblEmbeddedPlacement" + fun toJSONObject(placement: IterableEmbeddedPlacement): JSONObject { + + val embeddedPlacementJson = JSONObject() + + try { + embeddedPlacementJson.put(IterableConstants.ITERABLE_EMBEDDED_MESSAGE_PLACEMENT_ID, placement.placementId) + + if(placement?.messages != null) { + val messagesJson = JSONArray() + for(i in 0 until placement.messages.size) { + messagesJson.put(IterableEmbeddedMessage.toJSONObject(placement.messages[i])) + } + embeddedPlacementJson.put(IterableConstants.ITERABLE_EMBEDDED_MESSAGE, messagesJson) + } + } catch(e: JSONException) { + IterableLogger.e(TAG, "Error while serializing flex message", e) + } + + return embeddedPlacementJson + } + + fun fromJSONObject(placementJson: JSONObject): IterableEmbeddedPlacement { + val placementId: String = placementJson.getString(IterableConstants.ITERABLE_EMBEDDED_MESSAGE_PLACEMENT_ID) + + val messagesJson: JSONArray = placementJson.getJSONArray(IterableConstants.ITERABLE_EMBEDDED_MESSAGE) + var messages: MutableList = mutableListOf() + + for(i in 0 until messagesJson.length()) { + val messageJson: JSONObject = messagesJson.getJSONObject(i) + val message: IterableEmbeddedMessage = IterableEmbeddedMessage.fromJSONObject(messageJson) + messages.add(message) + } + + return IterableEmbeddedPlacement(placementId, messages) + } + } +} + data class IterableEmbeddedMessage ( val metadata: EmbeddedMessageMetadata, val elements: EmbeddedMessageElements? = null, diff --git a/iterableapi/src/test/java/com/iterable/iterableapi/EmbeddedTestUtils.java b/iterableapi/src/test/java/com/iterable/iterableapi/EmbeddedTestUtils.java index 0159efad4..1587e2c8b 100644 --- a/iterableapi/src/test/java/com/iterable/iterableapi/EmbeddedTestUtils.java +++ b/iterableapi/src/test/java/com/iterable/iterableapi/EmbeddedTestUtils.java @@ -6,7 +6,12 @@ public class EmbeddedTestUtils { public static IterableEmbeddedMessage getTestEmbeddedMessage() throws Exception { JSONObject payload = new JSONObject(IterableTestUtils.getResourceString("embedded_payload_optional_elements_and_custom_payload.json")); - JSONArray jsonArray = payload.optJSONArray(IterableConstants.ITERABLE_EMBEDDED_MESSAGE); - return IterableEmbeddedMessage.Companion.fromJSONObject(jsonArray.getJSONObject(0)); + JSONArray jsonArray = payload.optJSONArray(IterableConstants.ITERABLE_EMBEDDED_MESSAGE_PLACEMENTS); + + JSONObject placementJson = jsonArray.optJSONObject(0); + IterableEmbeddedPlacement placement = IterableEmbeddedPlacement.Companion.fromJSONObject(placementJson); + IterableEmbeddedMessage message = placement.getMessages().get(0); + + return message; } } diff --git a/iterableapi/src/test/java/com/iterable/iterableapi/IterableEmbeddedMessageTest.kt b/iterableapi/src/test/java/com/iterable/iterableapi/IterableEmbeddedPlacementTest.kt similarity index 68% rename from iterableapi/src/test/java/com/iterable/iterableapi/IterableEmbeddedMessageTest.kt rename to iterableapi/src/test/java/com/iterable/iterableapi/IterableEmbeddedPlacementTest.kt index 9a38efb8e..76b248218 100644 --- a/iterableapi/src/test/java/com/iterable/iterableapi/IterableEmbeddedMessageTest.kt +++ b/iterableapi/src/test/java/com/iterable/iterableapi/IterableEmbeddedPlacementTest.kt @@ -7,24 +7,28 @@ import org.junit.Test import org.skyscreamer.jsonassert.JSONAssert import org.skyscreamer.jsonassert.JSONCompareMode -class IterableEmbeddedMessageTest { +class IterableEmbeddedPlacementTest { @Test - fun embeddedMessageDeserialization_elementsAndCustomPayloadDefined() { + fun embeddedPlacementDeserialization_elementsAndCustomPayloadDefined() { val payload = JSONObject(IterableTestUtils.getResourceString("embedded_payload_optional_elements_and_custom_payload.json")) - val jsonArray = payload.optJSONArray(IterableConstants.ITERABLE_EMBEDDED_MESSAGE) + val jsonArray = payload.optJSONArray(IterableConstants.ITERABLE_EMBEDDED_MESSAGE_PLACEMENTS) if (jsonArray != null) { - // GIVEN an embedded message payload with optional elements - val messageJson = jsonArray.optJSONObject(0) + // GIVEN an embedded message placement payload + val placementJson = jsonArray.optJSONObject(0) + + // WHEN you deserialize the embedded message placement payload + val placement = IterableEmbeddedPlacement.fromJSONObject(placementJson) - // WHEN you deserialize the embedded message payload - val message = IterableEmbeddedMessage.fromJSONObject(messageJson) + val message = placement.messages[0] val payload = JSONObject() payload.put("someKey", "someValue") - // THEN we get appropriate embedded message object - assertNotNull(message) + // THEN we get appropriate embedded message object and associated placement id + assertNotNull(placement) + assertThat("0", `is` (placement.placementId)) + assertThat("doibjo4590340oidiobnw", `is` (message.metadata.messageId)) assertThat("mbn8489b7ehycy", `is` (message.metadata.placementId)) assertThat("noj9iyjthfvhs",`is` (message.metadata.campaignId)) @@ -51,19 +55,23 @@ class IterableEmbeddedMessageTest { } @Test - fun embeddedMessageDeserialization_noCustomPayloadDefined() { + fun embeddedPlacementDeserialization_noCustomPayloadDefined() { val payload = JSONObject(IterableTestUtils.getResourceString("embedded_payload_no_custom_payload.json")) - val jsonArray = payload.optJSONArray(IterableConstants.ITERABLE_EMBEDDED_MESSAGE) + val jsonArray = payload.optJSONArray(IterableConstants.ITERABLE_EMBEDDED_MESSAGE_PLACEMENTS) if (jsonArray != null) { - // GIVEN an embedded message payload with optional elements - val messageJson = jsonArray.optJSONObject(0) + // GIVEN an embedded message placement payload + val placementJson = jsonArray.optJSONObject(0) - // WHEN you deserialize the embedded message payload - val message = IterableEmbeddedMessage.fromJSONObject(messageJson) + // WHEN you deserialize the embedded message placement payload + val placement = IterableEmbeddedPlacement.fromJSONObject(placementJson) + + val message = placement.messages[0] + + // THEN we get appropriate embedded message object and associated placement id + assertNotNull(placement) + assertThat("0", `is` (placement.placementId)) - // THEN we get appropriate embedded message object - assertNotNull(message) assertThat("doibjo4590340oidiobnw", `is` (message.metadata.messageId)) assertThat("mbn8489b7ehycy", `is` (message.metadata.placementId)) assertThat("noj9iyjthfvhs",`is` (message.metadata.campaignId)) @@ -91,22 +99,26 @@ class IterableEmbeddedMessageTest { } @Test - fun embeddedMessageDeserialization_noButtonsOrText() { + fun embeddedPlacementDeserialization_noButtonsOrText() { val payload = JSONObject(IterableTestUtils.getResourceString("embedded_payload_no_buttons_no_text.json")) - val jsonArray = payload.optJSONArray(IterableConstants.ITERABLE_EMBEDDED_MESSAGE) + val jsonArray = payload.optJSONArray(IterableConstants.ITERABLE_EMBEDDED_MESSAGE_PLACEMENTS) if (jsonArray != null) { - // GIVEN an embedded message payload with optional elements - val messageJson = jsonArray.optJSONObject(0) + // GIVEN an embedded message placement payload + val placementJson = jsonArray.optJSONObject(0) - // WHEN you deserialize the embedded message payload - val message = IterableEmbeddedMessage.fromJSONObject(messageJson) + // WHEN you deserialize the embedded message placement payload + val placement = IterableEmbeddedPlacement.fromJSONObject(placementJson) + + val message = placement.messages[0] val payload = JSONObject() payload.put("someKey", "someValue") - // THEN we get appropriate embedded message object - assertNotNull(message) + // THEN we get appropriate embedded message object and associated placement id + assertNotNull(placement) + assertThat("0", `is` (placement.placementId)) + assertThat("doibjo4590340oidiobnw", `is` (message.metadata.messageId)) assertThat("mbn8489b7ehycy", `is` (message.metadata.placementId)) assertThat("noj9iyjthfvhs",`is` (message.metadata.campaignId)) @@ -127,19 +139,23 @@ class IterableEmbeddedMessageTest { } @Test - fun embeddedMessageDeserialization_noElementsOrCustomPayloadDefined() { + fun embeddedPlacementDeserialization_noElementsOrCustomPayloadDefined() { val payload = JSONObject(IterableTestUtils.getResourceString("embedded_payload_no_elements_no_custom_payload.json")) - val jsonArray = payload.optJSONArray(IterableConstants.ITERABLE_EMBEDDED_MESSAGE) + val jsonArray = payload.optJSONArray(IterableConstants.ITERABLE_EMBEDDED_MESSAGE_PLACEMENTS) if (jsonArray != null) { - // GIVEN an embedded message payload with optional elements - val messageJson = jsonArray.optJSONObject(0) + // GIVEN an embedded message placement payload with optional elements + val placementJson = jsonArray.optJSONObject(0) - // WHEN you deserialize the embedded message payload - val message = IterableEmbeddedMessage.fromJSONObject(messageJson) + // WHEN you deserialize the embedded message placement payload + val placement = IterableEmbeddedPlacement.fromJSONObject(placementJson) + + val message = placement.messages[0] + + // THEN we get appropriate embedded message object and associated placement id + assertNotNull(placement) + assertThat("0", `is` (placement.placementId)) - // THEN we get appropriate embedded message object - assertNotNull(message) assertThat("doibjo4590340oidiobnw", `is` (message.metadata.messageId)) assertThat("mbn8489b7ehycy", `is` (message.metadata.placementId)) assertThat("noj9iyjthfvhs",`is` (message.metadata.campaignId)) @@ -151,7 +167,7 @@ class IterableEmbeddedMessageTest { } @Test - fun embeddedMessageSerialization_elementsAndCustomPayloadDefined() { + fun embeddedPlacementSerialization_elementsAndCustomPayloadDefined() { val embeddedMessageMetadata = EmbeddedMessageMetadata( "doibjo4590340oidiobnw", "mbn8489b7ehycy", @@ -189,23 +205,28 @@ class IterableEmbeddedMessageTest { val embeddedMessage = IterableEmbeddedMessage(embeddedMessageMetadata, embeddedMessageElements, customPayload) + val placementId: String = "0" + val messages: List = listOf(embeddedMessage) + + val embeddedMessagePlacement = IterableEmbeddedPlacement(placementId, messages) + val payload = JSONObject(IterableTestUtils.getResourceString("embedded_payload_optional_elements_and_custom_payload.json")) - val jsonArray = payload.optJSONArray(IterableConstants.ITERABLE_EMBEDDED_MESSAGE) + val jsonArray = payload.optJSONArray(IterableConstants.ITERABLE_EMBEDDED_MESSAGE_PLACEMENTS) if (jsonArray != null) { - // GIVEN an embedded message payload with optional elements - val expectedMessageJson = jsonArray.optJSONObject(0) + // GIVEN an embedded message placement payload + val expectedPlacementJson = jsonArray.optJSONObject(0) // WHEN you serialize the embedded message payload - val messageJson = IterableEmbeddedMessage.toJSONObject(embeddedMessage) + val placementJson = IterableEmbeddedPlacement.toJSONObject(embeddedMessagePlacement) // THEN we get appropriate embedded message object - JSONAssert.assertEquals(expectedMessageJson, messageJson, JSONCompareMode.STRICT_ORDER) + JSONAssert.assertEquals(expectedPlacementJson, placementJson, JSONCompareMode.STRICT_ORDER) } } @Test - fun embeddedMessageSerialization_noButtons_noText() { + fun embeddedPlacementSerialization_noButtons_noText() { val embeddedMessageMetadata = EmbeddedMessageMetadata( "doibjo4590340oidiobnw", "mbn8489b7ehycy", @@ -229,18 +250,23 @@ class IterableEmbeddedMessageTest { val embeddedMessage = IterableEmbeddedMessage(embeddedMessageMetadata, embeddedMessageElements, customPayload) + val placementId: String = "0" + val messages: List = listOf(embeddedMessage) + + val embeddedMessagePlacement = IterableEmbeddedPlacement(placementId, messages) + val payload = JSONObject(IterableTestUtils.getResourceString("embedded_payload_no_buttons_no_text.json")) val jsonArray = payload.optJSONArray(IterableConstants.ITERABLE_EMBEDDED_MESSAGE) if (jsonArray != null) { - // GIVEN an embedded message payload with optional elements - val expectedMessageJson = jsonArray.optJSONObject(0) + // GIVEN an embedded message placement payload + val expectedPlacementJson = jsonArray.optJSONObject(0) // WHEN you serialize the embedded message payload - val messageJson = IterableEmbeddedMessage.toJSONObject(embeddedMessage) + val placementJson = IterableEmbeddedPlacement.toJSONObject(embeddedMessagePlacement) // THEN we get appropriate embedded message object - JSONAssert.assertEquals(expectedMessageJson, messageJson, JSONCompareMode.STRICT_ORDER) + JSONAssert.assertEquals(expectedPlacementJson, placementJson, JSONCompareMode.STRICT_ORDER) } } } \ No newline at end of file diff --git a/iterableapi/src/test/resources/embedded_payload_no_buttons_no_text.json b/iterableapi/src/test/resources/embedded_payload_no_buttons_no_text.json index 0b8a50361..647c4b0f2 100644 --- a/iterableapi/src/test/resources/embedded_payload_no_buttons_no_text.json +++ b/iterableapi/src/test/resources/embedded_payload_no_buttons_no_text.json @@ -1,24 +1,29 @@ { - "embeddedMessages": [ + "placements": [ { - "metadata": { - "messageId": "doibjo4590340oidiobnw", - "placementId": "mbn8489b7ehycy", - "campaignId": "noj9iyjthfvhs", - "isProof": true - }, - "elements": { - "title": "Iterable Coffee Shoppe", - "body": "SAVE 15% OFF NOW", - "mediaUrl": "http://placekitten.com/200/300", - "defaultAction": { - "type": "someType", - "data": "someData" + "placementId": "0", + "embeddedMessages": [ + { + "metadata": { + "messageId": "doibjo4590340oidiobnw", + "placementId": "mbn8489b7ehycy", + "campaignId": "noj9iyjthfvhs", + "isProof": true + }, + "elements": { + "title": "Iterable Coffee Shoppe", + "body": "SAVE 15% OFF NOW", + "mediaUrl": "http://placekitten.com/200/300", + "defaultAction": { + "type": "someType", + "data": "someData" + } + }, + "payload": { + "someKey": "someValue" + } } - }, - "payload" : { - "someKey": "someValue" - } + ] } ] } \ No newline at end of file diff --git a/iterableapi/src/test/resources/embedded_payload_no_custom_payload.json b/iterableapi/src/test/resources/embedded_payload_no_custom_payload.json index 3fdef6dd0..06f9e8650 100644 --- a/iterableapi/src/test/resources/embedded_payload_no_custom_payload.json +++ b/iterableapi/src/test/resources/embedded_payload_no_custom_payload.json @@ -1,34 +1,39 @@ { - "embeddedMessages": [ + "placements": [ { - "metadata": { - "messageId": "doibjo4590340oidiobnw", - "placementId": "mbn8489b7ehycy", - "campaignId": "noj9iyjthfvhs", - "isProof": true - }, - "elements": { - "title": "Iterable Coffee Shoppe", - "body": "SAVE 15% OFF NOW", - "mediaUrl": "http://placekitten.com/200/300", - "defaultAction": { - "type": "someType", - "data": "someData" - }, - "buttons": [{ - "id": "reward-button", - "title": "REDEEM MEOW", - "action": { - "type": "openUrl", - "data": "https://www.google.com" + "placementId": "0", + "embeddedMessages": [ + { + "metadata": { + "messageId": "doibjo4590340oidiobnw", + "placementId": "mbn8489b7ehycy", + "campaignId": "noj9iyjthfvhs", + "isProof": true + }, + "elements": { + "title": "Iterable Coffee Shoppe", + "body": "SAVE 15% OFF NOW", + "mediaUrl": "http://placekitten.com/200/300", + "defaultAction": { + "type": "someType", + "data": "someData" + }, + "buttons": [{ + "id": "reward-button", + "title": "REDEEM MEOW", + "action": { + "type": "openUrl", + "data": "https://www.google.com" + } + }], + "text": [{ + "id": "body", + "text": "CATS RULE!!!", + "label": "label" + }] } - }], - "text": [{ - "id": "body", - "text": "CATS RULE!!!", - "label": "label" - }] - } + } + ] } ] } \ No newline at end of file diff --git a/iterableapi/src/test/resources/embedded_payload_no_elements_no_custom_payload.json b/iterableapi/src/test/resources/embedded_payload_no_elements_no_custom_payload.json index f66bec0b9..555a17089 100644 --- a/iterableapi/src/test/resources/embedded_payload_no_elements_no_custom_payload.json +++ b/iterableapi/src/test/resources/embedded_payload_no_elements_no_custom_payload.json @@ -1,12 +1,17 @@ { - "embeddedMessages": [ + "placements": [ { - "metadata": { - "messageId": "doibjo4590340oidiobnw", - "placementId": "mbn8489b7ehycy", - "campaignId": "noj9iyjthfvhs", - "isProof": true - } + "placementId": "0", + "embeddedMessages": [ + { + "metadata": { + "messageId": "doibjo4590340oidiobnw", + "placementId": "mbn8489b7ehycy", + "campaignId": "noj9iyjthfvhs", + "isProof": true + } + } + ] } ] } \ No newline at end of file diff --git a/iterableapi/src/test/resources/embedded_payload_optional_elements_and_custom_payload.json b/iterableapi/src/test/resources/embedded_payload_optional_elements_and_custom_payload.json index 0931961f4..425a969b8 100644 --- a/iterableapi/src/test/resources/embedded_payload_optional_elements_and_custom_payload.json +++ b/iterableapi/src/test/resources/embedded_payload_optional_elements_and_custom_payload.json @@ -1,37 +1,42 @@ { - "embeddedMessages": [ + "placements": [ { - "metadata": { - "messageId": "doibjo4590340oidiobnw", - "placementId": "mbn8489b7ehycy", - "campaignId": "noj9iyjthfvhs", - "isProof": true - }, - "elements": { - "title": "Iterable Coffee Shoppe", - "body": "SAVE 15% OFF NOW", - "mediaUrl": "http://placekitten.com/200/300", - "defaultAction": { - "type": "someType", - "data": "someData" - }, - "buttons": [{ - "id": "reward-button", - "title": "REDEEM MEOW", - "action": { - "type": "openUrl", - "data": "https://www.google.com" + "placementId": "0", + "embeddedMessages": [ + { + "metadata": { + "messageId": "doibjo4590340oidiobnw", + "placementId": "mbn8489b7ehycy", + "campaignId": "noj9iyjthfvhs", + "isProof": true + }, + "elements": { + "title": "Iterable Coffee Shoppe", + "body": "SAVE 15% OFF NOW", + "mediaUrl": "http://placekitten.com/200/300", + "defaultAction": { + "type": "someType", + "data": "someData" + }, + "buttons": [{ + "id": "reward-button", + "title": "REDEEM MEOW", + "action": { + "type": "openUrl", + "data": "https://www.google.com" + } + }], + "text": [{ + "id": "body", + "text": "CATS RULE!!!", + "label": "label" + }] + }, + "payload": { + "someKey": "someValue" } - }], - "text": [{ - "id": "body", - "text": "CATS RULE!!!", - "label": "label" - }] - }, - "payload": { - "someKey": "someValue" - } + } + ] } ] } \ No newline at end of file