1 #!/usr/bin/env python 2 # 3 # Copyright 2014 Google Inc. All Rights Reserved. 4 # 5 # Licensed under the Apache License, Version 2.0 (the "License"); 6 # you may not use this file except in compliance with the License. 7 # You may obtain a copy of the License at 8 # 9 # http://www.apache.org/licenses/LICENSE-2.0 10 # 11 # Unless required by applicable law or agreed to in writing, software 12 # distributed under the License is distributed on an "AS IS" BASIS, 13 # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 14 # See the License for the specific language governing permissions and 15 # limitations under the License. 16 17 """Tests for errors handling 18 """ 19 from __future__ import absolute_import 20 21 __author__ = 'afshar (at] google.com (Ali Afshar)' 22 23 24 import unittest2 as unittest 25 import httplib2 26 27 28 from googleapiclient.errors import HttpError 29 30 31 JSON_ERROR_CONTENT = b""" 32 { 33 "error": { 34 "errors": [ 35 { 36 "domain": "global", 37 "reason": "required", 38 "message": "country is required", 39 "locationType": "parameter", 40 "location": "country" 41 } 42 ], 43 "code": 400, 44 "message": "country is required", 45 "details": "error details" 46 } 47 } 48 """ 49 50 def fake_response(data, headers, reason='Ok'): 51 response = httplib2.Response(headers) 52 response.reason = reason 53 return response, data 54 55 56 class Error(unittest.TestCase): 57 """Test handling of error bodies.""" 58 59 def test_json_body(self): 60 """Test a nicely formed, expected error response.""" 61 resp, content = fake_response(JSON_ERROR_CONTENT, 62 {'status':'400', 'content-type': 'application/json'}, 63 reason='Failed') 64 error = HttpError(resp, content, uri='http://example.org') 65 self.assertEqual(str(error), '<HttpError 400 when requesting http://example.org returned "country is required". Details: "error details">') 66 67 def test_bad_json_body(self): 68 """Test handling of bodies with invalid json.""" 69 resp, content = fake_response(b'{', 70 { 'status':'400', 'content-type': 'application/json'}, 71 reason='Failed') 72 error = HttpError(resp, content) 73 self.assertEqual(str(error), '<HttpError 400 "Failed">') 74 75 def test_with_uri(self): 76 """Test handling of passing in the request uri.""" 77 resp, content = fake_response(b'{', 78 {'status':'400', 'content-type': 'application/json'}, 79 reason='Failure') 80 error = HttpError(resp, content, uri='http://example.org') 81 self.assertEqual(str(error), '<HttpError 400 when requesting http://example.org returned "Failure">') 82 83 def test_missing_message_json_body(self): 84 """Test handling of bodies with missing expected 'message' element.""" 85 resp, content = fake_response(b'{}', 86 {'status':'400', 'content-type': 'application/json'}, 87 reason='Failed') 88 error = HttpError(resp, content) 89 self.assertEqual(str(error), '<HttpError 400 "Failed">') 90 91 def test_non_json(self): 92 """Test handling of non-JSON bodies""" 93 resp, content = fake_response(b'}NOT OK', {'status':'400'}) 94 error = HttpError(resp, content) 95 self.assertEqual(str(error), '<HttpError 400 "Ok">') 96 97 def test_missing_reason(self): 98 """Test an empty dict with a missing resp.reason.""" 99 resp, content = fake_response(b'}NOT OK', {'status': '400'}, reason=None) 100 error = HttpError(resp, content) 101 self.assertEqual(str(error), '<HttpError 400 "">') 102