package com.urbanairship.api.push.parse.notification.android;
import com.google.common.collect.ImmutableList;
import com.google.common.collect.ImmutableMap;
import com.urbanairship.api.common.parse.APIParsingException;
import com.urbanairship.api.push.model.PushExpiry;
import com.urbanairship.api.push.model.notification.Interactive;
import com.urbanairship.api.push.model.notification.actions.Actions;
import com.urbanairship.api.push.model.notification.actions.ShareAction;
import com.urbanairship.api.push.model.notification.android.AndroidDevicePayload;
import com.urbanairship.api.push.model.notification.android.Category;
import com.urbanairship.api.push.model.notification.android.PublicNotification;
import com.urbanairship.api.push.model.notification.android.Style;
import com.urbanairship.api.push.model.notification.android.Wearable;
import com.urbanairship.api.push.parse.PushObjectMapper;
import org.codehaus.jackson.map.ObjectMapper;
import org.junit.Test;
import java.util.Map;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertFalse;
import static org.junit.Assert.assertNotNull;
import static org.junit.Assert.assertTrue;
public class PayloadDeserializerTest {
private static final ObjectMapper mapper = PushObjectMapper.getInstance();
@Test
public void testAlert() throws Exception {
String json
= "{"
+ " \"alert\": \"android override\""
+ "}";
AndroidDevicePayload expected = AndroidDevicePayload.newBuilder()
.setAlert("android override")
.build();
AndroidDevicePayload payload = mapper.readValue(json, AndroidDevicePayload.class);
assertNotNull(payload);
assertTrue(payload.getAlert().isPresent());
assertFalse(payload.getCollapseKey().isPresent());
assertFalse(payload.getExtra().isPresent());
assertEquals("android override", payload.getAlert().get());
assertEquals(expected, payload);
}
@Test
public void testCollapseKey() throws Exception {
String json
= "{"
+ " \"collapse_key\": \"1234\""
+ "}";
AndroidDevicePayload expected = AndroidDevicePayload.newBuilder()
.setCollapseKey("1234")
.build();
AndroidDevicePayload payload = mapper.readValue(json, AndroidDevicePayload.class);
assertNotNull(payload);
assertNotNull(payload.getCollapseKey());
assertFalse(payload.getAlert().isPresent());
assertFalse(payload.getExtra().isPresent());
assertTrue(payload.getCollapseKey().isPresent());
assertEquals("1234", payload.getCollapseKey().get());
assertEquals(expected, payload);
}
@Test
public void testTimeToLive() throws Exception {
String json
= "{"
+ " \"time_to_live\": 1234"
+ "}";
AndroidDevicePayload expected = AndroidDevicePayload.newBuilder()
.setTimeToLive(PushExpiry.newBuilder()
.setExpirySeconds(1234)
.build())
.build();
AndroidDevicePayload payload = mapper.readValue(json, AndroidDevicePayload.class);
assertEquals(expected, payload);
assertTrue(payload.getTimeToLive().isPresent());
assertEquals(1234, payload.getTimeToLive().get().getExpirySeconds().get().intValue());
}
@Test(expected = APIParsingException.class)
public void testTimeToLiveBadFormat() throws Exception {
String json
= "{"
+ " \"time_to_live\": true"
+ "}";
mapper.readValue(json, AndroidDevicePayload.class);
}
@Test
public void testDelayWhileIdle() throws Exception {
String json
= "{"
+ " \"delay_while_idle\": true"
+ "}";
AndroidDevicePayload expected = AndroidDevicePayload.newBuilder()
.setDelayWhileIdle(true)
.build();
AndroidDevicePayload payload = mapper.readValue(json, AndroidDevicePayload.class);
assertEquals(expected, payload);
assertTrue(payload.getDelayWhileIdle().isPresent());
assertEquals(true, payload.getDelayWhileIdle().get());
}
@Test(expected = APIParsingException.class)
public void testDelayWhileIdleBadFormat() throws Exception {
String json
= "{"
+ " \"delay_while_idle\": 1010"
+ "}";
mapper.readValue(json, AndroidDevicePayload.class);
}
@Test
public void testExtra() throws Exception {
String json
= "{"
+ " \"extra\": {"
+ " \"k1\" : \"v1\","
+ " \"k2\" : \"v2\""
+ " }"
+ "}";
AndroidDevicePayload expected = AndroidDevicePayload.newBuilder()
.addExtraEntry("k1", "v1")
.addExtraEntry("k2", "v2")
.build();
AndroidDevicePayload payload = mapper.readValue(json, AndroidDevicePayload.class);
assertNotNull(payload);
assertNotNull(payload.getExtra());
assertTrue(payload.getExtra().isPresent());
assertFalse(payload.getAlert().isPresent());
assertFalse(payload.getCollapseKey().isPresent());
Map<String, String> extra = payload.getExtra().get();
assertTrue(extra.containsKey("k1"));
assertTrue(extra.containsKey("k2"));
assertEquals("v1", extra.get("k1"));
assertEquals("v2", extra.get("k2"));
assertEquals(expected, payload);
}
@Test
public void testValidate_Empty() throws Exception {
AndroidDevicePayload payload = mapper.readValue("{}", AndroidDevicePayload.class);
assertNotNull(payload);
assertFalse(payload.getAlert().isPresent());
assertFalse(payload.getExtra().isPresent());
assertFalse(payload.getCollapseKey().isPresent());
}
@Test
public void testInteractiveNotificationActions() throws Exception {
String json
= "{"
+ " \"interactive\": {"
+ " \"type\" : \"ua_yes_no_foreground\","
+ " \"button_actions\" : {"
+ " \"yes\" : {"
+ " \"share\" : \"foo\""
+ " }"
+ " }"
+ " }"
+ "}";
AndroidDevicePayload payload = mapper.readValue(json, AndroidDevicePayload.class);
Interactive interactive = Interactive.newBuilder()
.setType("ua_yes_no_foreground")
.setButtonActions(
ImmutableMap.of(
"yes",
Actions.newBuilder()
.setShare(new ShareAction("foo"))
.build()))
.build();
AndroidDevicePayload expected = AndroidDevicePayload.newBuilder()
.setInteractive(interactive)
.build();
assertEquals(expected, payload);
Interactive returned = payload.getInteractive().get();
assertEquals(interactive, returned);
}
@Test
public void testTitle() throws Exception {
String json
= "{"
+ " \"title\": \"title\""
+ "}";
AndroidDevicePayload expected = AndroidDevicePayload.newBuilder()
.setTitle("title")
.build();
AndroidDevicePayload payload = mapper.readValue(json, AndroidDevicePayload.class);
assertEquals(expected, payload);
assertTrue(payload.getTitle().isPresent());
assertEquals("title", payload.getTitle().get());
}
@Test
public void testDeliveryPriority() throws Exception {
String json =
"{" +
"\"delivery_priority\": \"high\"" +
"}";
AndroidDevicePayload payload = mapper.readValue(json, AndroidDevicePayload.class);
assertNotNull(payload);
assertEquals(payload.getDeliveryPriority().get(), "high");
}
@Test
public void testLocalOnly() throws Exception {
String json =
"{" +
"\"local_only\": true" +
"}";
AndroidDevicePayload payload = mapper.readValue(json, AndroidDevicePayload.class);
assertNotNull(payload);
assertEquals(payload.getLocalOnly().get(), true);
}
@Test
public void testWearable() throws Exception {
String json =
"{" +
"\"wearable\": {" +
"\"background_image\": \"https://yolo.pizza.biz/\"" +
"}" +
"}";
Wearable wearable = Wearable.newBuilder()
.setBackgroundImage("https://yolo.pizza.biz/")
.build();
AndroidDevicePayload payload = mapper.readValue(json, AndroidDevicePayload.class);
assertNotNull(payload);
assertEquals(payload.getWearable().get(), wearable);
}
@Test
public void testSummary() throws Exception {
String json =
"{" +
"\"summary\": \"A summary\"" +
"}";
AndroidDevicePayload payload = mapper.readValue(json, AndroidDevicePayload.class);
assertNotNull(payload);
assertEquals(payload.getSummary().get(), "A summary");
}
@Test
public void testStyle() throws Exception {
String bigTextJson =
"{" +
"\"style\":{" +
"\"summary\": \"A summary\"," +
"\"title\": \"A title\"," +
"\"type\": \"big_text\"," +
"\"big_text\": \"BlahBlah\"" +
"}" +
"}";
String bigPicJson =
"{" +
"\"style\":{" +
"\"summary\": \"A summary\"," +
"\"title\": \"A title\"," +
"\"type\": \"big_picture\"," +
"\"big_picture\": \"pic.png\"" +
"}" +
"}";
String inboxJson =
"{" +
"\"style\":{" +
"\"type\":\"inbox\"," +
"\"lines\":[\"line_1\",\"line_2\",\"line_3\"]," +
"\"title\":\"lines title\"," +
"\"summary\":\"lines summary\"" +
"}" +
"}";
AndroidDevicePayload bigTextPayload = mapper.readValue(bigTextJson, AndroidDevicePayload.class);
assertNotNull(bigTextPayload);
Style bigTextStyle = bigTextPayload.getStyle().get();
assertEquals(bigTextStyle.getType().getStyleType(), "big_text");
assertEquals(bigTextStyle.getSummary().get(), "A summary");
assertEquals(bigTextStyle.getTitle().get(), "A title");
assertEquals(bigTextStyle.getContent(), "BlahBlah");
AndroidDevicePayload bigPicPayload = mapper.readValue(bigPicJson, AndroidDevicePayload.class);
assertNotNull(bigPicPayload);
Style bigPicStyle = bigPicPayload.getStyle().get();
assertEquals(bigPicStyle.getType().getStyleType(), "big_picture");
assertEquals(bigPicStyle.getSummary().get(), "A summary");
assertEquals(bigPicStyle.getTitle().get(), "A title");
assertEquals(bigPicStyle.getContent(), "pic.png");
AndroidDevicePayload inboxPayload = mapper.readValue(inboxJson, AndroidDevicePayload.class);
assertNotNull(inboxPayload);
Style inboxStyle = inboxPayload.getStyle().get();
assertEquals(inboxStyle.getType().getStyleType(), "inbox");
assertEquals(inboxStyle.getSummary().get(), "lines summary");
assertEquals(inboxStyle.getTitle().get(), "lines title");
ImmutableList<String> lines = (ImmutableList<String>) inboxStyle.getContent();
assertEquals(lines.get(0), "line_1");
assertEquals(lines.get(1), "line_2");
assertEquals(lines.get(2), "line_3");
}
@Test
public void testSound() throws Exception {
String json =
"{" +
"\"sound\": \"cowbell.mp3\"" +
"}";
AndroidDevicePayload payload = mapper.readValue(json, AndroidDevicePayload.class);
assertNotNull(payload);
assertEquals(payload.getSound().get(), "cowbell.mp3");
}
@Test
public void testPriority() throws Exception {
String json =
"{" +
"\"priority\": 1" +
"}";
AndroidDevicePayload payload = mapper.readValue(json, AndroidDevicePayload.class);
assertNotNull(payload);
assertEquals(payload.getPriority().get().intValue(), 1);
}
@Test
public void testCategory() throws Exception {
String json =
"{" +
"\"category\": \"promo\"" +
"}";
AndroidDevicePayload payload = mapper.readValue(json, AndroidDevicePayload.class);
assertNotNull(payload);
assertEquals(payload.getCategory().get().getCategory(), Category.PROMO.getCategory());
}
@Test
public void testVisibility() throws Exception {
String json =
"{" +
"\"visibility\": 1" +
"}";
AndroidDevicePayload payload = mapper.readValue(json, AndroidDevicePayload.class);
assertNotNull(payload);
assertEquals(payload.getVisibility().get().intValue(), 1);
}
@Test
public void testPublicNotification() throws Exception {
String json =
"{" +
"\"public_notification\":{" +
"\"summary\": \"A summary\"," +
"\"title\": \"A title\"," +
"\"alert\": \"An alert\"" +
"}" +
"}";
AndroidDevicePayload payload = mapper.readValue(json, AndroidDevicePayload.class);
assertNotNull(payload);
PublicNotification publicNotification = payload.getPublicNotification().get();
assertEquals(publicNotification.getSummary().get(), "A summary");
assertEquals(publicNotification.getTitle().get(), "A title");
assertEquals(publicNotification.getAlert().get(), "An alert");
}
}