@@ -1285,12 +1285,8 @@ def test_track__invalid_user_id(self):
12851285 """ Test that None is returned and expected log messages are logged during track \
12861286 when user_id is in invalid format. """
12871287
1288- with mock .patch .object (self .optimizely , 'logger' ) as mock_client_logging , \
1289- mock .patch ('optimizely.helpers.validator.is_non_empty_string' , side_effect = [True , False ]) as mock_validator :
1288+ with mock .patch .object (self .optimizely , 'logger' ) as mock_client_logging :
12901289 self .assertIsNone (self .optimizely .track ('test_event' , 99 ))
1291-
1292- mock_validator .assert_any_call (99 )
1293-
12941290 mock_client_logging .error .assert_called_once_with ('Provided "user_id" is in an invalid format.' )
12951291
12961292 def test_get_variation__invalid_object (self ):
@@ -1329,11 +1325,8 @@ def test_is_feature_enabled__returns_false_for_invalid_user_id(self):
13291325
13301326 opt_obj = optimizely .Optimizely (json .dumps (self .config_dict_with_features ))
13311327
1332- with mock .patch .object (opt_obj , 'logger' ) as mock_client_logging ,\
1333- mock .patch ('optimizely.helpers.validator.is_non_empty_string' , side_effect = [True , False ]) as mock_validator :
1328+ with mock .patch .object (opt_obj , 'logger' ) as mock_client_logging :
13341329 self .assertFalse (opt_obj .is_feature_enabled ('feature_key' , 1.2 ))
1335-
1336- mock_validator .assert_any_call (1.2 )
13371330 mock_client_logging .error .assert_called_with ('Provided "user_id" is in an invalid format.' )
13381331
13391332 def test_is_feature_enabled__returns_false_for__invalid_attributes (self ):
@@ -1628,11 +1621,9 @@ def side_effect(*args, **kwargs):
16281621 mock_is_feature_enabled .assert_any_call ('test_feature_in_experiment_and_rollout' , 'user_1' , None )
16291622
16301623 def test_get_enabled_features_invalid_user_id (self ):
1631- with mock .patch .object (self .optimizely , 'logger' ) as mock_client_logging , \
1632- mock .patch ('optimizely.helpers.validator.is_non_empty_string' , return_value = False ) as mock_validator :
1633- self .optimizely .get_enabled_features (1.2 )
1624+ with mock .patch .object (self .optimizely , 'logger' ) as mock_client_logging :
1625+ self .assertEqual ([], self .optimizely .get_enabled_features (1.2 ))
16341626
1635- mock_validator .assert_any_call (1.2 )
16361627 mock_client_logging .error .assert_called_once_with ('Provided "user_id" is in an invalid format.' )
16371628
16381629 def test_get_enabled_features__invalid_attributes (self ):
@@ -1853,22 +1844,22 @@ def test_get_feature_variable__returns_none_if_none_feature_key(self):
18531844 with mock .patch .object (opt_obj , 'logger' ) as mock_client_logger :
18541845 # Check for booleans
18551846 self .assertIsNone (opt_obj .get_feature_variable_boolean (None , 'variable_key' , 'test_user' ))
1856- mock_client_logger .error .assert_called_with (enums . Errors . NONE_FEATURE_KEY_PARAMETER )
1847+ mock_client_logger .error .assert_called_with ('Provided "feature_key" is in an invalid format.' )
18571848 mock_client_logger .reset_mock ()
18581849
18591850 # Check for doubles
18601851 self .assertIsNone (opt_obj .get_feature_variable_double (None , 'variable_key' , 'test_user' ))
1861- mock_client_logger .error .assert_called_with (enums . Errors . NONE_FEATURE_KEY_PARAMETER )
1852+ mock_client_logger .error .assert_called_with ('Provided "feature_key" is in an invalid format.' )
18621853 mock_client_logger .reset_mock ()
18631854
18641855 # Check for integers
18651856 self .assertIsNone (opt_obj .get_feature_variable_integer (None , 'variable_key' , 'test_user' ))
1866- mock_client_logger .error .assert_called_with (enums . Errors . NONE_FEATURE_KEY_PARAMETER )
1857+ mock_client_logger .error .assert_called_with ('Provided "feature_key" is in an invalid format.' )
18671858 mock_client_logger .reset_mock ()
18681859
18691860 # Check for strings
18701861 self .assertIsNone (opt_obj .get_feature_variable_string (None , 'variable_key' , 'test_user' ))
1871- mock_client_logger .error .assert_called_with (enums . Errors . NONE_FEATURE_KEY_PARAMETER )
1862+ mock_client_logger .error .assert_called_with ('Provided "feature_key" is in an invalid format.' )
18721863 mock_client_logger .reset_mock ()
18731864
18741865 def test_get_feature_variable__returns_none_if_none_variable_key (self ):
@@ -1878,22 +1869,22 @@ def test_get_feature_variable__returns_none_if_none_variable_key(self):
18781869 with mock .patch .object (opt_obj , 'logger' ) as mock_client_logger :
18791870 # Check for booleans
18801871 self .assertIsNone (opt_obj .get_feature_variable_boolean ('feature_key' , None , 'test_user' ))
1881- mock_client_logger .error .assert_called_with (enums . Errors . NONE_VARIABLE_KEY_PARAMETER )
1872+ mock_client_logger .error .assert_called_with ('Provided "variable_key" is in an invalid format.' )
18821873 mock_client_logger .reset_mock ()
18831874
18841875 # Check for doubles
18851876 self .assertIsNone (opt_obj .get_feature_variable_double ('feature_key' , None , 'test_user' ))
1886- mock_client_logger .error .assert_called_with (enums . Errors . NONE_VARIABLE_KEY_PARAMETER )
1877+ mock_client_logger .error .assert_called_with ('Provided "variable_key" is in an invalid format.' )
18871878 mock_client_logger .reset_mock ()
18881879
18891880 # Check for integers
18901881 self .assertIsNone (opt_obj .get_feature_variable_integer ('feature_key' , None , 'test_user' ))
1891- mock_client_logger .error .assert_called_with (enums . Errors . NONE_VARIABLE_KEY_PARAMETER )
1882+ mock_client_logger .error .assert_called_with ('Provided "variable_key" is in an invalid format.' )
18921883 mock_client_logger .reset_mock ()
18931884
18941885 # Check for strings
18951886 self .assertIsNone (opt_obj .get_feature_variable_string ('feature_key' , None , 'test-User' ))
1896- mock_client_logger .error .assert_called_with (enums . Errors . NONE_VARIABLE_KEY_PARAMETER )
1887+ mock_client_logger .error .assert_called_with ('Provided "variable_key" is in an invalid format.' )
18971888 mock_client_logger .reset_mock ()
18981889
18991890 def test_get_feature_variable__returns_none_if_none_user_id (self ):
@@ -1903,22 +1894,22 @@ def test_get_feature_variable__returns_none_if_none_user_id(self):
19031894 with mock .patch .object (opt_obj , 'logger' ) as mock_client_logger :
19041895 # Check for booleans
19051896 self .assertIsNone (opt_obj .get_feature_variable_boolean ('feature_key' , 'variable_key' , None ))
1906- mock_client_logger .error .assert_called_with (enums . Errors . NONE_USER_ID_PARAMETER )
1897+ mock_client_logger .error .assert_called_with ('Provided "user_id" is in an invalid format.' )
19071898 mock_client_logger .reset_mock ()
19081899
19091900 # Check for doubles
19101901 self .assertIsNone (opt_obj .get_feature_variable_double ('feature_key' , 'variable_key' , None ))
1911- mock_client_logger .error .assert_called_with (enums . Errors . NONE_USER_ID_PARAMETER )
1902+ mock_client_logger .error .assert_called_with ('Provided "user_id" is in an invalid format.' )
19121903 mock_client_logger .reset_mock ()
19131904
19141905 # Check for integers
19151906 self .assertIsNone (opt_obj .get_feature_variable_integer ('feature_key' , 'variable_key' , None ))
1916- mock_client_logger .error .assert_called_with (enums . Errors . NONE_USER_ID_PARAMETER )
1907+ mock_client_logger .error .assert_called_with ('Provided "user_id" is in an invalid format.' )
19171908 mock_client_logger .reset_mock ()
19181909
19191910 # Check for strings
19201911 self .assertIsNone (opt_obj .get_feature_variable_string ('feature_key' , 'variable_key' , None ))
1921- mock_client_logger .error .assert_called_with (enums . Errors . NONE_USER_ID_PARAMETER )
1912+ mock_client_logger .error .assert_called_with ('Provided "user_id" is in an invalid format.' )
19221913 mock_client_logger .reset_mock ()
19231914
19241915 def test_get_feature_variable__invalid_attributes (self ):
@@ -2246,11 +2237,8 @@ def test_get_variation__invalid_user_id(self):
22462237 """ Test that None is returned and expected log messages are logged during get_variation \
22472238 when user_id is in invalid format. """
22482239
2249- with mock .patch .object (self .optimizely , 'logger' ) as mock_client_logging ,\
2250- mock .patch ('optimizely.helpers.validator.is_non_empty_string' , side_effect = [True , False ]) as mock_validator :
2240+ with mock .patch .object (self .optimizely , 'logger' ) as mock_client_logging :
22512241 self .assertIsNone (self .optimizely .get_variation ('test_experiment' , 99 ))
2252-
2253- mock_validator .assert_any_call (99 )
22542242 mock_client_logging .error .assert_called_once_with ('Provided "user_id" is in an invalid format.' )
22552243
22562244 def test_activate__invalid_experiment_key (self ):
@@ -2269,14 +2257,35 @@ def test_activate__invalid_user_id(self):
22692257 """ Test that None is returned and expected log messages are logged during activate \
22702258 when user_id is in invalid format. """
22712259
2272- with mock .patch .object (self .optimizely , 'logger' ) as mock_client_logging ,\
2273- mock .patch ('optimizely.helpers.validator.is_non_empty_string' , side_effect = [True , False ]) as mock_validator :
2260+ with mock .patch .object (self .optimizely , 'logger' ) as mock_client_logging :
22742261 self .assertIsNone (self .optimizely .activate ('test_experiment' , 99 ))
22752262
2276- mock_validator .assert_any_call (99 )
2277-
22782263 mock_client_logging .error .assert_called_once_with ('Provided "user_id" is in an invalid format.' )
22792264
2265+ def test_activate__empty_user_id (self ):
2266+ """ Test that expected log messages are logged during activate. """
2267+
2268+ variation_key = 'variation'
2269+ experiment_key = 'test_experiment'
2270+ user_id = ''
2271+
2272+ with mock .patch ('optimizely.decision_service.DecisionService.get_variation' ,
2273+ return_value = self .project_config .get_variation_from_id (
2274+ 'test_experiment' , '111129' )), \
2275+ mock .patch ('time.time' , return_value = 42 ), \
2276+ mock .patch ('optimizely.event_dispatcher.EventDispatcher.dispatch_event' ), \
2277+ mock .patch .object (self .optimizely , 'logger' ) as mock_client_logging :
2278+ self .assertEqual (variation_key , self .optimizely .activate (experiment_key , user_id ))
2279+
2280+ mock_client_logging .info .assert_called_once_with (
2281+ 'Activating user "" in experiment "test_experiment".'
2282+ )
2283+ debug_message = mock_client_logging .debug .call_args_list [0 ][0 ][0 ]
2284+ self .assertRegexpMatches (
2285+ debug_message ,
2286+ 'Dispatching impression event to URL https://logx.optimizely.com/v1/events with params'
2287+ )
2288+
22802289 def test_activate__invalid_attributes (self ):
22812290 """ Test that expected log messages are logged during activate when attributes are in invalid format. """
22822291 with mock .patch .object (self .optimizely , 'logger' ) as mock_client_logging :
@@ -2373,3 +2382,64 @@ def test_get_variation__invalid_attributes__forced_bucketing(self):
23732382 'test_user' ,
23742383 attributes = {'test_attribute' : 'test_value_invalid' })
23752384 self .assertEqual ('variation' , variation_key )
2385+
2386+ def test_set_forced_variation__invalid_object (self ):
2387+ """ Test that set_forced_variation logs error if Optimizely object is not created correctly. """
2388+
2389+ opt_obj = optimizely .Optimizely ('invalid_datafile' )
2390+
2391+ with mock .patch .object (opt_obj , 'logger' ) as mock_client_logging :
2392+ self .assertFalse (opt_obj .set_forced_variation ('test_experiment' , 'test_user' , 'test_variation' ))
2393+
2394+ mock_client_logging .error .assert_called_once_with ('Datafile has invalid format. Failing "set_forced_variation".' )
2395+
2396+ def test_set_forced_variation__invalid_experiment_key (self ):
2397+ """ Test that None is returned and expected log messages are logged during set_forced_variation \
2398+ when exp_key is in invalid format. """
2399+
2400+ with mock .patch .object (self .optimizely , 'logger' ) as mock_client_logging , \
2401+ mock .patch ('optimizely.helpers.validator.is_non_empty_string' , return_value = False ) as mock_validator :
2402+ self .assertFalse (self .optimizely .set_forced_variation (99 , 'test_user' , 'variation' ))
2403+
2404+ mock_validator .assert_any_call (99 )
2405+
2406+ mock_client_logging .error .assert_called_once_with ('Provided "experiment_key" is in an invalid format.' )
2407+
2408+ def test_set_forced_variation__invalid_user_id (self ):
2409+ """ Test that None is returned and expected log messages are logged during set_forced_variation \
2410+ when user_id is in invalid format. """
2411+
2412+ with mock .patch .object (self .optimizely , 'logger' ) as mock_client_logging :
2413+ self .assertFalse (self .optimizely .set_forced_variation ('test_experiment' , 99 , 'variation' ))
2414+ mock_client_logging .error .assert_called_once_with ('Provided "user_id" is in an invalid format.' )
2415+
2416+ def test_get_forced_variation__invalid_object (self ):
2417+ """ Test that get_forced_variation logs error if Optimizely object is not created correctly. """
2418+
2419+ opt_obj = optimizely .Optimizely ('invalid_datafile' )
2420+
2421+ with mock .patch .object (opt_obj , 'logger' ) as mock_client_logging :
2422+ self .assertIsNone (opt_obj .get_forced_variation ('test_experiment' , 'test_user' ))
2423+
2424+ mock_client_logging .error .assert_called_once_with ('Datafile has invalid format. Failing "get_forced_variation".' )
2425+
2426+ def test_get_forced_variation__invalid_experiment_key (self ):
2427+ """ Test that None is returned and expected log messages are logged during get_forced_variation \
2428+ when exp_key is in invalid format. """
2429+
2430+ with mock .patch .object (self .optimizely , 'logger' ) as mock_client_logging , \
2431+ mock .patch ('optimizely.helpers.validator.is_non_empty_string' , return_value = False ) as mock_validator :
2432+ self .assertIsNone (self .optimizely .get_forced_variation (99 , 'test_user' ))
2433+
2434+ mock_validator .assert_any_call (99 )
2435+
2436+ mock_client_logging .error .assert_called_once_with ('Provided "experiment_key" is in an invalid format.' )
2437+
2438+ def test_get_forced_variation__invalid_user_id (self ):
2439+ """ Test that None is returned and expected log messages are logged during get_forced_variation \
2440+ when user_id is in invalid format. """
2441+
2442+ with mock .patch .object (self .optimizely , 'logger' ) as mock_client_logging :
2443+ self .assertIsNone (self .optimizely .get_forced_variation ('test_experiment' , 99 ))
2444+
2445+ mock_client_logging .error .assert_called_once_with ('Provided "user_id" is in an invalid format.' )
0 commit comments