From f7e71c7cfdcc5447f40e562fe17100218e2a99e5 Mon Sep 17 00:00:00 2001 From: Hippolyte HENRY Date: Tue, 4 Jun 2019 13:59:06 +0200 Subject: [PATCH 1/2] Do not override API parameters with default when calling initialize if they are already set --- datadog/__init__.py | 11 ++-- tests/unit/api/test_api.py | 120 +++++++++++++++++++++---------------- 2 files changed, 73 insertions(+), 58 deletions(-) diff --git a/datadog/__init__.py b/datadog/__init__.py index 6935a8372..f0087f2fc 100644 --- a/datadog/__init__.py +++ b/datadog/__init__.py @@ -70,11 +70,10 @@ def initialize(api_key=None, app_key=None, host_name=None, api_host=None, :type mute: boolean """ # API configuration - api._api_key = api_key if api_key is not None else os.environ.get('DATADOG_API_KEY') - api._application_key = app_key if app_key is not None else os.environ.get('DATADOG_APP_KEY') - api._host_name = host_name if host_name is not None else get_hostname() - api._api_host = api_host if api_host is not None else \ - os.environ.get('DATADOG_HOST', 'https://api.datadoghq.com') + api._api_key = api_key or api._api_key or os.environ.get('DATADOG_API_KEY') + api._application_key = app_key or api._application_key or os.environ.get('DATADOG_APP_KEY') + api._host_name = host_name or api._host_name or get_hostname() + api._api_host = api_host or api._api_host or os.environ.get('DATADOG_HOST', 'https://api.datadoghq.com') # Statsd configuration # ...overrides the default `statsd` instance attributes @@ -90,5 +89,5 @@ def initialize(api_key=None, app_key=None, host_name=None, api_host=None, # HTTP client and API options for key, value in iteritems(kwargs): - attribute = "_{0}".format(key) + attribute = "_{}".format(key) setattr(api, attribute, value) diff --git a/tests/unit/api/test_api.py b/tests/unit/api/test_api.py index 1de68d183..0b2b3c9ff 100644 --- a/tests/unit/api/test_api.py +++ b/tests/unit/api/test_api.py @@ -9,7 +9,7 @@ import mock # datadog -from datadog import initialize, api +from datadog import initialize, api, util from datadog.api import ( Distribution, Metric, @@ -147,57 +147,73 @@ def test_initialize_options(self): initialize(api_key=API_KEY, mute=False) self.assertRaises(ApiError, MyCreatable.create) - def test_initialization_from_env(self): - """ - Set API parameters in `initialize` from environment variables. - """ - @preserve_environ_datadog - def test_api_params_from_env(env_name, attr_name, env_value): - """ - Set env_name environment variable to env_value - Assert api.attr_name = env_value - """ - os.environ[env_name] = env_value - initialize() - self.assertEqual(getattr(api, attr_name), env_value) - - @preserve_environ_datadog - def test_api_params_default(env_name, attr_name, expected_value): - """ - Unset env_name environment variable - Assert api.attr_name = expected_value - """ - if os.environ.get(env_name): - del os.environ[env_name] - initialize() - self.assertEqual(getattr(api, attr_name), expected_value) - - @preserve_environ_datadog - def test_api_params_from_params(env_name, parameter, attr_name, value): - """ - Unset env_name environment variable - Initialize API with parameter=value - Assert api.attr_name = value - """ - if os.environ.get(env_name): - del os.environ[env_name] - initialize(api_host='http://localhost') - self.assertEqual(api._api_host, 'http://localhost') - - # Default values - test_api_params_default("DATADOG_API_KEY", "_api_key", None) - test_api_params_default("DATADOG_APP_KEY", "_application_key", None) - test_api_params_default("DATADOG_HOST", "_api_host", "https://api.datadoghq.com") - - # From environment - test_api_params_from_env("DATADOG_API_KEY", "_api_key", env_value="apikey") - test_api_params_from_env("DATADOG_APP_KEY", "_application_key", env_value="appkey") - test_api_params_from_env("DATADOG_HOST", "_api_host", env_value="http://localhost") - - # From parameters - test_api_params_from_params("DATADOG_API_KEY", "api_key", "_api_key", "apikey2") - test_api_params_from_params("DATADOG_APP_KEY", "app_key", "_application_key", "appkey2") - test_api_params_from_params("DATADOG_HOST", "api_host", "_api_host", "http://127.0.0.1") + def test_default_values(self): + initialize() + + self.assertIsNone(api._api_key) + self.assertIsNone(api._application_key) + self.assertEqual(api._api_host, "https://api.datadoghq.com") + self.assertEqual(api._host_name, util.hostname.get_hostname()) + + def test_env_var_values(self): + os.environ["DATADOG_API_KEY"] = "API_KEY_ENV" + os.environ["DATADOG_APP_KEY"] = "APP_KEY_ENV" + os.environ["DATADOG_HOST"] = "HOST_ENV" + + initialize() + + self.assertEqual(api._api_key, "API_KEY_ENV") + self.assertEqual(api._application_key, "APP_KEY_ENV") + self.assertEqual(api._api_host, "HOST_ENV") + self.assertEqual(api._host_name, util.hostname.get_hostname()) + + del os.environ["DATADOG_API_KEY"] + del os.environ["DATADOG_APP_KEY"] + del os.environ["DATADOG_HOST"] + + def test_function_param_value(self): + initialize(api_key="API_KEY", app_key="APP_KEY", api_host="HOST", host_name="HOSTNAME") + + self.assertEqual(api._api_key, "API_KEY") + self.assertEqual(api._application_key, "APP_KEY") + self.assertEqual(api._api_host, "HOST") + self.assertEqual(api._host_name, "HOSTNAME") + + def test_additional_call(self): + initialize(api_key="API_KEY", app_key="APP_KEY", api_host="HOST", host_name="HOSTNAME") + + self.assertEqual(api._api_key, "API_KEY") + self.assertEqual(api._application_key, "APP_KEY") + self.assertEqual(api._api_host, "HOST") + self.assertEqual(api._host_name, "HOSTNAME") + + initialize(api_key="API_KEY2") + + self.assertEqual(api._api_key, "API_KEY2") + self.assertEqual(api._application_key, "APP_KEY") + self.assertEqual(api._api_host, "HOST") + self.assertEqual(api._host_name, "HOSTNAME") + + initialize(app_key="APP_KEY2") + + self.assertEqual(api._api_key, "API_KEY2") + self.assertEqual(api._application_key, "APP_KEY2") + self.assertEqual(api._api_host, "HOST") + self.assertEqual(api._host_name, "HOSTNAME") + + initialize(api_host="HOST2") + + self.assertEqual(api._api_key, "API_KEY2") + self.assertEqual(api._application_key, "APP_KEY2") + self.assertEqual(api._api_host, "HOST2") + self.assertEqual(api._host_name, "HOSTNAME") + + initialize(host_name="HOSTNAME2") + + self.assertEqual(api._api_key, "API_KEY2") + self.assertEqual(api._application_key, "APP_KEY2") + self.assertEqual(api._api_host, "HOST2") + self.assertEqual(api._host_name, "HOSTNAME2") class TestResources(DatadogAPIWithInitialization): From ea5665e559caa929fc2457c7207f48122f2a1e9d Mon Sep 17 00:00:00 2001 From: Hippolyte HENRY Date: Tue, 4 Jun 2019 16:53:38 +0200 Subject: [PATCH 2/2] Test precedence order --- tests/unit/api/test_api.py | 62 ++++++++++++-------------------------- 1 file changed, 20 insertions(+), 42 deletions(-) diff --git a/tests/unit/api/test_api.py b/tests/unit/api/test_api.py index 0b2b3c9ff..cd7864ede 100644 --- a/tests/unit/api/test_api.py +++ b/tests/unit/api/test_api.py @@ -38,25 +38,6 @@ ) -def preserve_environ_datadog(func): - """ - Decorator to preserve the original environment value. - """ - @wraps(func) - def wrapper(env_name, *args, **kwds): - environ_api_param = os.environ.get(env_name) - try: - return func(env_name, *args, **kwds) - finally: - # restore the original environ value - if environ_api_param: - os.environ[env_name] = environ_api_param - elif os.environ.get(env_name): - del os.environ[env_name] - - return wrapper - - class TestInitialization(DatadogAPINoInitialization): def test_no_initialization_fails(self): @@ -179,7 +160,20 @@ def test_function_param_value(self): self.assertEqual(api._api_host, "HOST") self.assertEqual(api._host_name, "HOSTNAME") - def test_additional_call(self): + def test_precedence(self): + # Initialize first with env vars + os.environ["DATADOG_API_KEY"] = "API_KEY_ENV" + os.environ["DATADOG_APP_KEY"] = "APP_KEY_ENV" + os.environ["DATADOG_HOST"] = "HOST_ENV" + + initialize() + + self.assertEqual(api._api_key, "API_KEY_ENV") + self.assertEqual(api._application_key, "APP_KEY_ENV") + self.assertEqual(api._api_host, "HOST_ENV") + self.assertEqual(api._host_name, util.hostname.get_hostname()) + + # Initialize again to check given parameters take precedence over already set value and env vars initialize(api_key="API_KEY", app_key="APP_KEY", api_host="HOST", host_name="HOSTNAME") self.assertEqual(api._api_key, "API_KEY") @@ -187,33 +181,17 @@ def test_additional_call(self): self.assertEqual(api._api_host, "HOST") self.assertEqual(api._host_name, "HOSTNAME") - initialize(api_key="API_KEY2") + # Initialize again without specifying attributes to check that already initialized value takes precedence + initialize() - self.assertEqual(api._api_key, "API_KEY2") + self.assertEqual(api._api_key, "API_KEY") self.assertEqual(api._application_key, "APP_KEY") self.assertEqual(api._api_host, "HOST") self.assertEqual(api._host_name, "HOSTNAME") - initialize(app_key="APP_KEY2") - - self.assertEqual(api._api_key, "API_KEY2") - self.assertEqual(api._application_key, "APP_KEY2") - self.assertEqual(api._api_host, "HOST") - self.assertEqual(api._host_name, "HOSTNAME") - - initialize(api_host="HOST2") - - self.assertEqual(api._api_key, "API_KEY2") - self.assertEqual(api._application_key, "APP_KEY2") - self.assertEqual(api._api_host, "HOST2") - self.assertEqual(api._host_name, "HOSTNAME") - - initialize(host_name="HOSTNAME2") - - self.assertEqual(api._api_key, "API_KEY2") - self.assertEqual(api._application_key, "APP_KEY2") - self.assertEqual(api._api_host, "HOST2") - self.assertEqual(api._host_name, "HOSTNAME2") + del os.environ["DATADOG_API_KEY"] + del os.environ["DATADOG_APP_KEY"] + del os.environ["DATADOG_HOST"] class TestResources(DatadogAPIWithInitialization):