@@ -38,6 +38,7 @@ public class OptimizelyTest
38
38
private ProjectConfig Config ;
39
39
private Mock < EventBuilder > EventBuilderMock ;
40
40
private Mock < IErrorHandler > ErrorHandlerMock ;
41
+ private Mock < IEventDispatcher > EventDispatcherMock ;
41
42
private Optimizely Optimizely ;
42
43
private IEventDispatcher EventDispatcher ;
43
44
private const string TestUserId = "testUserId" ;
@@ -73,19 +74,19 @@ public void Initialize()
73
74
logger : LoggerMock . Object ,
74
75
errorHandler : new NoOpErrorHandler ( ) ) ;
75
76
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 ) ;
78
79
79
80
Helper = new OptimizelyHelper
80
81
{
81
82
Datafile = TestData . Datafile ,
82
- EventDispatcher = EventDispatcher ,
83
+ EventDispatcher = EventDispatcherMock . Object ,
83
84
Logger = LoggerMock . Object ,
84
85
ErrorHandler = ErrorHandlerMock . Object ,
85
86
SkipJsonValidation = false ,
86
87
} ;
87
88
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 )
89
90
{
90
91
CallBase = true
91
92
} ;
@@ -1539,6 +1540,34 @@ public void TestIsFeatureEnabledGivenFeatureFlagIsEnabledAndUserIsBeingExperimen
1539
1540
$@ "Feature flag ""{ featureKey } "" is enabled for user ""{ TestUserId } "".") ) ;
1540
1541
}
1541
1542
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
+
1542
1571
// Verify that IsFeatureEnabled returns true if a variation does not get found in the feature
1543
1572
// flag experiment but found in the rollout rule.
1544
1573
[ Test ]
@@ -1811,36 +1840,52 @@ public void TestGetEnabledFeaturesWithSomeFeaturesEnabledForUser()
1811
1840
Array . ForEach ( notEnabledFeatures , nef => CollectionAssert . DoesNotContain ( actualFeaturesList , nef ) ) ;
1812
1841
}
1813
1842
1843
+ #endregion // Test GetEnabledFeatures
1844
+
1845
+ #region Test ValidateStringInputs
1846
+
1814
1847
[ Test ]
1815
- public void TestGetEnabledFeaturesReturnsSortedList ( )
1848
+ public void TestActivateValidateInputValues ( )
1816
1849
{
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 ) ;
1838
1854
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 ) ;
1842
1859
}
1843
1860
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
1845
1890
}
1846
1891
}
0 commit comments