@@ -43,6 +43,15 @@ function createMockEventSource() {
4343 return eventSource ;
4444}
4545
46+ function createSSEResponse ( events : Array < { event : string ; data : any } > ) {
47+ return events
48+ . map ( ( e ) => {
49+ const dataStr = typeof e . data === 'string' ? e . data : JSON . stringify ( e . data ) ;
50+ return `event: ${ e . event } \ndata: ${ dataStr } \n\n` ;
51+ } )
52+ . join ( '' ) ;
53+ }
54+
4655test ( 'should fetch from endpoint' , ( t ) =>
4756 new Promise ( ( resolve ) => {
4857 const url = 'http://unleash-test-0.app' ;
@@ -1970,3 +1979,143 @@ test('setMode should be no-op when repository is stopped', async (t) => {
19701979 await repo . setMode ( 'streaming' ) ;
19711980 t . is ( repo . getMode ( ) , 'polling' ) ;
19721981} ) ;
1982+
1983+ test ( 'SSE with HTTP mocking - should process unleash-connected event' , async ( t ) => {
1984+ const url = 'http://unleash-test-sse-http.app' ;
1985+ const feature = {
1986+ name : 'test-feature' ,
1987+ enabled : true ,
1988+ strategies : [
1989+ {
1990+ name : 'default' ,
1991+ } ,
1992+ ] ,
1993+ } ;
1994+
1995+ const sseResponse = createSSEResponse ( [
1996+ {
1997+ event : 'unleash-connected' ,
1998+ data : {
1999+ events : [
2000+ {
2001+ type : 'hydration' ,
2002+ eventId : 1 ,
2003+ features : [ feature ] ,
2004+ segments : [ ] ,
2005+ } ,
2006+ ] ,
2007+ } ,
2008+ } ,
2009+ ] ) ;
2010+
2011+ nock ( url )
2012+ . persist ( )
2013+ . get ( '/client/streaming' )
2014+ . reply ( 200 , sseResponse , { 'Content-Type' : 'text/event-stream' } ) ;
2015+
2016+ const storageProvider : StorageProvider < ClientFeaturesResponse > = new InMemStorageProvider ( ) ;
2017+
2018+ const repo = new Repository ( {
2019+ url,
2020+ appName,
2021+ instanceId,
2022+ connectionId,
2023+ refreshInterval : 10 ,
2024+ // @ts -expect-error
2025+ bootstrapProvider : new DefaultBootstrapProvider ( { } ) ,
2026+ storageProvider,
2027+ mode : { type : 'streaming' } ,
2028+ } ) ;
2029+
2030+ const changedEvent = new Promise < void > ( ( resolve ) => {
2031+ repo . once ( 'changed' , resolve ) ;
2032+ } ) ;
2033+
2034+ await repo . start ( ) ;
2035+ await changedEvent ;
2036+
2037+ const toggles = repo . getToggles ( ) ;
2038+ t . is ( toggles . length , 1 ) ;
2039+ t . is ( toggles [ 0 ] . name , 'test-feature' ) ;
2040+ t . is ( toggles [ 0 ] . enabled , true ) ;
2041+
2042+ repo . stop ( ) ;
2043+ } ) ;
2044+
2045+ test ( 'SSE with HTTP mocking - should process unleash-updated event' , async ( t ) => {
2046+ const url = 'http://unleash-test-sse-http-updated.app' ;
2047+ const feature = {
2048+ name : 'test-feature' ,
2049+ enabled : false ,
2050+ strategies : [
2051+ {
2052+ name : 'default' ,
2053+ } ,
2054+ ] ,
2055+ } ;
2056+
2057+ const sseResponse = createSSEResponse ( [
2058+ {
2059+ event : 'unleash-connected' ,
2060+ data : {
2061+ events : [
2062+ {
2063+ type : 'hydration' ,
2064+ eventId : 1 ,
2065+ features : [ feature ] ,
2066+ segments : [ ] ,
2067+ } ,
2068+ ] ,
2069+ } ,
2070+ } ,
2071+ {
2072+ event : 'unleash-updated' ,
2073+ data : {
2074+ events : [
2075+ {
2076+ type : 'feature-updated' ,
2077+ eventId : 2 ,
2078+ feature : { ...feature , enabled : true } ,
2079+ } ,
2080+ ] ,
2081+ } ,
2082+ } ,
2083+ ] ) ;
2084+
2085+ nock ( url )
2086+ . persist ( )
2087+ . get ( '/client/streaming' )
2088+ . reply ( 200 , sseResponse , { 'Content-Type' : 'text/event-stream' } ) ;
2089+
2090+ const storageProvider : StorageProvider < ClientFeaturesResponse > = new InMemStorageProvider ( ) ;
2091+
2092+ const repo = new Repository ( {
2093+ url,
2094+ appName,
2095+ instanceId,
2096+ connectionId,
2097+ refreshInterval : 10 ,
2098+ // @ts -expect-error
2099+ bootstrapProvider : new DefaultBootstrapProvider ( { } ) ,
2100+ storageProvider,
2101+ mode : { type : 'streaming' } ,
2102+ } ) ;
2103+
2104+ let changeCount = 0 ;
2105+ const changedEvents = new Promise < void > ( ( resolve ) => {
2106+ repo . on ( 'changed' , ( ) => {
2107+ changeCount ++ ;
2108+ if ( changeCount === 2 ) {
2109+ resolve ( ) ;
2110+ }
2111+ } ) ;
2112+ } ) ;
2113+
2114+ await repo . start ( ) ;
2115+ await changedEvents ;
2116+
2117+ const toggles = repo . getToggles ( ) ;
2118+ t . is ( toggles [ 0 ] . enabled , true ) ;
2119+
2120+ repo . stop ( ) ;
2121+ } ) ;
0 commit comments