import time
from unittest import TestCase

import mock
from orm.common.orm_common.utils import cross_api_utils


class TestCrossApiUtil(TestCase):
    @mock.patch('pecan.conf')
    def setUp(self, mock_conf):
        self.mock_response = mock.Mock()
        cross_api_utils.conf = mock_conf

    def respond(self, value, code):
        self.mock_response.json.return_value = value
        self.mock_response.status_code = code
        return self.mock_response

    def test_set_utils_conf(self):
        cross_api_utils.set_utils_conf(None)
        self.assertEqual(cross_api_utils.conf, None)

    def test_check_conf_initialization(self):
        cross_api_utils.set_utils_conf(None)
        self.assertRaises(AssertionError, cross_api_utils._check_conf_initialization)

    @mock.patch('orm.common.orm_common.utils.cross_api_utils.get_rms_region_group')
    def test_is_region_group_exist(self, mock_rms_region_group):
        mock_rms_region_group.return_value = 'test_group'
        exist = cross_api_utils.is_region_group_exist('test_group_name')
        self.assertEqual(exist, True)

    @mock.patch('orm.common.orm_common.utils.cross_api_utils.get_rms_region_group')
    def test_is_region_group_exist_false(self, mock_rms_region_group):
        mock_rms_region_group.return_value = None
        exist = cross_api_utils.is_region_group_exist('test_group_name')
        self.assertEqual(exist, False)

    @mock.patch('orm.common.orm_common.utils.cross_api_utils.get_rms_region_group')
    def test_get_regions_of_group(self, mock_rms_region_group):
        mock_rms_region_group.return_value = {'regions': 'group'}
        exist = cross_api_utils.get_regions_of_group('test_group_name')
        self.assertEqual(exist, 'group')

    @mock.patch('orm.common.orm_common.utils.cross_api_utils.get_rms_region_group')
    def test_get_regions_of_group_false(self, mock_rms_region_group):
        mock_rms_region_group.return_value = None
        exist = cross_api_utils.get_regions_of_group('test_group_name')
        self.assertEqual(exist, None)

    @mock.patch('requests.get')
    def test_get_rms_region_group(self, mock_get):
        mock_get.return_value = self.respond({'result': 'success'}, 200)
        result = cross_api_utils.get_rms_region_group('test_group_name')
        self.assertEqual(result, {'result': 'success'})

    def test_get_rms_region_group_cache_used(self):
        cross_api_utils.prev_timestamp = time.time()
        cross_api_utils.prev_group_name = 'test_group'
        cross_api_utils.prev_resp = 'test_response'
        cross_api_utils.conf.api.rms_server.cache_seconds = 14760251830
        self.assertEqual(cross_api_utils.prev_resp,
                         cross_api_utils.get_rms_region_group(
                             cross_api_utils.prev_group_name))

    @mock.patch.object(cross_api_utils, 'logger')
    @mock.patch.object(time, 'time', side_effect=ValueError('test'))
    def test_get_rms_region_group_cache_used(self, mock_time, mock_logger):
        self.assertRaises(ValueError, cross_api_utils.get_rms_region_group,
                          'test')

    # @mock.patch('requests.get')
    # def test_get_rms_region_group_with_exception(self, mock_get):
    #    mock_get.side_affect = Exception('boom')
    #    self.assertRaises(Exception, cross_api_utils.get_rms_region_group, 'test_group_name')