Home | History | Annotate | Download | only in tests
      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