77import org .junit .Test ;
88import org .junit .runner .RunWith ;
99import org .mockito .ArgumentCaptor ;
10+ import org .mockito .invocation .InvocationOnMock ;
11+ import org .mockito .stubbing .Answer ;
1012import org .robolectric .RobolectricGradleTestRunner ;
1113import org .robolectric .annotation .Config ;
1214
1315import java .net .URI ;
1416import java .util .concurrent .Executor ;
1517
18+ import bolts .Task ;
19+
1620import static junit .framework .Assert .assertEquals ;
1721import static junit .framework .Assert .assertTrue ;
22+ import static org .mockito .AdditionalMatchers .and ;
23+ import static org .mockito .AdditionalMatchers .not ;
1824import static org .mockito .Matchers .any ;
25+ import static org .mockito .Matchers .anyBoolean ;
26+ import static org .mockito .Matchers .contains ;
1927import static org .mockito .Matchers .eq ;
2028import static org .mockito .Mockito .mock ;
2129import static org .mockito .Mockito .times ;
2230import static org .mockito .Mockito .verify ;
31+ import static org .mockito .Mockito .when ;
2332
2433@ RunWith (RobolectricGradleTestRunner .class )
2534@ Config (constants = BuildConfig .class , sdk = 21 )
@@ -28,10 +37,23 @@ public class TestParseLiveQueryClient {
2837 private WebSocketClient webSocketClient ;
2938 private WebSocketClient .WebSocketClientCallback webSocketClientCallback ;
3039 private ParseLiveQueryClient <ParseObject > parseLiveQueryClient ;
40+ private ParseUser mockUser ;
3141
3242 @ Before
3343 public void setUp () throws Exception {
3444 ParsePlugins .initialize ("1234" , "1234" );
45+
46+ // Register a mock currentUserController to make getCurrentUser work
47+ mockUser = mock (ParseUser .class );
48+ ParseCurrentUserController currentUserController = mock (ParseCurrentUserController .class );
49+ when (currentUserController .getAsync (anyBoolean ())).thenAnswer (new Answer <Task <ParseUser >>() {
50+ @ Override
51+ public Task <ParseUser > answer (InvocationOnMock invocation ) throws Throwable {
52+ return Task .forResult (mockUser );
53+ }
54+ });
55+ ParseCorePlugins .getInstance ().registerCurrentUserController (currentUserController );
56+
3557 parseLiveQueryClient = ParseLiveQueryClient .Factory .getClient (new URI ("" ), new WebSocketClientFactory () {
3658 @ Override
3759 public WebSocketClient createInstance (WebSocketClient .WebSocketClientCallback webSocketClientCallback , URI hostUrl ) {
@@ -67,12 +89,14 @@ public void testSubscribeWhenSubscribedToCallback() throws Exception {
6789 @ Test
6890 public void testUnsubscribeWhenSubscribedToCallback () throws Exception {
6991 ParseQuery <ParseObject > parseQuery = new ParseQuery <>("test" );
70- SubscriptionHandling <ParseObject > subscriptionHandling = createSubscription (parseQuery , mock (SubscriptionHandling .HandleSubscribeCallback .class ));
92+ SubscriptionHandling <ParseObject > subscriptionHandling = createSubscription (parseQuery ,
93+ mock (SubscriptionHandling .HandleSubscribeCallback .class ));
7194
7295 parseLiveQueryClient .unsubscribe (parseQuery );
7396 verify (webSocketClient , times (1 )).send (any (String .class ));
7497
75- SubscriptionHandling .HandleUnsubscribeCallback <ParseObject > unsubscribeMockCallback = mock (SubscriptionHandling .HandleUnsubscribeCallback .class );
98+ SubscriptionHandling .HandleUnsubscribeCallback <ParseObject > unsubscribeMockCallback = mock (
99+ SubscriptionHandling .HandleUnsubscribeCallback .class );
76100 subscriptionHandling .handleUnsubscribe (unsubscribeMockCallback );
77101 webSocketClientCallback .onMessage (createUnsubscribedMessage (subscriptionHandling .getRequestId ()).toString ());
78102
@@ -82,7 +106,8 @@ public void testUnsubscribeWhenSubscribedToCallback() throws Exception {
82106 @ Test
83107 public void testErrorWhenSubscribedToCallback () throws Exception {
84108 ParseQuery <ParseObject > parseQuery = new ParseQuery <>("test" );
85- SubscriptionHandling <ParseObject > subscriptionHandling = createSubscription (parseQuery , mock (SubscriptionHandling .HandleSubscribeCallback .class ));
109+ SubscriptionHandling <ParseObject > subscriptionHandling = createSubscription (parseQuery ,
110+ mock (SubscriptionHandling .HandleSubscribeCallback .class ));
86111
87112 SubscriptionHandling .HandleErrorCallback <ParseObject > errorMockCallback = mock (SubscriptionHandling .HandleErrorCallback .class );
88113 subscriptionHandling .handleError (errorMockCallback );
@@ -103,7 +128,8 @@ public void testErrorWhenSubscribedToCallback() throws Exception {
103128 @ Test
104129 public void testCreateEventWhenSubscribedToCallback () throws Exception {
105130 ParseQuery <ParseObject > parseQuery = new ParseQuery <>("test" );
106- SubscriptionHandling <ParseObject > subscriptionHandling = createSubscription (parseQuery , mock (SubscriptionHandling .HandleSubscribeCallback .class ));
131+ SubscriptionHandling <ParseObject > subscriptionHandling = createSubscription (parseQuery ,
132+ mock (SubscriptionHandling .HandleSubscribeCallback .class ));
107133
108134 SubscriptionHandling .HandleEventCallback <ParseObject > eventMockCallback = mock (SubscriptionHandling .HandleEventCallback .class );
109135 subscriptionHandling .handleEvent (SubscriptionHandling .Event .CREATE , eventMockCallback );
@@ -119,7 +145,8 @@ public void testCreateEventWhenSubscribedToCallback() throws Exception {
119145 @ Test
120146 public void testEnterEventWhenSubscribedToCallback () throws Exception {
121147 ParseQuery <ParseObject > parseQuery = new ParseQuery <>("test" );
122- SubscriptionHandling <ParseObject > subscriptionHandling = createSubscription (parseQuery , mock (SubscriptionHandling .HandleSubscribeCallback .class ));
148+ SubscriptionHandling <ParseObject > subscriptionHandling = createSubscription (parseQuery ,
149+ mock (SubscriptionHandling .HandleSubscribeCallback .class ));
123150
124151 SubscriptionHandling .HandleEventCallback <ParseObject > eventMockCallback = mock (SubscriptionHandling .HandleEventCallback .class );
125152 subscriptionHandling .handleEvent (SubscriptionHandling .Event .ENTER , eventMockCallback );
@@ -135,7 +162,8 @@ public void testEnterEventWhenSubscribedToCallback() throws Exception {
135162 @ Test
136163 public void testUpdateEventWhenSubscribedToCallback () throws Exception {
137164 ParseQuery <ParseObject > parseQuery = new ParseQuery <>("test" );
138- SubscriptionHandling <ParseObject > subscriptionHandling = createSubscription (parseQuery , mock (SubscriptionHandling .HandleSubscribeCallback .class ));
165+ SubscriptionHandling <ParseObject > subscriptionHandling = createSubscription (parseQuery ,
166+ mock (SubscriptionHandling .HandleSubscribeCallback .class ));
139167
140168 SubscriptionHandling .HandleEventCallback <ParseObject > eventMockCallback = mock (SubscriptionHandling .HandleEventCallback .class );
141169 subscriptionHandling .handleEvent (SubscriptionHandling .Event .UPDATE , eventMockCallback );
@@ -151,7 +179,8 @@ public void testUpdateEventWhenSubscribedToCallback() throws Exception {
151179 @ Test
152180 public void testLeaveEventWhenSubscribedToCallback () throws Exception {
153181 ParseQuery <ParseObject > parseQuery = new ParseQuery <>("test" );
154- SubscriptionHandling <ParseObject > subscriptionHandling = createSubscription (parseQuery , mock (SubscriptionHandling .HandleSubscribeCallback .class ));
182+ SubscriptionHandling <ParseObject > subscriptionHandling = createSubscription (parseQuery ,
183+ mock (SubscriptionHandling .HandleSubscribeCallback .class ));
155184
156185 SubscriptionHandling .HandleEventCallback <ParseObject > eventMockCallback = mock (SubscriptionHandling .HandleEventCallback .class );
157186 subscriptionHandling .handleEvent (SubscriptionHandling .Event .LEAVE , eventMockCallback );
@@ -164,11 +193,11 @@ public void testLeaveEventWhenSubscribedToCallback() throws Exception {
164193 validateSameObject (eventMockCallback , parseQuery , parseObject );
165194 }
166195
167-
168196 @ Test
169197 public void testDeleteEventWhenSubscribedToCallback () throws Exception {
170198 ParseQuery <ParseObject > parseQuery = new ParseQuery <>("test" );
171- SubscriptionHandling <ParseObject > subscriptionHandling = createSubscription (parseQuery , mock (SubscriptionHandling .HandleSubscribeCallback .class ));
199+ SubscriptionHandling <ParseObject > subscriptionHandling = createSubscription (parseQuery ,
200+ mock (SubscriptionHandling .HandleSubscribeCallback .class ));
172201
173202 SubscriptionHandling .HandleEventCallback <ParseObject > eventMockCallback = mock (SubscriptionHandling .HandleEventCallback .class );
174203 subscriptionHandling .handleEvent (SubscriptionHandling .Event .DELETE , eventMockCallback );
@@ -184,7 +213,8 @@ public void testDeleteEventWhenSubscribedToCallback() throws Exception {
184213 @ Test
185214 public void testCreateEventWhenSubscribedToAnyCallback () throws Exception {
186215 ParseQuery <ParseObject > parseQuery = new ParseQuery <>("test" );
187- SubscriptionHandling <ParseObject > subscriptionHandling = createSubscription (parseQuery , mock (SubscriptionHandling .HandleSubscribeCallback .class ));
216+ SubscriptionHandling <ParseObject > subscriptionHandling = createSubscription (parseQuery ,
217+ mock (SubscriptionHandling .HandleSubscribeCallback .class ));
188218
189219 SubscriptionHandling .HandleEventsCallback <ParseObject > eventsMockCallback = mock (SubscriptionHandling .HandleEventsCallback .class );
190220 subscriptionHandling .handleEvents (eventsMockCallback );
@@ -205,12 +235,14 @@ public void testCreateEventWhenSubscribedToAnyCallback() throws Exception {
205235 @ Test
206236 public void testSubscriptionStoppedAfterUnsubscribe () throws Exception {
207237 ParseQuery <ParseObject > parseQuery = new ParseQuery <>("test" );
208- SubscriptionHandling <ParseObject > subscriptionHandling = createSubscription (parseQuery , mock (SubscriptionHandling .HandleSubscribeCallback .class ));
238+ SubscriptionHandling <ParseObject > subscriptionHandling = createSubscription (parseQuery ,
239+ mock (SubscriptionHandling .HandleSubscribeCallback .class ));
209240
210241 SubscriptionHandling .HandleEventCallback <ParseObject > eventMockCallback = mock (SubscriptionHandling .HandleEventCallback .class );
211242 subscriptionHandling .handleEvent (SubscriptionHandling .Event .CREATE , eventMockCallback );
212243
213- SubscriptionHandling .HandleUnsubscribeCallback <ParseObject > unsubscribeMockCallback = mock (SubscriptionHandling .HandleUnsubscribeCallback .class );
244+ SubscriptionHandling .HandleUnsubscribeCallback <ParseObject > unsubscribeMockCallback = mock (
245+ SubscriptionHandling .HandleUnsubscribeCallback .class );
214246 subscriptionHandling .handleUnsubscribe (unsubscribeMockCallback );
215247
216248 parseLiveQueryClient .unsubscribe (parseQuery );
@@ -239,14 +271,52 @@ public void testSubscriptionReplayedAfterReconnect() throws Exception {
239271 verify (webSocketClient , times (2 )).send (any (String .class ));
240272 }
241273
274+ @ Test
275+ public void testSessionTokenSentOnConnect () {
276+ when (mockUser .getSessionToken ()).thenReturn ("the token" );
277+ parseLiveQueryClient .reconnect ();
278+ webSocketClientCallback .onOpen ();
279+ verify (webSocketClient , times (1 )).send (contains ("\" sessionToken\" :\" the token\" " ));
280+ }
242281
243- private SubscriptionHandling <ParseObject > createSubscription (ParseQuery <ParseObject > parseQuery , SubscriptionHandling .HandleSubscribeCallback <ParseObject > subscribeMockCallback ) throws Exception {
282+ @ Test
283+ public void testEmptySessionTokenOnConnect () {
284+ parseLiveQueryClient .reconnect ();
285+ webSocketClientCallback .onOpen ();
286+ verify (webSocketClient , times (1 )).send (not (contains ("\" sessionToken\" :" )));
287+ }
288+
289+ @ Test
290+ public void testSessionTokenSentOnSubscribe () {
291+ when (mockUser .getSessionToken ()).thenReturn ("the token" );
292+ when (webSocketClient .getState ()).thenReturn (WebSocketClient .State .CONNECTED );
293+ parseLiveQueryClient .subscribe (ParseQuery .getQuery ("Test" ));
294+ verify (webSocketClient , times (1 )).send (and (
295+ contains ("\" op\" :\" subscribe\" " ),
296+ contains ("\" sessionToken\" :\" the token\" " )));
297+ }
298+
299+ @ Test
300+ public void testEmptySessionTokenOnSubscribe () {
301+ when (mockUser .getSessionToken ()).thenReturn ("the token" );
302+ when (webSocketClient .getState ()).thenReturn (WebSocketClient .State .CONNECTED );
303+ parseLiveQueryClient .subscribe (ParseQuery .getQuery ("Test" ));
304+ verify (webSocketClient , times (1 )).send (contains ("\" op\" :\" connect\" " ));
305+ verify (webSocketClient , times (1 )).send (and (
306+ contains ("\" op\" :\" subscribe\" " ),
307+ contains ("\" sessionToken\" :\" the token\" " )));
308+ }
309+
310+ private SubscriptionHandling <ParseObject > createSubscription (ParseQuery <ParseObject > parseQuery ,
311+ SubscriptionHandling .HandleSubscribeCallback <ParseObject > subscribeMockCallback ) throws Exception {
244312 SubscriptionHandling <ParseObject > subscriptionHandling = parseLiveQueryClient .subscribe (parseQuery ).handleSubscribe (subscribeMockCallback );
245313 webSocketClientCallback .onMessage (createSubscribedMessage (subscriptionHandling .getRequestId ()).toString ());
246314 return subscriptionHandling ;
247315 }
248316
249- private void validateSameObject (SubscriptionHandling .HandleEventCallback <ParseObject > eventMockCallback , ParseQuery <ParseObject > parseQuery , ParseObject originalParseObject ) {
317+ private void validateSameObject (SubscriptionHandling .HandleEventCallback <ParseObject > eventMockCallback ,
318+ ParseQuery <ParseObject > parseQuery ,
319+ ParseObject originalParseObject ) {
250320 ArgumentCaptor <ParseObject > objectCaptor = ArgumentCaptor .forClass (ParseObject .class );
251321 verify (eventMockCallback , times (1 )).onEvent (eq (parseQuery ), objectCaptor .capture ());
252322
@@ -335,5 +405,4 @@ private static JSONObject createObjectDeleteMessage(int requestId, ParseObject p
335405 jsonObject .put ("object" , PointerEncoder .get ().encodeRelatedObject (parseObject ));
336406 return jsonObject ;
337407 }
338-
339408}
0 commit comments