Skip to content

Commit 77c9d27

Browse files
mfahadahmedmikeproeng37
authored andcommitted
Added GetEnabledFeatures method. (#43)
1 parent ae81fcf commit 77c9d27

File tree

2 files changed

+90
-1
lines changed

2 files changed

+90
-1
lines changed

OptimizelySDK.Tests/OptimizelyTest.cs

Lines changed: 63 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1658,5 +1658,68 @@ public void TestTrackListener(UserAttributes userAttributes, EventTags eventTags
16581658
}
16591659

16601660
#endregion // Test NotificationCenter
1661+
1662+
#region Test GetEnabledFeatures
1663+
1664+
[Test]
1665+
public void TestGetEnabledFeaturesWithInvalidDatafile()
1666+
{
1667+
var optly = new Optimizely("Random datafile", null, LoggerMock.Object);
1668+
Assert.IsEmpty(optly.GetEnabledFeatures("some_user", null));
1669+
1670+
LoggerMock.Verify(l => l.Log(LogLevel.ERROR, "Datafile has invalid format. Failing 'GetEnabledFeatures'."), Times.Once);
1671+
1672+
}
1673+
1674+
[Test]
1675+
public void TestGetEnabledFeaturesWithNoFeatureEnabledForUser()
1676+
{
1677+
var userAttributes = new UserAttributes
1678+
{
1679+
{ "device_type", "iPhone" },
1680+
{ "location", "San Francisco" }
1681+
};
1682+
1683+
OptimizelyMock.Setup(om => om.IsFeatureEnabled(It.IsAny<string>(), TestUserId, It.IsAny<UserAttributes>())).Returns(false);
1684+
Assert.IsEmpty(OptimizelyMock.Object.GetEnabledFeatures(TestUserId, userAttributes));
1685+
}
1686+
1687+
[Test]
1688+
public void TestGetEnabledFeaturesWithSomeFeaturesEnabledForUser()
1689+
{
1690+
string[] enabledFeatures =
1691+
{
1692+
"boolean_feature",
1693+
"double_single_variable_feature",
1694+
"string_single_variable_feature",
1695+
"multi_variate_feature",
1696+
"empty_feature"
1697+
};
1698+
string[] notEnabledFeatures =
1699+
{
1700+
"integer_single_variable_feature",
1701+
"boolean_single_variable_feature",
1702+
"mutex_group_feature",
1703+
"no_rollout_experiment_feature"
1704+
};
1705+
var userAttributes = new UserAttributes
1706+
{
1707+
{ "device_type", "iPhone" },
1708+
{ "location", "San Francisco" }
1709+
};
1710+
1711+
OptimizelyMock.Setup(om => om.IsFeatureEnabled(It.IsIn<string>(enabledFeatures), TestUserId,
1712+
It.IsAny<UserAttributes>())).Returns(true);
1713+
OptimizelyMock.Setup(om => om.IsFeatureEnabled(It.IsIn<string>(notEnabledFeatures), TestUserId,
1714+
It.IsAny<UserAttributes>())).Returns(false);
1715+
1716+
var actualFeaturesList = OptimizelyMock.Object.GetEnabledFeatures(TestUserId, userAttributes);
1717+
1718+
// Verify that the returned feature list contains only enabledFeatures.
1719+
CollectionAssert.AreEquivalent(enabledFeatures, actualFeaturesList);
1720+
Array.ForEach(notEnabledFeatures, nef => CollectionAssert.DoesNotContain(actualFeaturesList, nef));
1721+
}
1722+
1723+
#endregion // Test GetEnabledFeatures
16611724
}
16621725
}

OptimizelySDK/Optimizely.cs

Lines changed: 27 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -333,7 +333,7 @@ public Variation GetForcedVariation(string experimentKey, string userId)
333333
/// <param name="userId">The user ID</param>
334334
/// <param name="userAttributes">The user's attributes.</param>
335335
/// <returns>True if feature is enabled, false or null otherwise</returns>
336-
public bool IsFeatureEnabled(string featureKey, string userId, UserAttributes userAttributes = null)
336+
public virtual bool IsFeatureEnabled(string featureKey, string userId, UserAttributes userAttributes = null)
337337
{
338338
if (string.IsNullOrEmpty(userId))
339339
{
@@ -575,6 +575,32 @@ private void SendImpressionEvent(Experiment experiment, Variation variation, str
575575
}
576576
}
577577

578+
/// <summary>
579+
/// Get the list of features that are enabled for the user.
580+
/// </summary>
581+
/// <param name="userId">The user Id</param>
582+
/// <param name="userAttributes">The user's attributes</param>
583+
/// <returns>List of the feature keys that are enabled for the user.</returns>
584+
public List<string> GetEnabledFeatures(string userId, UserAttributes userAttributes)
585+
{
586+
List<string> enabledFeaturesList = new List<string>();
587+
588+
if (!IsValid)
589+
{
590+
Logger.Log(LogLevel.ERROR, "Datafile has invalid format. Failing 'GetEnabledFeatures'.");
591+
return enabledFeaturesList;
592+
}
593+
594+
foreach (var feature in Config.FeatureKeyMap.Values)
595+
{
596+
var featureKey = feature.Key;
597+
if (IsFeatureEnabled(featureKey, userId, userAttributes))
598+
enabledFeaturesList.Add(featureKey);
599+
}
600+
601+
return enabledFeaturesList;
602+
}
603+
578604
#endregion // FeatureFlag APIs
579605
}
580606
}

0 commit comments

Comments
 (0)