Skip to content

Commit 3c0a73b

Browse files
author
Max Presman
committed
rework push notifications
1 parent a2268c7 commit 3c0a73b

File tree

4 files changed

+98
-37
lines changed

4 files changed

+98
-37
lines changed
Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,13 +1,20 @@
11
package com.pubnub.api;
22

33
import com.fasterxml.jackson.databind.JsonNode;
4+
import lombok.AccessLevel;
45
import lombok.Builder;
6+
import lombok.Getter;
7+
import retrofit2.Call;
58

69
@Builder
10+
@Getter
711
public class PubNubException extends Exception {
812
private String errormsg = "";
913
private PubNubError pubnubError;
1014
private JsonNode jso;
1115
private String response;
1216
private int statusCode;
17+
18+
@Getter(AccessLevel.NONE)
19+
private Call affectedCall;
1320
}

src/main/java/com/pubnub/api/endpoints/Endpoint.java

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -44,6 +44,7 @@ public final Output sync() throws PubNubException {
4444
throw PubNubException.builder()
4545
.pubnubError(PubNubError.PNERROBJ_PARSING_ERROR)
4646
.errormsg(e.toString())
47+
.affectedCall(call)
4748
.build();
4849
}
4950

@@ -60,6 +61,7 @@ public final Output sync() throws PubNubException {
6061
.pubnubError(PubNubError.PNERROBJ_HTTP_ERROR)
6162
.errormsg(responseBodyText)
6263
.statusCode(serverResponse.code())
64+
.affectedCall(call)
6365
.build();
6466
}
6567

src/main/java/com/pubnub/api/endpoints/push/CreatePushNotification.java

Lines changed: 39 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -15,41 +15,66 @@
1515
public class CreatePushNotification {
1616

1717
private PubNub pubnub;
18-
@Setter private PushType pushType;
19-
@Setter private Object pushPayload;
2018
@Setter private String channel;
2119

20+
Map<String, Object> pushData;
21+
2222
public CreatePushNotification(PubNub pubnub) {
2323
this.pubnub = pubnub;
24+
pushData = new HashMap<>();
2425
}
2526

2627
public PNPublishResult sync() throws PubNubException {
27-
Map<String, Object> payload = preparePayload();
28-
return pubnub.publish().channel(channel).message(payload).sync();
28+
return pubnub.publish().channel(channel).message(pushData).sync();
2929
}
3030

3131
public void async(final PNCallback<PNPublishResult> callback) {
32-
Map<String, Object> payload = preparePayload();
33-
pubnub.publish().channel(channel).message(payload).async(callback);
32+
pubnub.publish().channel(channel).message(pushData).async(callback);
33+
}
34+
35+
public CreatePushNotification addApplePayload(Map<String, Object> payload) {
36+
if (payload != null) {
37+
appendToPayload(PushType.APNS, payload);
38+
}
39+
return this;
3440
}
3541

36-
private Map<String, Object> preparePayload() {
37-
Map<String, Object> payload = new HashMap<>();
42+
public CreatePushNotification addGooglePayload(Map<String, Object> payload) {
43+
if (payload != null) {
44+
appendToPayload(PushType.GCM, payload);
45+
}
46+
return this;
47+
}
3848

49+
public CreatePushNotification addMicrosoftPayload(Map<String, Object> payload) {
50+
if (payload != null) {
51+
appendToPayload(PushType.MPNS, payload);
52+
}
53+
return this;
54+
}
55+
56+
public CreatePushNotification addPubNubPayload(Map<String, Object> payload) {
57+
if (payload != null) {
58+
for(String key : payload.keySet()) {
59+
pushData.put(key, payload.get(key));
60+
}
61+
}
62+
63+
return this;
64+
}
65+
66+
private void appendToPayload(PushType pushType, Map<String, Object> payload) {
3967
if (pushType == PushType.APNS) {
40-
payload.put("pn_apns", pushPayload);
68+
pushData.put("pn_apns", payload);
4169
}
4270

4371
if (pushType == PushType.GCM) {
44-
payload.put("pn_gcm", pushPayload);
72+
pushData.put("pn_gcm", payload);
4573
}
4674

4775
if (pushType == PushType.MPNS) {
48-
payload.put("pn_mpns", pushPayload);
76+
pushData.put("pn_mpns", payload);
4977
}
50-
51-
return payload;
5278
}
5379

54-
5580
}

src/test/java/com.pubnub.api/endpoints/push/CreatePushNotificationTest.java

Lines changed: 50 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -3,60 +3,66 @@
33
import com.github.tomakehurst.wiremock.junit.WireMockRule;
44
import com.github.tomakehurst.wiremock.verification.LoggedRequest;
55
import com.jayway.awaitility.Awaitility;
6-
import com.pubnub.api.callbacks.PNCallback;
76
import com.pubnub.api.PubNubException;
8-
import com.pubnub.api.enums.PushType;
7+
import com.pubnub.api.callbacks.PNCallback;
8+
import com.pubnub.api.endpoints.TestHarness;
99
import com.pubnub.api.models.consumer.PNPublishResult;
1010
import com.pubnub.api.models.consumer.PNStatus;
11-
import com.pubnub.api.endpoints.TestHarness;
1211
import org.junit.Before;
1312
import org.junit.Rule;
1413
import org.junit.Test;
1514

1615
import java.io.IOException;
17-
import java.util.Arrays;
16+
import java.util.HashMap;
1817
import java.util.List;
18+
import java.util.Map;
1919
import java.util.concurrent.TimeUnit;
2020
import java.util.concurrent.atomic.AtomicInteger;
2121

2222
import static com.github.tomakehurst.wiremock.client.WireMock.*;
2323
import static org.junit.Assert.assertEquals;
24+
import static org.junit.Assert.assertFalse;
2425

2526
public class CreatePushNotificationTest extends TestHarness {
2627

2728
@Rule
2829
public WireMockRule wireMockRule = new WireMockRule();
2930

3031
private CreatePushNotification instance;
32+
private Map<String, Object> pushPayload;
3133

3234

3335
@Before
3436
public void beforeEach() throws IOException {
3537
instance = this.createPubNubInstance(8080).createPushNotification();
38+
39+
pushPayload = new HashMap<>();
40+
pushPayload.put("a", "b");
41+
pushPayload.put("c", "d");
42+
3643
}
3744

3845
@Test
3946
public void appleSyncTest() throws PubNubException, InterruptedException {
4047

41-
stubFor(get(urlPathEqualTo("/publish/myPublishKey/mySubscribeKey/0/testChannel/0/%7B%22pn_apns%22%3A%5B%22a%22%2C%22b%22%5D%7D"))
48+
stubFor(get(urlPathEqualTo("/publish/myPublishKey/mySubscribeKey/0/testChannel/0/%7B%22pn_apns%22%3A%7B%22c%22%3A%22d%22%2C%22a%22%3A%22b%22%7D%7D"))
4249
.willReturn(aResponse().withBody("[1,\"Sent\",\"14598111595318003\"]")));
4350

44-
instance.pushType(PushType.APNS).channel("testChannel")
45-
.pushPayload(Arrays.asList("a", "b")).sync();
51+
instance.channel("testChannel")
52+
.addApplePayload(pushPayload).sync();
4653

4754
List<LoggedRequest> requests = findAll(getRequestedFor(urlMatching("/.*")));
4855
assertEquals(1, requests.size());
4956
assertEquals("myUUID", requests.get(0).queryParameter("uuid").firstValue());
5057
}
5158

5259
@Test
53-
public void googleSyncTest() throws PubNubException, InterruptedException {
54-
stubFor(get(urlPathEqualTo("/publish/myPublishKey/mySubscribeKey/0/testChannel/0/%7B%22pn_gcm%22%3A%5B%22a%22%2C%22b%22%5D%7D"))
60+
public void googleSyncTest() throws InterruptedException, PubNubException {
61+
stubFor(get(urlPathEqualTo("/publish/myPublishKey/mySubscribeKey/0/testChannel/0/%7B%22pn_gcm%22%3A%7B%22c%22%3A%22d%22%2C%22a%22%3A%22b%22%7D%7D"))
5562
.willReturn(aResponse().withBody("[1,\"Sent\",\"14598111595318003\"]")));
5663

5764

58-
instance.pushType(PushType.GCM).channel("testChannel")
59-
.pushPayload(Arrays.asList("a", "b")).sync();
65+
instance.channel("testChannel").addGooglePayload(pushPayload).sync();
6066

6167
List<LoggedRequest> requests = findAll(getRequestedFor(urlMatching("/.*")));
6268
assertEquals(1, requests.size());
@@ -66,11 +72,29 @@ public void googleSyncTest() throws PubNubException, InterruptedException {
6672
@Test
6773
public void microsoftSyncTest() throws PubNubException, InterruptedException {
6874

69-
stubFor(get(urlPathEqualTo("/publish/myPublishKey/mySubscribeKey/0/testChannel/0/%7B%22pn_mpns%22%3A%5B%22a%22%2C%22b%22%5D%7D"))
75+
stubFor(get(urlPathEqualTo("/publish/myPublishKey/mySubscribeKey/0/testChannel/0/%7B%22pn_mpns%22%3A%7B%22c%22%3A%22d%22%2C%22a%22%3A%22b%22%7D%7D"))
76+
.willReturn(aResponse().withBody("[1,\"Sent\",\"14598111595318003\"]")));
77+
78+
instance.channel("testChannel")
79+
.addMicrosoftPayload(pushPayload).sync();
80+
81+
List<LoggedRequest> requests = findAll(getRequestedFor(urlMatching("/.*")));
82+
assertEquals(1, requests.size());
83+
assertEquals("myUUID", requests.get(0).queryParameter("uuid").firstValue());
84+
}
85+
86+
@Test
87+
public void allPayloadsSyncTest() throws InterruptedException, PubNubException {
88+
89+
stubFor(get(urlPathEqualTo("/publish/myPublishKey/mySubscribeKey/0/testChannel/0/%7B%22pn_mpns%22%3A%7B%22c%22%3A%22d%22%2C%22a%22%3A%22b%22%7D%2C%22c%22%3A%22d%22%2C%22a%22%3A%22b%22%2C%22pn_gcm%22%3A%7B%22c%22%3A%22d%22%2C%22a%22%3A%22b%22%7D%2C%22pn_apns%22%3A%7B%22c%22%3A%22d%22%2C%22a%22%3A%22b%22%7D%7D"))
7090
.willReturn(aResponse().withBody("[1,\"Sent\",\"14598111595318003\"]")));
7191

72-
instance.pushType(PushType.MPNS).channel("testChannel")
73-
.pushPayload(Arrays.asList("a", "b")).sync();
92+
instance.channel("testChannel")
93+
.addApplePayload(pushPayload)
94+
.addMicrosoftPayload(pushPayload)
95+
.addGooglePayload(pushPayload)
96+
.addPubNubPayload(pushPayload)
97+
.sync();
7498

7599
List<LoggedRequest> requests = findAll(getRequestedFor(urlMatching("/.*")));
76100
assertEquals(1, requests.size());
@@ -80,15 +104,16 @@ public void microsoftSyncTest() throws PubNubException, InterruptedException {
80104
@Test
81105
public void appleAsyncTest() throws PubNubException, InterruptedException {
82106

83-
stubFor(get(urlPathEqualTo("/publish/myPublishKey/mySubscribeKey/0/testChannel/0/%7B%22pn_apns%22:[%22a%22,%22b%22]%7D"))
107+
stubFor(get(urlPathEqualTo("/publish/myPublishKey/mySubscribeKey/0/testChannel/0/%7B%22pn_apns%22%3A%7B%22c%22%3A%22d%22%2C%22a%22%3A%22b%22%7D%7D"))
84108
.willReturn(aResponse().withBody("[1,\"Sent\",\"14598111595318003\"]")));
85109

86110
final AtomicInteger atomic = new AtomicInteger(0);
87-
instance.pushType(PushType.APNS).channel("testChannel")
88-
.pushPayload(Arrays.asList("a", "b")).async(new PNCallback<PNPublishResult>() {
111+
instance.channel("testChannel")
112+
.addApplePayload(pushPayload).async(new PNCallback<PNPublishResult>() {
89113
@Override
90114
public void onResponse(PNPublishResult result, PNStatus status) {
91115
List<LoggedRequest> requests = findAll(getRequestedFor(urlMatching("/.*")));
116+
assertFalse(status.isError());
92117
assertEquals(1, requests.size());
93118
assertEquals("myUUID", requests.get(0).queryParameter("uuid").firstValue());
94119
atomic.addAndGet(1);
@@ -102,14 +127,15 @@ public void onResponse(PNPublishResult result, PNStatus status) {
102127

103128
@Test
104129
public void googleAsyncTest() throws PubNubException, InterruptedException {
105-
stubFor(get(urlPathEqualTo("/publish/myPublishKey/mySubscribeKey/0/testChannel/0/%7B%22pn_gcm%22:[%22a%22,%22b%22]%7D"))
130+
stubFor(get(urlPathEqualTo("/publish/myPublishKey/mySubscribeKey/0/testChannel/0/%7B%22pn_gcm%22%3A%7B%22c%22%3A%22d%22%2C%22a%22%3A%22b%22%7D%7D"))
106131
.willReturn(aResponse().withBody("[1,\"Sent\",\"14598111595318003\"]")));
107132
final AtomicInteger atomic = new AtomicInteger(0);
108-
instance.pushType(PushType.GCM).channel("testChannel")
109-
.pushPayload(Arrays.asList("a", "b")).async(new PNCallback<PNPublishResult>() {
133+
instance.channel("testChannel")
134+
.addGooglePayload(pushPayload).async(new PNCallback<PNPublishResult>() {
110135
@Override
111136
public void onResponse(PNPublishResult result, PNStatus status) {
112137
List<LoggedRequest> requests = findAll(getRequestedFor(urlMatching("/.*")));
138+
assertFalse(status.isError());
113139
assertEquals(1, requests.size());
114140
assertEquals("myUUID", requests.get(0).queryParameter("uuid").firstValue());
115141
atomic.addAndGet(1);
@@ -124,15 +150,16 @@ public void onResponse(PNPublishResult result, PNStatus status) {
124150
@Test
125151
public void microsoftAsyncTest() throws PubNubException, InterruptedException {
126152

127-
stubFor(get(urlPathEqualTo("/publish/myPublishKey/mySubscribeKey/0/testChannel/0/%7B%22pn_mpns%22:[%22a%22,%22b%22]%7D"))
153+
stubFor(get(urlPathEqualTo("/publish/myPublishKey/mySubscribeKey/0/testChannel/0/%7B%22pn_mpns%22%3A%7B%22c%22%3A%22d%22%2C%22a%22%3A%22b%22%7D%7D"))
128154
.willReturn(aResponse().withBody("[1,\"Sent\",\"14598111595318003\"]")));
129155

130156
final AtomicInteger atomic = new AtomicInteger(0);
131-
instance.pushType(PushType.MPNS).channel("testChannel")
132-
.pushPayload(Arrays.asList("a", "b")).async(new PNCallback<PNPublishResult>() {
157+
instance.channel("testChannel")
158+
.addMicrosoftPayload(pushPayload).async(new PNCallback<PNPublishResult>() {
133159
@Override
134160
public void onResponse(PNPublishResult result, PNStatus status) {
135161
List<LoggedRequest> requests = findAll(getRequestedFor(urlMatching("/.*")));
162+
assertFalse(status.isError());
136163
assertEquals(1, requests.size());
137164
assertEquals("myUUID", requests.get(0).queryParameter("uuid").firstValue());
138165
atomic.addAndGet(1);

0 commit comments

Comments
 (0)