package com.urbanairship.api.reports.parse; import com.google.common.base.Optional; import com.google.common.collect.ImmutableMap; import com.urbanairship.api.common.parse.DateFormats; import com.urbanairship.api.reports.Base64ByteArray; import com.urbanairship.api.reports.model.PerPushCounts; import com.urbanairship.api.reports.model.PlatformType; import com.urbanairship.api.reports.model.PushDetailResponse; import org.codehaus.jackson.map.ObjectMapper; import org.joda.time.DateTime; import org.junit.Test; import java.io.IOException; import java.util.UUID; import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertNotNull; public class PushDetailResponseDeserializerTest { private static final ObjectMapper mapper = ReportsObjectMapper.getInstance(); @Test public void testPerPushDetailResponseDeserialize() throws IOException { String json = "{ \n" + " \"app_key\":\"some_app_key\",\n" + " \"push_id\":\"57ef3728-79dc-46b1-a6b9-20081e561f97\",\n" + " \"created\":\"2013-07-31 22:05:53\",\n" + " \"push_body\":\"PEJhc2U2NC1lbmNvZGVkIHN0cmluZz4=\",\n" + " \"rich_deletions\":1,\n" + " \"rich_responses\":2,\n" + " \"rich_sends\":3,\n" + " \"sends\":58,\n" + " \"direct_responses\":4,\n" + " \"influenced_responses\":5,\n" + " \"platforms\":{ \n" + " \"android\":{ \n" + " \"direct_responses\":6,\n" + " \"influenced_responses\":7,\n" + " \"sends\":22\n" + " },\n" + " \"ios\":{ \n" + " \"direct_responses\":8,\n" + " \"influenced_responses\":9,\n" + " \"sends\":36\n" + " }\n" + " }\n" + "}"; PushDetailResponse obj = mapper.readValue(json, PushDetailResponse.class); assertNotNull(obj); assertEquals("some_app_key", obj.getAppKey()); assertEquals(UUID.fromString("57ef3728-79dc-46b1-a6b9-20081e561f97"), obj.getPushID()); assertEquals(DateFormats.DATE_PARSER.parseDateTime("2013-07-31 22:05:53"), obj.getCreated().get()); assertEquals("PEJhc2U2NC1lbmNvZGVkIHN0cmluZz4=", obj.getPushBody().get().getBase64EncodedString()); assertEquals("<Base64-encoded string>", new String(obj.getPushBody().get().getByteArray())); assertEquals("<Base64-encoded string>", obj.getPushBody().get().toString()); assertEquals(1, obj.getRichDeletions()); assertEquals(2, obj.getRichResponses()); assertEquals(3, obj.getRichSends()); assertEquals(58, obj.getSends()); assertEquals(4, obj.getDirectResponses()); assertEquals(5, obj.getInfluencedResponses()); ImmutableMap<PlatformType, PerPushCounts> platforms = obj.getPlatforms(); PerPushCounts android = platforms.get(PlatformType.ANDROID); assertEquals(6, android.getDirectResponses()); assertEquals(7, android.getInfluencedResponses()); assertEquals(22, android.getSends()); PerPushCounts ios = platforms.get(PlatformType.IOS); assertEquals(8, ios.getDirectResponses()); assertEquals(9, ios.getInfluencedResponses()); assertEquals(36, ios.getSends()); } @Test public void testPerPushDetailResponseDeserializeWithZeroNullValues() throws IOException { String json = "{ \n" + " \"app_key\":\"some_app_key\",\n" + " \"push_id\":\"57ef3728-79dc-46b1-a6b9-20081e561f97\",\n" + " \"created\":0,\n" + " \"push_body\":null,\n" + " \"sends\":0,\n" + " \"direct_responses\":0,\n" + " \"influenced_responses\":0,\n" + " \"rich_sends\":0,\n" + " \"rich_responses\":0,\n" + " \"rich_deletions\":0,\n" + " \"platforms\":{ \n" + " \"ios\":{ \n" + " \"sends\":0,\n" + " \"direct_responses\":0,\n" + " \"influenced_responses\":0\n" + " },\n" + " \"android\":{ \n" + " \"sends\":0,\n" + " \"direct_responses\":0,\n" + " \"influenced_responses\":0\n" + " },\n" + " \"amazon\":{ \n" + " \"sends\":0,\n" + " \"direct_responses\":0,\n" + " \"influenced_responses\":0\n" + " }\n" + " }\n" + "}"; PushDetailResponse obj = mapper.readValue(json, PushDetailResponse.class); assertNotNull(obj); assertEquals("some_app_key", obj.getAppKey()); assertEquals(UUID.fromString("57ef3728-79dc-46b1-a6b9-20081e561f97"), obj.getPushID()); assertEquals(Optional.<DateTime>absent(), obj.getCreated()); assertEquals(Optional.<Base64ByteArray>absent(), obj.getPushBody()); assertEquals(0, obj.getRichDeletions()); assertEquals(0, obj.getRichResponses()); assertEquals(0, obj.getRichSends()); assertEquals(0, obj.getSends()); assertEquals(0, obj.getDirectResponses()); assertEquals(0, obj.getInfluencedResponses()); } @Test(expected = IllegalArgumentException.class) public void testPerPushDetailResponseDeserializeWithInvalidPushBody() throws IOException { String json = "{ \n" + " \"app_key\":\"some_app_key\",\n" + " \"push_id\":\"57ef3728-79dc-46b1-a6b9-20081e561f97\",\n" + " \"created\":0,\n" + " \"push_body\":\"I am not a base64 encoded string\",\n" + " \"sends\":0,\n" + " \"direct_responses\":0,\n" + " \"influenced_responses\":0,\n" + " \"rich_sends\":0,\n" + " \"rich_responses\":0,\n" + " \"rich_deletions\":0,\n" + " \"platforms\":{ \n" + " \"ios\":{ \n" + " \"sends\":0,\n" + " \"direct_responses\":0,\n" + " \"influenced_responses\":0\n" + " },\n" + " \"android\":{ \n" + " \"sends\":0,\n" + " \"direct_responses\":0,\n" + " \"influenced_responses\":0\n" + " },\n" + " \"amazon\":{ \n" + " \"sends\":0,\n" + " \"direct_responses\":0,\n" + " \"influenced_responses\":0\n" + " }\n" + " }\n" + "}"; PushDetailResponse obj = mapper.readValue(json, PushDetailResponse.class); assertNotNull(obj); assertEquals("some_app_key", obj.getAppKey()); assertEquals(UUID.fromString("57ef3728-79dc-46b1-a6b9-20081e561f97"), obj.getPushID()); assertEquals(Optional.<DateTime>absent(), obj.getCreated()); assertEquals(Optional.<Base64ByteArray>absent(), obj.getPushBody()); assertEquals(0, obj.getRichDeletions()); assertEquals(0, obj.getRichResponses()); assertEquals(0, obj.getRichSends()); assertEquals(0, obj.getSends()); assertEquals(0, obj.getDirectResponses()); assertEquals(0, obj.getInfluencedResponses()); } }