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""" 19from __future__ import absolute_import 20 21__author__ = 'afshar@google.com (Ali Afshar)' 22 23 24import unittest2 as unittest 25import httplib2 26 27 28from googleapiclient.errors import HttpError 29 30 31JSON_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 50def fake_response(data, headers, reason='Ok'): 51 response = httplib2.Response(headers) 52 response.reason = reason 53 return response, data 54 55 56class 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