@@ -2397,10 +2397,8 @@ describe('Client', () => {
23972397
23982398 client . emit ( 'beforeEnvelope' , mockEnvelope ) ;
23992399 } ) ;
2400- } ) ;
24012400
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 ( ) => {
24042402 vi . useFakeTimers ( ) ;
24052403 expect . assertions ( 8 ) ;
24062404
@@ -2420,7 +2418,7 @@ describe('Client', () => {
24202418 const callback = vi . fn ( ) ;
24212419 const removeAfterSendEventListenerFn = client . on ( 'afterSendEvent' , callback ) ;
24222420
2423- expect ( client [ '_hooks' ] [ 'afterSendEvent' ] ) . toEqual ( [ callback ] ) ;
2421+ expect ( client [ '_hooks' ] [ 'afterSendEvent' ] ! . size ) . toBe ( 1 ) ;
24242422
24252423 client . sendEvent ( errorEvent ) ;
24262424 vi . runAllTimers ( ) ;
@@ -2435,7 +2433,7 @@ describe('Client', () => {
24352433
24362434 // Should unregister `afterSendEvent` callback.
24372435 removeAfterSendEventListenerFn ( ) ;
2438- expect ( client [ '_hooks' ] [ 'afterSendEvent' ] ) . toEqual ( [ ] ) ;
2436+ expect ( client [ '_hooks' ] [ 'afterSendEvent' ] ! . size ) . toBe ( 0 ) ;
24392437
24402438 client . sendEvent ( errorEvent ) ;
24412439 vi . runAllTimers ( ) ;
@@ -2450,6 +2448,112 @@ describe('Client', () => {
24502448 expect ( callback ) . toBeCalledTimes ( 1 ) ;
24512449 expect ( callback ) . toBeCalledWith ( errorEvent , { statusCode : 200 } ) ;
24522450 } ) ;
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+ } ) ;
24532557 } ) ;
24542558
24552559 describe ( 'withMonitor' , ( ) => {
0 commit comments