@@ -25,11 +25,19 @@ function addSetting(key: string, value: any) {
2525}
2626
2727let listKvRequestCount = 0 ;
28+ let failNextListKv = false ;
2829const listKvCallback = ( ) => {
30+ if ( failNextListKv ) {
31+ throw new Error ( "Intended error for test" ) ;
32+ }
2933 listKvRequestCount ++ ;
3034} ;
3135let getKvRequestCount = 0 ;
36+ let failNextGetKv = false ;
3237const getKvCallback = ( ) => {
38+ if ( failNextGetKv ) {
39+ throw new Error ( "Intended error for test" ) ;
40+ }
3341 getKvRequestCount ++ ;
3442} ;
3543
@@ -40,6 +48,7 @@ describe("dynamic refresh", function () {
4048 { value : "red" , key : "app.settings.fontColor" } ,
4149 { value : "40" , key : "app.settings.fontSize" } ,
4250 { value : "30" , key : "app.settings.fontSize" , label : "prod" } ,
51+ { value : "someValue" , key : "sentinel" } ,
4352 { value : "someValue" , key : "TestTagKey" , tags : { "env" : "dev" } }
4453 ] . map ( createMockedKeyValue ) ;
4554 mockAppConfigurationClientListConfigurationSettings ( [ mockedKVs ] , listKvCallback ) ;
@@ -48,6 +57,8 @@ describe("dynamic refresh", function () {
4857
4958 afterEach ( ( ) => {
5059 restoreMocks ( ) ;
60+ failNextListKv = false ;
61+ failNextGetKv = false ;
5162 listKvRequestCount = 0 ;
5263 getKvRequestCount = 0 ;
5364 } ) ;
@@ -239,6 +250,44 @@ describe("dynamic refresh", function () {
239250 expect ( settings . get ( "app.settings.bgColor" ) ) . eq ( "white" ) ;
240251 } ) ;
241252
253+ it ( "should continue to refresh when previous refresh-all attempt failed" , async ( ) => {
254+ const connectionString = createMockedConnectionString ( ) ;
255+ const settings = await load ( connectionString , {
256+ selectors : [
257+ { keyFilter : "app.settings.*" }
258+ ] ,
259+ refreshOptions : {
260+ enabled : true ,
261+ refreshIntervalInMs : 2000 ,
262+ watchedSettings : [
263+ { key : "sentinel" }
264+ ]
265+ }
266+ } ) ;
267+ expect ( settings . get ( "app.settings.fontSize" ) ) . eq ( "40" ) ;
268+ expect ( settings . get ( "app.settings.fontColor" ) ) . eq ( "red" ) ;
269+ expect ( settings . get ( "sentinel" ) ) . to . be . undefined ;
270+ expect ( listKvRequestCount ) . eq ( 1 ) ;
271+ expect ( getKvRequestCount ) . eq ( 1 ) ; // one getKv request for sentinel key
272+
273+ // change setting
274+ addSetting ( "app.settings.bgColor" , "white" ) ;
275+ updateSetting ( "sentinel" , "updatedValue" ) ;
276+ failNextListKv = true ; // force next listConfigurationSettings request to fail
277+ await sleepInMs ( 2 * 1000 + 1 ) ;
278+ await settings . refresh ( ) ; // even if the provider detects the sentinel key change, this refresh will fail, so we won't get the updated value of sentinel
279+ expect ( listKvRequestCount ) . eq ( 1 ) ;
280+ expect ( getKvRequestCount ) . eq ( 2 ) ;
281+ expect ( settings . get ( "app.settings.bgColor" ) ) . to . be . undefined ;
282+
283+ failNextListKv = false ;
284+ await sleepInMs ( 2 * 1000 + 1 ) ;
285+ await settings . refresh ( ) ; // should continue to refresh even if sentinel key doesn't change now
286+ expect ( listKvRequestCount ) . eq ( 2 ) ;
287+ expect ( getKvRequestCount ) . eq ( 4 ) ;
288+ expect ( settings . get ( "app.settings.bgColor" ) ) . eq ( "white" ) ;
289+ } ) ;
290+
242291 it ( "should execute callbacks on successful refresh" , async ( ) => {
243292 const connectionString = createMockedConnectionString ( ) ;
244293 const settings = await load ( connectionString , {
0 commit comments