1- import { CallbackClient , Code , ConnectError , PromiseClient } from '@bufbuild/connect-web ' ;
1+ import { CallbackClient , Code , ConnectError , PromiseClient } from '@bufbuild/connect' ;
22import { Struct } from '@bufbuild/protobuf' ;
33import { Client , ErrorCode , JsonValue , OpenFeature , ProviderEvents , StandardResolutionReasons } from '@openfeature/web-sdk' ;
44import fetchMock from 'jest-fetch-mock' ;
@@ -35,14 +35,19 @@ class MockCallbackClient implements Partial<CallbackClient<typeof Service>> {
3535 */
3636 fail = false ;
3737
38+ // use to fire an incoming mock message
3839 mockMessage ( message : Partial < EventStreamResponse > ) {
3940 this . messageCallback ?.( message as EventStreamResponse ) ;
4041 }
4142
43+ // use to fire a mock connection close
4244 mockClose ( error : Partial < ConnectError > ) {
4345 this . closeCallback ?.( error as ConnectError ) ;
4446 }
4547
48+ // cancel function stub to make assertions against
49+ cancelFunction = jest . fn ( ( ) => undefined ) ;
50+
4651 eventStream = jest . fn (
4752 (
4853 _ ,
@@ -57,7 +62,7 @@ class MockCallbackClient implements Partial<CallbackClient<typeof Service>> {
5762 setTimeout ( ( ) => this . closeCallback ?.( { code : Code . Unavailable } as unknown as ConnectError ) , 0 ) ;
5863 }
5964
60- return ( ) => undefined ;
65+ return this . cancelFunction ;
6166 }
6267 ) ;
6368}
@@ -239,6 +244,34 @@ describe(FlagdWebProvider.name, () => {
239244 } ) ;
240245 } ) ;
241246
247+ describe ( 'shutdown' , ( ) => {
248+ let client : Client ;
249+ let mockCallbackClient : MockCallbackClient ;
250+ const mockPromiseClient = new MockPromiseClient ( ) as unknown as PromiseClient < typeof Service > ;
251+ const context = { some : 'value' } ;
252+
253+ beforeEach ( ( ) => {
254+ mockCallbackClient = new MockCallbackClient ( ) ;
255+ OpenFeature . setProvider (
256+ new FlagdWebProvider (
257+ { host : 'fake.com' , maxRetries : - 1 } ,
258+ console ,
259+ mockPromiseClient ,
260+ mockCallbackClient as unknown as CallbackClient < typeof Service >
261+ )
262+ ) ;
263+ client = OpenFeature . getClient ( 'events-test' ) ;
264+ } ) ;
265+
266+ describe ( 'API close' , ( ) => {
267+ it ( 'should call cancel function on provider' , ( ) => {
268+ expect ( mockCallbackClient . cancelFunction ) . not . toHaveBeenCalled ( ) ;
269+ OpenFeature . close ( ) ;
270+ expect ( mockCallbackClient . cancelFunction ) . toHaveBeenCalled ( ) ;
271+ } ) ;
272+ } ) ;
273+ } ) ;
274+
242275 describe ( 'reconnect logic' , ( ) => {
243276 describe ( 'Infinite maxRetries' , ( ) => {
244277 it ( 'should attempt reconnect many times' , ( done ) => {
0 commit comments