#   Copyright 2017 Huawei, 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.
#

import json

from openstackclient.tests.functional import base


class ModuleTest(base.TestCase):
    """Functional tests for openstackclient module list output."""

    CLIENTS = ['openstackclient',
               'keystoneclient',
               'novaclient',
               'openstack']

    LIBS = ['osc_lib',
            'keystoneauth1']

    def test_module_list(self):
        # Test module list
        cmd_output = json.loads(self.openstack('module list -f json'))
        for one_module in self.CLIENTS:
            self.assertIn(one_module, cmd_output.keys())
        for one_module in self.LIBS:
            self.assertNotIn(one_module, cmd_output.keys())

        # Test module list --all
        cmd_output = json.loads(self.openstack('module list --all -f json'))
        for one_module in self.CLIENTS + self.LIBS:
            self.assertIn(one_module, cmd_output.keys())


class CommandTest(base.TestCase):
    """Functional tests for openstackclient command list."""
    GROUPS = [
        'openstack.volume.v3',
        'openstack.network.v2',
        'openstack.image.v2',
        'openstack.identity.v3',
        'openstack.compute.v2',
        'openstack.common',
        'openstack.cli',
    ]

    def test_command_list_no_option(self):
        cmd_output = json.loads(self.openstack('command list -f json'))
        group_names = [each.get('Command Group') for each in cmd_output]
        for one_group in self.GROUPS:
            self.assertIn(one_group, group_names)

    def test_command_list_with_group(self):
        input_groups = [
            'volume',
            'network',
            'image',
            'identity',
            'compute.v2'
        ]
        for each_input in input_groups:
            cmd_output = json.loads(self.openstack(
                'command list --group %s -f json' % each_input
            ))
            group_names = [each.get('Command Group') for each in cmd_output]
            for each_name in group_names:
                self.assertIn(each_input, each_name)