From a7e9a49a3f851097b323093048c62b2acbbf5090 Mon Sep 17 00:00:00 2001
From: Eric Harney <eharney@redhat.com>
Date: Tue, 12 Nov 2019 15:54:07 -0500
Subject: [PATCH] Add test for subcommands

This tests that the expected subcommands register
in the shell client, by looking at the output
that would show up in "cinder help".

The purpose of this is to help prevent us from
accidentally deleting some commands when refactoring
shell code.

TODO: cover commands post-3.0
Change-Id: Ifcbc08ae9184fa33049b18f8ad7ef5d92003a7b8
---
 cinderclient/shell.py                    |   1 +
 cinderclient/tests/unit/v3/test_shell.py | 118 +++++++++++++++++++++++
 2 files changed, 119 insertions(+)

diff --git a/cinderclient/shell.py b/cinderclient/shell.py
index d948332a9..57c9d8ccb 100644
--- a/cinderclient/shell.py
+++ b/cinderclient/shell.py
@@ -135,6 +135,7 @@ class OpenStackCinderShell(object):
     def __init__(self):
         self.ks_logger = None
         self.client_logger = None
+        self.extensions = []
 
     def get_base_parser(self):
         parser = CinderClientArgumentParser(
diff --git a/cinderclient/tests/unit/v3/test_shell.py b/cinderclient/tests/unit/v3/test_shell.py
index ee35ddfd9..4dd6c38f0 100644
--- a/cinderclient/tests/unit/v3/test_shell.py
+++ b/cinderclient/tests/unit/v3/test_shell.py
@@ -1443,3 +1443,121 @@ class ShellTest(utils.TestCase):
             '--os-volume-api-version 3.59 transfer-list')
         url = ('/volume-transfers/detail')
         self.assert_called('GET', url)
+
+    def test_subcommand_parser(self):
+        """Ensure that all the expected commands show up.
+
+        This test ensures that refactoring code does not somehow result in
+        a command accidentally ceasing to exist.
+
+        TODO: add a similar test for 3.59 or so
+        """
+        p = self.shell.get_subcommand_parser(api_versions.APIVersion("3.0"),
+                                             input_args=['help'], do_help=True)
+        help_text = p.format_help()
+
+        # These are v3.0 commands only
+        expected_commands = ('absolute-limits',
+                             'api-version',
+                             'availability-zone-list',
+                             'backup-create',
+                             'backup-delete',
+                             'backup-export',
+                             'backup-import',
+                             'backup-list',
+                             'backup-reset-state',
+                             'backup-restore',
+                             'backup-show',
+                             'cgsnapshot-create',
+                             'cgsnapshot-delete',
+                             'cgsnapshot-list',
+                             'cgsnapshot-show',
+                             'consisgroup-create',
+                             'consisgroup-create-from-src',
+                             'consisgroup-delete',
+                             'consisgroup-list',
+                             'consisgroup-show',
+                             'consisgroup-update',
+                             'create',
+                             'delete',
+                             'encryption-type-create',
+                             'encryption-type-delete',
+                             'encryption-type-list',
+                             'encryption-type-show',
+                             'encryption-type-update',
+                             'extend',
+                             'extra-specs-list',
+                             'failover-host',
+                             'force-delete',
+                             'freeze-host',
+                             'get-capabilities',
+                             'get-pools',
+                             'image-metadata',
+                             'image-metadata-show',
+                             'list',
+                             'manage',
+                             'metadata',
+                             'metadata-show',
+                             'metadata-update-all',
+                             'migrate',
+                             'qos-associate',
+                             'qos-create',
+                             'qos-delete',
+                             'qos-disassociate',
+                             'qos-disassociate-all',
+                             'qos-get-association',
+                             'qos-key',
+                             'qos-list',
+                             'qos-show',
+                             'quota-class-show',
+                             'quota-class-update',
+                             'quota-defaults',
+                             'quota-delete',
+                             'quota-show',
+                             'quota-update',
+                             'quota-usage',
+                             'rate-limits',
+                             'readonly-mode-update',
+                             'rename',
+                             'reset-state',
+                             'retype',
+                             'service-disable',
+                             'service-enable',
+                             'service-list',
+                             'set-bootable',
+                             'show',
+                             'snapshot-create',
+                             'snapshot-delete',
+                             'snapshot-list',
+                             'snapshot-manage',
+                             'snapshot-metadata',
+                             'snapshot-metadata-show',
+                             'snapshot-metadata-update-all',
+                             'snapshot-rename',
+                             'snapshot-reset-state',
+                             'snapshot-show',
+                             'snapshot-unmanage',
+                             'thaw-host',
+                             'transfer-accept',
+                             'transfer-create',
+                             'transfer-delete',
+                             'transfer-list',
+                             'transfer-show',
+                             'type-access-add',
+                             'type-access-list',
+                             'type-access-remove',
+                             'type-create',
+                             'type-default',
+                             'type-delete',
+                             'type-key',
+                             'type-list',
+                             'type-show',
+                             'type-update',
+                             'unmanage',
+                             'upload-to-image',
+                             'version-list',
+                             'bash-completion',
+                             'help',)
+
+        for e in expected_commands:
+            self.assertIn('    ' + e, help_text)