Skip to content

feat: return reasons and remove from args. #255

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Merged
merged 12 commits into from
Jan 20, 2021
Merged
15 changes: 6 additions & 9 deletions OptimizelySDK.Net35/OptimizelySDK.Net35.csproj
Original file line number Diff line number Diff line change
Expand Up @@ -304,15 +304,6 @@
</Compile>
<Compile Include="..\OptimizelySDK\OptimizelyDecisions\DecisionMessage.cs">
<Link>OptimizelyDecisions\DecisionMessage.cs</Link>
</Compile>
<Compile Include="..\OptimizelySDK\OptimizelyDecisions\IDecisionReasons.cs">
<Link>OptimizelyDecisions\IDecisionReasons.cs</Link>
</Compile>
<Compile Include="..\OptimizelySDK\OptimizelyDecisions\DefaultDecisionReasons.cs">
<Link>OptimizelyDecisions\DefaultDecisionReasons.cs</Link>
</Compile>
<Compile Include="..\OptimizelySDK\OptimizelyDecisions\ErrorsDecisionReasons.cs">
<Link>OptimizelyDecisions\ErrorsDecisionReasons.cs</Link>
</Compile>
<Compile Include="..\OptimizelySDK\OptimizelyDecisions\OptimizelyDecideOption.cs">
<Link>OptimizelyDecisions\OptimizelyDecideOption.cs</Link>
Expand All @@ -323,6 +314,12 @@
<Compile Include="..\OptimizelySDK\OptimizelyUserContext.cs">
<Link>OptimizelyUserContext.cs</Link>
</Compile>
<Compile Include="..\OptimizelySDK\Entity\Result.cs">
<Link>Entity\Result.cs</Link>
</Compile>
<Compile Include="..\OptimizelySDK\OptimizelyDecisions\DecisionReasons.cs">
<Link>OptimizelyDecisions\DecisionReasons.cs</Link>
</Compile>
</ItemGroup>
<ItemGroup>
<None Include="..\OptimizelySDK\Utils\schema.json">
Expand Down
13 changes: 5 additions & 8 deletions OptimizelySDK.Net40/OptimizelySDK.Net40.csproj
Original file line number Diff line number Diff line change
Expand Up @@ -322,14 +322,8 @@
<Compile Include="..\OptimizelySDK\OptimizelyDecisions\DecisionMessage.cs">
<Link>OptimizelyDecisions\DecisionMessage.cs</Link>
</Compile>
<Compile Include="..\OptimizelySDK\OptimizelyDecisions\IDecisionReasons.cs">
<Link>OptimizelyDecisions\IDecisionReasons.cs</Link>
</Compile>
<Compile Include="..\OptimizelySDK\OptimizelyDecisions\DefaultDecisionReasons.cs">
<Link>OptimizelyDecisions\DefaultDecisionReasons.cs</Link>
</Compile>
<Compile Include="..\OptimizelySDK\OptimizelyDecisions\ErrorsDecisionReasons.cs">
<Link>OptimizelyDecisions\ErrorsDecisionReasons.cs</Link>
<Compile Include="..\OptimizelySDK\OptimizelyDecisions\DecisionReasons.cs">
<Link>OptimizelyDecisions\DecisionReasons.cs</Link>
</Compile>
<Compile Include="..\OptimizelySDK\OptimizelyDecisions\OptimizelyDecideOption.cs">
<Link>OptimizelyDecisions\OptimizelyDecideOption.cs</Link>
Expand All @@ -340,6 +334,9 @@
<Compile Include="..\OptimizelySDK\OptimizelyUserContext.cs">
<Link>OptimizelyUserContext.cs</Link>
</Compile>
<Compile Include="..\OptimizelySDK\Entity\Result.cs">
<Link>Entity\Result.cs</Link>
</Compile>
</ItemGroup>
<ItemGroup>
<None Include="..\OptimizelySDK\Utils\schema.json">
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -89,9 +89,7 @@
<Compile Include="..\OptimizelySDK\OptlyConfig\OptimizelyConfigService.cs" />
<Compile Include="..\OptimizelySDK\OptlyConfig\IOptimizelyConfigManager.cs" />
<Compile Include="..\OptimizelySDK\OptimizelyDecisions\DecisionMessage.cs" />
<Compile Include="..\OptimizelySDK\OptimizelyDecisions\IDecisionReasons.cs" />
<Compile Include="..\OptimizelySDK\OptimizelyDecisions\DefaultDecisionReasons.cs" />
<Compile Include="..\OptimizelySDK\OptimizelyDecisions\ErrorsDecisionReasons.cs"/>
<Compile Include="..\OptimizelySDK\OptimizelyDecisions\DecisionReasons.cs" />
<Compile Include="..\OptimizelySDK\OptimizelyDecisions\OptimizelyDecideOption.cs" />
<Compile Include="..\OptimizelySDK\OptimizelyDecisions\OptimizelyDecision.cs" />
<Compile Include="..\OptimizelySDK\OptimizelyUserContext.cs" />
Expand Down Expand Up @@ -143,6 +141,9 @@
<Compile Include="..\OptimizelySDK\Event\EventProcessor.cs">
<Link>EventProcessor.cs</Link>
</Compile>
<Compile Include="..\OptimizelySDK\Entity\Result.cs">
<Link>Result.cs</Link>
</Compile>
</ItemGroup>
<ItemGroup>
<EmbeddedResource Include="..\OptimizelySDK\Utils\schema.json">
Expand Down
13 changes: 5 additions & 8 deletions OptimizelySDK.NetStandard20/OptimizelySDK.NetStandard20.csproj
Original file line number Diff line number Diff line change
Expand Up @@ -283,14 +283,8 @@
<Compile Include="..\OptimizelySDK\OptimizelyDecisions\DecisionMessage.cs">
<Link>OptimizelyDecisions\DecisionMessage.cs</Link>
</Compile>
<Compile Include="..\OptimizelySDK\OptimizelyDecisions\IDecisionReasons.cs">
<Link>OptimizelyDecisions\IDecisionReasons.cs</Link>
</Compile>
<Compile Include="..\OptimizelySDK\OptimizelyDecisions\DefaultDecisionReasons.cs">
<Link>OptimizelyDecisions\DefaultDecisionReasons.cs</Link>
</Compile>
<Compile Include="..\OptimizelySDK\OptimizelyDecisions\ErrorsDecisionReasons.cs">
<Link>OptimizelyDecisions\ErrorsDecisionReasons.cs</Link>
<Compile Include="..\OptimizelySDK\OptimizelyDecisions\DecisionReasons.cs">
<Link>OptimizelyDecisions\DecisionReasons.cs</Link>
</Compile>
<Compile Include="..\OptimizelySDK\OptimizelyDecisions\OptimizelyDecideOption.cs">
<Link>OptimizelyDecisions\OptimizelyDecideOption.cs</Link>
Expand All @@ -301,6 +295,9 @@
<Compile Include="..\OptimizelySDK\OptimizelyUserContext.cs">
<Link>OptimizelyUserContext.cs</Link>
</Compile>
<Compile Include="..\OptimizelySDK\Entity\Result.cs">
<Link>Entity\Result.cs</Link>
</Compile>
</ItemGroup>
<ItemGroup>
<None Include="..\OptimizelySDK\Event\.DS_Store">
Expand Down
57 changes: 32 additions & 25 deletions OptimizelySDK.Tests/BucketerTest.cs
Original file line number Diff line number Diff line change
Expand Up @@ -28,7 +28,6 @@ public class BucketerTest
{
private Mock<ILogger> LoggerMock;
private ProjectConfig Config;
private IDecisionReasons DecisionReasons;
private const string TestUserId = "testUserId";
public string TestBucketingIdControl { get; } = "testBucketingIdControl!"; // generates bucketing number 3741
public string TestBucketingIdVariation { get; } = "123456789'"; // generates bucketing number 4567
Expand Down Expand Up @@ -61,7 +60,6 @@ public override string ToString()
public void Initialize()
{
LoggerMock = new Mock<ILogger>();
DecisionReasons = DefaultDecisionReasons.NewInstance();
Config = DatafileProjectConfig.Create(TestData.Datafile, LoggerMock.Object, new ErrorHandler.NoOpErrorHandler());
}

Expand Down Expand Up @@ -98,29 +96,32 @@ public void TestBucketValidExperimentNotInGroup()
{
TestBucketer bucketer = new TestBucketer(LoggerMock.Object);
bucketer.SetBucketValues(new[] { 3000, 7000, 9000 });
var variation = bucketer.Bucket(Config, Config.GetExperimentFromKey("test_experiment"), TestBucketingIdControl, TestUserId);
// control
Assert.AreEqual(new Variation { Id = "7722370027", Key = "control" },
bucketer.Bucket(Config, Config.GetExperimentFromKey("test_experiment"), TestBucketingIdControl, TestUserId, DecisionReasons));
variation.ResultObject);

LoggerMock.Verify(l => l.Log(It.IsAny<LogLevel>(), It.IsAny<string>()), Times.Exactly(2));
LoggerMock.Verify(l => l.Log(LogLevel.DEBUG, "Assigned bucket [3000] to user [testUserId] with bucketing ID [testBucketingIdControl!]."));
LoggerMock.Verify(l => l.Log(LogLevel.INFO, "User [testUserId] is in variation [control] of experiment [test_experiment]."));
// variation
variation = bucketer.Bucket(Config, Config.GetExperimentFromKey("test_experiment"), TestBucketingIdControl, TestUserId);
Assert.AreEqual(new Variation { Id = "7721010009", Key = "variation" },
bucketer.Bucket(Config, Config.GetExperimentFromKey("test_experiment"), TestBucketingIdControl, TestUserId, DecisionReasons));
variation.ResultObject);

LoggerMock.Verify(l => l.Log(It.IsAny<LogLevel>(), It.IsAny<string>()), Times.Exactly(4));
LoggerMock.Verify(l => l.Log(LogLevel.DEBUG, "Assigned bucket [7000] to user [testUserId] with bucketing ID [testBucketingIdControl!]."));
LoggerMock.Verify(l => l.Log(LogLevel.INFO, "User [testUserId] is in variation [variation] of experiment [test_experiment]."));

// no variation
variation = bucketer.Bucket(Config, Config.GetExperimentFromKey("test_experiment"), TestBucketingIdControl, TestUserId);
Assert.AreEqual(new Variation { },
bucketer.Bucket(Config, Config.GetExperimentFromKey("test_experiment"), TestBucketingIdControl, TestUserId, DecisionReasons));
variation.ResultObject);

LoggerMock.Verify(l => l.Log(It.IsAny<LogLevel>(), It.IsAny<string>()), Times.Exactly(6));
LoggerMock.Verify(l => l.Log(LogLevel.DEBUG, "Assigned bucket [9000] to user [testUserId] with bucketing ID [testBucketingIdControl!]."));
LoggerMock.Verify(l => l.Log(LogLevel.INFO, "User [testUserId] is in no variation."));
Assert.AreEqual(DecisionReasons.ToReport().Count, 0);
Assert.AreEqual(variation.DecisionReasons.ToReport().Count, 0);
}

[Test]
Expand All @@ -131,31 +132,36 @@ public void TestBucketValidExperimentInGroup()
// group_experiment_1 (20% experiment)
// variation 1
bucketer.SetBucketValues(new[] { 1000, 4000 });
var variation = bucketer.Bucket(Config, Config.GetExperimentFromKey("group_experiment_1"), TestBucketingIdControl, TestUserId);
Assert.AreEqual(new Variation { Id = "7722260071", Key = "group_exp_1_var_1" },
bucketer.Bucket(Config, Config.GetExperimentFromKey("group_experiment_1"), TestBucketingIdControl, TestUserId, DecisionReasons));
variation.ResultObject);
LoggerMock.Verify(l => l.Log(LogLevel.DEBUG, "Assigned bucket [1000] to user [testUserId] with bucketing ID [testBucketingIdControl!]."));
LoggerMock.Verify(l => l.Log(LogLevel.INFO, "User [testUserId] is in experiment [group_experiment_1] of group [7722400015]."));
LoggerMock.Verify(l => l.Log(LogLevel.DEBUG, "Assigned bucket [4000] to user [testUserId] with bucketing ID [testBucketingIdControl!]."));
LoggerMock.Verify(l => l.Log(LogLevel.INFO, "User [testUserId] is in variation [group_exp_1_var_1] of experiment [group_experiment_1]."));
Assert.AreEqual(variation.DecisionReasons.ToReport().Count, 0);

// variation 2
bucketer.SetBucketValues(new[] { 1500, 7000 });
var variation1 = bucketer.Bucket(Config, Config.GetExperimentFromKey("group_experiment_1"), TestBucketingIdControl, TestUserId);
Assert.AreEqual(new Variation { Id = "7722360022", Key = "group_exp_1_var_2" },
bucketer.Bucket(Config, Config.GetExperimentFromKey("group_experiment_1"), TestBucketingIdControl, TestUserId, DecisionReasons));
variation1.ResultObject);
LoggerMock.Verify(l => l.Log(LogLevel.DEBUG, "Assigned bucket [1500] to user [testUserId] with bucketing ID [testBucketingIdControl!]."));
LoggerMock.Verify(l => l.Log(LogLevel.INFO, "User [testUserId] is in experiment [group_experiment_1] of group [7722400015]."));
LoggerMock.Verify(l => l.Log(LogLevel.DEBUG, "Assigned bucket [7000] to user [testUserId] with bucketing ID [testBucketingIdControl!]."));
LoggerMock.Verify(l => l.Log(LogLevel.INFO, "User [testUserId] is in variation [group_exp_1_var_1] of experiment [group_experiment_1]."));
Assert.AreEqual(variation1.DecisionReasons.ToReport().Count, 0);

// User not in experiment
bucketer.SetBucketValues(new[] { 5000, 7000 });
var variation2 = bucketer.Bucket(Config, Config.GetExperimentFromKey("group_experiment_1"), TestBucketingIdControl, TestUserId);
Assert.AreEqual(new Variation { },
bucketer.Bucket(Config, Config.GetExperimentFromKey("group_experiment_1"), TestBucketingIdControl, TestUserId, DecisionReasons));
variation2.ResultObject);
LoggerMock.Verify(l => l.Log(LogLevel.DEBUG, "Assigned bucket [5000] to user [testUserId] with bucketing ID [testBucketingIdControl!]."));
LoggerMock.Verify(l => l.Log(LogLevel.INFO, "User [testUserId] is not in experiment [group_experiment_1] of group [7722400015]."));
Assert.AreEqual(variation2.DecisionReasons.ToReport().Count, 0);

LoggerMock.Verify(l => l.Log(It.IsAny<LogLevel>(), It.IsAny<string>()), Times.Exactly(10));
Assert.AreEqual(DecisionReasons.ToReport().Count, 0);
}

[Test]
Expand All @@ -164,7 +170,7 @@ public void TestBucketInvalidExperiment()
var bucketer = new Bucketer(LoggerMock.Object);

Assert.AreEqual(new Variation { },
bucketer.Bucket(Config, new Experiment(), TestBucketingIdControl, TestUserId, DecisionReasons));
bucketer.Bucket(Config, new Experiment(), TestBucketingIdControl, TestUserId).ResultObject);

LoggerMock.Verify(l => l.Log(It.IsAny<LogLevel>(), It.IsAny<string>()), Times.Never);
}
Expand All @@ -178,9 +184,10 @@ public void TestBucketWithBucketingId()
var expectedVariation2 = new Variation { Id = "7721010009", Key = "variation" };

// make sure that the bucketing ID is used for the variation bucketing and not the user ID
Assert.AreEqual(expectedVariation,
bucketer.Bucket(Config, experiment, TestBucketingIdControl, TestUserIdBucketsToVariation, DecisionReasons));
Assert.AreEqual(DecisionReasons.ToReport().Count, 0);
var variationResult = bucketer.Bucket(Config, experiment, TestBucketingIdControl, TestUserIdBucketsToVariation);
Assert.AreEqual(expectedVariation,
variationResult.ResultObject);
Assert.AreEqual(variationResult.DecisionReasons.ToReport().Count, 0);
}

// Test for invalid experiment keys, null variation should be returned
Expand All @@ -189,10 +196,10 @@ public void TestBucketVariationInvalidExperimentsWithBucketingId()
{
var bucketer = new Bucketer(LoggerMock.Object);
var expectedVariation = new Variation();

var variationResult = bucketer.Bucket(Config, Config.GetExperimentFromKey("invalid_experiment"), TestBucketingIdVariation, TestUserId);
Assert.AreEqual(expectedVariation,
bucketer.Bucket(Config, Config.GetExperimentFromKey("invalid_experiment"), TestBucketingIdVariation, TestUserId, DecisionReasons));
Assert.AreEqual(DecisionReasons.ToReport().Count, 0);
variationResult.ResultObject);
Assert.AreEqual(variationResult.DecisionReasons.ToReport().Count, 0);
}

// Make sure that the bucketing ID is used to bucket the user into a group and not the user ID
Expand All @@ -202,11 +209,11 @@ public void TestBucketVariationGroupedExperimentsWithBucketingId()
var bucketer = new Bucketer(LoggerMock.Object);
var expectedVariation = new Variation();
var expectedGroupVariation = new Variation{ Id = "7725250007", Key = "group_exp_2_var_2" };

var variationResult = bucketer.Bucket(Config, Config.GetExperimentFromKey("group_experiment_2"),
TestBucketingIdGroupExp2Var2, TestUserIdBucketsToNoGroup);
Assert.AreEqual(expectedGroupVariation,
bucketer.Bucket(Config, Config.GetExperimentFromKey("group_experiment_2"),
TestBucketingIdGroupExp2Var2, TestUserIdBucketsToNoGroup, DecisionReasons));
Assert.AreEqual(DecisionReasons.ToReport().Count, 0);
variationResult.ResultObject);
Assert.AreEqual(variationResult.DecisionReasons.ToReport().Count, 0);
}

// Make sure that user gets bucketed into the rollout rule.
Expand All @@ -217,10 +224,10 @@ public void TestBucketRolloutRule()
var rollout = Config.GetRolloutFromId("166660");
var rolloutRule = rollout.Experiments[1];
var expectedVariation = Config.GetVariationFromId(rolloutRule.Key, "177773");

Assert.True(TestData.CompareObjects(expectedVariation,
bucketer.Bucket(Config, rolloutRule, "testBucketingId", TestUserId, DecisionReasons)));
Assert.AreEqual(DecisionReasons.ToReport().Count, 0);
var variationResult = bucketer.Bucket(Config, rolloutRule, "testBucketingId", TestUserId);
Assert.True(TestData.CompareObjects(expectedVariation,
variationResult.ResultObject));
Assert.AreEqual(variationResult.DecisionReasons.ToReport().Count, 0);
}
}
}
Loading