Skip to content

Commit 5a6a098

Browse files
move validate forced decision to decision service (#292)
* move validate forced decision to decision service * Fixed comments Co-authored-by: muhammadnoman <[email protected]>
1 parent 512d491 commit 5a6a098

File tree

5 files changed

+51
-51
lines changed

5 files changed

+51
-51
lines changed

Diff for: OptimizelySDK.Tests/DecisionServiceTest.cs

+19
Original file line numberDiff line numberDiff line change
@@ -71,6 +71,25 @@ public void SetUp()
7171
Config = DatafileProjectConfig.Create(TestData.Datafile, LoggerMock.Object, ErrorHandlerMock.Object);
7272
}
7373

74+
[Test]
75+
public void TestFindValidatedForcedDecisionReturnsCorrectDecisionWithNullVariation()
76+
{
77+
DecisionService decisionService = new DecisionService(BucketerMock.Object, ErrorHandlerMock.Object, null, LoggerMock.Object);
78+
79+
var optlyObject = new Optimizely(TestData.Datafile, new ValidEventDispatcher(), LoggerMock.Object);
80+
81+
var decisionReasons = new DecisionReasons();
82+
decisionReasons.AddInfo("{0}", "Invalid variation is mapped to flag: flagKey and rule: rule forced decision map.");
83+
var expectedResult = Result<Variation>.NullResult(decisionReasons);
84+
var user = optlyObject.CreateUserContext(GenericUserId);
85+
86+
var context = new OptimizelyDecisionContext("flagKey", "ruleKey");
87+
88+
var result = decisionService.ValidatedForcedDecision(context, Config, user);
89+
90+
Assertions.AreEqual(expectedResult, result);
91+
}
92+
7493
[Test]
7594
public void TestGetVariationForcedVariationPrecedesAudienceEval()
7695
{

Diff for: OptimizelySDK.Tests/OptimizelyUserContextTest.cs

-15
Original file line numberDiff line numberDiff line change
@@ -286,21 +286,6 @@ public void TestGetForcedDecisionReturnsValueWithRuleKey()
286286
Assertions.AreEqual(decision, result);
287287
}
288288

289-
[Test]
290-
public void TestFindValidatedForcedDecisionReturnsCorrectDecisionWithNullVariation()
291-
{
292-
var decisionReasons = new DecisionReasons();
293-
decisionReasons.AddInfo("{0}", "Invalid variation is mapped to flag: flagKey and rule: rule forced decision map.");
294-
var expectedResult = Result<Variation>.NullResult(decisionReasons);
295-
var user = Optimizely.CreateUserContext(UserID);
296-
297-
var context = new OptimizelyDecisionContext("flagKey", "ruleKey");
298-
299-
var result = user.FindValidatedForcedDecision(context, null);
300-
301-
Assertions.AreEqual(expectedResult, result);
302-
}
303-
304289
[Test]
305290
public void TestRemoveForcedDecisionReturnsFalseForNullFlagKey()
306291
{

Diff for: OptimizelySDK/Bucketing/DecisionService.cs

+31-5
Original file line numberDiff line numberDiff line change
@@ -461,7 +461,7 @@ public virtual Result<FeatureDecision> GetVariationForFeatureRollout(FeatureFlag
461461
//Check forced decision first
462462
var rule = rolloutRules[index];
463463
var decisionContext = new OptimizelyDecisionContext(featureFlag.Key, rule.Key);
464-
var forcedDecisionResponse = user.FindValidatedForcedDecision(decisionContext, config);
464+
var forcedDecisionResponse = ValidatedForcedDecision(decisionContext, config, user);
465465

466466
reasons += forcedDecisionResponse.DecisionReasons;
467467
if (forcedDecisionResponse.ResultObject != null)
@@ -550,10 +550,9 @@ public virtual Result<FeatureDecision> GetVariationForFeatureExperiment(FeatureF
550550

551551
if (string.IsNullOrEmpty(experiment.Key))
552552
continue;
553-
554-
var forcedDecisionResponse = user.FindValidatedForcedDecision(
555-
new OptimizelyDecisionContext(featureFlag.Key, experiment?.Key),
556-
config);
553+
var decisionContext = new OptimizelyDecisionContext(featureFlag.Key, experiment?.Key);
554+
var forcedDecisionResponse = ValidatedForcedDecision(decisionContext, config, user);
555+
557556
reasons += forcedDecisionResponse.DecisionReasons;
558557

559558
if (forcedDecisionResponse?.ResultObject != null)
@@ -662,5 +661,32 @@ private Result<string> GetBucketingId(string userId, UserAttributes filteredAttr
662661

663662
return Result<string>.NewResult(bucketingId, reasons);
664663
}
664+
665+
/// <summary>
666+
/// Finds a validated forced decision.
667+
/// </summary>
668+
/// <param name="context">Object containing flag and rule key of which forced decision is set.</param>
669+
/// <param name="config">The Project config.</param>
670+
/// <param name="user">Optimizely user context.</param>
671+
/// <returns>A result with the variation</returns>
672+
public Result<Variation> ValidatedForcedDecision(OptimizelyDecisionContext context, ProjectConfig config, OptimizelyUserContext user)
673+
{
674+
DecisionReasons reasons = new DecisionReasons();
675+
var userId = user.GetUserId();
676+
var forcedDecision = user.GetForcedDecision(context);
677+
if (config != null && forcedDecision != null) {
678+
var loggingKey = context.RuleKey != null ? "flag (" + context.FlagKey + "), rule (" + context.RuleKey + ")" : "flag (" + context.FlagKey + ")";
679+
var variationKey = forcedDecision.VariationKey;
680+
var variation = config.GetFlagVariationByKey(context.FlagKey, variationKey);
681+
if (variation != null) {
682+
reasons.AddInfo("Decided by forced decision.");
683+
reasons.AddInfo("Variation ({0}) is mapped to {1} and user ({2}) in the forced decision map.", variationKey, loggingKey, userId);
684+
return Result<Variation>.NewResult(variation, reasons);
685+
} else {
686+
reasons.AddInfo("Invalid variation is mapped to {0} and user ({1}) in the forced decision map.", loggingKey, userId);
687+
}
688+
}
689+
return Result<Variation>.NullResult(reasons);
690+
}
665691
}
666692
}

Diff for: OptimizelySDK/Optimizely.cs

+1-1
Original file line numberDiff line numberDiff line change
@@ -754,7 +754,7 @@ internal OptimizelyDecision Decide(OptimizelyUserContext user,
754754
FeatureDecision decision = null;
755755

756756
var decisionContext = new OptimizelyDecisionContext(flag.Key);
757-
var forcedDecisionVariation = user.FindValidatedForcedDecision(decisionContext, config);
757+
var forcedDecisionVariation = DecisionService.ValidatedForcedDecision(decisionContext, config, user);
758758
decisionReasons += forcedDecisionVariation.DecisionReasons;
759759

760760
if (forcedDecisionVariation.ResultObject != null)

Diff for: OptimizelySDK/OptimizelyUserContext.cs

-30
Original file line numberDiff line numberDiff line change
@@ -298,35 +298,5 @@ public bool RemoveAllForcedDecisions()
298298
}
299299
return true;
300300
}
301-
302-
/// <summary>
303-
/// Finds a validated forced decision.
304-
/// </summary>
305-
/// <param name="context">Object containing flag and rule key of which forced decision is set.</param>
306-
/// <param name="config">The Project config.</param>
307-
/// <returns>A result with the variation</returns>
308-
public Result<Variation> FindValidatedForcedDecision(OptimizelyDecisionContext context, ProjectConfig config)
309-
{
310-
DecisionReasons reasons = new DecisionReasons();
311-
var forcedDecision = GetForcedDecision(context);
312-
313-
if (config != null && forcedDecision != null)
314-
{
315-
var loggingKey = context.RuleKey != null ? "flag (" + context.FlagKey + "), rule (" + context.RuleKey + ")" : "flag (" + context.FlagKey + ")";
316-
var variationKey = forcedDecision.VariationKey;
317-
var variation = config.GetFlagVariationByKey(context.FlagKey, variationKey);
318-
if (variation != null)
319-
{
320-
reasons.AddInfo("Decided by forced decision.");
321-
reasons.AddInfo("Variation ({0}) is mapped to {1} and user ({2}) in the forced decision map.", variationKey, loggingKey, UserId);
322-
return Result<Variation>.NewResult(variation, reasons);
323-
}
324-
else
325-
{
326-
reasons.AddInfo("Invalid variation is mapped to {0} and user ({1}) in the forced decision map.", loggingKey, UserId);
327-
}
328-
}
329-
return Result<Variation>.NullResult(reasons);
330-
}
331301
}
332302
}

0 commit comments

Comments
 (0)