1
1
import { CallbackClient , Code , ConnectError , PromiseClient } from '@bufbuild/connect' ;
2
2
import { Struct } from '@bufbuild/protobuf' ;
3
- import { Client , ErrorCode , JsonValue , OpenFeature , ProviderEvents , StandardResolutionReasons } from '@openfeature/web-sdk' ;
3
+ import {
4
+ Client ,
5
+ ErrorCode ,
6
+ JsonValue ,
7
+ OpenFeature ,
8
+ ProviderEvents ,
9
+ ProviderStatus ,
10
+ StandardResolutionReasons ,
11
+ } from '@openfeature/web-sdk' ;
4
12
import fetchMock from 'jest-fetch-mock' ;
5
13
import { Service } from '../proto/ts/schema/v1/schema_connect' ;
6
14
import { AnyFlag , EventStreamResponse , ResolveAllResponse } from '../proto/ts/schema/v1/schema_pb' ;
@@ -52,7 +60,7 @@ class MockCallbackClient implements Partial<CallbackClient<typeof Service>> {
52
60
(
53
61
_ ,
54
62
messageCallback : ( response : EventStreamResponse ) => void ,
55
- closeCallback : ( error : ConnectError ) => void
63
+ closeCallback : ( error : ConnectError ) => void ,
56
64
) : ( ( ) => void ) => {
57
65
this . messageCallback = messageCallback ;
58
66
this . closeCallback = closeCallback ;
@@ -63,7 +71,7 @@ class MockCallbackClient implements Partial<CallbackClient<typeof Service>> {
63
71
}
64
72
65
73
return this . cancelFunction ;
66
- }
74
+ } ,
67
75
) ;
68
76
}
69
77
@@ -122,9 +130,9 @@ describe(FlagdWebProvider.name, () => {
122
130
{ host : 'fake.com' } ,
123
131
console ,
124
132
new MockPromiseClient ( ) as unknown as PromiseClient < typeof Service > ,
125
- mockCallbackClient as unknown as CallbackClient < typeof Service >
133
+ mockCallbackClient as unknown as CallbackClient < typeof Service > ,
126
134
) ;
127
- OpenFeature . setProvider ( provider ) ;
135
+ OpenFeature . setProvider ( 'resolution functionality test' , provider ) ;
128
136
client = OpenFeature . getClient ( 'resolution functionality test' ) ;
129
137
130
138
client . addHandler ( ProviderEvents . Ready , ( ) => {
@@ -165,38 +173,64 @@ describe(FlagdWebProvider.name, () => {
165
173
} ) ;
166
174
167
175
describe ( 'events' , ( ) => {
176
+ let provider : FlagdWebProvider ;
168
177
let client : Client ;
169
178
let mockCallbackClient : MockCallbackClient ;
170
179
const mockPromiseClient = new MockPromiseClient ( ) as unknown as PromiseClient < typeof Service > ;
171
180
const context = { some : 'value' } ;
172
181
173
182
beforeEach ( ( ) => {
174
183
mockCallbackClient = new MockCallbackClient ( ) ;
175
- OpenFeature . setProvider (
176
- new FlagdWebProvider (
177
- { host : 'fake.com' , maxRetries : - 1 } ,
178
- console ,
179
- mockPromiseClient ,
180
- mockCallbackClient as unknown as CallbackClient < typeof Service >
181
- )
184
+ provider = new FlagdWebProvider (
185
+ { host : 'fake.com' , maxRetries : - 1 } ,
186
+ console ,
187
+ mockPromiseClient ,
188
+ mockCallbackClient as unknown as CallbackClient < typeof Service > ,
182
189
) ;
190
+ OpenFeature . setProvider ( 'events-test' , provider ) ;
183
191
client = OpenFeature . getClient ( 'events-test' ) ;
184
192
} ) ;
185
193
186
194
describe ( ProviderEvents . Ready , ( ) => {
187
- it ( 'should be fired as soon as client subscribes, if ready' , ( done ) => {
195
+ it ( 'should fire as soon as client subscribes, if ready' , ( done ) => {
196
+ try {
197
+ // should start NOT_READY
198
+ expect ( provider . status ) . toEqual ( ProviderStatus . NOT_READY ) ;
199
+ done ( ) ;
200
+ } catch ( err ) {
201
+ done ( err ) ;
202
+ }
203
+
188
204
mockCallbackClient . mockMessage ( {
189
205
type : EVENT_PROVIDER_READY ,
190
206
} ) ;
191
207
192
208
client . addHandler ( ProviderEvents . Ready , ( ) => {
193
- done ( ) ;
209
+ try {
210
+ expect ( provider . status ) . toEqual ( ProviderStatus . READY ) ;
211
+ done ( ) ;
212
+ } catch ( err ) {
213
+ done ( err ) ;
214
+ }
194
215
} ) ;
195
216
} ) ;
196
217
197
- it ( 'should fire if message received' , ( done ) => {
198
- client . addHandler ( ProviderEvents . Ready , ( ) => {
218
+ it ( 'should fire and be ready if message received' , ( done ) => {
219
+ try {
220
+ // should start NOT_READY
221
+ expect ( provider . status ) . toEqual ( ProviderStatus . NOT_READY ) ;
199
222
done ( ) ;
223
+ } catch ( err ) {
224
+ done ( err ) ;
225
+ }
226
+
227
+ client . addHandler ( ProviderEvents . Ready , ( ) => {
228
+ try {
229
+ expect ( provider . status ) . toEqual ( ProviderStatus . READY ) ;
230
+ done ( ) ;
231
+ } catch ( err ) {
232
+ done ( err ) ;
233
+ }
200
234
} ) ;
201
235
mockCallbackClient . mockMessage ( {
202
236
type : EVENT_PROVIDER_READY ,
@@ -215,12 +249,13 @@ describe(FlagdWebProvider.name, () => {
215
249
} ) ;
216
250
217
251
it ( 'should trigger call to resolveAll with current context' , ( done ) => {
218
-
219
252
client . addHandler ( ProviderEvents . ConfigurationChanged , ( ) => {
220
253
try {
221
- expect ( mockPromiseClient . resolveAll ) . toHaveBeenLastCalledWith ( { context : Struct . fromJson ( context as JsonValue ) } ) ;
254
+ expect ( mockPromiseClient . resolveAll ) . toHaveBeenLastCalledWith ( {
255
+ context : Struct . fromJson ( context as JsonValue ) ,
256
+ } ) ;
222
257
done ( ) ;
223
- } catch ( err ) {
258
+ } catch ( err ) {
224
259
done ( err ) ;
225
260
}
226
261
} ) ;
@@ -235,7 +270,12 @@ describe(FlagdWebProvider.name, () => {
235
270
describe ( ProviderEvents . Error , ( ) => {
236
271
it ( 'should fire if message received' , ( done ) => {
237
272
client . addHandler ( ProviderEvents . Error , ( ) => {
238
- done ( ) ;
273
+ try {
274
+ expect ( provider . status ) . toEqual ( ProviderStatus . ERROR ) ;
275
+ done ( ) ;
276
+ } catch ( err ) {
277
+ done ( err ) ;
278
+ }
239
279
} ) ;
240
280
mockCallbackClient . mockClose ( {
241
281
code : Code . Unavailable ,
@@ -251,19 +291,20 @@ describe(FlagdWebProvider.name, () => {
251
291
beforeEach ( ( ) => {
252
292
mockCallbackClient = new MockCallbackClient ( ) ;
253
293
OpenFeature . setProvider (
294
+ 'shutdown test' ,
254
295
new FlagdWebProvider (
255
296
{ host : 'fake.com' , maxRetries : - 1 } ,
256
297
console ,
257
298
mockPromiseClient ,
258
- mockCallbackClient as unknown as CallbackClient < typeof Service >
259
- )
299
+ mockCallbackClient as unknown as CallbackClient < typeof Service > ,
300
+ ) ,
260
301
) ;
261
302
} ) ;
262
303
263
304
describe ( 'API close' , ( ) => {
264
- it ( 'should call cancel function on provider' , ( ) => {
305
+ it ( 'should call cancel function on provider' , async ( ) => {
265
306
expect ( mockCallbackClient . cancelFunction ) . not . toHaveBeenCalled ( ) ;
266
- OpenFeature . close ( ) ;
307
+ await OpenFeature . close ( ) ;
267
308
expect ( mockCallbackClient . cancelFunction ) . toHaveBeenCalled ( ) ;
268
309
} ) ;
269
310
} ) ;
@@ -274,12 +315,13 @@ describe(FlagdWebProvider.name, () => {
274
315
it ( 'should attempt reconnect many times' , ( done ) => {
275
316
const mockCallbackClient = new MockCallbackClient ( ) ;
276
317
OpenFeature . setProvider (
318
+ 'should attempt many reconnect test' ,
277
319
new FlagdWebProvider (
278
320
{ host : 'fake.com' } ,
279
321
console ,
280
322
undefined ,
281
- mockCallbackClient as unknown as CallbackClient < typeof Service >
282
- )
323
+ mockCallbackClient as unknown as CallbackClient < typeof Service > ,
324
+ ) ,
283
325
) ;
284
326
mockCallbackClient . fail = true ;
285
327
mockCallbackClient . mockClose ( {
@@ -300,12 +342,13 @@ describe(FlagdWebProvider.name, () => {
300
342
it ( 'should attempt reconnect if maxRetries (1) times' , ( done ) => {
301
343
const mockCallbackClient = new MockCallbackClient ( ) ;
302
344
OpenFeature . setProvider (
345
+ 'should connect test' ,
303
346
new FlagdWebProvider (
304
347
{ host : 'fake.com' , maxRetries : 1 } ,
305
348
console ,
306
349
undefined ,
307
- mockCallbackClient as unknown as CallbackClient < typeof Service >
308
- )
350
+ mockCallbackClient as unknown as CallbackClient < typeof Service > ,
351
+ ) ,
309
352
) ;
310
353
311
354
mockCallbackClient . fail = true ;
@@ -325,12 +368,13 @@ describe(FlagdWebProvider.name, () => {
325
368
it ( 'should NOT attempt reconnect if maxRetries (-1) times' , ( done ) => {
326
369
const mockCallbackClient = new MockCallbackClient ( ) ;
327
370
OpenFeature . setProvider (
371
+ 'should not reconnect test' ,
328
372
new FlagdWebProvider (
329
373
{ host : 'fake.com' , maxRetries : - 1 } ,
330
374
console ,
331
375
undefined ,
332
- mockCallbackClient as unknown as CallbackClient < typeof Service >
333
- )
376
+ mockCallbackClient as unknown as CallbackClient < typeof Service > ,
377
+ ) ,
334
378
) ;
335
379
336
380
mockCallbackClient . fail = true ;
@@ -357,9 +401,9 @@ describe(FlagdWebProvider.name, () => {
357
401
{ host : 'fake.com' } ,
358
402
console ,
359
403
new MockPromiseClient ( ) as unknown as PromiseClient < typeof Service > ,
360
- mockCallbackClient as unknown as CallbackClient < typeof Service >
404
+ mockCallbackClient as unknown as CallbackClient < typeof Service > ,
361
405
) ;
362
- OpenFeature . setProvider ( provider ) ;
406
+ OpenFeature . setProvider ( 'resolution functionality test' , provider ) ;
363
407
client = OpenFeature . getClient ( 'resolution functionality test' ) ;
364
408
365
409
client . addHandler ( ProviderEvents . Ready , ( ) => {
0 commit comments