示例#1
0
    def test_missing_from_config_file_throws(self, _, missing_attributes, token):
        """
        Tests that if some required fields are missing from the ApiConfiguration an error is thrown

        :return:
        """
        # Create an ApiConfiguration with all values populated
        proxy_config = ProxyConfig(**{
            key.replace("proxy_", ""): value for key, value in source_config_details.items() if value is not None and "proxy" in key
        }) if source_config_details["proxy_address"] is not None else None

        api_config_kwargs = {key: value for key, value in source_config_details.items() if value is not None and "proxy" not in key}
        api_config_kwargs["proxy_config"] = proxy_config
        api_configuration = ApiConfiguration(**api_config_kwargs)

        # Pop off the missing attributes
        [setattr(api_configuration, missing_attribute, None) for missing_attribute in missing_attributes]

        # Ensure that there are no environment variables which can be used to fill the missing Api Url
        with patch.dict('os.environ', clear=True), self.assertRaises(ValueError) as ex:
            ApiClientBuilder.build(api_configuration=api_configuration, token=token)

        self.assertEqual(
            ex.exception.args[0], f"The fields {str(missing_attributes)} on the ApiConfiguration are set to None, "
                                  f"please ensure that you have provided them directly, via a secrets file or environment "
                                  f"variables")
示例#2
0
    def test_use_okta_response_handler(self):

        api_configuration = ApiConfiguration(**{
            key: value for key, value in source_config_details.items() if "proxy" not in key
        })

        api_configuration.certificate_filename = None

        env_vars = {}

        def response_handler(okta_response):
            if not okta_response.json.return_value.get("refresh_token", False):
                raise ValueError("Refresh token missing from config")

        with patch.dict('os.environ', env_vars, clear=True), patch("requests.post") as mock_requests, self.assertRaises(ValueError):

            mock_requests.return_value.status_code = 200
            mock_requests.return_value.json.return_value = {
                "access_token": "mock_access_token",
                "expires_in": 60
            }

            ApiClientBuilder.build(
                api_configuration=api_configuration,
                okta_response_handler=response_handler)
 def api_client(cls):
     if not cls._api_client:
         with cls._lock:
             if not cls._api_client:
                 cls._api_client = ApiClientBuilder().build(
                     CredentialsSource.secrets_path())
     return cls._api_client
    def test_use_explicit_correlation_id_when_env_var_exists(self):

        api_configuration = ApiConfiguration(
            **{
                key: value
                for key, value in source_config_details.items()
                if "proxy" not in key
            })

        env_vars = {
            config_keys[key]["env"]: value
            for key, value in source_config_details.items()
            if value is not None
        }
        env_vars["FBN_CORRELATION_ID"] = "env-correlation-id"

        with patch.dict('os.environ', env_vars, clear=True):
            client = ApiClientBuilder.build(
                api_configuration=api_configuration,
                correlation_id="param-correlation-id")

        self.assertTrue("CorrelationId" in client.default_headers,
                        msg="CorrelationId not found in headers")
        self.assertEquals(client.default_headers["CorrelationId"],
                          "param-correlation-id")
    def test_build_client_with_token_provided(self, _, config_to_remove,
                                              env_vars, api_configuration,
                                              token):
        """
        This test builds an ApiClient from a provided token.
        """

        secrets = {
            "api": {
                config_keys[key]["config"]: value
                for key, value in source_config_details.items()
                if value is not None and "proxy" not in key
            }
        }

        [secrets.pop(config) for config in config_to_remove]

        # Use a temporary file and no environment variables to generate the API Client
        with patch.dict('os.environ', env_vars, clear=True):
            secrets_file = TempFileManager.create_temp_file(secrets)
            client = ApiClientBuilder.build(
                api_secrets_filename=secrets_file.name,
                api_configuration=api_configuration,
                token=token)

            TempFileManager.delete_temp_file(secrets_file)

        self.assertEqual(client.configuration.host,
                         source_config_details["api_url"])
        self.assertEqual(client.configuration.access_token, token)
        self.assertIsInstance(client, ApiClient)
    def test_build_client_no_token_provided_file_only(self):
        """
        This test builds an ApiClient from a provided secrets.json file. The call to generate the token is mocked here.
        """

        secrets = {
            "api": {
                config_keys[key]["config"]: value for key, value in source_config_details.items() if
                value is not None and "proxy" not in key
            }
        }

        env_vars = {}

        api_configuration = None

        # Use a temporary file and no environment variables to generate the API Client
        with patch.dict('os.environ', env_vars, clear=True), patch("requests.post") as mock_requests:
            mock_requests.return_value.status_code = 200
            mock_requests.return_value.json.return_value = {
                "access_token": "mock_access_token",
                "refresh_token": "mock_refresh_token",
                "expires_in": 60
            }

            secrets_file = TempFileManager.create_temp_file(secrets)
            client = ApiClientBuilder.build(
                api_secrets_filename=secrets_file.name,
                api_configuration=api_configuration)

            TempFileManager.delete_temp_file(secrets_file)
            self.assertEqual(client.configuration.access_token, "mock_access_token")

        self.assertEqual(client.configuration.host, source_config_details["api_url"])
        self.assertIsInstance(client, ApiClient)
    def test_no_correlation_id_is_set_when_no_env_var_is_set(self):

        api_configuration = ApiConfiguration(**{
            key: value for key, value in source_config_details.items() if "proxy" not in key
        })

        env_vars = {config_keys[key]["env"]: value for key, value in source_config_details.items() if value is not None}

        with patch.dict('os.environ', env_vars, clear=True):
            client = ApiClientBuilder.build(api_configuration=api_configuration)

        self.assertFalse("CorrelationId" in client.default_headers, msg="Unexpected CorrelationId found in headers")
示例#8
0
    def get_okta_tokens():
        original_token = ""
        refresh_token = ""

        def extract_refresh_token(okta_response):
            nonlocal refresh_token
            nonlocal original_token

            okta_json = okta_response.json()
            refresh_token = okta_json["refresh_token"]
            original_token = okta_json["access_token"]

        ApiClientBuilder().build(
            CredentialsSource.secrets_path(),
            extract_refresh_token
        )

        return original_token, refresh_token