@@ -14,50 +14,73 @@ async function wait(fn: () => boolean, timeout = 2000) {
1414 }
1515}
1616
17- describe ( "ClientProvider event.scope" , ( ) => {
18- test ( "reconnects the event stream when interest changes, not when it is unchanged" , async ( ) => {
19- const events = createEventStream ( )
20- const eventUrls : URL [ ] = [ ]
21- const calls = createFetch ( ( url , request ) => {
22- if ( url . pathname !== "/api/event" ) return undefined
23- eventUrls . push ( url )
24- return events . v2 ( request . signal )
25- } , events )
17+ async function mount ( interest : { location : { directory : string } ; sessions ?: string [ ] } ) {
18+ const events = createEventStream ( )
19+ const eventUrls : URL [ ] = [ ]
20+ const calls = createFetch ( ( url , request ) => {
21+ if ( url . pathname !== "/api/event" ) return undefined
22+ eventUrls . push ( url )
23+ return events . v2 ( request . signal )
24+ } , events )
2625
27- let client ! : ReturnType < typeof useClient >
28- let done ! : ( ) => void
29- const ready = new Promise < void > ( ( resolve ) => {
30- done = resolve
31- } )
26+ let client ! : ReturnType < typeof useClient >
27+ let done ! : ( ) => void
28+ const ready = new Promise < void > ( ( resolve ) => {
29+ done = resolve
30+ } )
3231
33- const app = await testRender ( ( ) => (
34- < TestTuiContexts >
35- < ClientProvider
36- api = { createApi ( calls . fetch ) }
37- interest = { { location : { directory } } }
38- >
39- < Probe
40- onReady = { ( ctx ) => {
41- client = ctx
42- done ( )
43- } }
44- />
45- </ ClientProvider >
46- </ TestTuiContexts >
47- ) )
32+ const app = await testRender ( ( ) => (
33+ < TestTuiContexts >
34+ < ClientProvider api = { createApi ( calls . fetch ) } interest = { interest } >
35+ < Probe
36+ onReady = { ( ctx ) => {
37+ client = ctx
38+ done ( )
39+ } }
40+ />
41+ </ ClientProvider >
42+ </ TestTuiContexts >
43+ ) )
4844
45+ await ready
46+ return { app, client, eventUrls }
47+ }
48+
49+ describe ( "ClientProvider event.scope" , ( ) => {
50+ test ( "connects the event stream with location interest" , async ( ) => {
51+ const { app, client, eventUrls } = await mount ( { location : { directory } } )
4952 try {
50- await ready
5153 await wait ( ( ) => client . connection . status ( ) === "connected" && eventUrls . length >= 1 )
5254 expect ( eventUrls [ 0 ] ! . searchParams . get ( "location[directory]" ) ) . toBe ( directory )
5355 expect ( eventUrls [ 0 ] ! . searchParams . getAll ( "session" ) ) . toEqual ( [ ] )
56+ } finally {
57+ app . renderer . destroy ( )
58+ }
59+ } )
60+
61+ test ( "reconnects when session interest changes" , async ( ) => {
62+ const { app, client, eventUrls } = await mount ( { location : { directory } } )
63+ try {
64+ await wait ( ( ) => client . connection . status ( ) === "connected" && eventUrls . length >= 1 )
5465
5566 client . event . scope ( { location : { directory } , sessions : [ "ses_a" ] } )
5667 await wait ( ( ) => eventUrls . length >= 2 )
5768 expect ( eventUrls [ 1 ] ! . searchParams . get ( "location[directory]" ) ) . toBe ( directory )
5869 expect ( eventUrls [ 1 ] ! . searchParams . getAll ( "session" ) ) . toEqual ( [ "ses_a" ] )
70+ } finally {
71+ app . renderer . destroy ( )
72+ }
73+ } )
5974
75+ test ( "does not reconnect when interest is unchanged" , async ( ) => {
76+ const { app, client, eventUrls } = await mount ( {
77+ location : { directory } ,
78+ sessions : [ "ses_a" ] ,
79+ } )
80+ try {
81+ await wait ( ( ) => client . connection . status ( ) === "connected" && eventUrls . length >= 1 )
6082 const before = eventUrls . length
83+
6184 client . event . scope ( { location : { directory } , sessions : [ "ses_a" ] } )
6285 await Bun . sleep ( 50 )
6386 expect ( eventUrls . length ) . toBe ( before )
0 commit comments