package com.urbanairship.api.push.parse;
import com.urbanairship.api.common.parse.APIParsingException;
import com.urbanairship.api.push.model.DeviceType;
import com.urbanairship.api.push.model.DeviceTypeData;
import com.urbanairship.api.push.model.PushExpiry;
import com.urbanairship.api.push.model.PushOptions;
import com.urbanairship.api.push.model.PushPayload;
import com.urbanairship.api.push.model.audience.Selectors;
import com.urbanairship.api.push.model.notification.Notification;
import org.codehaus.jackson.map.ObjectMapper;
import org.joda.time.DateTime;
import org.joda.time.DateTimeZone;
import org.junit.Test;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertFalse;
import static org.junit.Assert.assertTrue;
public class PushOptionsTest {
private ObjectMapper mapper = PushObjectMapper.getInstance();
@Test
public void testOptionsNotPresent() throws Exception {
String properJson
= "{"
+ "\"audience\":\"ALL\","
+ "\"device_types\":[\"ios\"],"
+ "\"notification\":{\"alert\":\"wat\"}"
+ "}";
PushPayload pushPayload = PushPayload.newBuilder()
.setAudience(Selectors.all())
.setDeviceTypes(DeviceTypeData.newBuilder().addDeviceType(DeviceType.IOS).build())
.setNotification(Notification.newBuilder().setAlert("wat").build())
.build();
assertFalse(pushPayload.getPushOptions().isPresent());
String json = mapper.writeValueAsString(pushPayload);
assertEquals(properJson, json);
}
@Test
public void testOptionsPresent() throws Exception {
String properJson
= "{"
+ "\"audience\":\"ALL\","
+ "\"device_types\":[\"ios\"],"
+ "\"notification\":{\"alert\":\"wat\"},"
+ "\"options\":{}"
+ "}";
PushPayload push = PushPayload.newBuilder()
.setAudience(Selectors.all())
.setDeviceTypes(DeviceTypeData.newBuilder().addDeviceType(DeviceType.IOS).build())
.setNotification(Notification.newBuilder().setAlert("wat").build())
.setPushOptions(PushOptions.newBuilder().build())
.build();
String json = mapper.writeValueAsString(push);
assertTrue(push.getPushOptions().isPresent());
assertEquals(properJson, json);
}
@Test
public void testEmptyOptions() throws Exception {
String properJson
= "{"
+ "}";
PushOptions options = PushOptions.newBuilder().build();
String json = mapper.writeValueAsString(options);
assertFalse(options.getExpiry().isPresent());
assertEquals(json, properJson);
}
@Test
public void testParseExpiryRoundTrip() throws Exception {
PushExpiry expiry1 = PushExpiry.newBuilder().setExpirySeconds(600).build();
String json = mapper.writeValueAsString(expiry1);
PushExpiry expiry2 = mapper.readValue(json, PushExpiry.class);
assertEquals(expiry1, expiry2);
}
/* Equality */
@Test
public void testTimeStampEquality() throws Exception {
PushExpiry e1 = PushExpiry.newBuilder().setExpiryTimeStamp(new DateTime("2014-07-08T12:00:00", DateTimeZone.UTC)).build();
PushExpiry e2 = PushExpiry.newBuilder().setExpiryTimeStamp(new DateTime("2014-07-08T12:00:00", DateTimeZone.UTC)).build();
PushExpiry e3 = PushExpiry.newBuilder().setExpiryTimeStamp(new DateTime("2014-07-08T14:00:00", DateTimeZone.UTC)).build();
assertEquals(e1, e1);
assertEquals(e1, e2);
assertEquals(e2, e1);
assertTrue(e1.equals(e2));
assertTrue(e2.equals(e1));
assertFalse(e1.equals(e3));
assertFalse(e3.equals(e1));
}
@Test
public void testSecondsEquality() throws Exception {
PushExpiry e1 = PushExpiry.newBuilder().setExpirySeconds(100).build();
PushExpiry e2 = PushExpiry.newBuilder().setExpirySeconds(100).build();
PushExpiry e3 = PushExpiry.newBuilder().setExpirySeconds(10).build();
assertEquals(e1, e1);
assertEquals(e1, e2);
assertEquals(e2, e1);
assertTrue(e1.equals(e2));
assertTrue(e2.equals(e1));
assertFalse(e1.equals(e3));
assertFalse(e3.equals(e1));
}
@Test
public void testParsingExpirySeconds() throws Exception {
String json
= "{"
+ "\"expiry\":3600"
+ "}";
PushOptions options = mapper.readValue(json, PushOptions.class);
Integer seconds = 3600;
assertTrue(options.getExpiry().isPresent());
PushExpiry expiry = options.getExpiry().get();
assertEquals(seconds, expiry.getExpirySeconds().get());
}
@Test
public void testParsingExpiryTimeStamp() throws Exception {
String json
= "{"
+ "\"expiry\":\"2014-07-08T12:00:00\""
+ "}";
PushOptions options = mapper.readValue(json, PushOptions.class);
assertTrue(options.getExpiry().isPresent());
PushExpiry expiry = options.getExpiry().get();
assertEquals(new DateTime(2014, 7, 8, 12, 0, 0, DateTimeZone.UTC), expiry.getExpiryTimeStamp().get());
}
@Test(expected=APIParsingException.class)
public void testParseValidation() throws Exception {
String json
= "{"
+ " \"expiry\" : -10"
+ "}";
mapper.readValue(json, PushOptions.class);
}
@Test(expected=APIParsingException.class)
public void testEmptyValidation() throws Exception {
PushExpiry.newBuilder()
.build();
}
@Test(expected=APIParsingException.class)
public void testDoubleValidation() throws Exception {
PushExpiry.newBuilder()
.setExpirySeconds(100)
.setExpiryTimeStamp(new DateTime())
.build();
}
@Test(expected=APIParsingException.class)
public void testNegativeValidation() throws Exception {
PushExpiry.newBuilder()
.setExpirySeconds(-100)
.build();
}
}