1- import { describe , test } from 'vitest' ;
2- import { maybeInstrument } from '../../../src/instrument/handlers' ;
1+ import { afterEach , describe , expect , test , vi } from 'vitest' ;
2+ import {
3+ addHandler ,
4+ maybeInstrument ,
5+ resetInstrumentationHandlers ,
6+ triggerHandlers ,
7+ } from '../../../src/instrument/handlers' ;
8+
9+ afterEach ( ( ) => {
10+ resetInstrumentationHandlers ( ) ;
11+ } ) ;
312
413describe ( 'maybeInstrument' , ( ) => {
514 test ( 'does not throw when instrumenting fails' , ( ) => {
@@ -12,3 +21,89 @@ describe('maybeInstrument', () => {
1221 maybeInstrument ( 'xhr' , undefined as any ) ;
1322 } ) ;
1423} ) ;
24+
25+ describe ( 'addHandler' , ( ) => {
26+ test ( 'returns an unsubscribe function' , ( ) => {
27+ const handler = vi . fn ( ) ;
28+ const unsubscribe = addHandler ( 'fetch' , handler ) ;
29+
30+ expect ( typeof unsubscribe ) . toBe ( 'function' ) ;
31+ } ) ;
32+
33+ test ( 'handler is called when triggerHandlers is invoked' , ( ) => {
34+ const handler = vi . fn ( ) ;
35+ addHandler ( 'fetch' , handler ) ;
36+
37+ triggerHandlers ( 'fetch' , { url : 'https://example.com' } ) ;
38+
39+ expect ( handler ) . toHaveBeenCalledTimes ( 1 ) ;
40+ expect ( handler ) . toHaveBeenCalledWith ( { url : 'https://example.com' } ) ;
41+ } ) ;
42+
43+ test ( 'unsubscribe removes the handler' , ( ) => {
44+ const handler = vi . fn ( ) ;
45+ const unsubscribe = addHandler ( 'fetch' , handler ) ;
46+
47+ triggerHandlers ( 'fetch' , { test : 1 } ) ;
48+ expect ( handler ) . toHaveBeenCalledTimes ( 1 ) ;
49+
50+ unsubscribe ( ) ;
51+
52+ triggerHandlers ( 'fetch' , { test : 2 } ) ;
53+ expect ( handler ) . toHaveBeenCalledTimes ( 1 ) ;
54+ } ) ;
55+
56+ test ( 'unsubscribe only removes the specific handler' , ( ) => {
57+ const handler1 = vi . fn ( ) ;
58+ const handler2 = vi . fn ( ) ;
59+
60+ const unsubscribe1 = addHandler ( 'fetch' , handler1 ) ;
61+ addHandler ( 'fetch' , handler2 ) ;
62+
63+ triggerHandlers ( 'fetch' , { test : 1 } ) ;
64+ expect ( handler1 ) . toHaveBeenCalledTimes ( 1 ) ;
65+ expect ( handler2 ) . toHaveBeenCalledTimes ( 1 ) ;
66+
67+ unsubscribe1 ( ) ;
68+
69+ triggerHandlers ( 'fetch' , { test : 2 } ) ;
70+ expect ( handler1 ) . toHaveBeenCalledTimes ( 1 ) ;
71+ expect ( handler2 ) . toHaveBeenCalledTimes ( 2 ) ;
72+ } ) ;
73+
74+ test ( 'calling unsubscribe multiple times is safe' , ( ) => {
75+ const handler = vi . fn ( ) ;
76+ const unsubscribe = addHandler ( 'fetch' , handler ) ;
77+
78+ unsubscribe ( ) ;
79+ expect ( ( ) => unsubscribe ( ) ) . not . toThrow ( ) ;
80+ expect ( ( ) => unsubscribe ( ) ) . not . toThrow ( ) ;
81+ } ) ;
82+
83+ test ( 'unsubscribe works with different handler types' , ( ) => {
84+ const consoleHandler = vi . fn ( ) ;
85+ const fetchHandler = vi . fn ( ) ;
86+
87+ const unsubscribeConsole = addHandler ( 'console' , consoleHandler ) ;
88+ const unsubscribeFetch = addHandler ( 'fetch' , fetchHandler ) ;
89+
90+ triggerHandlers ( 'console' , { level : 'log' } ) ;
91+ triggerHandlers ( 'fetch' , { url : 'test' } ) ;
92+
93+ expect ( consoleHandler ) . toHaveBeenCalledTimes ( 1 ) ;
94+ expect ( fetchHandler ) . toHaveBeenCalledTimes ( 1 ) ;
95+
96+ unsubscribeConsole ( ) ;
97+
98+ triggerHandlers ( 'console' , { level : 'warn' } ) ;
99+ triggerHandlers ( 'fetch' , { url : 'test2' } ) ;
100+
101+ expect ( consoleHandler ) . toHaveBeenCalledTimes ( 1 ) ;
102+ expect ( fetchHandler ) . toHaveBeenCalledTimes ( 2 ) ;
103+
104+ unsubscribeFetch ( ) ;
105+
106+ triggerHandlers ( 'fetch' , { url : 'test3' } ) ;
107+ expect ( fetchHandler ) . toHaveBeenCalledTimes ( 2 ) ;
108+ } ) ;
109+ } ) ;
0 commit comments