# 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 `rbd_iscsi_client` package."""

import unittest
from unittest import mock

from rbd_iscsi_client import client
from rbd_iscsi_client import exceptions

import requests


class TestRbd_iscsi_client(unittest.TestCase):
    """Tests for `rbd_iscsi_client` package."""

    client = None
    FAKE_URL = 'client://fake-url:0000'
    FAKE_USER = 'user'
    FAKE_PASSWORD = 'password'

    def setUp(self):
        self.client = client.RBDISCSIClient(self.FAKE_USER,
                                            self.FAKE_PASSWORD,
                                            self.FAKE_URL,
                                            secure=False,
                                            http_log_debug=True,
                                            suppress_ssl_warnings=False,
                                            timeout=None)

    def tearDown(self):
        self.client = None

    def test_request_timeout(self):
        self.client._http_log_req = mock.Mock()
        self.client.timeout = 10
        retest = mock.Mock()
        http_method = 'fake this'
        http_url = 'http://fake-url:0000'

        with mock.patch('requests.request', retest, create=True):
            # Test timeout exception
            retest.side_effect = requests.exceptions.Timeout
            self.assertRaises(exceptions.Timeout,
                              self.client.request,
                              http_url, http_method)

    def test_request_redirects(self):
        self.client._http_log_req = mock.Mock()
        self.client.timeout = 10
        retest = mock.Mock()
        http_method = 'fake this'
        http_url = 'http://fake-url:0000'

        with mock.patch('requests.request', retest, create=True):
            # Test too many redirects exception
            retest.side_effect = requests.exceptions.TooManyRedirects
            self.assertRaises(exceptions.TooManyRedirects,
                              self.client.request,
                              http_url, http_method)

    def test_request_http_error(self):
        self.client._http_log_req = mock.Mock()
        self.client.timeout = 10
        retest = mock.Mock()
        http_method = 'fake this'
        http_url = 'http://fake-url:0000'

        with mock.patch('requests.request', retest, create=True):
            # Test HTTP Error exception
            retest.side_effect = requests.exceptions.HTTPError
            self.assertRaises(exceptions.HTTPError,
                              self.client.request,
                              http_url, http_method)

    def test_request_url_required(self):
        self.client._http_log_req = mock.Mock()
        self.client.timeout = 10
        retest = mock.Mock()
        http_method = 'fake this'
        http_url = 'http://fake-url:0000'

        with mock.patch('requests.request', retest, create=True):
            # Test URL required exception
            retest.side_effect = requests.exceptions.URLRequired
            self.assertRaises(exceptions.URLRequired,
                              self.client.request,
                              http_url, http_method)

    def test_request_exception(self):
        self.client._http_log_req = mock.Mock()
        self.client.timeout = 10
        retest = mock.Mock()
        http_method = 'fake this'
        http_url = 'http://fake-url:0000'

        with mock.patch('requests.request', retest, create=True):
            # Test request exception
            retest.side_effect = requests.exceptions.RequestException
            self.assertRaises(exceptions.RequestException,
                              self.client.request,
                              http_url, http_method)

    def test_request_ssl_error(self):
        self.client._http_log_req = mock.Mock()
        self.client.timeout = 10
        retest = mock.Mock()

        with mock.patch('requests.request', retest, create=True):
            # Test requests exception
            retest.side_effect = requests.exceptions.SSLError
            self.assertRaisesRegexp(exceptions.SSLCertFailed, "failed")

    def test_client_timeout_setting(self):
        self.client._http_log_req = mock.Mock()
        self.client.timeout = 10
        retest = mock.Mock()

        with mock.patch('requests.request', retest, create=True):
            self.assertEqual(self.client.timeout, 10)