#!/usr/bin/env python
#
# Copyright 2014 Google Inc. All Rights Reserved.
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
#      http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.

"""Tests for errors handling
"""
from __future__ import absolute_import

__author__ = "afshar@google.com (Ali Afshar)"


import unittest2 as unittest
import httplib2


from googleapiclient.errors import HttpError


JSON_ERROR_CONTENT = b"""
{
 "error": {
  "errors": [
   {
    "domain": "global",
    "reason": "required",
    "message": "country is required",
    "locationType": "parameter",
    "location": "country"
   }
  ],
  "code": 400,
  "message": "country is required",
  "details": "error details"
 }
}
"""


def fake_response(data, headers, reason="Ok"):
    response = httplib2.Response(headers)
    response.reason = reason
    return response, data


class Error(unittest.TestCase):
    """Test handling of error bodies."""

    def test_json_body(self):
        """Test a nicely formed, expected error response."""
        resp, content = fake_response(
            JSON_ERROR_CONTENT,
            {"status": "400", "content-type": "application/json"},
            reason="Failed",
        )
        error = HttpError(resp, content, uri="http://example.org")
        self.assertEqual(
            str(error),
            '<HttpError 400 when requesting http://example.org returned "country is required". Details: "error details">',
        )

    def test_bad_json_body(self):
        """Test handling of bodies with invalid json."""
        resp, content = fake_response(
            b"{", {"status": "400", "content-type": "application/json"}, reason="Failed"
        )
        error = HttpError(resp, content)
        self.assertEqual(str(error), '<HttpError 400 "Failed">')

    def test_with_uri(self):
        """Test handling of passing in the request uri."""
        resp, content = fake_response(
            b"{",
            {"status": "400", "content-type": "application/json"},
            reason="Failure",
        )
        error = HttpError(resp, content, uri="http://example.org")
        self.assertEqual(
            str(error),
            '<HttpError 400 when requesting http://example.org returned "Failure">',
        )

    def test_missing_message_json_body(self):
        """Test handling of bodies with missing expected 'message' element."""
        resp, content = fake_response(
            b"{}",
            {"status": "400", "content-type": "application/json"},
            reason="Failed",
        )
        error = HttpError(resp, content)
        self.assertEqual(str(error), '<HttpError 400 "Failed">')

    def test_non_json(self):
        """Test handling of non-JSON bodies"""
        resp, content = fake_response(b"}NOT OK", {"status": "400"})
        error = HttpError(resp, content)
        self.assertEqual(str(error), '<HttpError 400 "Ok">')

    def test_missing_reason(self):
        """Test an empty dict with a missing resp.reason."""
        resp, content = fake_response(b"}NOT OK", {"status": "400"}, reason=None)
        error = HttpError(resp, content)
        self.assertEqual(str(error), '<HttpError 400 "">')
