#   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.
#

"""Volume v2 API Library Tests"""

import http
from unittest import mock
import uuid

from openstack.block_storage import v2 as block_storage_v2
from osc_lib import exceptions as osc_lib_exceptions

from openstackclient.api import volume_v2 as volume
from openstackclient.tests.unit import fakes
from openstackclient.tests.unit import utils


class TestConsistencyGroup(utils.TestCase):
    def setUp(self):
        super().setUp()

        # TODO(stephenfin): Switch to spec_set once keystoneauth exposes
        # instance attributes as class attributes
        # https://review.opendev.org/c/openstack/keystoneauth/+/994090
        self.volume_client = mock.Mock(spec=block_storage_v2.Proxy)

    def test_find_consistency_group_by_id(self):
        cg_id = uuid.uuid4().hex
        cg_name = 'name-' + uuid.uuid4().hex
        data = {
            'consistencygroup': {
                'id': cg_id,
                'name': cg_name,
                'status': 'available',
                'availability_zone': 'az1',
                'created_at': '2015-09-16T09:28:52.000000',
                'description': 'description-' + uuid.uuid4().hex,
                'volume_types': ['123456'],
            }
        }
        self.volume_client.get.side_effect = [
            fakes.FakeResponse(data=data),
        ]

        result = volume.find_consistency_group(self.volume_client, cg_id)

        self.volume_client.get.assert_has_calls(
            [
                mock.call(f'/consistencygroups/{cg_id}'),
            ]
        )
        self.assertEqual(data['consistencygroup'], result)

    def test_find_consistency_group_by_name(self):
        cg_id = uuid.uuid4().hex
        cg_name = 'name-' + uuid.uuid4().hex
        data = {
            'consistencygroups': [
                {
                    'id': cg_id,
                    'name': cg_name,
                }
            ],
        }
        self.volume_client.get.side_effect = [
            fakes.FakeResponse(status_code=http.HTTPStatus.NOT_FOUND),
            fakes.FakeResponse(data=data),
        ]

        result = volume.find_consistency_group(self.volume_client, cg_name)

        self.volume_client.get.assert_has_calls(
            [
                mock.call(f'/consistencygroups/{cg_name}'),
                mock.call('/consistencygroups'),
            ]
        )
        self.assertEqual(data['consistencygroups'][0], result)

    def test_find_consistency_group_not_found(self):
        data = {'consistencygroups': []}
        self.volume_client.get.side_effect = [
            fakes.FakeResponse(status_code=http.HTTPStatus.NOT_FOUND),
            fakes.FakeResponse(data=data),
        ]
        self.assertRaises(
            osc_lib_exceptions.NotFound,
            volume.find_consistency_group,
            self.volume_client,
            'invalid-cg',
        )

    def test_find_consistency_group_by_name_duplicate(self):
        cg_name = 'name-' + uuid.uuid4().hex
        data = {
            'consistencygroups': [
                {
                    'id': uuid.uuid4().hex,
                    'name': cg_name,
                },
                {
                    'id': uuid.uuid4().hex,
                    'name': cg_name,
                },
            ],
        }
        self.volume_client.get.side_effect = [
            fakes.FakeResponse(status_code=http.HTTPStatus.NOT_FOUND),
            fakes.FakeResponse(data=data),
        ]

        self.assertRaises(
            osc_lib_exceptions.NotFound,
            volume.find_consistency_group,
            self.volume_client,
            cg_name,
        )
