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{
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)
76 assertResult(t, flag, ldcontext.NewMulti(dog("z"), user("a")), matchVar2)
77 assertResult(t, flag, ldcontext.NewMulti(dog("x"), user("z")), nonMatchVar)
78 assertResult(t, flag, ldcontext.NewMulti(dog("a"), ldcontext.NewWithKind("cat", "b")), matchVar1)
79 })
80
81 }
82
View as plain text