Skip to content

Commit af25faa

Browse files
author
Max Presman
committed
fixing state change field
1 parent e297d25 commit af25faa

File tree

9 files changed

+106
-26
lines changed

9 files changed

+106
-26
lines changed

src/main/java/com/pubnub/api/endpoints/presence/PresenceService.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -45,6 +45,6 @@ Call<Envelope<Object>> getState(@Path("subKey") String subKey,
4545
Call<Envelope<Map<String, Object>>> setState(@Path("subKey") String subKey,
4646
@Path("channel") String channel,
4747
@Path("uuid") String uuid,
48-
@QueryMap Map<String, String> options);
48+
@QueryMap(encoded = true) Map<String, String> options);
4949

5050
}

src/main/java/com/pubnub/api/endpoints/pubsub/PubSubService.java

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -16,22 +16,22 @@ public interface PubSubService {
1616
@GET("v2/subscribe/{subKey}/{channel}/0")
1717
Call<SubscribeEnvelope> subscribe(@Path("subKey") String subKey,
1818
@Path("channel") String channel,
19-
@QueryMap Map<String, String> options);
19+
@QueryMap(encoded = true) Map<String, String> options);
2020

2121
@GET("publish/{pubKey}/{subKey}/0/{channel}/0/{message}")
2222
Call<List<Object>> publish(@Path("pubKey") String pubKey,
2323
@Path("subKey") String subKey,
2424
@Path("channel") String channel,
2525
@Path(value = "message", encoded = true) String message,
26-
@QueryMap Map<String, String> options);
26+
@QueryMap(encoded = true) Map<String, String> options);
2727

2828
@POST("publish/{pubKey}/{subKey}/0/{channel}/0")
2929
@Headers("Content-Type: application/json; charset=UTF-8")
3030
Call<List<Object>> publishWithPost(@Path("pubKey") String pubKey,
3131
@Path("subKey") String subKey,
3232
@Path("channel") String channel,
3333
@Body Object body,
34-
@QueryMap Map<String, String> options);
34+
@QueryMap(encoded = true) Map<String, String> options);
3535

3636

3737
}

src/main/java/com/pubnub/api/models/consumer/pubsub/PNPresenceEventResult.java

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
package com.pubnub.api.models.consumer.pubsub;
22

3+
import com.fasterxml.jackson.databind.JsonNode;
34
import lombok.Builder;
45
import lombok.Getter;
56

@@ -12,6 +13,7 @@ public class PNPresenceEventResult {
1213
private String uuid;
1314
private Long timestamp;
1415
private Integer occupancy;
16+
private JsonNode state;
1517

1618
private String subscribedChannel;
1719
private String actualChannel;

src/main/java/com/pubnub/api/models/server/PresenceEnvelope.java

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
package com.pubnub.api.models.server;
22

33
import com.fasterxml.jackson.annotation.JsonIgnoreProperties;
4+
import com.fasterxml.jackson.databind.JsonNode;
45
import lombok.Getter;
56

67
@JsonIgnoreProperties(ignoreUnknown = true)
@@ -11,5 +12,6 @@ public class PresenceEnvelope {
1112
private String uuid;
1213
private Integer occupancy;
1314
private Long timestamp;
15+
private JsonNode data;
1416

1517
}

src/main/java/com/pubnub/api/workers/SubscribeMessageWorker.java

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -111,6 +111,7 @@ private void processIncomingPayload(final SubscribeMessage message) {
111111
.event(presencePayload.getAction())
112112
.actualChannel((subscriptionMatch != null) ? channel : null)
113113
.subscribedChannel(subscriptionMatch != null ? subscriptionMatch : channel)
114+
.state(presencePayload.getData())
114115
.timetoken(publishMetaData.getPublishTimetoken())
115116
.occupancy(presencePayload.getOccupancy())
116117
.uuid(presencePayload.getUuid())

src/test/java/com/pubnub/api/endpoints/presence/SetStateEndpointTest.java

Lines changed: 51 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,9 @@
1212

1313
import java.io.IOException;
1414
import java.util.Arrays;
15+
import java.util.HashMap;
1516
import java.util.List;
17+
import java.util.Map;
1618

1719
import static com.github.tomakehurst.wiremock.client.WireMock.*;
1820
import static org.junit.Assert.assertEquals;
@@ -37,64 +39,84 @@ public void beforeEach() throws IOException {
3739
public void applyStateForChannelSync() throws PubNubException, InterruptedException {
3840

3941
stubFor(get(urlPathEqualTo("/v2/presence/sub-key/mySubscribeKey/channel/testChannel/uuid/myUUID/data"))
42+
.withQueryParam("uuid", matching("myUUID"))
43+
.withQueryParam("pnsdk", matching("Java/suchJava"))
44+
.withQueryParam("state", matching("%7B%22age%22%3A20%7D"))
4045
.willReturn(aResponse().withBody("{ \"status\": 200, \"message\": \"OK\", \"payload\": { \"age\" : 20, \"status\" : \"online\" }, \"service\": \"Presence\"}")));
4146

42-
PNSetStateResult result = partialSetState.channels(Arrays.asList("testChannel")).state(Arrays.asList("s1", "s2", "s3")).sync();
47+
Map<String, Object> myState = new HashMap<>();
48+
myState.put("age", 20);
49+
50+
PNSetStateResult result = partialSetState.channels(Arrays.asList("testChannel")).state(myState).sync();
4351
assertEquals(result.getState().get("age"), 20);
4452
assertEquals(result.getState().get("status"), "online");
4553

4654
List<LoggedRequest> requests = findAll(getRequestedFor(urlMatching("/.*")));
4755
assertEquals(1, requests.size());
48-
assertEquals("%5B%22s1%22%2C%22s2%22%2C%22s3%22%5D", requests.get(0).queryParameter("state").firstValue());
49-
5056
}
5157

5258
@Test
5359
public void applyStateForChannelsSync() throws PubNubException, InterruptedException {
5460

5561
stubFor(get(urlPathEqualTo("/v2/presence/sub-key/mySubscribeKey/channel/testChannel,testChannel2/uuid/myUUID/data"))
62+
.withQueryParam("uuid", matching("myUUID"))
63+
.withQueryParam("pnsdk", matching("Java/suchJava"))
64+
.withQueryParam("state", matching("%7B%22age%22%3A20%7D"))
5665
.willReturn(aResponse().withBody("{ \"status\": 200, \"message\": \"OK\", \"payload\": { \"age\" : 20, \"status\" : \"online\" }, \"service\": \"Presence\"}")));
5766

58-
PNSetStateResult result = partialSetState.channels(Arrays.asList("testChannel", "testChannel2")).state(Arrays.asList("s1", "s2", "s3")).sync();
67+
Map<String, Object> myState = new HashMap<>();
68+
myState.put("age", 20);
69+
70+
PNSetStateResult result = partialSetState.channels(Arrays.asList("testChannel", "testChannel2")).state(myState).sync();
5971
assertEquals(result.getState().get("age"), 20);
6072
assertEquals(result.getState().get("status"), "online");
6173

6274
List<LoggedRequest> requests = findAll(getRequestedFor(urlMatching("/.*")));
6375
assertEquals(1, requests.size());
64-
assertEquals("%5B%22s1%22%2C%22s2%22%2C%22s3%22%5D", requests.get(0).queryParameter("state").firstValue());
76+
6577
}
6678

6779
@Test
6880
public void applyStateForChannelGroupSync() throws PubNubException, InterruptedException {
6981

7082
stubFor(get(urlPathEqualTo("/v2/presence/sub-key/mySubscribeKey/channel/,/uuid/myUUID/data"))
83+
.withQueryParam("uuid", matching("myUUID"))
84+
.withQueryParam("pnsdk", matching("Java/suchJava"))
85+
.withQueryParam("state", matching("%7B%22age%22%3A20%7D"))
7186
.willReturn(aResponse().withBody("{ \"status\": 200, \"message\": \"OK\", \"payload\": { \"age\" : 20, \"status\" : \"online\" }, \"service\": \"Presence\"}")));
7287

73-
PNSetStateResult result = partialSetState.channelGroups(Arrays.asList("cg1")).state(Arrays.asList("s1", "s2", "s3")).sync();
88+
Map<String, Object> myState = new HashMap<>();
89+
myState.put("age", 20);
90+
91+
PNSetStateResult result = partialSetState.channelGroups(Arrays.asList("cg1")).state(myState).sync();
7492

7593
assertEquals(result.getState().get("age"), 20);
7694
assertEquals(result.getState().get("status"), "online");
7795

7896
List<LoggedRequest> requests = findAll(getRequestedFor(urlMatching("/.*")));
7997
assertEquals(1, requests.size());
80-
assertEquals("%5B%22s1%22%2C%22s2%22%2C%22s3%22%5D", requests.get(0).queryParameter("state").firstValue());
81-
assertEquals("cg1", requests.get(0).queryParameter("channel-group").firstValue());
98+
8299
}
83100

84101
@Test
85102
public void applyStateForChannelGroupsSync() throws PubNubException, InterruptedException {
86103

87104
stubFor(get(urlPathEqualTo("/v2/presence/sub-key/mySubscribeKey/channel/,/uuid/myUUID/data"))
105+
.withQueryParam("uuid", matching("myUUID"))
106+
.withQueryParam("pnsdk", matching("Java/suchJava"))
107+
.withQueryParam("state", matching("%7B%22age%22%3A20%7D"))
88108
.willReturn(aResponse().withBody("{ \"status\": 200, \"message\": \"OK\", \"payload\": { \"age\" : 20, \"status\" : \"online\" }, \"service\": \"Presence\"}")));
89109

90-
PNSetStateResult result = partialSetState.channelGroups(Arrays.asList("cg1", "cg2")).state(Arrays.asList("s1", "s2", "s3")).sync();
110+
Map<String, Object> myState = new HashMap<>();
111+
myState.put("age", 20);
112+
113+
PNSetStateResult result = partialSetState.channelGroups(Arrays.asList("cg1", "cg2")).state(myState).sync();
91114

92115
assertEquals(result.getState().get("age"), 20);
93116
assertEquals(result.getState().get("status"), "online");
94117

95118
List<LoggedRequest> requests = findAll(getRequestedFor(urlMatching("/.*")));
96119
assertEquals(1, requests.size());
97-
assertEquals("%5B%22s1%22%2C%22s2%22%2C%22s3%22%5D", requests.get(0).queryParameter("state").firstValue());
98120
assertEquals("cg1,cg2", requests.get(0).queryParameter("channel-group").firstValue());
99121

100122
}
@@ -103,37 +125,51 @@ public void applyStateForChannelGroupsSync() throws PubNubException, Interrupted
103125
public void applyStateForMixSync() throws PubNubException, InterruptedException {
104126

105127
stubFor(get(urlPathEqualTo("/v2/presence/sub-key/mySubscribeKey/channel/ch1/uuid/myUUID/data"))
128+
.withQueryParam("uuid", matching("myUUID"))
129+
.withQueryParam("pnsdk", matching("Java/suchJava"))
130+
.withQueryParam("state", matching("%7B%22age%22%3A20%7D"))
106131
.willReturn(aResponse().withBody("{ \"status\": 200, \"message\": \"OK\", \"payload\": { \"age\" : 20, \"status\" : \"online\" }, \"service\": \"Presence\"}")));
107132

108-
PNSetStateResult result = partialSetState.channels(Arrays.asList("ch1")).channelGroups(Arrays.asList("cg1", "cg2")).state(Arrays.asList("s1", "s2", "s3")).sync();
133+
Map<String, Object> myState = new HashMap<>();
134+
myState.put("age", 20);
135+
136+
PNSetStateResult result = partialSetState.channels(Arrays.asList("ch1")).channelGroups(Arrays.asList("cg1", "cg2")).state(myState).sync();
109137

110138
assertEquals(result.getState().get("age"), 20);
111139
assertEquals(result.getState().get("status"), "online");
112140

113141
List<LoggedRequest> requests = findAll(getRequestedFor(urlMatching("/.*")));
114142
assertEquals(1, requests.size());
115-
assertEquals("%5B%22s1%22%2C%22s2%22%2C%22s3%22%5D", requests.get(0).queryParameter("state").firstValue());
116-
assertEquals("cg1,cg2", requests.get(0).queryParameter("channel-group").firstValue());
117143

118144
}
119145

120146
@org.junit.Test(expected = PubNubException.class)
121147
public void applyNon200Sync() throws PubNubException, InterruptedException {
122148

123149
stubFor(get(urlPathEqualTo("/v2/presence/sub-key/mySubscribeKey/channel/ch1/uuid/myUUID/data"))
150+
.withQueryParam("uuid", matching("myUUID"))
151+
.withQueryParam("pnsdk", matching("Java/suchJava"))
152+
.withQueryParam("state", matching("%7B%22status%22%3A%22oneline%22%2C%22age%22%3A20%7D"))
124153
.willReturn(aResponse().withBody("{ \"status\": 200, \"message\": \"OK\", \"payload\": { \"age\" : 20, \"status\" : \"online\" }, \"service\": \"Presence\"}").withStatus(400)));
125154

126155

127-
PNSetStateResult result = partialSetState.channels(Arrays.asList("ch1")).channelGroups(Arrays.asList("cg1", "cg2")).state(Arrays.asList("s1", "s2", "s3")).sync();
156+
Map<String, Object> myState = new HashMap<>();
157+
myState.put("age", 20);
158+
159+
PNSetStateResult result = partialSetState.channels(Arrays.asList("ch1")).channelGroups(Arrays.asList("cg1", "cg2")).state(myState).sync();
160+
128161
}
129162

130163
@org.junit.Test(expected = PubNubException.class)
131-
public void MissimStateSync() throws PubNubException, InterruptedException {
164+
public void MissingStateSync() throws PubNubException, InterruptedException {
132165

133166
stubFor(get(urlPathEqualTo("/v2/presence/sub-key/mySubscribeKey/channel/testChannel/uuid/myUUID/data"))
167+
.withQueryParam("uuid", matching("myUUID"))
168+
.withQueryParam("pnsdk", matching("Java/suchJava"))
134169
.willReturn(aResponse().withBody("{ \"status\": 200, \"message\": \"OK\", \"payload\": { \"age\" : 20, \"status\" : \"online\" }, \"service\": \"Presence\"}")));
135170

136171
PNSetStateResult result = partialSetState.channels(Arrays.asList("testChannel")).sync();
172+
137173
}
138174

139175

src/test/java/com/pubnub/api/endpoints/pubsub/PublishTest.java

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -108,15 +108,17 @@ public void testSuccessStoreTrueSync() throws PubNubException, InterruptedExcept
108108
@Test
109109
public void testSuccessMetaSync() throws PubNubException, InterruptedException {
110110
stubFor(get(urlPathEqualTo("/publish/myPublishKey/mySubscribeKey/0/coolChannel/0/%22hi%22"))
111+
.withQueryParam("uuid", matching("myUUID"))
112+
.withQueryParam("pnsdk", matching("Java/suchJava"))
113+
.withQueryParam("meta", matching("%5B%22m1%22%2C%22m2%22%5D"))
114+
.withQueryParam("store", matching("0"))
115+
.withQueryParam("seqn", matching("1"))
111116
.willReturn(aResponse().withBody("[1,\"Sent\",\"14598111595318003\"]")));
112117

113118
instance.channel("coolChannel").message("hi").meta(Arrays.asList("m1", "m2")).shouldStore(false).sync();
114119

115120
List<LoggedRequest> requests = findAll(getRequestedFor(urlMatching("/.*")));
116121
assertEquals(1, requests.size());
117-
assertEquals("0", requests.get(0).queryParameter("store").firstValue());
118-
assertEquals("myUUID", requests.get(0).queryParameter("uuid").firstValue());
119-
assertEquals("%5B%22m1%22%2C%22m2%22%5D", requests.get(0).queryParameter("meta").firstValue());
120122
}
121123

122124
@Test

src/test/java/com/pubnub/api/endpoints/pubsub/SubscribeEndpointTest.java

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -142,14 +142,16 @@ public void subscribeWithTimeTokenSync() throws PubNubException {
142142
public void subscribeWithFilter() throws PubNubException {
143143

144144
stubFor(get(urlPathEqualTo("/v2/subscribe/mySubscribeKey/,/0"))
145+
.withQueryParam("uuid", matching("myUUID"))
146+
.withQueryParam("pnsdk", matching("Java/suchJava"))
147+
.withQueryParam("filter-expr", matching("this%3D1%26that%3Dcool"))
148+
.withQueryParam("channel-group", matching("cg1"))
145149
.willReturn(aResponse().withBody("{\"t\":{\"t\":\"14607577960932487\",\"r\":1},\"m\":[{\"a\":\"4\",\"f\":0,\"i\":\"Client-g5d4g\",\"p\":{\"t\":\"14607577960925503\",\"r\":1},\"k\":\"sub-c-4cec9f8e-01fa-11e6-8180-0619f8945a4f\",\"c\":\"coolChannel\",\"d\":{\"text\":\"Enter Message Here\"},\"b\":\"coolChan-bnel\"}]}")));
146150

147151
instance.channelGroups(Arrays.asList("cg1")).filterExpression("this=1&that=cool").sync();
148152

149153
List<LoggedRequest> requests = findAll(getRequestedFor(urlMatching("/.*")));
150154
assertEquals(1, requests.size());
151-
assertEquals("cg1", requests.get(0).queryParameter("channel-group").firstValue());
152-
assertEquals("this%3D1%26that%3Dcool", requests.get(0).queryParameter("filter-expr").firstValue());
153155
}
154156

155157
@Test

src/test/java/com/pubnub/api/managers/SubscriptionManagerTest.java

Lines changed: 37 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -29,6 +29,7 @@
2929

3030
import static com.github.tomakehurst.wiremock.client.WireMock.*;
3131
import static org.junit.Assert.assertEquals;
32+
import static org.junit.Assert.assertTrue;
3233

3334
public class SubscriptionManagerTest extends TestHarness {
3435

@@ -337,6 +338,10 @@ public void testSubscribeWithFilterExpressionBuilder() {
337338
final AtomicInteger atomic = new AtomicInteger(0);
338339
pubnub.getConfiguration().setFilterExpression("much=filtering");
339340
stubFor(get(urlPathEqualTo("/v2/subscribe/mySubscribeKey/ch2,ch1/0"))
341+
.withQueryParam("uuid", matching("myUUID"))
342+
.withQueryParam("pnsdk", matching("Java/suchJava"))
343+
.withQueryParam("filter-expr", matching("much%3Dfiltering"))
344+
.withQueryParam("tt", matching("0"))
340345
.willReturn(aResponse().withBody("{\"t\":{\"t\":\"14607577960932487\",\"r\":1},\"m\":[{\"a\":\"4\",\"f\":0,\"i\":\"Client-g5d4g\",\"p\":{\"t\":\"14607577960925503\",\"r\":1},\"k\":\"sub-c-4cec9f8e-01fa-11e6-8180-0619f8945a4f\",\"c\":\"coolChannel\",\"d\":{\"text\":\"Enter Message Here\"},\"b\":\"coolChan-bnel\"}]}")));
341346

342347
pubnub.addListener(new SubscribeCallback() {
@@ -347,8 +352,7 @@ public void status(PubNub pubnub, PNStatus status) {
347352
@Override
348353
public void message(PubNub pubnub, PNMessageResult message) {
349354
List<LoggedRequest> requests = findAll(getRequestedFor(urlMatching("/v2/subscribe.*")));
350-
351-
assertEquals("much%3Dfiltering", requests.get(0).queryParameter("filter-expr").firstValue());
355+
assertTrue(requests.size() > 0);
352356
atomic.addAndGet(1);
353357
}
354358

@@ -431,6 +435,37 @@ public void presence(PubNub pubnub, PNPresenceEventResult presence) {
431435

432436
}
433437

438+
@Test
439+
public void testSubscribePresenceStateCallback() {
440+
final AtomicBoolean atomic = new AtomicBoolean();
441+
stubFor(get(urlPathEqualTo("/v2/subscribe/mySubscribeKey/ch10,ch10-pnpres/0"))
442+
.willReturn(aResponse().withBody("{\"t\":{\"t\":\"14637536741734954\",\"r\":1},\"m\":[{\"a\":\"4\",\"f\":512,\"p\":{\"t\":\"14637536740940378\",\"r\":1},\"k\":\"demo-36\",\"c\":\"ch10-pnpres\",\"d\":{\"action\": \"join\", \"timestamp\": 1463753674, \"uuid\": \"24c9bb19-1fcd-4c40-a6f1-522a8a1329ef\", \"occupancy\": 3},\"b\":\"ch10-pnpres\"},{\"a\":\"4\",\"f\":512,\"p\":{\"t\":\"14637536741726901\",\"r\":1},\"k\":\"demo-36\",\"c\":\"ch10-pnpres\",\"d\":{\"action\": \"state-change\", \"timestamp\": 1463753674, \"data\": {\"state\": \"cool\"}, \"uuid\": \"24c9bb19-1fcd-4c40-a6f1-522a8a1329ef\", \"occupancy\": 3},\"b\":\"ch10-pnpres\"}]}")));
443+
444+
pubnub.addListener(new SubscribeCallback() {
445+
@Override
446+
public void status(PubNub pubnub, PNStatus status) {
447+
}
448+
449+
@Override
450+
public void message(PubNub pubnub, PNMessageResult message) {
451+
}
452+
453+
@Override
454+
public void presence(PubNub pubnub, PNPresenceEventResult presence) {
455+
if (presence.getEvent().equals("state-change")) {
456+
if (presence.getState().has("state") && presence.getState().get("state").asText().equals("cool")) {
457+
atomic.set(true);
458+
}
459+
}
460+
}
461+
});
462+
463+
pubnub.subscribe().channels(Arrays.asList("ch10")).withPresence().execute();
464+
465+
Awaitility.await().atMost(2, TimeUnit.SECONDS).untilAtomic(atomic, org.hamcrest.core.IsEqual.equalTo(true));
466+
467+
}
468+
434469
@Test
435470
public void testSubscribeRegionBuilder() {
436471
final AtomicInteger atomic = new AtomicInteger(0);

0 commit comments

Comments
 (0)