def test_api_key_file_from_config_with_lesser_loading_order(self):
        """Let's say we load the default configuration, and then
        stormpath.yml file with client.apiKey.file key. Then we provide
        API key ID and secret through environment variables - which
        have greater loading order than the stormpath.yml.
        """
        load_strategies = [
            # 1. We load the default configuration.
            LoadFileConfigStrategy('tests/assets/default_config.yml', must_exist=True),
            LoadAPIKeyConfigStrategy('i-do-not-exist'),
            # 3. We load stormpath.yml file with client.apiKey.file
            LoadFileConfigStrategy('tests/assets/apiKeyFile.yml'),
            LoadAPIKeyConfigStrategy('i-do-not-exist'),
            LoadFileConfigStrategy('i-do-not-exist'),
            # 6. We load API key id and secret from environment
            #    variables.
            LoadEnvConfigStrategy(prefix='STORMPATH'),
            ExtendConfigStrategy(extend_with={})
        ]
        post_processing_strategies = [LoadAPIKeyFromConfigStrategy()]
        validation_strategies = [ValidateClientConfigStrategy()]

        cl = ConfigLoader(load_strategies, post_processing_strategies, validation_strategies)
        config = cl.load()

        self.assertEqual(config['client']['apiKey']['id'], 'greater order id')
        self.assertEqual(config['client']['apiKey']['secret'], 'greater order secret')
        self.assertFalse('file' in config['client']['apiKey'])
    def test_api_key_from_config_with_lesser_loading_order(self):
        """Similar to the previous test, but with apiKey key.
        """
        client_config = {
            'client': {
                'apiKey': {
                    'id': 'CLIENT_CONFIG_API_KEY_ID',
                    'secret': 'CLIENT_CONFIG_API_KEY_SECRET',
                }
            }
        }

        load_strategies = [
            # 1. We load the default configuration.
            LoadFileConfigStrategy('tests/assets/default_config.yml', must_exist=True),
            LoadAPIKeyConfigStrategy('i-do-not-exist'),
            # 3. We load stormpath.yml file with client.apiKey.file
            LoadFileConfigStrategy('tests/assets/apiKeyApiKey.json'),
            LoadAPIKeyConfigStrategy('i-do-not-exist'),
            LoadFileConfigStrategy('i-do-not-exist'),
            LoadEnvConfigStrategy(prefix='STORMPATH'),
            # 7. Configuration provided through the SDK client
            #    constructor.
            ExtendConfigStrategy(extend_with=client_config)
        ]
        post_processing_strategies = [LoadAPIKeyFromConfigStrategy()]
        validation_strategies = [ValidateClientConfigStrategy()]

        cl = ConfigLoader(load_strategies, post_processing_strategies, validation_strategies)
        config = cl.load()

        self.assertEqual(config['client']['apiKey']['id'], 'CLIENT_CONFIG_API_KEY_ID')
        self.assertEqual(config['client']['apiKey']['secret'], 'CLIENT_CONFIG_API_KEY_SECRET')
    def test_config_extending(self):
        client_config = {
            'client': {
                'apiKey': {
                    'id': 'CLIENT_CONFIG_API_KEY_ID',
                    'secret': 'CLIENT_CONFIG_API_KEY_SECRET',
                }
            }
        }

        load_strategies = [
            # 1. We load the default configuration.
            LoadFileConfigStrategy('tests/assets/default_config.yml', must_exist=True),
            LoadAPIKeyConfigStrategy('i-do-not-exist'),
            LoadFileConfigStrategy('i-do-not-exist'),
            LoadAPIKeyConfigStrategy('i-do-not-exist'),
            LoadFileConfigStrategy('i-do-not-exist'),
            LoadEnvConfigStrategy(prefix='STORMPATH'),
            # 7. Configuration provided through the SDK client
            #    constructor.
            ExtendConfigStrategy(extend_with=client_config)
        ]
        post_processing_strategies = [LoadAPIKeyFromConfigStrategy()]
        validation_strategies = [ValidateClientConfigStrategy()]

        cl = ConfigLoader(load_strategies, post_processing_strategies, validation_strategies)
        config = cl.load()

        self.assertTrue('baseUrl' in config['client'])
    def test_load_api_key_config(self):
        lapcs = LoadAPIKeyConfigStrategy('tests/assets/apiKey.properties')
        config = lapcs.process()

        self.assertEqual(config['client']['apiKey']['id'],
                         'API_KEY_PROPERTIES_ID')
        self.assertEqual(config['client']['apiKey']['secret'],
                         'API_KEY_PROPERTIES_SECRET')
    def test_empty_api_key_properties_file_after_default_config(self):
        lfcs = LoadFileConfigStrategy("tests/assets/default_config.yml")
        config = lfcs.process()
        lapcs = LoadAPIKeyConfigStrategy("tests/assets/empty_apiKey.properties")
        returned_config = lapcs.process(config)

        self.assertEqual(returned_config, config)
        self.assertEqual(config["client"]["cacheManager"]["defaultTtl"], 300)
        self.assertIsNone(config["client"]["apiKey"]["id"])
        self.assertIsNone(config["client"]["apiKey"]["secret"])
    def test_empty_api_key_properties_file_after_default_config(self):
        lfcs = LoadFileConfigStrategy('tests/assets/default_config.yml')
        config = lfcs.process()
        lapcs = LoadAPIKeyConfigStrategy(
            'tests/assets/empty_apiKey.properties')
        returned_config = lapcs.process(config)

        self.assertEqual(returned_config, config)
        self.assertEqual(config['client']['cacheManager']['defaultTtl'], 300)
        self.assertIsNone(config['client']['apiKey']['id'])
        self.assertIsNone(config['client']['apiKey']['secret'])
    def test_load_empty_api_key_config_must_exist_no_home_env(self):
        path = "~/tests/assets/empty_apiKey.properties"

        with patch.object(Path, "abspath", return_value=path):
            lapcs = LoadAPIKeyConfigStrategy(path, must_exist=True)
            try:
                lapcs.process()
            except Exception as e:
                self.assertEqual(str(e), 'Unable to load "%s". Environment home not set.' % path)
            else:
                self.fail("Loading config without environment home didn't throw any exception.")
    def setUp(self):
        client_config = {
            'application': {
                'name': 'CLIENT_CONFIG_APP',
                'href': None
            },
            'client': {
                'apiKey': {
                    'id': 'CLIENT_CONFIG_API_KEY_ID',
                    'secret': 'CLIENT_CONFIG_API_KEY_SECRET',
                }
            }
        }

        self.load_strategies = [
            # 1. Default configuration.
            LoadFileConfigStrategy('tests/assets/default_config.yml', must_exist=True),

            # 2. apiKey.properties file from ~/.stormpath directory.
            LoadAPIKeyConfigStrategy('tests/assets/apiKey.properties'),

            # 3. stormpath.[json or yaml] file from ~/.stormpath
            #    directory.
            LoadFileConfigStrategy('tests/assets/stormpath.yml'),

            # 4. apiKey.properties file from application directory.
            LoadAPIKeyConfigStrategy('tests/assets/no_apiKey.properties'),

            # 5. stormpath.[json or yaml] file from application
            #    directory.
            LoadFileConfigStrategy('tests/assets/stormpath.json'),

            # 6. Environment variables.
            LoadEnvConfigStrategy(prefix='STORMPATH'),

            # 7. Configuration provided through the SDK client
            #    constructor.
            ExtendConfigStrategy(extend_with=client_config)
        ]
        self.post_processing_strategies = [
            # Post-processing: If the key client.apiKey.file isn't
            # empty, then a apiKey.properties file should be loaded
            # from that path.
            LoadAPIKeyFromConfigStrategy(),
        ]
        self.validation_strategies = [
            # Post-processing: Validation
            ValidateClientConfigStrategy()
        ]
    def test_load_empty_api_key_config_must_exist_no_home_env(self):
        path = '~/tests/assets/empty_apiKey.properties'

        with patch.object(Path, 'abspath', return_value=path):
            lapcs = LoadAPIKeyConfigStrategy(path, must_exist=True)
            try:
                lapcs.process()
            except Exception as e:
                self.assertEqual(
                    str(e),
                    'Unable to load "%s". Environment home not set.' % path)
            else:
                self.fail(
                    'Loading config without environment home didn\'t throw any exception.'
                )
    def test_load_empty_api_key_config_must_exist(self):
        lapcs = LoadAPIKeyConfigStrategy(
            'tests/assets/empty_apiKey.properties', must_exist=True)

        with self.assertRaises(Exception):
            lapcs.process()
    def test_load_empty_api_key_config(self):
        lapcs = LoadAPIKeyConfigStrategy(
            'tests/assets/empty_apiKey.properties')
        config = lapcs.process()

        self.assertEqual(config, {})
    def test_load_api_key_config(self):
        lapcs = LoadAPIKeyConfigStrategy("tests/assets/apiKey.properties")
        config = lapcs.process()

        self.assertEqual(config["client"]["apiKey"]["id"], "API_KEY_PROPERTIES_ID")
        self.assertEqual(config["client"]["apiKey"]["secret"], "API_KEY_PROPERTIES_SECRET")
    def test_load_empty_api_key_config_must_exist(self):
        lapcs = LoadAPIKeyConfigStrategy("tests/assets/empty_apiKey.properties", must_exist=True)

        with self.assertRaises(Exception):
            lapcs.process()
    def test_load_empty_api_key_config(self):
        lapcs = LoadAPIKeyConfigStrategy("tests/assets/empty_apiKey.properties")
        config = lapcs.process()

        self.assertEqual(config, {})