Skip to content

Commit b7df60f

Browse files
feature variable type enum removed (#211)
* feature variable type enum removed
1 parent 812c832 commit b7df60f

File tree

6 files changed

+88
-48
lines changed

6 files changed

+88
-48
lines changed

OptimizelySDK.Tests/EntityTests/FeatureVariableTest.cs

Lines changed: 14 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
/*
2-
* Copyright 2019, Optimizely
2+
* Copyright 2019-2020, Optimizely
33
*
44
* Licensed under the Apache License, Version 2.0 (the "License");
55
* you may not use this file except in compliance with the License.
@@ -26,10 +26,19 @@ public class FeatureVariableTest
2626
[Test]
2727
public void TestFeatureVariableTypeName()
2828
{
29-
Assert.AreEqual(FeatureVariable.GetFeatureVariableTypeName(FeatureVariable.VariableType.BOOLEAN), "GetFeatureVariableBoolean");
30-
Assert.AreEqual(FeatureVariable.GetFeatureVariableTypeName(FeatureVariable.VariableType.DOUBLE), "GetFeatureVariableDouble");
31-
Assert.AreEqual(FeatureVariable.GetFeatureVariableTypeName(FeatureVariable.VariableType.INTEGER), "GetFeatureVariableInteger");
32-
Assert.AreEqual(FeatureVariable.GetFeatureVariableTypeName(FeatureVariable.VariableType.STRING), "GetFeatureVariableString");
29+
Assert.AreEqual(FeatureVariable.GetFeatureVariableTypeName(FeatureVariable.BOOLEAN_TYPE), "GetFeatureVariableBoolean");
30+
Assert.AreEqual(FeatureVariable.GetFeatureVariableTypeName(FeatureVariable.DOUBLE_TYPE), "GetFeatureVariableDouble");
31+
Assert.AreEqual(FeatureVariable.GetFeatureVariableTypeName(FeatureVariable.INTEGER_TYPE), "GetFeatureVariableInteger");
32+
Assert.AreEqual(FeatureVariable.GetFeatureVariableTypeName(FeatureVariable.STRING_TYPE), "GetFeatureVariableString");
33+
}
34+
35+
[Test]
36+
public void TestConstantValues()
37+
{
38+
Assert.AreEqual(FeatureVariable.BOOLEAN_TYPE, "boolean");
39+
Assert.AreEqual(FeatureVariable.DOUBLE_TYPE, "double");
40+
Assert.AreEqual(FeatureVariable.INTEGER_TYPE, "integer");
41+
Assert.AreEqual(FeatureVariable.STRING_TYPE, "string");
3342
}
3443
}
3544
}

OptimizelySDK.Tests/OptimizelyTest.cs

Lines changed: 27 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -1158,7 +1158,7 @@ public void TestGetFeatureVariableBooleanReturnsCorrectValue()
11581158
var variableKeyFalse = "varFalse";
11591159
var variableKeyNonBoolean = "varNonBoolean";
11601160
var variableKeyNull = "varNull";
1161-
var featureVariableType = FeatureVariable.VariableType.BOOLEAN;
1161+
var featureVariableType = "boolean";
11621162

11631163
OptimizelyMock.Setup(om => om.GetFeatureVariableValueForType<bool?>(It.IsAny<string>(), variableKeyTrue, It.IsAny<string>(),
11641164
It.IsAny<UserAttributes>(), featureVariableType)).Returns(true);
@@ -1253,7 +1253,7 @@ public void TestGetFeatureVariableDoubleReturnsCorrectValue()
12531253
var variableKeyInt = "varInt";
12541254
var variableKeyNonDouble = "varNonDouble";
12551255
var variableKeyNull = "varNull";
1256-
var featureVariableType = FeatureVariable.VariableType.DOUBLE;
1256+
var featureVariableType = "double";
12571257

12581258
OptimizelyMock.Setup(om => om.GetFeatureVariableValueForType<double?>(It.IsAny<string>(), variableKeyDouble, It.IsAny<string>(),
12591259
It.IsAny<UserAttributes>(), featureVariableType)).Returns(100.54);
@@ -1279,7 +1279,7 @@ public void TestGetFeatureVariableIntegerReturnsCorrectValue()
12791279
var variableKeyInt = "varInt";
12801280
var variableNonInt = "varNonInt";
12811281
var variableKeyNull = "varNull";
1282-
var featureVariableType = FeatureVariable.VariableType.INTEGER;
1282+
var featureVariableType = "integer";
12831283

12841284
OptimizelyMock.Setup(om => om.GetFeatureVariableValueForType<int?>(It.IsAny<string>(), variableKeyInt, It.IsAny<string>(),
12851285
It.IsAny<UserAttributes>(), featureVariableType)).Returns(100);
@@ -1301,7 +1301,7 @@ public void TestGetFeatureVariableStringReturnsCorrectValue()
13011301
var variableKeyString = "varString1";
13021302
var variableKeyIntString = "varString2";
13031303
var variableKeyNull = "varNull";
1304-
var featureVariableType = FeatureVariable.VariableType.STRING;
1304+
var featureVariableType = "string";
13051305

13061306
OptimizelyMock.Setup(om => om.GetFeatureVariableValueForType<string>(It.IsAny<string>(), variableKeyString, It.IsAny<string>(),
13071307
It.IsAny<UserAttributes>(), featureVariableType)).Returns("Test String");
@@ -1558,7 +1558,7 @@ public void TestGetFeatureVariableValueForTypeGivenNullOrEmptyArguments()
15581558
{
15591559
var featureKey = "featureKey";
15601560
var variableKey = "variableKey";
1561-
var variableType = FeatureVariable.VariableType.BOOLEAN;
1561+
var variableType = "boolean";
15621562

15631563
// Passing null and empty feature key.
15641564
Assert.IsNull(Optimizely.GetFeatureVariableValueForType<bool?>(null, variableKey, TestUserId, null, variableType));
@@ -1583,7 +1583,7 @@ public void TestGetFeatureVariableValueForTypeGivenFeatureKeyOrVariableKeyNotFou
15831583
{
15841584
var featureKey = "this_feature_should_never_be_found_in_the_datafile_unless_the_datafile_creator_got_insane";
15851585
var variableKey = "this_variable_should_never_be_found_in_the_datafile_unless_the_datafile_creator_got_insane";
1586-
var variableType = FeatureVariable.VariableType.BOOLEAN;
1586+
var variableType = "boolean";
15871587

15881588
Assert.IsNull(Optimizely.GetFeatureVariableValueForType<bool?>(featureKey, variableKey, TestUserId, null, variableType));
15891589
Assert.IsNull(Optimizely.GetFeatureVariableValueForType<bool?>("double_single_variable_feature", variableKey, TestUserId, null, variableType));
@@ -1597,24 +1597,34 @@ public void TestGetFeatureVariableValueForTypeGivenFeatureKeyOrVariableKeyNotFou
15971597
[Test]
15981598
public void TestGetFeatureVariableValueForTypeGivenInvalidVariableType()
15991599
{
1600-
var variableTypeBool = FeatureVariable.VariableType.BOOLEAN;
1601-
var variableTypeInt = FeatureVariable.VariableType.INTEGER;
1602-
var variableTypeDouble = FeatureVariable.VariableType.DOUBLE;
1603-
var variableTypeString = FeatureVariable.VariableType.STRING;
1600+
var variableTypeBool = "boolean";
1601+
var variableTypeInt = "integer";
1602+
var variableTypeDouble = "double";
1603+
var variableTypeString = "string";
16041604

16051605
Assert.IsNull(Optimizely.GetFeatureVariableValueForType<double?>("double_single_variable_feature", "double_variable", TestUserId, null, variableTypeBool));
16061606
Assert.IsNull(Optimizely.GetFeatureVariableValueForType<bool?>("boolean_single_variable_feature", "boolean_variable", TestUserId, null, variableTypeDouble));
16071607
Assert.IsNull(Optimizely.GetFeatureVariableValueForType<int?>("integer_single_variable_feature", "integer_variable", TestUserId, null, variableTypeString));
16081608
Assert.IsNull(Optimizely.GetFeatureVariableValueForType<string>("string_single_variable_feature", "string_variable", TestUserId, null, variableTypeInt));
16091609

16101610
LoggerMock.Verify(l => l.Log(LogLevel.ERROR,
1611-
$@"Variable is of type ""DOUBLE"", but you requested it as type ""{variableTypeBool}""."));
1611+
$@"Variable is of type ""double"", but you requested it as type ""{variableTypeBool}""."));
16121612
LoggerMock.Verify(l => l.Log(LogLevel.ERROR,
1613-
$@"Variable is of type ""BOOLEAN"", but you requested it as type ""{variableTypeDouble}""."));
1613+
$@"Variable is of type ""boolean"", but you requested it as type ""{variableTypeDouble}""."));
16141614
LoggerMock.Verify(l => l.Log(LogLevel.ERROR,
1615-
$@"Variable is of type ""INTEGER"", but you requested it as type ""{variableTypeString}""."));
1615+
$@"Variable is of type ""integer"", but you requested it as type ""{variableTypeString}""."));
16161616
LoggerMock.Verify(l => l.Log(LogLevel.ERROR,
1617-
$@"Variable is of type ""STRING"", but you requested it as type ""{variableTypeInt}""."));
1617+
$@"Variable is of type ""string"", but you requested it as type ""{variableTypeInt}""."));
1618+
}
1619+
1620+
[Test]
1621+
public void TestUnsupportedVariableType()
1622+
{
1623+
var featureVariableStringRandomType = Optimizely.GetFeatureVariableString("", "any_key", TestUserId);
1624+
Assert.IsNull(featureVariableStringRandomType);
1625+
1626+
var featureVariableStringJsonType = Optimizely.GetFeatureVariableString("unsupported_variabletype", "string_json_key", TestUserId);
1627+
Assert.AreEqual(featureVariableStringJsonType, "{\"myvalue\": \"jsonValue\"}");
16181628
}
16191629

16201630
// Should return default value and log message when feature is not enabled for the user.
@@ -1626,7 +1636,7 @@ public void TestGetFeatureVariableValueForTypeGivenFeatureFlagIsNotEnabledForUse
16261636
var experiment = Config.GetExperimentFromKey("test_experiment_double_feature");
16271637
var variation = Config.GetVariationFromKey("test_experiment_double_feature", "variation");
16281638
var variableKey = "double_variable";
1629-
var variableType = FeatureVariable.VariableType.DOUBLE;
1639+
var variableType = "double";
16301640
var expectedValue = 14.99;
16311641

16321642
var decision = new FeatureDecision(experiment, variation, FeatureDecision.DECISION_SOURCE_FEATURE_TEST);
@@ -1656,7 +1666,7 @@ public void TestGetFeatureVariableValueForTypeGivenFeatureFlagIsEnabledForUserAn
16561666
var differentVariation = Config.GetVariationFromKey("test_experiment_integer_feature", "control");
16571667
var expectedDecision = new FeatureDecision(experiment, differentVariation, FeatureDecision.DECISION_SOURCE_FEATURE_TEST);
16581668
var variableKey = "double_variable";
1659-
var variableType = FeatureVariable.VariableType.DOUBLE;
1669+
var variableType = "double";
16601670
var expectedValue = 14.99;
16611671

16621672
// Mock GetVariationForFeature method to return variation of different feature.
@@ -1682,7 +1692,7 @@ public void TestGetFeatureVariableValueForTypeGivenFeatureFlagIsEnabledForUserAn
16821692
var featureKey = "double_single_variable_feature";
16831693
var featureFlag = Config.GetFeatureFlagFromKey("double_single_variable_feature");
16841694
var variableKey = "double_variable";
1685-
var variableType = FeatureVariable.VariableType.DOUBLE;
1695+
var variableType = "double";
16861696
var expectedValue = 42.42;
16871697
var experiment = Config.GetExperimentFromKey("test_experiment_double_feature");
16881698
var variation = Config.GetVariationFromKey("test_experiment_double_feature", "control");

OptimizelySDK.Tests/ProjectConfigTest.cs

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -399,7 +399,8 @@ public void TestInit()
399399
{ "multi_variate_feature", Config.GetFeatureFlagFromKey("multi_variate_feature") },
400400
{ "mutex_group_feature", Config.GetFeatureFlagFromKey("mutex_group_feature") },
401401
{ "empty_feature", Config.GetFeatureFlagFromKey("empty_feature") },
402-
{ "no_rollout_experiment_feature", Config.GetFeatureFlagFromKey("no_rollout_experiment_feature") }
402+
{ "no_rollout_experiment_feature", Config.GetFeatureFlagFromKey("no_rollout_experiment_feature") },
403+
{ "unsupported_variabletype", Config.GetFeatureFlagFromKey("unsupported_variabletype") }
403404
};
404405

405406
Assert.IsTrue(TestData.CompareObjects(expectedFeatureKeyMap, Config.FeatureKeyMap));

OptimizelySDK.Tests/TestData.json

Lines changed: 23 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -561,7 +561,7 @@
561561
"key": "integer_variable",
562562
"type": "integer",
563563
"defaultValue": "7"
564-
}
564+
}
565565
]
566566
},
567567
{
@@ -639,6 +639,28 @@
639639
"rolloutId": "166662",
640640
"experimentIds": [],
641641
"variables": []
642+
},
643+
{
644+
"id": "155566",
645+
"key": "unsupported_variabletype",
646+
"rolloutId": "166662",
647+
"experimentIds": [],
648+
"variables": [
649+
{
650+
"id": "255554",
651+
"key": "any_key",
652+
"type": "random",
653+
"defaultValue": "{}"
654+
},
655+
{
656+
"id": "255555",
657+
"key": "string_json_key",
658+
"type": "string",
659+
"defaultValue": "{\"myvalue\": \"jsonValue\"}",
660+
"subType": "json"
661+
}
662+
]
663+
642664
}
643665
],
644666
"rollouts": [

OptimizelySDK/Entity/FeatureVariable.cs

Lines changed: 12 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
/*
2-
* Copyright 2017, 2019, Optimizely
2+
* Copyright 2017, 2019-2020, Optimizely
33
*
44
* Licensed under the Apache License, Version 2.0 (the "License");
55
* you may not use this file except in compliance with the License.
@@ -18,39 +18,37 @@ namespace OptimizelySDK.Entity
1818
{
1919
public class FeatureVariable : IdKeyEntity
2020
{
21+
public const string STRING_TYPE = "string";
22+
public const string INTEGER_TYPE = "integer";
23+
public const string DOUBLE_TYPE = "double";
24+
public const string BOOLEAN_TYPE = "boolean";
25+
2126
public enum VariableStatus
2227
{
2328
ACTIVE,
2429
ARCHIVED
2530
}
2631

27-
public enum VariableType
28-
{
29-
BOOLEAN,
30-
INTEGER,
31-
DOUBLE,
32-
STRING
33-
}
3432

3533
public string DefaultValue { get; set; }
36-
public VariableType Type { get; set; }
34+
public string Type { get; set; }
3735
public VariableStatus Status { get; set; }
3836

3937
/// <summary>
4038
/// Returns the feature variable api name based on VariableType.
4139
/// </summary>
4240
/// <returns>The feature variable type name.</returns>
4341
/// <param name="variableType">Variable type.</param>
44-
public static string GetFeatureVariableTypeName(VariableType variableType)
42+
public static string GetFeatureVariableTypeName(string variableType)
4543
{
4644
switch (variableType) {
47-
case FeatureVariable.VariableType.BOOLEAN:
45+
case BOOLEAN_TYPE:
4846
return "GetFeatureVariableBoolean";
49-
case FeatureVariable.VariableType.DOUBLE:
47+
case DOUBLE_TYPE:
5048
return "GetFeatureVariableDouble";
51-
case FeatureVariable.VariableType.INTEGER:
49+
case INTEGER_TYPE:
5250
return "GetFeatureVariableInteger";
53-
case FeatureVariable.VariableType.STRING:
51+
case STRING_TYPE:
5452
return "GetFeatureVariableString";
5553
default:
5654
return null;

OptimizelySDK/Optimizely.cs

Lines changed: 10 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -515,7 +515,7 @@ public virtual bool IsFeatureEnabled(string featureKey, string userId, UserAttri
515515
/// <param name="variableType">Variable type</param>
516516
/// <returns>string | null Feature variable value</returns>
517517
public virtual T GetFeatureVariableValueForType<T>(string featureKey, string variableKey, string userId,
518-
UserAttributes userAttributes, FeatureVariable.VariableType variableType)
518+
UserAttributes userAttributes, string variableType)
519519
{
520520

521521
var config = ProjectConfigManager?.GetConfig();
@@ -620,7 +620,7 @@ public virtual T GetFeatureVariableValueForType<T>(string featureKey, string var
620620
/// <returns>bool | Feature variable value or null</returns>
621621
public bool? GetFeatureVariableBoolean(string featureKey, string variableKey, string userId, UserAttributes userAttributes = null)
622622
{
623-
return GetFeatureVariableValueForType<bool?>(featureKey, variableKey, userId, userAttributes, FeatureVariable.VariableType.BOOLEAN);
623+
return GetFeatureVariableValueForType<bool?>(featureKey, variableKey, userId, userAttributes, FeatureVariable.BOOLEAN_TYPE);
624624
}
625625

626626
/// <summary>
@@ -633,7 +633,7 @@ public virtual T GetFeatureVariableValueForType<T>(string featureKey, string var
633633
/// <returns>double | Feature variable value or null</returns>
634634
public double? GetFeatureVariableDouble(string featureKey, string variableKey, string userId, UserAttributes userAttributes = null)
635635
{
636-
return GetFeatureVariableValueForType<double?>(featureKey, variableKey, userId, userAttributes, FeatureVariable.VariableType.DOUBLE);
636+
return GetFeatureVariableValueForType<double?>(featureKey, variableKey, userId, userAttributes, FeatureVariable.DOUBLE_TYPE);
637637
}
638638

639639
/// <summary>
@@ -646,7 +646,7 @@ public virtual T GetFeatureVariableValueForType<T>(string featureKey, string var
646646
/// <returns>int | Feature variable value or null</returns>
647647
public int? GetFeatureVariableInteger(string featureKey, string variableKey, string userId, UserAttributes userAttributes = null)
648648
{
649-
return GetFeatureVariableValueForType<int?>(featureKey, variableKey, userId, userAttributes, FeatureVariable.VariableType.INTEGER);
649+
return GetFeatureVariableValueForType<int?>(featureKey, variableKey, userId, userAttributes, FeatureVariable.INTEGER_TYPE);
650650
}
651651

652652
/// <summary>
@@ -659,7 +659,7 @@ public virtual T GetFeatureVariableValueForType<T>(string featureKey, string var
659659
/// <returns>string | Feature variable value or null</returns>
660660
public string GetFeatureVariableString(string featureKey, string variableKey, string userId, UserAttributes userAttributes = null)
661661
{
662-
return GetFeatureVariableValueForType<string>(featureKey, variableKey, userId, userAttributes, FeatureVariable.VariableType.STRING);
662+
return GetFeatureVariableValueForType<string>(featureKey, variableKey, userId, userAttributes, FeatureVariable.STRING_TYPE);
663663
}
664664

665665
/// <summary>
@@ -786,24 +786,24 @@ private bool ValidateStringInputs(Dictionary<string, string> inputs)
786786
return isValid;
787787
}
788788

789-
private object GetTypeCastedVariableValue(string value, FeatureVariable.VariableType type)
789+
private object GetTypeCastedVariableValue(string value, string type)
790790
{
791791
object result = null;
792792
switch (type)
793793
{
794-
case FeatureVariable.VariableType.BOOLEAN:
794+
case FeatureVariable.BOOLEAN_TYPE:
795795
bool.TryParse(value, out bool booleanValue);
796796
result = booleanValue;
797797
break;
798-
case FeatureVariable.VariableType.DOUBLE:
798+
case FeatureVariable.DOUBLE_TYPE:
799799
double.TryParse(value, System.Globalization.NumberStyles.Number, System.Globalization.CultureInfo.InvariantCulture, out double doubleValue);
800800
result = doubleValue;
801801
break;
802-
case FeatureVariable.VariableType.INTEGER:
802+
case FeatureVariable.INTEGER_TYPE:
803803
int.TryParse(value, out int intValue);
804804
result = intValue;
805805
break;
806-
case FeatureVariable.VariableType.STRING:
806+
case FeatureVariable.STRING_TYPE:
807807
result = value;
808808
break;
809809
}

0 commit comments

Comments
 (0)