@@ -80,7 +80,7 @@ func TestUpdateFlags(t *testing.T) {
8080 }
8181 s .Update (source1 , []model.Flag {
8282 {Key : "waka" , DefaultVariant : "off" },
83- }, nil )
83+ }, nil , false )
8484 return s
8585 },
8686 newFlags : []model.Flag {
@@ -100,7 +100,7 @@ func TestUpdateFlags(t *testing.T) {
100100 }
101101 s .Update (source1 , []model.Flag {
102102 {Key : "waka" , DefaultVariant : "off" },
103- }, nil )
103+ }, nil , false )
104104 return s
105105 },
106106 newFlags : []model.Flag {
@@ -119,7 +119,7 @@ func TestUpdateFlags(t *testing.T) {
119119 if err != nil {
120120 t .Fatalf ("NewStore failed: %v" , err )
121121 }
122- s .Update (source1 , []model.Flag {}, model.Metadata {})
122+ s .Update (source1 , []model.Flag {}, model.Metadata {}, false )
123123 return s
124124 },
125125 setMetadata : model.Metadata {
@@ -142,7 +142,7 @@ func TestUpdateFlags(t *testing.T) {
142142 if err != nil {
143143 t .Fatalf ("NewStore failed: %v" , err )
144144 }
145- s .Update (source1 , []model.Flag {}, model.Metadata {})
145+ s .Update (source1 , []model.Flag {}, model.Metadata {}, false )
146146 return s
147147
148148 },
@@ -168,7 +168,7 @@ func TestUpdateFlags(t *testing.T) {
168168 if err != nil {
169169 t .Fatalf ("NewStore failed: %v" , err )
170170 }
171- s .Update (source1 , []model.Flag {}, model.Metadata {})
171+ s .Update (source1 , []model.Flag {}, model.Metadata {}, false )
172172 return s
173173 },
174174 setMetadata : model.Metadata {
@@ -195,7 +195,7 @@ func TestUpdateFlags(t *testing.T) {
195195 t .Run (tt .name , func (t * testing.T ) {
196196 t .Parallel ()
197197 store := tt .setup (t )
198- store .Update (tt .source , tt .newFlags , tt .setMetadata )
198+ store .Update (tt .source , tt .newFlags , tt .setMetadata , false )
199199 gotFlags , _ , _ := store .GetAll (context .Background (), nil )
200200 sort .Slice (tt .wantFlags , func (i , j int ) bool {
201201 return tt .wantFlags [i ].FlagSetId + "|" + tt .wantFlags [i ].Key > tt .wantFlags [j ].FlagSetId + "|" + tt .wantFlags [j ].Key
@@ -330,7 +330,7 @@ func TestGet(t *testing.T) {
330330 }
331331
332332 for _ , source := range s .order {
333- store .Update (source .Name , source .flags , nil )
333+ store .Update (source .Name , source .flags , nil , false )
334334 }
335335 gotFlag , _ , err := store .Get (context .Background (), tt .key , tt .selector )
336336
@@ -473,7 +473,7 @@ func TestGetAllNoWatcher(t *testing.T) {
473473 }
474474
475475 for _ , source := range s .order {
476- store .Update (source .Name , source .flags , nil )
476+ store .Update (source .Name , source .flags , nil , false )
477477 }
478478 gotFlags , _ , _ := store .GetAll (context .Background (), tt .selector )
479479
@@ -556,9 +556,9 @@ func TestWatch(t *testing.T) {
556556 }
557557
558558 // setup initial flags
559- store .Update (sourceA , sourceAFlags , model.Metadata {})
560- store .Update (sourceB , sourceBFlags , model.Metadata {})
561- store .Update (sourceC , sourceCFlags , model.Metadata {})
559+ store .Update (sourceA , sourceAFlags , model.Metadata {}, false )
560+ store .Update (sourceB , sourceBFlags , model.Metadata {}, false )
561+ store .Update (sourceC , sourceCFlags , model.Metadata {}, false )
562562 watcher := make (chan FlagQueryResult , 1 )
563563 time .Sleep (pauseTime )
564564
@@ -573,29 +573,29 @@ func TestWatch(t *testing.T) {
573573 // changing a flag default variant should trigger an update
574574 store .Update (sourceA , []model.Flag {
575575 {Key : "flagA" , DefaultVariant : "on" },
576- }, model.Metadata {})
576+ }, model.Metadata {}, false )
577577
578578 time .Sleep (pauseTime )
579579
580580 // changing a flag default variant should trigger an update
581581 store .Update (sourceB , []model.Flag {
582582 {Key : "flagB" , DefaultVariant : "on" , Metadata : model.Metadata {"flagSetId" : myFlagSetId }},
583- }, model.Metadata {})
583+ }, model.Metadata {}, false )
584584
585585 time .Sleep (pauseTime )
586586
587587 // removing a flag set id should trigger an update (even for flag set id selectors; it should remove the flag from the set)
588588 // TODO: challenge this test and behaviour
589589 store .Update (sourceB , []model.Flag {
590590 {Key : "flagB" , DefaultVariant : "on" },
591- }, model.Metadata {})
591+ }, model.Metadata {}, false )
592592
593593 time .Sleep (pauseTime )
594594
595595 // adding a flag set id should trigger an update
596596 store .Update (sourceB , []model.Flag {
597597 {Key : "flagB" , DefaultVariant : "on" , Metadata : model.Metadata {"flagSetId" : myFlagSetId }},
598- }, model.Metadata {})
598+ }, model.Metadata {}, false )
599599 }()
600600
601601 updates := 0
@@ -625,8 +625,9 @@ func TestUpdateFlagSetIdScoping(t *testing.T) {
625625 sources := []string {src }
626626
627627 type updateStep struct {
628- flags []model.Flag
629- metadata model.Metadata
628+ flags []model.Flag
629+ metadata model.Metadata
630+ incrementalUpdate * bool // nil: incremental merge; explicit false: full replace for the source
630631 }
631632
632633 tests := []struct {
@@ -664,13 +665,29 @@ func TestUpdateFlagSetIdScoping(t *testing.T) {
664665 },
665666 {
666667 name : "no flagSetId in metadata falls back to source-scoped deletion" ,
667- updates : []updateStep {
668- {flags : []model.Flag {{Key : "flagA" }}, metadata : model.Metadata {"flagSetId" : "A" }},
669- {flags : []model.Flag {{Key : "flagB" }}, metadata : model.Metadata {"flagSetId" : "B" }},
670- {flags : []model.Flag {}, metadata : nil },
671- },
668+ updates : func () []updateStep {
669+ fullSnapshot := false
670+ return []updateStep {
671+ {flags : []model.Flag {{Key : "flagA" }}, metadata : model.Metadata {"flagSetId" : "A" }},
672+ {flags : []model.Flag {{Key : "flagB" }}, metadata : model.Metadata {"flagSetId" : "B" }},
673+ {flags : []model.Flag {}, metadata : nil , incrementalUpdate : & fullSnapshot },
674+ }
675+ }(),
672676 wantAbsent : []string {"A/flagA" , "B/flagB" },
673677 },
678+ {
679+ name : "incrementalUpdate=false with flagSetId still does full-source deletion" ,
680+ updates : func () []updateStep {
681+ fullSnapshot := false
682+ return []updateStep {
683+ {flags : []model.Flag {{Key : "flagA" }}, metadata : model.Metadata {"flagSetId" : "A" }},
684+ {flags : []model.Flag {{Key : "flagB" }}, metadata : model.Metadata {"flagSetId" : "B" }},
685+ {flags : []model.Flag {{Key : "flagA" }}, metadata : model.Metadata {"flagSetId" : "A" }, incrementalUpdate : & fullSnapshot },
686+ }
687+ }(),
688+ wantPresent : []string {"A/flagA" },
689+ wantAbsent : []string {"B/flagB" },
690+ },
674691 {
675692 name : "empty update with flagSetId clears only that set" ,
676693 updates : []updateStep {
@@ -691,7 +708,11 @@ func TestUpdateFlagSetIdScoping(t *testing.T) {
691708 require .NoError (t , err )
692709
693710 for _ , step := range tt .updates {
694- s .Update (src , step .flags , step .metadata )
711+ inc := true
712+ if step .incrementalUpdate != nil {
713+ inc = * step .incrementalUpdate
714+ }
715+ s .Update (src , step .flags , step .metadata , inc )
695716 }
696717
697718 allFlags , _ , _ := s .GetAll (context .Background (), nil )
@@ -770,7 +791,7 @@ func TestQueryMetadata(t *testing.T) {
770791 }
771792
772793 // setup initial flags
773- store .Update (sourceA , sourceAFlags , model.Metadata {})
794+ store .Update (sourceA , sourceAFlags , model.Metadata {}, false )
774795
775796 // #1708 Until we decide on the Selector syntax, only a single key=value pair is supported
776797 // these tests should then also cover more complex selectors
0 commit comments