def test_set_config__twice__with_same_content(self): """ Test calling set_config twice with same content to ensure config is not updated. """ test_datafile = json.dumps(self.config_dict_with_features) mock_logger = mock.Mock() mock_notification_center = mock.Mock() with mock.patch('optimizely.config_manager.BaseConfigManager._validate_instantiation_options'), \ mock.patch('optimizely.optimizely_config.OptimizelyConfigService.get_config') as mock_opt_service: project_config_manager = config_manager.StaticConfigManager( datafile=test_datafile, logger=mock_logger, notification_center=mock_notification_center, ) project_config_manager._set_config(test_datafile) mock_logger.debug.assert_called_with( 'Received new datafile and updated config. ' 'Old revision number: None. New revision number: 1.') self.assertEqual(1, mock_logger.debug.call_count) mock_notification_center.send_notifications.assert_called_once_with( 'OPTIMIZELY_CONFIG_UPDATE') self.assertEqual(1, mock_opt_service.call_count) mock_logger.reset_mock() mock_notification_center.reset_mock() mock_opt_service.reset_mock() # Call set config again and confirm that no new log message denoting config update is there project_config_manager._set_config(test_datafile) self.assertEqual(0, mock_logger.debug.call_count) self.assertEqual(0, mock_notification_center.call_count) # Assert that mock_opt_service is not called again. self.assertEqual(0, mock_opt_service.call_count)
def test_init__invalid_notification_center_fails(self): """ Test that initialization fails if notification_center is invalid. """ class InvalidNotificationCenter(object): pass with self.assertRaisesRegexp(optimizely_exceptions.InvalidInputException, 'Provided "notification_center" is in an invalid format.'): config_manager.StaticConfigManager(notification_center=InvalidNotificationCenter())
def test_set_config__unsupported_datafile_version(self): """ Test set_config when datafile has unsupported version. """ test_datafile = json.dumps(self.config_dict_with_features) mock_logger = mock.Mock() mock_notification_center = mock.Mock() with mock.patch( 'optimizely.config_manager.BaseConfigManager._validate_instantiation_options' ): project_config_manager = config_manager.StaticConfigManager( datafile=test_datafile, logger=mock_logger, notification_center=mock_notification_center, ) invalid_version_datafile = self.config_dict_with_features.copy() invalid_version_datafile['version'] = 'invalid_version' test_datafile = json.dumps(invalid_version_datafile) # Call set_config with datafile having invalid version project_config_manager._set_config(test_datafile) mock_logger.error.assert_called_once_with( 'This version of the Python SDK does not support ' 'the given datafile version: "invalid_version".') self.assertEqual(0, mock_notification_center.call_count)
def test_init__invalid_error_handler_fails(self): """ Test that initialization fails if error_handler is invalid. """ class InvalidErrorHandler(object): pass with self.assertRaisesRegexp(optimizely_exceptions.InvalidInputException, 'Provided "error_handler" is in an invalid format.'): config_manager.StaticConfigManager(error_handler=InvalidErrorHandler())
def test_get_config(self): """ Test get_config. """ test_datafile = json.dumps(self.config_dict_with_features) project_config_manager = config_manager.StaticConfigManager(datafile=test_datafile) # Assert that config is set. self.assertIsInstance(project_config_manager.get_config(), project_config.ProjectConfig)
def test_init__invalid_logger_fails(self): """ Test that initialization fails if logger is invalid. """ class InvalidLogger(object): pass with self.assertRaisesRegex( optimizely_exceptions.InvalidInputException, 'Provided "logger" is in an invalid format.', ): config_manager.StaticConfigManager(logger=InvalidLogger())
def test_set_config__schema_validation(self): """ Test set_config calls or does not call schema validation based on skip_json_validation value. """ test_datafile = json.dumps(self.config_dict_with_features) mock_logger = mock.Mock() # Test that schema is validated. # Note: set_config is called in __init__ itself. with mock.patch('optimizely.helpers.validator.is_datafile_valid', return_value=True) as mock_validate_datafile: config_manager.StaticConfigManager(datafile=test_datafile, logger=mock_logger) mock_validate_datafile.assert_called_once_with(test_datafile) # Test that schema is not validated if skip_json_validation option is set to True. with mock.patch('optimizely.helpers.validator.is_datafile_valid', return_value=True) as mock_validate_datafile: config_manager.StaticConfigManager(datafile=test_datafile, logger=mock_logger, skip_json_validation=True) mock_validate_datafile.assert_not_called()
def test_set_config__success(self): """ Test set_config when datafile is valid. """ test_datafile = json.dumps(self.config_dict_with_features) mock_logger = mock.Mock() mock_notification_center = mock.Mock() with mock.patch('optimizely.config_manager.BaseConfigManager._validate_instantiation_options'): project_config_manager = config_manager.StaticConfigManager(datafile=test_datafile, logger=mock_logger, notification_center=mock_notification_center) project_config_manager._set_config(test_datafile) mock_logger.debug.assert_called_with('Received new datafile and updated config. ' 'Old revision number: None. New revision number: 1.') mock_notification_center.send_notifications.assert_called_once_with('OPTIMIZELY_CONFIG_UPDATE')
def test_set_config__invalid_datafile(self): """ Test set_config when datafile is invalid. """ test_datafile = json.dumps(self.config_dict_with_features) mock_logger = mock.Mock() mock_notification_center = mock.Mock() with mock.patch('optimizely.config_manager.BaseConfigManager._validate_instantiation_options'): project_config_manager = config_manager.StaticConfigManager(datafile=test_datafile, logger=mock_logger, notification_center=mock_notification_center) # Call set_config with invalid content project_config_manager._set_config('invalid_datafile') mock_logger.error.assert_called_once_with('Provided "datafile" is in an invalid format.') self.assertEqual(0, mock_notification_center.call_count)
def test_set_config__twice__with_diff_content(self): """ Test calling set_config twice with different content to ensure config is updated. """ test_datafile = json.dumps(self.config_dict_with_features) mock_logger = mock.Mock() mock_notification_center = mock.Mock() with mock.patch( 'optimizely.config_manager.BaseConfigManager._validate_instantiation_options' ): project_config_manager = config_manager.StaticConfigManager( datafile=test_datafile, logger=mock_logger, notification_center=mock_notification_center, ) mock_logger.debug.assert_called_with( 'Received new datafile and updated config. ' 'Old revision number: None. New revision number: 1.') self.assertEqual(1, mock_logger.debug.call_count) mock_notification_center.send_notifications.assert_called_once_with( 'OPTIMIZELY_CONFIG_UPDATE') self.assertEqual('1', project_config_manager.optimizely_config.revision) mock_logger.reset_mock() mock_notification_center.reset_mock() # Call set config again other_datafile = json.dumps(self.config_dict_with_multiple_experiments) project_config_manager._set_config(other_datafile) mock_logger.debug.assert_called_with( 'Received new datafile and updated config. ' 'Old revision number: 1. New revision number: 42.') self.assertEqual(1, mock_logger.debug.call_count) mock_notification_center.send_notifications.assert_called_once_with( 'OPTIMIZELY_CONFIG_UPDATE') self.assertEqual('42', project_config_manager.optimizely_config.revision)