@@ -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,67 @@ 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 (
2454+ getDefaultTestClientOptions ( {
2455+ dsn : PUBLIC_DSN ,
2456+ enableSend : true ,
2457+ } ) ,
2458+ ) ;
2459+
2460+ const callback1 = vi . fn ( ) ;
2461+ const callback2 = vi . fn ( ) ;
2462+
2463+ const removeCallback1 = client . on ( 'close' , ( ) => {
2464+ callback1 ( ) ;
2465+ removeCallback1 ( ) ;
2466+ } ) ;
2467+ const removeCallback2 = client . on ( 'close' , ( ) => {
2468+ callback2 ( ) ;
2469+ removeCallback2 ( ) ;
2470+ } ) ;
2471+
2472+ client . emit ( 'close' ) ;
2473+
2474+ expect ( callback1 ) . toHaveBeenCalledTimes ( 1 ) ;
2475+ expect ( callback2 ) . toHaveBeenCalledTimes ( 1 ) ;
2476+
2477+ callback1 . mockReset ( ) ;
2478+ callback2 . mockReset ( ) ;
2479+
2480+ client . emit ( 'close' ) ;
2481+
2482+ expect ( callback1 ) . toHaveBeenCalledTimes ( 0 ) ;
2483+ expect ( callback2 ) . toHaveBeenCalledTimes ( 0 ) ;
2484+ } ) ;
2485+
2486+ it ( 'allows registering and unregistering the same callback multiple times' , ( ) => {
2487+ const client = new TestClient ( options ) ;
2488+ const callback = vi . fn ( ) ;
2489+
2490+ const unregister1 = client . on ( 'close' , callback ) ;
2491+ const unregister2 = client . on ( 'close' , callback ) ;
2492+
2493+ client . emit ( 'close' ) ;
2494+
2495+ expect ( callback ) . toHaveBeenCalledTimes ( 2 ) ;
2496+
2497+ unregister1 ( ) ;
2498+
2499+ callback . mockReset ( ) ;
2500+
2501+ client . emit ( 'close' ) ;
2502+
2503+ expect ( callback ) . toHaveBeenCalledTimes ( 1 ) ;
2504+
2505+ unregister2 ( ) ;
2506+
2507+ callback . mockReset ( ) ;
2508+ client . emit ( 'close' ) ;
2509+
2510+ expect ( callback ) . toHaveBeenCalledTimes ( 0 ) ;
2511+ } ) ;
24532512 } ) ;
24542513
24552514 describe ( 'withMonitor' , ( ) => {
0 commit comments