"""Test flask extension.""" import json import os from flask import current_app try: # moto>=5.0.0 from moto import mock_aws as mock_secretsmanager except ImportError: # moto<5.0.0 from moto import mock_secretsmanager def test_flask_secrets_manager_get_local(fixture_app, secrets_manager_client): """Test get secrets outside of app context.""" secrets_manager_client.init_app(fixture_app) cred = secrets_manager_client.get_cred('TEST') assert cred is None def test_secrets_manager_no_app_context(secrets_manager_client_no_app_context): os.environ['TEST'] = 'found' cred = secrets_manager_client_no_app_context.get_cred('TEST') assert cred == 'found' def test_flask_secrets_manager_get_local_found( fixture_app, secrets_manager_client): """Test secrets from local ENV.""" os.environ['TEST'] = 'testing' with fixture_app.app_context(): secrets_manager_client.init_app(current_app) cred = secrets_manager_client.get_cred('TEST') assert cred == 'testing' @mock_secretsmanager def test_flask_secrets_manager_get_remote(fixture_app, secrets_manager_client): """Test secrets from AWS.""" fixture_app.config['ENVIRONMENT'] = 'prod' with fixture_app.app_context(): var_to_secret_name = { 'AR_DB_NAME': 'ar_db_username', } secrets_manager_client.init_app( current_app, local_to_remote_name=var_to_secret_name) secrets_manager_client.store_cred('ar_db_username', 'testing') cred = secrets_manager_client.get_cred('AR_DB_NAME') assert cred == 'testing' secrets_manager_client.store_cred('ar_db_username', 1) cred = secrets_manager_client.get_cred('AR_DB_NAME') assert cred == 1 secrets = {'key_1': 'value_1', 'key_2': 'value_2'} secrets_manager_client.get_client().create_secret( Name='prod/test/secrets', SecretString=json.dumps(secrets) ) cred = secrets_manager_client.get_cred('secrets') assert cred == secrets assert type(cred) is dict @mock_secretsmanager def test_flask_secrets_manager_get_remote_no_config( fixture_app_no_config, secrets_manager_client): """Test flask secrets manager. We try and get a secret using env_var_to_secret_name but that only applies to prod and since we are in dev it gets the literal env var. """ with fixture_app_no_config.app_context(): var_to_secret_name = { 'AR_DB_NAME': 'ar_db_username', } secrets_manager_client.init_app( current_app, env_var_to_secret_name=var_to_secret_name) secrets_manager_client.store_cred('ar_db_username', 'testing') cred = secrets_manager_client.get_cred('ar_db_username') assert cred == 'testing' @mock_secretsmanager def test_flask_secrets_manager_force_remote( fixture_app, secrets_manager_client): """Test secrets from AWS.""" fixture_app.config['ENVIRONMENT'] = 'dev' with fixture_app.app_context(): secrets_manager_client.init_app(current_app, force_remote=True) secrets_manager_client.get_client().create_secret( Name='dev/test/test_key', SecretString='testing' ) cred = secrets_manager_client.get_cred('test_key') assert cred == 'testing'