@@ -2397,10 +2397,8 @@ describe('Client', () => {
2397
2397
2398
2398
client . emit ( 'beforeEnvelope' , mockEnvelope ) ;
2399
2399
} ) ;
2400
- } ) ;
2401
2400
2402
- describe ( 'hook removal with `on`' , ( ) => {
2403
- it ( 'should return a cleanup function that, when executed, unregisters a hook' , async ( ) => {
2401
+ it ( 'returns a cleanup function that, when executed, unregisters a hook' , async ( ) => {
2404
2402
vi . useFakeTimers ( ) ;
2405
2403
expect . assertions ( 8 ) ;
2406
2404
@@ -2420,7 +2418,7 @@ describe('Client', () => {
2420
2418
const callback = vi . fn ( ) ;
2421
2419
const removeAfterSendEventListenerFn = client . on ( 'afterSendEvent' , callback ) ;
2422
2420
2423
- expect ( client [ '_hooks' ] [ 'afterSendEvent' ] ) . toEqual ( [ callback ] ) ;
2421
+ expect ( client [ '_hooks' ] [ 'afterSendEvent' ] ! . size ) . toBe ( 1 ) ;
2424
2422
2425
2423
client . sendEvent ( errorEvent ) ;
2426
2424
vi . runAllTimers ( ) ;
@@ -2435,7 +2433,7 @@ describe('Client', () => {
2435
2433
2436
2434
// Should unregister `afterSendEvent` callback.
2437
2435
removeAfterSendEventListenerFn ( ) ;
2438
- expect ( client [ '_hooks' ] [ 'afterSendEvent' ] ) . toEqual ( [ ] ) ;
2436
+ expect ( client [ '_hooks' ] [ 'afterSendEvent' ] ! . size ) . toBe ( 0 ) ;
2439
2437
2440
2438
client . sendEvent ( errorEvent ) ;
2441
2439
vi . runAllTimers ( ) ;
@@ -2450,6 +2448,112 @@ describe('Client', () => {
2450
2448
expect ( callback ) . toBeCalledTimes ( 1 ) ;
2451
2449
expect ( callback ) . toBeCalledWith ( errorEvent , { statusCode : 200 } ) ;
2452
2450
} ) ;
2451
+
2452
+ it ( 'allows synchronously unregistering multiple callbacks from within the callback' , ( ) => {
2453
+ const client = new TestClient ( getDefaultTestClientOptions ( ) ) ;
2454
+
2455
+ const callback1 = vi . fn ( ) ;
2456
+ const callback2 = vi . fn ( ) ;
2457
+
2458
+ const removeCallback1 = client . on ( 'close' , ( ) => {
2459
+ callback1 ( ) ;
2460
+ removeCallback1 ( ) ;
2461
+ } ) ;
2462
+ const removeCallback2 = client . on ( 'close' , ( ) => {
2463
+ callback2 ( ) ;
2464
+ removeCallback2 ( ) ;
2465
+ } ) ;
2466
+
2467
+ client . emit ( 'close' ) ;
2468
+
2469
+ expect ( callback1 ) . toHaveBeenCalledTimes ( 1 ) ;
2470
+ expect ( callback2 ) . toHaveBeenCalledTimes ( 1 ) ;
2471
+
2472
+ callback1 . mockReset ( ) ;
2473
+ callback2 . mockReset ( ) ;
2474
+
2475
+ client . emit ( 'close' ) ;
2476
+
2477
+ expect ( callback1 ) . not . toHaveBeenCalled ( ) ;
2478
+ expect ( callback2 ) . not . toHaveBeenCalled ( ) ;
2479
+ } ) ;
2480
+
2481
+ it ( 'allows synchronously unregistering other callbacks from within one callback' , ( ) => {
2482
+ const client = new TestClient ( getDefaultTestClientOptions ( ) ) ;
2483
+
2484
+ const callback1 = vi . fn ( ) ;
2485
+ const callback2 = vi . fn ( ) ;
2486
+
2487
+ const removeCallback1 = client . on ( 'close' , ( ) => {
2488
+ callback1 ( ) ;
2489
+ removeCallback1 ( ) ;
2490
+ removeCallback2 ( ) ;
2491
+ } ) ;
2492
+ const removeCallback2 = client . on ( 'close' , ( ) => {
2493
+ callback2 ( ) ;
2494
+ removeCallback2 ( ) ;
2495
+ removeCallback1 ( ) ;
2496
+ } ) ;
2497
+
2498
+ client . emit ( 'close' ) ;
2499
+
2500
+ expect ( callback1 ) . toHaveBeenCalledTimes ( 1 ) ;
2501
+ // callback2 was already cancelled from within callback1, so it must not be called
2502
+ expect ( callback2 ) . not . toHaveBeenCalled ( ) ;
2503
+
2504
+ callback1 . mockReset ( ) ;
2505
+ callback2 . mockReset ( ) ;
2506
+
2507
+ client . emit ( 'close' ) ;
2508
+
2509
+ expect ( callback1 ) . not . toHaveBeenCalled ( ) ;
2510
+ expect ( callback2 ) . not . toHaveBeenCalled ( ) ;
2511
+ } ) ;
2512
+
2513
+ it ( 'allows registering and unregistering the same callback multiple times' , ( ) => {
2514
+ const client = new TestClient ( getDefaultTestClientOptions ( ) ) ;
2515
+ const callback = vi . fn ( ) ;
2516
+
2517
+ const unregister1 = client . on ( 'close' , callback ) ;
2518
+ const unregister2 = client . on ( 'close' , callback ) ;
2519
+
2520
+ client . emit ( 'close' ) ;
2521
+
2522
+ expect ( callback ) . toHaveBeenCalledTimes ( 2 ) ;
2523
+
2524
+ unregister1 ( ) ;
2525
+
2526
+ callback . mockReset ( ) ;
2527
+
2528
+ client . emit ( 'close' ) ;
2529
+
2530
+ expect ( callback ) . toHaveBeenCalledTimes ( 1 ) ;
2531
+
2532
+ unregister2 ( ) ;
2533
+
2534
+ callback . mockReset ( ) ;
2535
+ client . emit ( 'close' ) ;
2536
+
2537
+ expect ( callback ) . not . toHaveBeenCalled ( ) ;
2538
+ } ) ;
2539
+
2540
+ it ( 'handles unregistering a callback multiple times' , ( ) => {
2541
+ const client = new TestClient ( getDefaultTestClientOptions ( ) ) ;
2542
+ const callback = vi . fn ( ) ;
2543
+
2544
+ const unregister = client . on ( 'close' , callback ) ;
2545
+ client . emit ( 'close' ) ;
2546
+ expect ( callback ) . toHaveBeenCalledTimes ( 1 ) ;
2547
+
2548
+ callback . mockReset ( ) ;
2549
+ unregister ( ) ;
2550
+ unregister ( ) ;
2551
+ unregister ( ) ;
2552
+
2553
+ client . emit ( 'close' ) ;
2554
+
2555
+ expect ( callback ) . not . toHaveBeenCalled ( ) ;
2556
+ } ) ;
2453
2557
} ) ;
2454
2558
2455
2559
describe ( 'withMonitor' , ( ) => {
0 commit comments