def test_get_limit_check_id_other_exception(self):

        def se_api(language=None):
            response = {
                'ResponseMetadata': {
                    'HTTPStatusCode': 400,
                    'RequestId': '3cc9b2a8-c6e5-11e5-bc1d-b13dcea36176'
                },
                'Error': {
                    'Message': 'foo',
                    'Code': 'SomeOtherException'
                }
            }
            raise ClientError(response, 'operation')

        self.mock_conn.describe_trusted_advisor_checks.side_effect = se_api
        with pytest.raises(ClientError) as excinfo:
            self.cls._get_limit_check_id()
        assert self.mock_conn.mock_calls == [
            call.describe_trusted_advisor_checks(language='en')
        ]
        assert excinfo.value.response['ResponseMetadata'][
                   'HTTPStatusCode'] == 400
        assert excinfo.value.response['Error']['Message'] == 'foo'
        assert excinfo.value.response['Error']['Code'] == 'SomeOtherException'
    def test_get_limit_check_id_subscription_required(self):
        def se_api(language=None):
            response = {
                'ResponseMetadata': {
                    'HTTPStatusCode': 400,
                    'RequestId': '3cc9b2a8-c6e5-11e5-bc1d-b13dcea36176'
                },
                'Error': {
                    'Message': 'AWS Premium Support Subscription is required '
                    'to use this service.',
                    'Code': 'SubscriptionRequiredException'
                }
            }
            raise ClientError(response, 'operation')

        assert self.cls.have_ta is True
        self.mock_conn.describe_trusted_advisor_checks.side_effect = se_api
        with patch('awslimitchecker.trustedadvisor'
                   '.logger', autospec=True) as mock_logger:
            res = self.cls._get_limit_check_id()
        assert self.cls.have_ta is False
        assert res == (None, None)
        assert self.mock_conn.mock_calls == [
            call.describe_trusted_advisor_checks(language='en')
        ]
        assert mock_logger.mock_calls == [
            call.debug("Querying Trusted Advisor checks"),
            call.warning(
                "Cannot check TrustedAdvisor: %s",
                'AWS Premium Support Subscription is required to '
                'use this service.')
        ]
    def test_get_limit_check_id_subscription_required(self):

        def se_api(language=None):
            response = {
                'ResponseMetadata': {
                    'HTTPStatusCode': 400,
                    'RequestId': '3cc9b2a8-c6e5-11e5-bc1d-b13dcea36176'
                },
                'Error': {
                    'Message': 'AWS Premium Support Subscription is required '
                               'to use this service.',
                    'Code': 'SubscriptionRequiredException'
                }
            }
            raise ClientError(response, 'operation')

        assert self.cls.have_ta is True
        self.mock_conn.describe_trusted_advisor_checks.side_effect = se_api
        with patch('awslimitchecker.trustedadvisor'
                   '.logger', autospec=True) as mock_logger:
            res = self.cls._get_limit_check_id()
        assert self.cls.have_ta is False
        assert res == (None, None)
        assert self.mock_conn.mock_calls == [
            call.describe_trusted_advisor_checks(language='en')
        ]
        assert mock_logger.mock_calls == [
            call.debug("Querying Trusted Advisor checks"),
            call.warning("Cannot check TrustedAdvisor: %s",
                         'AWS Premium Support Subscription is required to '
                         'use this service.')
        ]
 def test_get_limit_check_id(self):
     api_resp = {
         'checks': [
             {
                 'category':
                 'performance',
                 'name':
                 'Service Limits',
                 'id':
                 'bar',
                 'metadata': [
                     'Region', 'Service', 'Limit Name', 'Limit Amount',
                     'Current Usage', 'Status'
                 ],
             },
             {
                 'category': 'fault_tolerance',
                 'name': 'ELB Cross-Zone Load Balancing',
                 'id': 'foo',
             },
         ]
     }
     self.mock_conn.describe_trusted_advisor_checks.return_value = api_resp
     res = self.cls._get_limit_check_id()
     assert res == ('bar', [
         'Region', 'Service', 'Limit Name', 'Limit Amount', 'Current Usage',
         'Status'
     ])
     assert self.mock_conn.mock_calls == [
         call.describe_trusted_advisor_checks(language='en')
     ]
    def test_get_limit_check_id_subscription_required(self):

        def se_api(language):
            status = 400
            reason = 'Bad Request'
            body = {
                'message': 'AWS Premium Support Subscription is required to '
                'use this service.',
                '__type': 'SubscriptionRequiredException'
            }
            raise JSONResponseError(status, reason, body)

        self.mock_conn.describe_trusted_advisor_checks.side_effect = se_api
        assert self.cls.have_ta is True
        with patch('awslimitchecker.trustedadvisor'
                   '.logger', autospec=True) as mock_logger:
            res = self.cls._get_limit_check_id()
        assert self.cls.have_ta is False
        assert res == (None, None)
        assert self.mock_conn.mock_calls == [
            call.describe_trusted_advisor_checks('en')
        ]
        assert mock_logger.mock_calls == [
            call.debug("Querying Trusted Advisor checks"),
            call.warning("Cannot check TrustedAdvisor: %s",
                         "AWS Premium Support "
                         "Subscription is required to use this service.")
        ]
    def test_other_exception(self):

        def se_api(language=None):
            response = {
                'ResponseMetadata': {
                    'HTTPStatusCode': 400,
                    'RequestId': '3cc9b2a8-c6e5-11e5-bc1d-b13dcea36176'
                },
                'Error': {
                    'Message': 'foo',
                    'Code': 'SomeOtherException'
                }
            }
            raise ClientError(response, 'operation')

        self.mock_conn.describe_trusted_advisor_checks.side_effect = se_api
        with pytest.raises(ClientError) as excinfo:
            self.cls._get_limit_check_id()
        assert self.mock_conn.mock_calls == [
            call.describe_trusted_advisor_checks(language='en')
        ]
        assert excinfo.value.response['ResponseMetadata'][
                   'HTTPStatusCode'] == 400
        assert excinfo.value.response['Error']['Message'] == 'foo'
        assert excinfo.value.response['Error']['Code'] == 'SomeOtherException'
    def test_get_limit_check_id_other_exception(self):

        def se_api(language):
            status = 400
            reason = 'foobar'
            body = {
                'message': 'other message',
                '__type': 'OtherException'
            }
            raise JSONResponseError(status, reason, body)

        self.mock_conn.describe_trusted_advisor_checks.side_effect = se_api
        with pytest.raises(BotoServerError) as excinfo:
            self.cls._get_limit_check_id()
        assert self.mock_conn.mock_calls == [
            call.describe_trusted_advisor_checks('en')
        ]
        assert excinfo.value.status == 400
        assert excinfo.value.reason == 'foobar'
        assert excinfo.value.body['__type'] == 'OtherException'
 def test_get_limit_check_id_none(self):
     api_resp = {
         'checks': [
             {
                 'category': 'performance',
                 'name': 'Something Else',
                 'id': 'bar',
             },
             {
                 'category': 'fault_tolerance',
                 'name': 'ELB Cross-Zone Load Balancing',
                 'id': 'foo',
             },
         ]
     }
     self.mock_conn.describe_trusted_advisor_checks.return_value = api_resp
     res = self.cls._get_limit_check_id()
     assert res == (None, None)
     assert self.mock_conn.mock_calls == [
         call.describe_trusted_advisor_checks(language='en')
     ]
 def test_get_limit_check_id_none(self):
     api_resp = {
         'checks': [
             {
                 'category': 'performance',
                 'name': 'Something Else',
                 'id': 'bar',
             },
             {
                 'category': 'fault_tolerance',
                 'name': 'ELB Cross-Zone Load Balancing',
                 'id': 'foo',
             },
         ]
     }
     self.mock_conn.describe_trusted_advisor_checks.return_value = api_resp
     res = self.cls._get_limit_check_id()
     assert res == (None, None)
     assert self.mock_conn.mock_calls == [
         call.describe_trusted_advisor_checks(language='en')
     ]
 def test_get_limit_check_id(self):
     api_resp = {
         'checks': [
             {
                 'category': 'performance',
                 'name': 'Service Limits',
                 'id': 'bar',
                 'metadata': [
                     'Region',
                     'Service',
                     'Limit Name',
                     'Limit Amount',
                     'Current Usage',
                     'Status'
                 ],
             },
             {
                 'category': 'fault_tolerance',
                 'name': 'ELB Cross-Zone Load Balancing',
                 'id': 'foo',
             },
         ]
     }
     self.mock_conn.describe_trusted_advisor_checks.return_value = api_resp
     res = self.cls._get_limit_check_id()
     assert res == (
         'bar',
         [
             'Region',
             'Service',
             'Limit Name',
             'Limit Amount',
             'Current Usage',
             'Status'
         ]
     )
     assert self.mock_conn.mock_calls == [
         call.describe_trusted_advisor_checks(language='en')
     ]