# Copyright (c) 2016, Intel Corporation.
# 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.

from unittest import mock

from openstackclient.network.v2 import network_qos_rule_type as _qos_rule_type
from openstackclient.tests.unit.network.v2 import fakes as network_fakes
from openstackclient.tests.unit import utils as tests_utils


class TestNetworkQosRuleType(network_fakes.TestNetworkV2):

    def setUp(self):
        super(TestNetworkQosRuleType, self).setUp()
        # Get a shortcut to the network client
        self.network = self.app.client_manager.network


class TestShowNetworkQosRuleType(TestNetworkQosRuleType):

    attrs = {
        'drivers': [{
            'name': 'driver 1',
            'supported_parameters': []
        }]
    }
    # The QoS policies to show.
    qos_rule_type = (
        network_fakes.FakeNetworkQosRuleType.create_one_qos_rule_type(attrs))
    columns = (
        'drivers',
        'rule_type_name'
    )
    data = [
        qos_rule_type.drivers,
        qos_rule_type.type
    ]

    def setUp(self):
        super(TestShowNetworkQosRuleType, self).setUp()
        self.network.get_qos_rule_type = mock.Mock(
            return_value=self.qos_rule_type)

        # Get the command object to test
        self.cmd = _qos_rule_type.ShowNetworkQosRuleType(self.app,
                                                         self.namespace)

    def test_show_no_options(self):
        arglist = []
        verifylist = []

        # Missing required args should bail here
        self.assertRaises(tests_utils.ParserException, self.check_parser,
                          self.cmd, arglist, verifylist)

    def test_show_all_options(self):
        arglist = [
            self.qos_rule_type.type,
        ]
        verifylist = [
            ('rule_type', self.qos_rule_type.type),
        ]

        parsed_args = self.check_parser(self.cmd, arglist, verifylist)
        columns, data = self.cmd.take_action(parsed_args)

        self.network.get_qos_rule_type.assert_called_once_with(
            self.qos_rule_type.type)
        self.assertEqual(self.columns, columns)
        self.assertEqual(list(self.data), list(data))


class TestListNetworkQosRuleType(TestNetworkQosRuleType):

    # The QoS policies to list up.
    qos_rule_types = (
        network_fakes.FakeNetworkQosRuleType.create_qos_rule_types(count=3))
    columns = (
        'Type',
    )
    data = []
    for qos_rule_type in qos_rule_types:
        data.append((
            qos_rule_type.type,
        ))

    def setUp(self):
        super(TestListNetworkQosRuleType, self).setUp()
        self.network.qos_rule_types = mock.Mock(
            return_value=self.qos_rule_types)

        # Get the command object to test
        self.cmd = _qos_rule_type.ListNetworkQosRuleType(self.app,
                                                         self.namespace)

    def test_qos_rule_type_list(self):
        arglist = []
        verifylist = []

        parsed_args = self.check_parser(self.cmd, arglist, verifylist)
        columns, data = self.cmd.take_action(parsed_args)

        self.network.qos_rule_types.assert_called_once_with(**{})
        self.assertEqual(self.columns, columns)
        self.assertEqual(self.data, list(data))

    def test_qos_rule_type_list_all_supported(self):
        arglist = [
            '--all-supported'
        ]
        verifylist = [
            ('all_supported', True),
        ]

        parsed_args = self.check_parser(self.cmd, arglist, verifylist)
        columns, data = self.cmd.take_action(parsed_args)

        self.network.qos_rule_types.assert_called_once_with(
            **{'all_supported': True}
        )
        self.assertEqual(self.columns, columns)
        self.assertEqual(self.data, list(data))

    def test_qos_rule_type_list_all_rules(self):
        arglist = [
            '--all-rules'
        ]
        verifylist = [
            ('all_rules', True),
        ]

        parsed_args = self.check_parser(self.cmd, arglist, verifylist)
        columns, data = self.cmd.take_action(parsed_args)

        self.network.qos_rule_types.assert_called_once_with(
            **{'all_rules': True}
        )
        self.assertEqual(self.columns, columns)
        self.assertEqual(self.data, list(data))
