public void EventTrackingAndReasonAreNotForcedIfFlagIsNotSetForMatchingRule() { var clause0 = ClauseBuilder.ShouldNotMatchUser(user); var clause1 = ClauseBuilder.ShouldMatchUser(user); var rule0 = new RuleBuilder().Id("id0").Variation(1).Clauses(clause0).TrackEvents(true).Build(); var rule1 = new RuleBuilder().Id("id1").Variation(1).Clauses(clause1).TrackEvents(false).Build(); var flag = new FeatureFlagBuilder("flag").Version(1) .On(true) .Rules(rule0, rule1) .OffVariation(0) .Variations(LdValue.Of("off"), LdValue.Of("on")) .Build(); testData.UsePreconfiguredFlag(flag); client.StringVariation("flag", user, "default"); // It matched rule1, which has trackEvents: false, so we don't get the override behavior Assert.Equal(1, eventSink.Events.Count); var e = Assert.IsType <EvaluationEvent>(eventSink.Events[0]); Assert.False(e.TrackEvents); Assert.Null(e.Reason); }
public void FlagReturnsInExperimentForRuleMatchWhenInExperimentVariationButNonExperimentRollout() { var user = User.WithKey("userkey"); var rollout = BuildRollout(RolloutKind.Rollout, false); var rule = new RuleBuilder().Id("id").Rollout(rollout).Clauses(ClauseBuilder.ShouldMatchUser(user)).Build(); var f = FeatureFlagWithRules(rule); var result = BasicEvaluator.Evaluate(f, baseUser, EventFactory.Default); Assert.Equal(EvaluationReasonKind.RuleMatch, result.Result.Reason.Kind); Assert.False(result.Result.Reason.InExperiment); }
public void RuleWithNoVariationOrRolloutReturnsMalformedFlagError() { var user = User.WithKey("userkey"); var clause = ClauseBuilder.ShouldMatchUser(user); var rule = new RuleBuilder().Id("ruleid").Clauses(clause).Build(); var f = FeatureFlagWithRules(rule); var result = BasicEvaluator.Evaluate(f, user, EventFactory.Default); var expected = new EvaluationDetail <LdValue>(LdValue.Null, null, EvaluationReason.ErrorReason(EvaluationErrorKind.MalformedFlag)); Assert.Equal(expected, result.Result); Assert.Equal(0, result.PrerequisiteEvents.Count); }
public void UnmatchedByExcludeRegardlessOfRule() { var clause = ClauseBuilder.ShouldMatchUser(baseUser); var rule = new SegmentRule(new List <Clause> { clause }, 0, null); var segment = new SegmentBuilder("segmentkey").Unbounded(true).Generation(2) .Rules(rule) .Build(); var bigSegments = new MockBigSegmentProvider(); bigSegments.Membership[baseUser.Key] = MockMembership.New().Exclude(segment); var flag = new FeatureFlagBuilder("key").BooleanMatchingSegment(segment.Key).Build(); var evaluator = BasicEvaluator.WithStoredSegments(segment).WithBigSegments(bigSegments); var result = evaluator.Evaluate(flag, baseUser, EventFactory.Default); Assert.Equal(LdValue.Of(false), result.Result.Value); Assert.Equal(BigSegmentsStatus.Healthy, result.Result.Reason.BigSegmentsStatus); }
public void EventTrackingAndReasonCanBeForcedForRule() { var clause = ClauseBuilder.ShouldMatchUser(user); var rule = new RuleBuilder().Id("rule-id").Variation(1).Clauses(clause).TrackEvents(true).Build(); var flag = new FeatureFlagBuilder("flag").Version(1) .On(true) .Rules(rule) .OffVariation(0) .Variations(LdValue.Of("off"), LdValue.Of("on")) .Build(); testData.UsePreconfiguredFlag(flag); client.StringVariation("flag", user, "default"); // Note, we did not call StringVariationDetail and the flag is not tracked, but we should still get // tracking and a reason, because the rule-level trackEvents flag is on for the matched rule. Assert.Equal(1, eventSink.Events.Count); var e = Assert.IsType <EvaluationEvent>(eventSink.Events[0]); Assert.True(e.TrackEvents); Assert.Equal(EvaluationReason.RuleMatchReason(0, "rule-id"), e.Reason); }