@@ -251,3 +251,119 @@ describe('flagd-core common flag definitions', () => {
251251 expect ( ( ) => core . setConfigurations ( flagCfg ) ) . toThrow ( ParseError ) ;
252252 } ) ;
253253} ) ;
254+
255+ describe ( 'flagd-core flag metadata' , ( ) => {
256+ const targetingFlag =
257+ '{"flags":{"targetedFlag":{"variants":{"first":"AAA","second":"BBB","third":"CCC"},"defaultVariant":"first","state":"ENABLED","targeting":{"if":[{"in":["@openfeature.dev",{"var":"email"}]},"second",null]},"metadata":{"owner": "mike"}},"shortCircuit":{"variants":{"true":true,"false":false},"defaultVariant":"false","state":"ENABLED","targeting":{"==":[{"var":"favoriteNumber"},1]}}},"metadata":{"id":"dev","version":"1"}}' ;
258+ let core : FlagdCore ;
259+
260+ beforeAll ( ( ) => {
261+ core = new FlagdCore ( ) ;
262+ core . setConfigurations ( targetingFlag ) ;
263+ } ) ;
264+
265+ it ( 'should return "targetedFlag" flag metadata' , ( ) => {
266+ const resolved = core . resolveStringEvaluation ( 'targetedFlag' , 'none' , { email :
'[email protected] ' } ) ; 267+ expect ( resolved . flagMetadata ) . toEqual ( { flagSetVersion : '1' , flagSetId : 'dev' , owner : 'mike' } ) ;
268+ } ) ;
269+
270+ it ( 'should return "shortCircuit" flag metadata' , ( ) => {
271+ const resolved = core . resolveBooleanEvaluation ( 'shortCircuit' , false , { favoriteNumber : 1 } ) ;
272+ expect ( resolved . flagMetadata ) . toEqual ( { flagSetVersion : '1' , flagSetId : 'dev' } ) ;
273+ } ) ;
274+ } ) ;
275+
276+ describe ( 'flagd-core error conditions' , ( ) => {
277+ const errorFlags = {
278+ flags : {
279+ basic : {
280+ variants : { on : true , off : false } ,
281+ defaultVariant : 'on' ,
282+ state : 'ENABLED' ,
283+ } ,
284+ disabledFlag : {
285+ variants : { on : true , off : false } ,
286+ defaultVariant : 'on' ,
287+ state : 'DISABLED' ,
288+ } ,
289+ invalidTargetingRule : {
290+ variants : { on : true , off : false } ,
291+ defaultVariant : 'on' ,
292+ state : 'ENABLED' ,
293+ targeting : { invalid : true } ,
294+ } ,
295+ invalidVariantName : {
296+ variants : { true : true , false : false } ,
297+ defaultVariant : 'false' ,
298+ state : 'ENABLED' ,
299+ targeting : { if : [ true , 'invalid' ] } ,
300+ } ,
301+ } ,
302+ metadata : { id : 'dev' , version : '1' } ,
303+ } ;
304+ let core : FlagdCore ;
305+
306+ beforeAll ( ( ) => {
307+ core = new FlagdCore ( ) ;
308+ core . setConfigurations ( JSON . stringify ( errorFlags ) ) ;
309+ } ) ;
310+
311+ it ( 'should not find the flag' , ( ) => {
312+ const resolved = core . resolveBooleanEvaluation ( 'invalid' , false , { } ) ;
313+ expect ( resolved . reason ) . toBe ( StandardResolutionReasons . ERROR ) ;
314+ expect ( resolved . errorCode ) . toBe ( ErrorCode . FLAG_NOT_FOUND ) ;
315+ expect ( resolved . errorMessage ) . toBeTruthy ( ) ;
316+ expect ( resolved . flagMetadata ) . toEqual ( { flagSetVersion : '1' , flagSetId : 'dev' } ) ;
317+ } ) ;
318+
319+ it ( 'should treat disabled flags as not found' , ( ) => {
320+ const resolved = core . resolveBooleanEvaluation ( 'disabledFlag' , false , { } ) ;
321+ expect ( resolved . reason ) . toBe ( StandardResolutionReasons . ERROR ) ;
322+ expect ( resolved . errorCode ) . toBe ( ErrorCode . FLAG_NOT_FOUND ) ;
323+ expect ( resolved . errorMessage ) . toBeTruthy ( ) ;
324+ expect ( resolved . flagMetadata ) . toEqual ( { flagSetVersion : '1' , flagSetId : 'dev' } ) ;
325+ } ) ;
326+
327+ it ( 'should return a parse error code' , ( ) => {
328+ const resolved = core . resolveBooleanEvaluation ( 'invalidTargetingRule' , false , { } ) ;
329+ expect ( resolved . reason ) . toBe ( StandardResolutionReasons . ERROR ) ;
330+ expect ( resolved . errorCode ) . toBe ( ErrorCode . PARSE_ERROR ) ;
331+ expect ( resolved . errorMessage ) . toBeTruthy ( ) ;
332+ expect ( resolved . flagMetadata ) . toEqual ( { flagSetVersion : '1' , flagSetId : 'dev' } ) ;
333+ } ) ;
334+
335+ // it('should return a general error if targeting evaluate fails', () => {
336+ // const evaluationErrorCore = new FlagdCore({
337+ // setConfigurations: jest.fn(),
338+ // getFlag: () => {
339+ // const featureFlag = new FeatureFlag('basic', {}, logger)
340+ // featureFlag[_targeting] = () => throw new Error("something broke");
341+ // return featureFlag;
342+ // },
343+ // getFlags: jest.fn(),
344+ // getFlagSetMetadata: jest.fn(),
345+ // });
346+
347+ // const resolved = evaluationErrorCore.resolveBooleanEvaluation('basic', false, {});
348+ // expect(resolved.reason).toBe(StandardResolutionReasons.ERROR);
349+ // expect(resolved.errorCode).toBe(ErrorCode.PARSE_ERROR);
350+ // expect(resolved.errorMessage).toBeTruthy();
351+ // expect(resolved.flagMetadata).toEqual({ flagSetVersion: '1', flagSetId: 'dev' });
352+ // });
353+
354+ it ( 'should return a general error if the variant is not a string' , ( ) => {
355+ const resolved = core . resolveBooleanEvaluation ( 'invalidVariantName' , false , { } ) ;
356+ expect ( resolved . reason ) . toBe ( StandardResolutionReasons . ERROR ) ;
357+ expect ( resolved . errorCode ) . toBe ( ErrorCode . GENERAL ) ;
358+ expect ( resolved . errorMessage ) . toBeTruthy ( ) ;
359+ expect ( resolved . flagMetadata ) . toEqual ( { flagSetVersion : '1' , flagSetId : 'dev' } ) ;
360+ } ) ;
361+
362+ it ( 'should return a type mismatch error' , ( ) => {
363+ const resolved = core . resolveStringEvaluation ( 'basic' , 'false' , { } ) ;
364+ expect ( resolved . reason ) . toBe ( StandardResolutionReasons . ERROR ) ;
365+ expect ( resolved . errorCode ) . toBe ( ErrorCode . TYPE_MISMATCH ) ;
366+ expect ( resolved . errorMessage ) . toBeTruthy ( ) ;
367+ expect ( resolved . flagMetadata ) . toEqual ( { flagSetVersion : '1' , flagSetId : 'dev' } ) ;
368+ } ) ;
369+ } ) ;
0 commit comments