mirror of
https://github.com/GAM-team/GAM.git
synced 2026-06-23 07:31:36 +00:00
213 lines
9.9 KiB
Python
213 lines
9.9 KiB
Python
"""Python unit tests for gapi.errors"""
|
|
|
|
import json
|
|
|
|
import unittest
|
|
from unittest.mock import patch
|
|
|
|
import googleapiclient.errors
|
|
from gam.gapi import errors
|
|
import httplib2
|
|
|
|
|
|
def create_simple_http_error(status, reason, message):
|
|
content = errors._create_http_error_dict(status, reason, message)
|
|
return create_http_error(status, content)
|
|
|
|
|
|
def create_http_error(status, content):
|
|
response = httplib2.Response({
|
|
'status': status,
|
|
'content-type': 'application/json',
|
|
})
|
|
content_as_bytes = json.dumps(content).encode('UTF-8')
|
|
return googleapiclient.errors.HttpError(response, content_as_bytes)
|
|
|
|
|
|
class ErrorsTest(unittest.TestCase):
|
|
|
|
def test_get_gapi_error_detail_quota_exceeded(self):
|
|
# TODO: Add test logic once the opening ValueError exception case has a
|
|
# repro case (i.e. an Exception type/format that will cause it to raise).
|
|
pass
|
|
|
|
def test_get_gapi_error_detail_invalid_domain(self):
|
|
# TODO: Add test logic once the opening ValueError exception case has a
|
|
# repro case (i.e. an Exception type/format that will cause it to raise).
|
|
pass
|
|
|
|
def test_get_gapi_error_detail_invalid_signing_key(self):
|
|
# TODO: Add test logic once the opening ValueError exception case has a
|
|
# repro case (i.e. an Exception type/format that will cause it to raise).
|
|
pass
|
|
|
|
def test_get_gapi_error_detail_unknown_error(self):
|
|
# TODO: Add test logic once the opening ValueError exception case has a
|
|
# repro case (i.e. an Exception type/format that will cause it to raise).
|
|
pass
|
|
|
|
def test_get_gapi_error_retry_http_error(self):
|
|
# TODO: Add test logic once the opening ValueError exception case has a
|
|
# repro case (i.e. an Exception type/format that will cause it to raise).
|
|
pass
|
|
|
|
def test_get_gapi_error_prints_soft_errors(self):
|
|
# TODO: Add test logic once the opening ValueError exception case has a
|
|
# repro case (i.e. an Exception type/format that will cause it to raise).
|
|
pass
|
|
|
|
def test_get_gapi_error_exits_on_unrecoverable_errors(self):
|
|
# TODO: Add test logic once the opening ValueError exception case has a
|
|
# repro case (i.e. an Exception type/format that will cause it to raise).
|
|
pass
|
|
|
|
def test_get_gapi_error_quota_exceeded_for_current_request(self):
|
|
# TODO: Add test logic once the opening ValueError exception case has a
|
|
# repro case (i.e. an Exception type/format that will cause it to raise).
|
|
pass
|
|
|
|
def test_get_gapi_error_quota_exceeded_high_request_rate(self):
|
|
# TODO: Add test logic once the opening ValueError exception case has a
|
|
# repro case (i.e. an Exception type/format that will cause it to raise).
|
|
pass
|
|
|
|
def test_get_gapi_error_extracts_user_not_found(self):
|
|
err = create_simple_http_error(404, 'notFound',
|
|
'Resource Not Found: userKey.')
|
|
print(err)
|
|
http_status, reason, message = errors.get_gapi_error_detail(err)
|
|
self.assertEqual(http_status, 404)
|
|
self.assertEqual(reason, errors.ErrorReason.USER_NOT_FOUND.value)
|
|
self.assertEqual(message, 'Resource Not Found: userKey.')
|
|
|
|
def test_get_gapi_error_extracts_group_not_found(self):
|
|
err = create_simple_http_error(404, 'notFound',
|
|
'Resource Not Found: groupKey.')
|
|
http_status, reason, message = errors.get_gapi_error_detail(err)
|
|
self.assertEqual(http_status, 404)
|
|
self.assertEqual(reason, errors.ErrorReason.GROUP_NOT_FOUND.value)
|
|
self.assertEqual(message, 'Resource Not Found: groupKey.')
|
|
|
|
def test_get_gapi_error_extracts_member_not_found(self):
|
|
err = create_simple_http_error(404, 'notFound',
|
|
'Resource Not Found: memberKey.')
|
|
http_status, reason, message = errors.get_gapi_error_detail(err)
|
|
self.assertEqual(http_status, 404)
|
|
self.assertEqual(reason, errors.ErrorReason.MEMBER_NOT_FOUND.value)
|
|
self.assertEqual(message, 'Resource Not Found: memberKey.')
|
|
|
|
def test_get_gapi_error_extracts_domain_not_found(self):
|
|
err = create_simple_http_error(404, 'notFound', 'Domain not found.')
|
|
http_status, reason, message = errors.get_gapi_error_detail(err)
|
|
self.assertEqual(http_status, 404)
|
|
self.assertEqual(reason, errors.ErrorReason.DOMAIN_NOT_FOUND.value)
|
|
self.assertEqual(message, 'Domain not found.')
|
|
|
|
def test_get_gapi_error_extracts_generic_resource_not_found(self):
|
|
err = create_simple_http_error(404, 'notFound',
|
|
'Resource Not Found: unknownResource.')
|
|
http_status, reason, message = errors.get_gapi_error_detail(err)
|
|
self.assertEqual(http_status, 404)
|
|
self.assertEqual(reason, errors.ErrorReason.RESOURCE_NOT_FOUND.value)
|
|
self.assertEqual(message, 'Resource Not Found: unknownResource.')
|
|
|
|
def test_get_gapi_error_extracts_invalid_userid(self):
|
|
err = create_simple_http_error(400, 'invalid', 'Invalid Input: userId')
|
|
http_status, reason, message = errors.get_gapi_error_detail(err)
|
|
self.assertEqual(http_status, 400)
|
|
self.assertEqual(reason, errors.ErrorReason.USER_NOT_FOUND.value)
|
|
self.assertEqual(message, 'Invalid Input: userId')
|
|
|
|
def test_get_gapi_error_extracts_invalid_member(self):
|
|
err = create_simple_http_error(400, 'invalid',
|
|
'Invalid Input: memberKey')
|
|
http_status, reason, message = errors.get_gapi_error_detail(err)
|
|
self.assertEqual(http_status, 400)
|
|
self.assertEqual(reason, errors.ErrorReason.INVALID_MEMBER.value)
|
|
self.assertEqual(message, 'Invalid Input: memberKey')
|
|
|
|
def test_get_gapi_error_extracts_bad_request(self):
|
|
err = create_simple_http_error(400, 'failedPrecondition', 'Bad Request')
|
|
http_status, reason, message = errors.get_gapi_error_detail(err)
|
|
self.assertEqual(http_status, 400)
|
|
self.assertEqual(reason, errors.ErrorReason.BAD_REQUEST.value)
|
|
self.assertEqual(message, 'Bad Request')
|
|
|
|
def test_get_gapi_error_extracts_service_not_available(self):
|
|
err = create_simple_http_error(400, 'failedPrecondition',
|
|
'Mail service not enabled')
|
|
http_status, reason, message = errors.get_gapi_error_detail(err)
|
|
self.assertEqual(http_status, 400)
|
|
self.assertEqual(reason, errors.ErrorReason.SERVICE_NOT_AVAILABLE.value)
|
|
self.assertEqual(message, 'Mail service not enabled')
|
|
|
|
def test_get_gapi_error_extracts_required_member_not_found(self):
|
|
err = create_simple_http_error(400, 'required',
|
|
'Missing required field: memberKey')
|
|
http_status, reason, message = errors.get_gapi_error_detail(err)
|
|
self.assertEqual(http_status, 400)
|
|
self.assertEqual(reason, errors.ErrorReason.MEMBER_NOT_FOUND.value)
|
|
self.assertEqual(message, 'Missing required field: memberKey')
|
|
|
|
def test_get_gapi_error_extracts_cyclic_memberships_error(self):
|
|
err = create_simple_http_error(400, 'conditionNotMet',
|
|
'Cyclic memberships not allowed')
|
|
http_status, reason, message = errors.get_gapi_error_detail(err)
|
|
self.assertEqual(http_status, 400)
|
|
self.assertEqual(
|
|
reason, errors.ErrorReason.CYCLIC_MEMBERSHIPS_NOT_ALLOWED.value)
|
|
self.assertEqual(message, 'Cyclic memberships not allowed')
|
|
|
|
def test_get_gapi_error_extracts_single_error_with_message(self):
|
|
status_code = 999
|
|
response = httplib2.Response({'status': status_code})
|
|
# This error does not have an "errors" key describing each error.
|
|
content = {'error': {'code': status_code, 'message': 'unknown error'}}
|
|
content_as_bytes = json.dumps(content).encode('UTF-8')
|
|
err = googleapiclient.errors.HttpError(response, content_as_bytes)
|
|
|
|
http_status, reason, message = errors.get_gapi_error_detail(err)
|
|
self.assertEqual(http_status, status_code)
|
|
self.assertEqual(reason, str(status_code))
|
|
self.assertEqual(message, content['error']['message'])
|
|
|
|
def test_get_gapi_error_exits_code_4_on_malformed_error_with_unknown_description(
|
|
self):
|
|
status_code = 999
|
|
response = httplib2.Response({'status': status_code})
|
|
# This error only has an error_description_field and an unknown description.
|
|
content = {'error_description': 'something errored'}
|
|
content_as_bytes = json.dumps(content).encode('UTF-8')
|
|
err = googleapiclient.errors.HttpError(response, content_as_bytes)
|
|
|
|
with self.assertRaises(SystemExit) as context:
|
|
errors.get_gapi_error_detail(err)
|
|
self.assertEqual(4, context.exception.code)
|
|
|
|
def test_get_gapi_error_exits_on_invalid_error_description(self):
|
|
status_code = 400
|
|
response = httplib2.Response({'status': status_code})
|
|
content = {'error_description': 'Invalid Value'}
|
|
content_as_bytes = json.dumps(content).encode('UTF-8')
|
|
err = googleapiclient.errors.HttpError(response, content_as_bytes)
|
|
|
|
http_status, reason, message = errors.get_gapi_error_detail(err)
|
|
self.assertEqual(http_status, status_code)
|
|
self.assertEqual(reason, errors.ErrorReason.INVALID.value)
|
|
self.assertEqual(message, 'Invalid Value')
|
|
|
|
def test_get_gapi_error_exits_code_4_on_unexpected_error_contents(self):
|
|
status_code = 900
|
|
response = httplib2.Response({'status': status_code})
|
|
content = {'notErrorContentThatIsExpected': 'foo'}
|
|
content_as_bytes = json.dumps(content).encode('UTF-8')
|
|
err = googleapiclient.errors.HttpError(response, content_as_bytes)
|
|
|
|
with self.assertRaises(SystemExit) as context:
|
|
errors.get_gapi_error_detail(err)
|
|
self.assertEqual(4, context.exception.code)
|
|
|
|
|
|
if __name__ == '__main__':
|
|
unittest.main()
|