Add update share type functional tests

Depends-on: I4c7bdd601d48b40c01639b5089d4bff259a7b3af
Part-of blueprint update-share-type-name-or-description

Change-Id: Id1073a964b6d034375b74fa89e3ebb39e2c56220
diff --git a/manila_tempest_tests/tests/api/admin/test_share_types.py b/manila_tempest_tests/tests/api/admin/test_share_types.py
index f06c70d..aef202b 100644
--- a/manila_tempest_tests/tests/api/admin/test_share_types.py
+++ b/manila_tempest_tests/tests/api/admin/test_share_types.py
@@ -99,6 +99,82 @@
         self.assertDictMatch(get["volume_type"], get["share_type"])
 
     @tc.attr(base.TAG_POSITIVE, base.TAG_API)
+    @ddt.data(
+        ('2.50', data_utils.rand_name("type_updated"),
+         'description_updated', True),
+        ('2.50', data_utils.rand_name("type_updated"), None, None),
+        ('2.50', None, 'description_updated', None),
+        ('2.50', None, None, True),
+        ('2.50', None, None, False),
+        (LATEST_MICROVERSION, data_utils.rand_name("type_updated"),
+         'description_updated', True),
+        (LATEST_MICROVERSION, data_utils.rand_name("type_updated"),
+         None, None),
+        (LATEST_MICROVERSION, None, 'description_updated', None),
+        (LATEST_MICROVERSION, None, None, True),
+        (LATEST_MICROVERSION, None, None, False),
+    )
+    @ddt.unpack
+    def test_share_type_create_update(self, version, st_name,
+                                      st_description, st_is_public):
+        name = data_utils.rand_name("tempest-manila")
+        description = "Description for share type"
+        extra_specs = self.add_extra_specs_to_dict({"key": "value", })
+
+        # Create share type
+        st_create = self.create_share_type(
+            name, extra_specs=extra_specs, version=version,
+            description=description)
+        self.assertEqual(name, st_create['share_type']['name'])
+        self._verify_description(
+            description, st_create['share_type'], version)
+        self._verify_is_public_key_name(st_create['share_type'], version)
+        st_id = st_create["share_type"]["id"]
+
+        # Update share type
+        updated_st = self.shares_v2_client.update_share_type(
+            st_id, name=st_name, is_public=st_is_public,
+            description=st_description, version=version)
+        if st_name is not None:
+            self.assertEqual(st_name, updated_st["share_type"]["name"])
+        if st_description is not None:
+            self._verify_description(st_description,
+                                     updated_st['share_type'], version)
+        if st_is_public is not None:
+            self.assertEqual(
+                st_is_public,
+                updated_st["share_type"]["share_type_access:is_public"])
+
+    @tc.attr(base.TAG_POSITIVE, base.TAG_API)
+    @ddt.data(
+        ('2.50', None, '', None),
+        (LATEST_MICROVERSION, None, '', None),
+    )
+    @ddt.unpack
+    def test_share_type_unset_description(
+            self, version, st_name, st_description, st_is_public):
+        name = data_utils.rand_name("tempest-manila")
+        description = "Description for share type"
+        extra_specs = self.add_extra_specs_to_dict({"key": "value", })
+
+        # Create share type
+        st_create = self.create_share_type(
+            name, extra_specs=extra_specs, version=version,
+            description=description)
+        self.assertEqual(name, st_create['share_type']['name'])
+        self._verify_description(
+            description, st_create['share_type'], version)
+        self._verify_is_public_key_name(st_create['share_type'], version)
+        st_id = st_create["share_type"]["id"]
+
+        # Update share type
+        updated_st = self.shares_v2_client.update_share_type(
+            st_id, name=st_name, is_public=st_is_public,
+            description=st_description, version=version)
+
+        self._verify_description(None, updated_st['share_type'], version)
+
+    @tc.attr(base.TAG_POSITIVE, base.TAG_API)
     @ddt.data('2.0', '2.6', '2.7', '2.40', '2.41')
     def test_share_type_create_list(self, version):
         self.skip_if_microversion_not_supported(version)
diff --git a/manila_tempest_tests/tests/api/base.py b/manila_tempest_tests/tests/api/base.py
index eca162a..3afd6fb 100644
--- a/manila_tempest_tests/tests/api/base.py
+++ b/manila_tempest_tests/tests/api/base.py
@@ -870,6 +870,16 @@
             cls.method_resources.insert(0, resource)
         return share_type
 
+    @classmethod
+    def update_share_type(cls, share_type_id, name=None,
+                          is_public=None, description=None,
+                          client=None):
+        if client is None:
+            client = cls.shares_v2_client
+        share_type = client.update_share_type(share_type_id, name,
+                                              is_public, description)
+        return share_type
+
     @staticmethod
     def add_extra_specs_to_dict(extra_specs=None):
         """Add any required extra-specs to share type dictionary"""
diff --git a/manila_tempest_tests/tests/api/test_share_types_negative.py b/manila_tempest_tests/tests/api/test_share_types_negative.py
index 63b11d1..9b4f6ba 100644
--- a/manila_tempest_tests/tests/api/test_share_types_negative.py
+++ b/manila_tempest_tests/tests/api/test_share_types_negative.py
@@ -13,19 +13,37 @@
 #    License for the specific language governing permissions and limitations
 #    under the License.
 
+import ddt
+import random
+from tempest import config
 from tempest.lib.common.utils import data_utils
 from tempest.lib import exceptions as lib_exc
 from testtools import testcase as tc
 
 from manila_tempest_tests.tests.api import base
 
+CONF = config.CONF
 
+LATEST_MICROVERSION = CONF.share.max_api_microversion
+
+
+def generate_long_description(des_length=256):
+    random_str = ''
+    base_str = 'ABCDEFGHIGKLMNOPQRSTUVWXYZabcdefghigklmnopqrstuvwxyz'
+    length = len(base_str) - 1
+    for i in range(des_length):
+        random_str += base_str[random.randint(0, length)]
+    return random_str
+
+
+@ddt.ddt
 class ShareTypesNegativeTest(base.BaseSharesMixedTest):
 
     @classmethod
     def resource_setup(cls):
         super(ShareTypesNegativeTest, cls).resource_setup()
         cls.st = cls._create_share_type()
+        cls.st2 = cls._create_share_type()
 
     @tc.attr(base.TAG_NEGATIVE, base.TAG_API)
     def test_try_create_share_type_with_user(self):
@@ -53,3 +71,32 @@
                           self.shares_client.remove_access_from_share_type,
                           self.st['id'],
                           self.shares_client.tenant_id)
+
+    @tc.attr(base.TAG_NEGATIVE, base.TAG_API)
+    @ddt.data(
+        ('2.50', '', None, None),
+        (LATEST_MICROVERSION, '', None, None),
+        ('2.50', None, None, 'not_bool'),
+        (LATEST_MICROVERSION, None, None, 'not_bool'),
+        ('2.50', None, generate_long_description(256), None),
+        (LATEST_MICROVERSION, None, generate_long_description(256), None),
+    )
+    @ddt.unpack
+    def test_share_type_update_bad_request(
+            self, version, st_name, st_description, st_is_public):
+        st_id = self.st['id']
+        # Update share type
+        self.assertRaises(lib_exc.BadRequest,
+                          self.admin_shares_v2_client.update_share_type,
+                          st_id, st_name, st_is_public, st_description,
+                          version)
+
+    @tc.attr(base.TAG_NEGATIVE, base.TAG_API)
+    @ddt.data('2.50', LATEST_MICROVERSION)
+    def test_share_type_update_conflict(self, version):
+        name_1 = self.st['name']
+        st_id_2 = self.st2['id']
+        # Update share type
+        self.assertRaises(lib_exc.Conflict,
+                          self.admin_shares_v2_client.update_share_type,
+                          st_id_2, name_1, None, None, version)