...

Source file src/github.com/launchdarkly/go-server-sdk-evaluation/v2/evaluator_target_test.go

Documentation: github.com/launchdarkly/go-server-sdk-evaluation/v2

     1  package evaluation
     2  
     3  import (
     4  	"testing"
     5  
     6  	"github.com/launchdarkly/go-server-sdk-evaluation/v2/ldbuilders"
     7  	"github.com/launchdarkly/go-server-sdk-evaluation/v2/ldmodel"
     8  
     9  	"github.com/launchdarkly/go-sdk-common/v3/ldcontext"
    10  	"github.com/launchdarkly/go-sdk-common/v3/ldreason"
    11  	"github.com/launchdarkly/go-sdk-common/v3/ldvalue"
    12  
    13  	m "github.com/launchdarkly/go-test-helpers/v3/matchers"
    14  )
    15  
    16  func TestFlagMatchesContextFromTargets(t *testing.T) {
    17  	variations := []ldvalue.Value{ldvalue.String("fall"), ldvalue.String("match1"), ldvalue.String("match2"), ldvalue.String("off")}
    18  	nonMatchVar, matchVar1, matchVar2, offVar := 0, 1, 2, 3
    19  
    20  	makeBaseFlag := func() ldmodel.FeatureFlag {
    21  		return ldbuilders.NewFlagBuilder("flagkey").
    22  			Variations(variations...).On(true).OffVariation(offVar).FallthroughVariation(nonMatchVar).Build()
    23  	}
    24  	user := func(key string) ldcontext.Context { return ldcontext.New(key) }
    25  	dog := func(key string) ldcontext.Context { return ldcontext.NewWithKind("dog", key) }
    26  
    27  	assertResult := func(t *testing.T, flag ldmodel.FeatureFlag, context ldcontext.Context, expectedVariation int) {
    28  		t.Helper()
    29  		result := basicEvaluator().Evaluate(&flag, context, FailOnAnyPrereqEvent(t))
    30  		expectedReason := ldreason.NewEvalReasonTargetMatch()
    31  		if expectedVariation == nonMatchVar {
    32  			expectedReason = ldreason.NewEvalReasonFallthrough()
    33  		}
    34  		m.In(t).Assert(result, ResultDetailProps(expectedVariation, variations[expectedVariation], expectedReason))
    35  	}
    36  
    37  	t.Run("flag has Targets only", func(t *testing.T) {
    38  		flag := makeBaseFlag()
    39  		flag.Targets = []ldmodel.Target{ // these targets are for the "user" kind only
    40  			{Variation: matchVar1, Values: []string{"c"}},
    41  			{Variation: matchVar2, Values: []string{"b", "a"}},
    42  		}
    43  		ldmodel.PreprocessFlag(&flag)
    44  
    45  		assertResult(t, flag, user("a"), matchVar2)
    46  		assertResult(t, flag, user("b"), matchVar2)
    47  		assertResult(t, flag, user("c"), matchVar1)
    48  		assertResult(t, flag, user("z"), nonMatchVar)
    49  
    50  		assertResult(t, flag, ldcontext.NewMulti(dog("b"), user("a")), matchVar2)
    51  		assertResult(t, flag, ldcontext.NewMulti(dog("a"), user("c")), matchVar1)
    52  		assertResult(t, flag, ldcontext.NewMulti(dog("a"), user("z")), nonMatchVar)
    53  		assertResult(t, flag, ldcontext.NewMulti(dog("a"), ldcontext.NewWithKind("cat", "b")), nonMatchVar)
    54  	})
    55  
    56  	t.Run("flag has Targets+ContextTargets", func(t *testing.T) {
    57  		flag := makeBaseFlag()
    58  		flag.Targets = []ldmodel.Target{
    59  			{Variation: matchVar1, Values: []string{"c"}},
    60  			{Variation: matchVar2, Values: []string{"b", "a"}},
    61  		}
    62  		flag.ContextTargets = []ldmodel.Target{
    63  			{ContextKind: "dog", Variation: matchVar1, Values: []string{"a", "b"}},
    64  			{ContextKind: "dog", Variation: matchVar2, Values: []string{"c"}},
    65  			{ContextKind: "user", Variation: matchVar1},
    66  			{ContextKind: "user", Variation: matchVar2},
    67  		}
    68  		ldmodel.PreprocessFlag(&flag)
    69  
    70  		assertResult(t, flag, user("a"), matchVar2)
    71  		assertResult(t, flag, user("b"), matchVar2)
    72  		assertResult(t, flag, user("c"), matchVar1)
    73  		assertResult(t, flag, user("z"), nonMatchVar)
    74  
    75  		assertResult(t, flag, ldcontext.NewMulti(dog("b"), user("a")), matchVar1)   // the "dog" target takes precedence due to ordering
    76  		assertResult(t, flag, ldcontext.NewMulti(dog("z"), user("a")), matchVar2)   // "dog" targets don't match, continue to "user" targets
    77  		assertResult(t, flag, ldcontext.NewMulti(dog("x"), user("z")), nonMatchVar) // nothing matches
    78  		assertResult(t, flag, ldcontext.NewMulti(dog("a"), ldcontext.NewWithKind("cat", "b")), matchVar1)
    79  	})
    80  
    81  }
    82  

View as plain text