@@ -630,6 +630,75 @@ func TestRequirement_1_4_12(t *testing.T) {
630630 }
631631}
632632
633+ // Requirement_1_4_13
634+ // If the `flag metadata` field in the `flag resolution` structure returned by the configured `provider` is set,
635+ // the `evaluation details` structure's `flag metadata` field MUST contain that value. Otherwise,
636+ // it MUST contain an empty record.
637+ func TestRequirement_1_4_13 (t * testing.T ) {
638+ client := NewClient ("test-client" )
639+ flagKey := "flag-key"
640+ evalCtx := EvaluationContext {}
641+ flatCtx := flattenContext (evalCtx )
642+
643+ ctrl := gomock .NewController (t )
644+ t .Run ("No Metadata" , func (t * testing.T ) {
645+ defer t .Cleanup (initSingleton )
646+ mockProvider := NewMockFeatureProvider (ctrl )
647+ defaultValue := true
648+ mockProvider .EXPECT ().Metadata ().AnyTimes ()
649+ mockProvider .EXPECT ().Hooks ().AnyTimes ()
650+ mockProvider .EXPECT ().BooleanEvaluation (context .Background (), flagKey , defaultValue , flatCtx ).
651+ Return (BoolResolutionDetail {
652+ Value : true ,
653+ ProviderResolutionDetail : ProviderResolutionDetail {
654+ FlagMetadata : nil ,
655+ },
656+ }).Times (1 )
657+ SetProvider (mockProvider )
658+
659+ evDetails , err := client .BooleanValueDetails (context .Background (), flagKey , defaultValue , EvaluationContext {})
660+ if err != nil {
661+ t .Error (err )
662+ }
663+ if ! reflect .DeepEqual (evDetails .FlagMetadata , FlagMetadata {}) {
664+ t .Errorf (
665+ "flag metadata is not as expected in EvaluationDetail, got %v, expected %v" ,
666+ evDetails .FlagMetadata , FlagMetadata {},
667+ )
668+ }
669+ })
670+
671+ t .Run ("Metadata present" , func (t * testing.T ) {
672+ defer t .Cleanup (initSingleton )
673+ mockProvider := NewMockFeatureProvider (ctrl )
674+ defaultValue := true
675+ metadata := FlagMetadata {
676+ "bing" : "bong" ,
677+ }
678+ mockProvider .EXPECT ().Metadata ().AnyTimes ()
679+ mockProvider .EXPECT ().Hooks ().AnyTimes ()
680+ mockProvider .EXPECT ().BooleanEvaluation (context .Background (), flagKey , defaultValue , flatCtx ).
681+ Return (BoolResolutionDetail {
682+ Value : true ,
683+ ProviderResolutionDetail : ProviderResolutionDetail {
684+ FlagMetadata : metadata ,
685+ },
686+ }).Times (1 )
687+ SetProvider (mockProvider )
688+
689+ evDetails , err := client .BooleanValueDetails (context .Background (), flagKey , defaultValue , EvaluationContext {})
690+ if err != nil {
691+ t .Error (err )
692+ }
693+ if ! reflect .DeepEqual (metadata , evDetails .FlagMetadata ) {
694+ t .Errorf (
695+ "flag metadata is not as expected in EvaluationDetail, got %v, expected %v" ,
696+ evDetails .FlagMetadata , metadata ,
697+ )
698+ }
699+ })
700+ }
701+
633702// Requirement_1_5_1
634703// The `evaluation options` structure's `hooks` field denotes an ordered collection of hooks that the client MUST
635704// execute for the respective flag evaluation, in addition to those already configured.
@@ -908,3 +977,117 @@ func TestObjectEvaluationShouldSupportNilValue(t *testing.T) {
908977 t .Error ("not supposed to have an error code" )
909978 }
910979}
980+
981+ func TestFlagMetadataAccessors (t * testing.T ) {
982+
983+ t .Run ("bool" , func (t * testing.T ) {
984+ expectedValue := true
985+ key := "bool"
986+ key2 := "not-bool"
987+ metadata := FlagMetadata {
988+ key : expectedValue ,
989+ key2 : "12" ,
990+ }
991+ val , err := metadata .GetBool (key )
992+ if err != nil {
993+ t .Error ("unexpected error value, expected nil" , err )
994+ }
995+ if val != expectedValue {
996+ t .Errorf ("wrong value returned from FlagMetadata, expected %t, got %t" , val , expectedValue )
997+ }
998+ _ , err = metadata .GetBool (key2 )
999+ if err == nil {
1000+ t .Error ("unexpected error value" , err )
1001+ }
1002+ _ , err = metadata .GetBool ("not-in-map" )
1003+ if err == nil {
1004+ t .Error ("unexpected error value" , err )
1005+ }
1006+ })
1007+
1008+ t .Run ("string" , func (t * testing.T ) {
1009+ expectedValue := "string"
1010+ key := "string"
1011+ key2 := "not-string"
1012+ metadata := FlagMetadata {
1013+ key : expectedValue ,
1014+ key2 : true ,
1015+ }
1016+ val , err := metadata .GetString (key )
1017+ if err != nil {
1018+ t .Error ("unexpected error value, expected nil" , err )
1019+ }
1020+ if val != expectedValue {
1021+ t .Errorf ("wrong value returned from FlagMetadata, expected %s, got %s" , val , expectedValue )
1022+ }
1023+ _ , err = metadata .GetString (key2 )
1024+ if err == nil {
1025+ t .Error ("unexpected error value" , err )
1026+ }
1027+ _ , err = metadata .GetString ("not-in-map" )
1028+ if err == nil {
1029+ t .Error ("unexpected error value" , err )
1030+ }
1031+ })
1032+
1033+ t .Run ("int" , func (t * testing.T ) {
1034+ expectedValue := int64 (12 )
1035+ metadata := FlagMetadata {
1036+ "int" : int (12 ),
1037+ "int8" : int8 (12 ),
1038+ "int16" : int16 (12 ),
1039+ "int32" : int32 (12 ),
1040+ "int164" : int32 (12 ),
1041+ }
1042+ for k := range metadata {
1043+ val , err := metadata .GetInt (k )
1044+ if err != nil {
1045+ t .Error ("unexpected error value, expected nil" , err )
1046+ }
1047+ if val != expectedValue {
1048+ t .Errorf ("wrong value returned from FlagMetadata, expected %b, got %b" , val , expectedValue )
1049+ }
1050+ }
1051+
1052+ metadata = FlagMetadata {
1053+ "not-int" : true ,
1054+ }
1055+ _ , err := metadata .GetInt ("not-int" )
1056+ if err == nil {
1057+ t .Error ("unexpected error value" , err )
1058+ }
1059+ _ , err = metadata .GetInt ("not-in-map" )
1060+ if err == nil {
1061+ t .Error ("unexpected error value" , err )
1062+ }
1063+ })
1064+
1065+ t .Run ("float" , func (t * testing.T ) {
1066+ expectedValue := float64 (12 )
1067+ metadata := FlagMetadata {
1068+ "float32" : float32 (12 ),
1069+ "float64" : float64 (12 ),
1070+ }
1071+ for k := range metadata {
1072+ val , err := metadata .GetFloat (k )
1073+ if err != nil {
1074+ t .Error ("unexpected error value, expected nil" , err )
1075+ }
1076+ if val != expectedValue {
1077+ t .Errorf ("wrong value returned from FlagMetadata, expected %b, got %b" , val , expectedValue )
1078+ }
1079+ }
1080+
1081+ metadata = FlagMetadata {
1082+ "not-float" : true ,
1083+ }
1084+ _ , err := metadata .GetInt ("not-float" )
1085+ if err == nil {
1086+ t .Error ("unexpected error value" , err )
1087+ }
1088+ _ , err = metadata .GetInt ("not-in-map" )
1089+ if err == nil {
1090+ t .Error ("unexpected error value" , err )
1091+ }
1092+ })
1093+ }
0 commit comments