def setUp(self):
     """Instantiate the session manager class."""
     self.label = 'MY-LABEL'
     self.region = 'MY-REGION'
     self.session = SessionManager()
class SessionManagerTests(unittest.TestCase):
    """Session Manager keyword test class."""

    def setUp(self):
        """Instantiate the session manager class."""
        self.label = 'MY-LABEL'
        self.region = 'MY-REGION'
        self.session = SessionManager()

    def test_class_should_initiate(self):
        """Class init should instantiate required classes."""
        self.assertIsInstance(self.session._builtin, BuiltIn)
        self.assertIsInstance(self.session._cache, ConnectionCache)

    def test_create_should_register_new_session(self):
        """Create session should successfully register new session."""
        label = self.session.create_dynamodb_session(self.region, label=self.label)
        self.assertEqual(label, self.label)
        self.assertNotEqual(label, self.region)
        try:
            self.session._cache.switch(label)
        except RuntimeError:
            self.fail("Label '%s' should be exist." % label)
        self.session.delete_all_dynamodb_sessions()

    def test_create_should_register_with_region_as_label(self):
        """Create session should successfully register new session with region as default label."""
        label = self.session.create_dynamodb_session(self.region)
        self.assertNotEqual(label, self.label)
        self.assertEqual(label, self.region)
        try:
            self.session._cache.switch(label)
        except RuntimeError:
            self.fail("Label '%s' should be exist." % label)
        self.session.delete_all_dynamodb_sessions()

    def test_create_should_register_new_session_with_keys(self):
        """Create session should successfully register new session with keys."""
        label = self.session.create_dynamodb_session(access_key='key', secret_key='secret')
        try:
            self.session._cache.switch(label)
        except RuntimeError:
            self.fail("Label '%s' should be exist." % label)
        self.session.delete_all_dynamodb_sessions()

    def test_create_should_register_new_session_with_default_config(self):
        """Create session should successfully register new session with region from default config."""
        config_region = 'us-east-1'
        label = self.session.create_dynamodb_session()
        self.assertEqual(label, config_region)
        self.assertNotEqual(label, self.region)
        try:
            session = self.session._cache.switch(label)
            # configs and credentials only resolved after client creation
            credentials = session._session._session._credentials
            default_conf = session._session._session._config['profiles']['default']
            self.assertEqual(credentials.access_key, 'ACCESS_KEY')
            self.assertEqual(credentials.secret_key, 'SECRET_KEY')
            self.assertEqual(default_conf['aws_access_key_id'], 'ACCESS_KEY')
            self.assertEqual(default_conf['aws_secret_access_key'], 'SECRET_KEY')
            self.assertEqual(default_conf['region'], config_region)
            self.assertEqual(session.connection.region, config_region)
        except RuntimeError:
            self.fail("Label '%s' should be exist." % label)
        self.session.delete_all_dynamodb_sessions()

    def test_create_should_register_new_session_with_all_default_values(self):
        """Create session should successfully register new session with all default values from config."""
        config_region = 'us-east-1'
        label = self.session.create_dynamodb_session()
        self.assertEqual(label, config_region)
        self.assertNotEqual(label, self.region)
        try:
            session_client = self.session._cache.switch(label)
            # configs and credentials only resolved after client creation
            self.assertEqual(session_client.connection.region, config_region)
        except RuntimeError:
            self.fail("Label '%s' should be exist." % label)
        self.session.delete_all_dynamodb_sessions()

    def test_create_should_register_new_session_with_default_keys(self):
        """Create session should successfully register new session with default keys."""
        label = self.session.create_dynamodb_session(self.region, label=self.label)
        self.assertEqual(label, self.label)
        self.assertNotEqual(label, self.region)
        try:
            session = self.session._cache.switch(label)
            # configs and credentials only resolved after client creation
            credentials = session._session._session._credentials
            default_conf = session._session._session._config['profiles']['default']
            self.assertEqual(credentials.access_key, 'ACCESS_KEY')
            self.assertEqual(credentials.secret_key, 'SECRET_KEY')
            self.assertEqual(default_conf['aws_access_key_id'], 'ACCESS_KEY')
            self.assertEqual(default_conf['aws_secret_access_key'], 'SECRET_KEY')
            self.assertNotEqual(default_conf['region'], self.region)
            self.assertEqual(session.connection.region, self.region)
        except RuntimeError:
            self.fail("Label '%s' should be exist." % label)
        self.session.delete_all_dynamodb_sessions()

    def test_create_should_register_new_session_with_specified_profile(self):
        """Create session should successfully register new session with specified profile."""
        config_region = 'us-west-1'
        default_config_region = 'us-east-1'
        label = self.session.create_dynamodb_session(profile='profile1')
        self.assertEqual(label, config_region)
        self.assertNotEqual(label, self.region)
        self.assertNotEqual(label, default_config_region)
        try:
            session = self.session._cache.switch(label)
            # configs and credentials only resolved after client creation
            credentials = session._session._session._credentials
            profile_conf = session._session._session._config['profiles']['profile1']
            self.assertEqual(credentials.access_key, 'ACCESS_KEY_1')
            self.assertEqual(credentials.secret_key, 'SECRET_KEY_1')
            self.assertEqual(profile_conf['aws_access_key_id'], 'ACCESS_KEY_1')
            self.assertEqual(profile_conf['aws_secret_access_key'], 'SECRET_KEY_1')
            self.assertNotEqual(profile_conf['region'], default_config_region)
            self.assertEqual(session.connection.region, config_region)
        except RuntimeError:
            self.fail("Label '%s' should be exist." % label)
        self.session.delete_all_dynamodb_sessions()

    def test_create_should_register_new_session_with_specified_profile_2(self):
        """Create session should successfully register new session with specified profile (without session)."""
        config_region = 'us-west-2'
        default_config_region = 'us-east-1'
        label = self.session.create_dynamodb_session(profile='profile2')
        self.assertEqual(label, config_region)
        self.assertNotEqual(label, self.region)
        self.assertNotEqual(label, default_config_region)
        try:
            session = self.session._cache.switch(label)
            # configs and credentials only resolved after client creation
            self.assertEqual(session.connection.region, config_region)
        except RuntimeError:
            self.fail("Label '%s' should be exist." % label)
        self.session.delete_all_dynamodb_sessions()

    def test_delete_should_remove_all_sessions(self):
        """Delete session should successfully remove all existing sessions."""
        self.session.create_dynamodb_session(self.region, label=self.label)
        self.session.delete_all_dynamodb_sessions()
        with self.assertRaises(RuntimeError) as context:
            self.session._cache.switch(self.label)
        self.assertTrue("Non-existing index or alias '%s'." % self.label in context.exception)

    def test_delete_should_remove_requested_session(self):
        """Delete session should successfully remove requested existing session."""
        self.session.create_dynamodb_session(self.region)
        self.session.create_dynamodb_session(self.region, label=self.label)
        self.session.delete_dynamodb_session(self.region)
        with self.assertRaises(RuntimeError) as context:
            self.session._cache.switch(self.region)
        self.assertTrue("Non-existing index or alias '%s'." % self.region in context.exception)
        try:
            self.session._cache.switch(self.label)
        except RuntimeError:
            self.fail("Label '%s' should be exist." % self.label)
        self.session.delete_all_dynamodb_sessions()

    def test_should_return_client(self):
        """Should return client session object."""
        config_region = 'us-east-1'
        session = Session()
        client = self.session._get_client(session)
        self.assertEqual(str(client._endpoint),
                         'dynamodb(https://dynamodb.%s.amazonaws.com)' % config_region)
        self.assertEqual(client._client_config.region_name, config_region)
        self.assertEqual(client.meta._endpoint_url,
                         'https://dynamodb.%s.amazonaws.com' % config_region)

    def test_should_return_client_with_requested_values(self):
        """Should return client session object with requested input values."""
        config_region = 'us-west-2'
        host = '127.0.0.1'
        port = 8000
        session = Session()
        client = self.session._get_client(session, host=host, is_secure=False,
                                          port=port, region=config_region)
        self.assertEqual(str(client._endpoint), 'dynamodb(http://%s:%s)' % (host, port))
        self.assertEqual(client._client_config.region_name, config_region)
        self.assertEqual(client.meta._endpoint_url, 'http://%s:%s' % (host, port))

    def test_should_return_session(self):
        """Should return session object."""
        config_region = 'us-east-1'
        session = self.session._get_session()
        default_conf = session._session._config['profiles']['default']
        self.assertEqual(default_conf['aws_access_key_id'], 'ACCESS_KEY')
        self.assertEqual(default_conf['aws_secret_access_key'], 'SECRET_KEY')
        self.assertEqual(default_conf['region'], config_region)

    def test_should_return_session_with_requested_values(self):
        """Should return session object with requested input values."""
        access_key = 'key'
        config_region = 'us-west-2'
        default_config_region = 'us-east-1'
        profile = 'profile1'
        secret_key = 'secret'
        session_token = 'session'
        session = self.session._get_session(access_key=access_key, profile=profile,
                                            region=config_region, secret_key=secret_key,
                                            session_token=session_token)
        credentials = session._session._credentials
        default_conf = session._session._config['profiles']['default']
        var = session._session._session_instance_vars
        self.assertEqual(credentials.access_key, access_key)
        self.assertEqual(credentials.secret_key, secret_key)
        self.assertEqual(credentials.token, session_token)
        self.assertEqual(default_conf['aws_access_key_id'], 'ACCESS_KEY')
        self.assertEqual(default_conf['aws_secret_access_key'], 'SECRET_KEY')
        self.assertEqual(default_conf['region'], default_config_region)
        self.assertEqual(var['profile'], profile)
        self.assertEqual(var['region'], config_region)

    def test_get_url_should_return_none(self):
        """Should return None on no input values."""
        host = None
        port = None
        is_secure = None
        url = self.session._get_url(host, port, is_secure)
        self.assertIsNone(url)

    def test_get_url_should_return_url(self):
        """Should return URL."""
        host = '127.0.0.1'
        port = None
        url = self.session._get_url(host, port)
        self.assertEqual(url, 'https://127.0.0.1')

    def test_get_url_should_return_url_with_port(self):
        """Should return URL with port numbers."""
        host = '127.0.0.1'
        port = 80
        is_secure = None
        url = self.session._get_url(host, port, is_secure)
        self.assertEqual(url, 'http://127.0.0.1:80')

    def test_get_url_should_return_url_with_ssl(self):
        """Should return URL without SSL."""
        host = '127.0.0.1'
        port = 80
        is_secure = True
        url = self.session._get_url(host, port, is_secure)
        self.assertEqual(url, 'https://127.0.0.1:80')

    def test_get_url_should_return_url_without_ssl(self):
        """Should return URL without SSL."""
        host = '127.0.0.1'
        port = 80
        is_secure = False
        url = self.session._get_url(host, port, is_secure)
        self.assertEqual(url, 'http://127.0.0.1:80')