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") .On(true) .Rules(rule0, rule1) .OffVariation(0) .Variations(new JValue("off"), new JValue("on")) .Build(); featureStore.Upsert(VersionedDataKind.Features, 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 <FeatureRequestEvent>(eventSink.Events[0]); Assert.False(e.TrackEvents); Assert.Null(e.Reason); }
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 = f.Evaluate(user, featureStore, EventFactory.Default); var expected = new EvaluationDetail <LdValue>(LdValue.Null, null, EvaluationReason.ErrorReason(EvaluationErrorKind.MALFORMED_FLAG)); Assert.Equal(expected, result.Result); Assert.Equal(0, result.PrerequisiteEvents.Count); }
public void FlagMatchesUserFromRules() { var user = User.WithKey("userkey"); var clause0 = ClauseBuilder.ShouldNotMatchUser(user); var clause1 = ClauseBuilder.ShouldMatchUser(user); var rule0 = new RuleBuilder().Id("ruleid0").Variation(2).Clauses(clause0).Build(); var rule1 = new RuleBuilder().Id("ruleid1").Variation(2).Clauses(clause1).Build(); var f = FeatureFlagWithRules(rule0, rule1); var result = f.Evaluate(user, featureStore, EventFactory.Default); var expected = new EvaluationDetail <LdValue>(LdValue.Of("on"), 2, EvaluationReason.RuleMatchReason(1, "ruleid1")); Assert.Equal(expected, result.Result); Assert.Equal(0, result.PrerequisiteEvents.Count); }
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") .On(true) .Rules(rule) .OffVariation(0) .Variations(new JValue("off"), new JValue("on")) .Build(); featureStore.Upsert(VersionedDataKind.Features, 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 <FeatureRequestEvent>(eventSink.Events[0]); Assert.True(e.TrackEvents); Assert.Equal(EvaluationReason.RuleMatchReason(0, "rule-id"), e.Reason); }