Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -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";
Expand Down
Original file line number Diff line number Diff line change
@@ -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<IterableEmbeddedMessage>
) {
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<IterableEmbeddedMessage> = 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,
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -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;
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -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))
Expand All @@ -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))
Expand Down Expand Up @@ -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))
Expand All @@ -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))
Expand All @@ -151,7 +167,7 @@ class IterableEmbeddedMessageTest {
}

@Test
fun embeddedMessageSerialization_elementsAndCustomPayloadDefined() {
fun embeddedPlacementSerialization_elementsAndCustomPayloadDefined() {
val embeddedMessageMetadata = EmbeddedMessageMetadata(
"doibjo4590340oidiobnw",
"mbn8489b7ehycy",
Expand Down Expand Up @@ -189,23 +205,28 @@ class IterableEmbeddedMessageTest {

val embeddedMessage = IterableEmbeddedMessage(embeddedMessageMetadata, embeddedMessageElements, customPayload)

val placementId: String = "0"
val messages: List<IterableEmbeddedMessage> = 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",
Expand All @@ -229,18 +250,23 @@ class IterableEmbeddedMessageTest {

val embeddedMessage = IterableEmbeddedMessage(embeddedMessageMetadata, embeddedMessageElements, customPayload)

val placementId: String = "0"
val messages: List<IterableEmbeddedMessage> = 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)
}
}
}
Original file line number Diff line number Diff line change
@@ -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"
}
]
}
]
}
Loading