@@ -248,4 +248,85 @@ describe("feature manager", () => {
248248 } ) ;
249249
250250 it ( "should override default filters with custom filters" ) ;
251+
252+ it ( "should skip missing filter and continue evaluating when requirement type is Any" , ( ) => {
253+ const jsonObject = {
254+ "feature_management" : {
255+ "feature_flags" : [
256+ {
257+ "id" : "MissingFilterAny" ,
258+ "enabled" : true ,
259+ "conditions" : {
260+ "requirement_type" : "Any" ,
261+ "client_filters" : [
262+ {
263+ "name" : "UnregisteredFilter" ,
264+ "parameters" : { }
265+ } ,
266+ {
267+ "name" : "Microsoft.Targeting" ,
268+ "parameters" : {
269+ "Audience" : {
270+ "Users" : [ "Alice" ]
271+ }
272+ }
273+ }
274+ ]
275+ }
276+ } ,
277+ {
278+ "id" : "MissingFilterAll" ,
279+ "enabled" : true ,
280+ "conditions" : {
281+ "requirement_type" : "All" ,
282+ "client_filters" : [
283+ {
284+ "name" : "UnregisteredFilter" ,
285+ "parameters" : { }
286+ } ,
287+ {
288+ "name" : "Microsoft.Targeting" ,
289+ "parameters" : {
290+ "Audience" : {
291+ "Users" : [ "Alice" ]
292+ }
293+ }
294+ }
295+ ]
296+ }
297+ } ,
298+ {
299+ "id" : "AllMissingFiltersAny" ,
300+ "enabled" : true ,
301+ "conditions" : {
302+ "requirement_type" : "Any" ,
303+ "client_filters" : [
304+ {
305+ "name" : "UnregisteredFilter1" ,
306+ "parameters" : { }
307+ } ,
308+ {
309+ "name" : "UnregisteredFilter2" ,
310+ "parameters" : { }
311+ }
312+ ]
313+ }
314+ }
315+ ]
316+ }
317+ } ;
318+
319+ const provider = new ConfigurationObjectFeatureFlagProvider ( jsonObject ) ;
320+ const featureManager = new FeatureManager ( provider ) ;
321+ return Promise . all ( [
322+ // Any: missing filter is skipped, targeting filter matches Alice => enabled
323+ expect ( featureManager . isEnabled ( "MissingFilterAny" , { userId : "Alice" } ) ) . eventually . eq ( true ) ,
324+ // Any: missing filter is skipped, targeting filter does not match Bob => disabled
325+ expect ( featureManager . isEnabled ( "MissingFilterAny" , { userId : "Bob" } ) ) . eventually . eq ( false ) ,
326+ // All: missing filter means cannot satisfy all conditions => disabled
327+ expect ( featureManager . isEnabled ( "MissingFilterAll" , { userId : "Alice" } ) ) . eventually . eq ( false ) ,
328+ // Any: all filters are missing => disabled (no filter can match)
329+ expect ( featureManager . isEnabled ( "AllMissingFiltersAny" , { userId : "Alice" } ) ) . eventually . eq ( false )
330+ ] ) ;
331+ } ) ;
251332} ) ;
0 commit comments