@@ -267,7 +267,11 @@ describe("KnockGuideClient", () => {
267
267
test ( "subscribes to socket events when socket is available" , ( ) => {
268
268
const mockChannel = {
269
269
join : vi . fn ( ) . mockReturnValue ( {
270
- receive : vi . fn ( ) . mockReturnValue ( { receive : vi . fn ( ) } ) ,
270
+ receive : vi . fn ( ) . mockReturnValue ( {
271
+ receive : vi . fn ( ) . mockReturnValue ( {
272
+ receive : vi . fn ( )
273
+ } )
274
+ } ) ,
271
275
} ) ,
272
276
on : vi . fn ( ) ,
273
277
off : vi . fn ( ) ,
@@ -303,6 +307,121 @@ describe("KnockGuideClient", () => {
303
307
expect ( mockChannel . join ) . toHaveBeenCalled ( ) ;
304
308
} ) ;
305
309
310
+ test ( "handles successful channel join" , ( ) => {
311
+ let okCallback : ( ) => void ;
312
+ const mockChannel = {
313
+ join : vi . fn ( ) . mockReturnValue ( {
314
+ receive : vi . fn ( ( event , callback ) => {
315
+ if ( event === "ok" ) {
316
+ okCallback = callback ;
317
+ }
318
+ return {
319
+ receive : vi . fn ( ) . mockReturnValue ( { receive : vi . fn ( ) } )
320
+ } ;
321
+ } ) ,
322
+ } ) ,
323
+ on : vi . fn ( ) ,
324
+ off : vi . fn ( ) ,
325
+ leave : vi . fn ( ) ,
326
+ state : "closed" ,
327
+ } ;
328
+
329
+ const mockSocket = {
330
+ channel : vi . fn ( ) . mockReturnValue ( mockChannel ) ,
331
+ isConnected : vi . fn ( ) . mockReturnValue ( true ) ,
332
+ connect : vi . fn ( ) ,
333
+ } ;
334
+
335
+ mockApiClient . socket = mockSocket as unknown as Socket ;
336
+ vi . mocked ( mockKnock . client ) . mockReturnValue ( mockApiClient as ApiClient ) ;
337
+
338
+ const client = new KnockGuideClient (
339
+ mockKnock ,
340
+ channelId ,
341
+ defaultTargetParams ,
342
+ ) ;
343
+ client . subscribe ( ) ;
344
+
345
+ // Trigger the ok callback
346
+ okCallback ! ( ) ;
347
+
348
+ expect ( mockKnock . log ) . toHaveBeenCalledWith ( "[Guide] Successfully joined channel" ) ;
349
+ } ) ;
350
+
351
+ test ( "unsubscribes after reaching max retry limit" , ( ) => {
352
+ let errorCallback : ( resp : { reason : string } ) => void ;
353
+ const mockChannel = {
354
+ join : vi . fn ( ) . mockReturnValue ( {
355
+ receive : vi . fn ( ( event , callback ) => {
356
+ if ( event === "error" ) {
357
+ errorCallback = callback ;
358
+ }
359
+ return {
360
+ receive : vi . fn ( ( event , callback ) => {
361
+ if ( event === "error" ) {
362
+ errorCallback = callback ;
363
+ }
364
+ return {
365
+ receive : vi . fn ( ( event , callback ) => {
366
+ if ( event === "error" ) {
367
+ errorCallback = callback ;
368
+ }
369
+ return { receive : vi . fn ( ) } ;
370
+ } )
371
+ } ;
372
+ } )
373
+ } ;
374
+ } ) ,
375
+ } ) ,
376
+ on : vi . fn ( ) ,
377
+ off : vi . fn ( ) ,
378
+ leave : vi . fn ( ) ,
379
+ state : "closed" ,
380
+ } ;
381
+
382
+ const mockSocket = {
383
+ channel : vi . fn ( ) . mockReturnValue ( mockChannel ) ,
384
+ isConnected : vi . fn ( ) . mockReturnValue ( true ) ,
385
+ connect : vi . fn ( ) ,
386
+ } ;
387
+
388
+ mockApiClient . socket = mockSocket as unknown as Socket ;
389
+ vi . mocked ( mockKnock . client ) . mockReturnValue ( mockApiClient as ApiClient ) ;
390
+
391
+ const client = new KnockGuideClient (
392
+ mockKnock ,
393
+ channelId ,
394
+ defaultTargetParams ,
395
+ ) ;
396
+
397
+ const unsubscribeSpy = vi . spyOn ( client , "unsubscribe" ) ;
398
+
399
+ client . subscribe ( ) ;
400
+
401
+ // Initial fail. The retry count starts at 0 and is incremented on each
402
+ // error to represent the next retry.
403
+ errorCallback ! ( { reason : "auth_error" } ) ;
404
+
405
+ // First retry fail
406
+ expect ( client [ "subscribeRetryCount" ] ) . toBe ( 1 ) ;
407
+ errorCallback ! ( { reason : "auth_error" } ) ;
408
+
409
+ // Second retry fail
410
+ expect ( client [ "subscribeRetryCount" ] ) . toBe ( 2 ) ;
411
+ errorCallback ! ( { reason : "auth_error" } ) ;
412
+
413
+ // Third retry fail
414
+ expect ( client [ "subscribeRetryCount" ] ) . toBe ( 3 ) ;
415
+ errorCallback ! ( { reason : "auth_error" } ) ;
416
+
417
+ // Check that the max retry limit message was logged
418
+ expect ( mockKnock . log ) . toHaveBeenCalledWith (
419
+ "[Guide] Channel join max retry limit reached: 3"
420
+ ) ;
421
+
422
+ expect ( unsubscribeSpy ) . toHaveBeenCalled ( ) ;
423
+ } ) ;
424
+
306
425
test ( "unsubscribes from socket events" , ( ) => {
307
426
const mockChannel = {
308
427
join : vi . fn ( ) ,
0 commit comments