@@ -38,6 +38,7 @@ public class OptimizelyTest
3838 private ProjectConfig Config ;
3939 private Mock < EventBuilder > EventBuilderMock ;
4040 private Mock < IErrorHandler > ErrorHandlerMock ;
41+ private Mock < IEventDispatcher > EventDispatcherMock ;
4142 private Optimizely Optimizely ;
4243 private IEventDispatcher EventDispatcher ;
4344 private const string TestUserId = "testUserId" ;
@@ -73,19 +74,19 @@ public void Initialize()
7374 logger : LoggerMock . Object ,
7475 errorHandler : new NoOpErrorHandler ( ) ) ;
7576
76- EventDispatcher = new ValidEventDispatcher ( ) ;
77- Optimizely = new Optimizely ( TestData . Datafile , EventDispatcher , LoggerMock . Object , ErrorHandlerMock . Object ) ;
77+ EventDispatcherMock = new Mock < IEventDispatcher > ( ) ;
78+ Optimizely = new Optimizely ( TestData . Datafile , EventDispatcherMock . Object , LoggerMock . Object , ErrorHandlerMock . Object ) ;
7879
7980 Helper = new OptimizelyHelper
8081 {
8182 Datafile = TestData . Datafile ,
82- EventDispatcher = EventDispatcher ,
83+ EventDispatcher = EventDispatcherMock . Object ,
8384 Logger = LoggerMock . Object ,
8485 ErrorHandler = ErrorHandlerMock . Object ,
8586 SkipJsonValidation = false ,
8687 } ;
8788
88- OptimizelyMock = new Mock < Optimizely > ( TestData . Datafile , EventDispatcher , LoggerMock . Object , ErrorHandlerMock . Object , null , false )
89+ OptimizelyMock = new Mock < Optimizely > ( TestData . Datafile , EventDispatcherMock . Object , LoggerMock . Object , ErrorHandlerMock . Object , null , false )
8990 {
9091 CallBase = true
9192 } ;
@@ -1539,6 +1540,34 @@ public void TestIsFeatureEnabledGivenFeatureFlagIsEnabledAndUserIsBeingExperimen
15391540 $@ "Feature flag ""{ featureKey } "" is enabled for user ""{ TestUserId } "".") ) ;
15401541 }
15411542
1543+ // Should return false and send an impression event when feature is enabled for the user
1544+ // and user is being experimented.
1545+ [ Test ]
1546+ public void TestIsFeatureEnabledGivenFeatureFlagIsNotEnabledAndUserIsBeingExperimented ( )
1547+ {
1548+ var featureKey = "double_single_variable_feature" ;
1549+ var experiment = Config . GetExperimentFromKey ( "test_experiment_double_feature" ) ;
1550+ var variation = Config . GetVariationFromKey ( "test_experiment_double_feature" , "variation" ) ;
1551+ var featureFlag = Config . GetFeatureFlagFromKey ( featureKey ) ;
1552+ var decision = new FeatureDecision ( experiment , variation , FeatureDecision . DECISION_SOURCE_EXPERIMENT ) ;
1553+
1554+ DecisionServiceMock . Setup ( ds => ds . GetVariationForFeature ( featureFlag , TestUserId , null ) ) . Returns ( decision ) ;
1555+
1556+ var optly = Helper . CreatePrivateOptimizely ( ) ;
1557+ optly . SetFieldOrProperty ( "DecisionService" , DecisionServiceMock . Object ) ;
1558+
1559+ bool result = ( bool ) optly . Invoke ( "IsFeatureEnabled" , featureKey , TestUserId , null ) ;
1560+ Assert . False ( result ) ;
1561+
1562+ // SendImpressionEvent() gets called.
1563+ LoggerMock . Verify ( l => l . Log ( LogLevel . INFO ,
1564+ $@ "The user ""{ TestUserId } "" is not being experimented on feature ""{ featureKey } "".") , Times . Never ) ;
1565+
1566+ LoggerMock . Verify ( l => l . Log ( LogLevel . INFO ,
1567+ $@ "Feature flag ""{ featureKey } "" is not enabled for user ""{ TestUserId } "".") ) ;
1568+ EventDispatcherMock . Verify ( dispatcher => dispatcher . DispatchEvent ( It . IsAny < LogEvent > ( ) ) ) ;
1569+ }
1570+
15421571 // Verify that IsFeatureEnabled returns true if a variation does not get found in the feature
15431572 // flag experiment but found in the rollout rule.
15441573 [ Test ]
@@ -1811,36 +1840,52 @@ public void TestGetEnabledFeaturesWithSomeFeaturesEnabledForUser()
18111840 Array . ForEach ( notEnabledFeatures , nef => CollectionAssert . DoesNotContain ( actualFeaturesList , nef ) ) ;
18121841 }
18131842
1843+ #endregion // Test GetEnabledFeatures
1844+
1845+ #region Test ValidateStringInputs
1846+
18141847 [ Test ]
1815- public void TestGetEnabledFeaturesReturnsSortedList ( )
1848+ public void TestActivateValidateInputValues ( )
18161849 {
1817- string [ ] unsortedFeaturesList =
1818- {
1819- "double_single_variable_feature" ,
1820- "boolean_feature" ,
1821- "string_single_variable_feature" ,
1822- "multi_variate_feature" ,
1823- "empty_feature" ,
1824- "boolean_single_variable_feature"
1825- } ;
1826- string [ ] sortedFeaturesList =
1827- {
1828- "boolean_feature" ,
1829- "boolean_single_variable_feature" ,
1830- "double_single_variable_feature" ,
1831- "empty_feature" ,
1832- "multi_variate_feature" ,
1833- "string_single_variable_feature" ,
1834- } ;
1835-
1836- OptimizelyMock . Setup ( om => om . IsFeatureEnabled ( It . IsIn < string > ( unsortedFeaturesList ) , TestUserId ,
1837- It . IsAny < UserAttributes > ( ) ) ) . Returns ( true ) ;
1850+ // Verify that ValidateStringInputs does not log error for valid values.
1851+ var variation = Optimizely . Activate ( "test_experiment" , "test_user" ) ;
1852+ LoggerMock . Verify ( l => l . Log ( LogLevel . ERROR , "Provided User Id is in invalid format." ) , Times . Never ) ;
1853+ LoggerMock . Verify ( l => l . Log ( LogLevel . ERROR , "Provided Experiment Key is in invalid format." ) , Times . Never ) ;
18381854
1839- // Verify that returned list in sorterd in ascending order.
1840- var actualFeaturesList = OptimizelyMock . Object . GetEnabledFeatures ( TestUserId , null ) ;
1841- CollectionAssert . AreEqual ( sortedFeaturesList , actualFeaturesList ) ;
1855+ // Verify that ValidateStringInputs logs error for invalid values.
1856+ variation = Optimizely . Activate ( "" , null ) ;
1857+ LoggerMock . Verify ( l => l . Log ( LogLevel . ERROR , "Provided User Id is in invalid format." ) , Times . Once ) ;
1858+ LoggerMock . Verify ( l => l . Log ( LogLevel . ERROR , "Provided Experiment Key is in invalid format." ) , Times . Once ) ;
18421859 }
18431860
1844- #endregion // Test GetEnabledFeatures
1861+ [ Test ]
1862+ public void TestGetVariationValidateInputValues ( )
1863+ {
1864+ // Verify that ValidateStringInputs does not log error for valid values.
1865+ var variation = Optimizely . GetVariation ( "test_experiment" , "test_user" ) ;
1866+ LoggerMock . Verify ( l => l . Log ( LogLevel . ERROR , "Provided User Id is in invalid format." ) , Times . Never ) ;
1867+ LoggerMock . Verify ( l => l . Log ( LogLevel . ERROR , "Provided Experiment Key is in invalid format." ) , Times . Never ) ;
1868+
1869+ // Verify that ValidateStringInputs logs error for invalid values.
1870+ variation = Optimizely . GetVariation ( "" , null ) ;
1871+ LoggerMock . Verify ( l => l . Log ( LogLevel . ERROR , "Provided User Id is in invalid format." ) , Times . Once ) ;
1872+ LoggerMock . Verify ( l => l . Log ( LogLevel . ERROR , "Provided Experiment Key is in invalid format." ) , Times . Once ) ;
1873+ }
1874+
1875+ [ Test ]
1876+ public void TestTrackValidateInputValues ( )
1877+ {
1878+ // Verify that ValidateStringInputs does not log error for valid values.
1879+ Optimizely . Track ( "purchase" , "test_user" ) ;
1880+ LoggerMock . Verify ( l => l . Log ( LogLevel . ERROR , "Provided User Id is in invalid format." ) , Times . Never ) ;
1881+ LoggerMock . Verify ( l => l . Log ( LogLevel . ERROR , "Provided Event Key is in invalid format." ) , Times . Never ) ;
1882+
1883+ // Verify that ValidateStringInputs logs error for invalid values.
1884+ Optimizely . Track ( "" , null ) ;
1885+ LoggerMock . Verify ( l => l . Log ( LogLevel . ERROR , "Provided User Id is in invalid format." ) , Times . Once ) ;
1886+ LoggerMock . Verify ( l => l . Log ( LogLevel . ERROR , "Provided Event Key is in invalid format." ) , Times . Once ) ;
1887+ }
1888+
1889+ #endregion // Test ValidateStringInputs
18451890 }
18461891}
0 commit comments