From b9358201c70a4659f7c7ad132bf6ff19edd17aa8 Mon Sep 17 00:00:00 2001 From: zhufl Date: Mon, 27 Apr 2020 16:12:52 +0800 Subject: [PATCH] Adding description for testcases - identity part3 When Tempest is used in customer site, often we are required to provide a testcase list including testcase names and descriptions. Now no this kind of doc is available, so we can add descriptions with the format of doc string for every testcase, so later we can generata such a testcase description list. There are hundreds of testcases missing descriptions, so we can add them gradually, and limit the modified files in one patch for the convenience of reviewing. Change-Id: I6d8fd63c7a473b498cde35ed53d83270b9e526c3 partially-implements: blueprint testcase-description --- .../api/identity/admin/v2/test_services.py | 9 ++- tempest/api/identity/admin/v2/test_tenants.py | 18 +++--- .../identity/admin/v2/test_users_negative.py | 56 +++++++++++-------- tempest/api/identity/admin/v3/test_domains.py | 11 +++- .../admin/v3/test_domains_negative.py | 16 +++++- .../api/identity/admin/v3/test_endpoints.py | 5 ++ .../identity/admin/v3/test_list_projects.py | 16 ++++-- .../api/identity/admin/v3/test_projects.py | 22 +++++--- .../admin/v3/test_projects_negative.py | 20 ++++--- 9 files changed, 115 insertions(+), 58 deletions(-) diff --git a/tempest/api/identity/admin/v2/test_services.py b/tempest/api/identity/admin/v2/test_services.py index 03543ac727..182b24cc72 100644 --- a/tempest/api/identity/admin/v2/test_services.py +++ b/tempest/api/identity/admin/v2/test_services.py @@ -20,6 +20,7 @@ from tempest.lib import exceptions as lib_exc class ServicesTestJSON(base.BaseIdentityV2AdminTest): + """Test identity services via v2 API""" def _del_service(self, service_id): # Deleting the service created in this method @@ -30,6 +31,7 @@ class ServicesTestJSON(base.BaseIdentityV2AdminTest): @decorators.idempotent_id('84521085-c6e6-491c-9a08-ec9f70f90110') def test_create_get_delete_service(self): + """Test verifies the identity service create/get/delete via v2 API""" # GET Service # Creating a Service name = data_utils.rand_name('service') @@ -64,7 +66,10 @@ class ServicesTestJSON(base.BaseIdentityV2AdminTest): @decorators.idempotent_id('5d3252c8-e555-494b-a6c8-e11d7335da42') def test_create_service_without_description(self): - # Create a service only with name and type + """Test creating identity service without description via v2 API + + Create a service only with name and type. + """ name = data_utils.rand_name('service') s_type = data_utils.rand_name('type') service = self.services_client.create_service( @@ -79,7 +84,7 @@ class ServicesTestJSON(base.BaseIdentityV2AdminTest): @decorators.attr(type='smoke') @decorators.idempotent_id('34ea6489-012d-4a86-9038-1287cadd5eca') def test_list_services(self): - # Create, List, Verify and Delete Services + """Test Create/List/Verify/Delete of identity service via v2 API""" services = [] for _ in range(3): name = data_utils.rand_name('service') diff --git a/tempest/api/identity/admin/v2/test_tenants.py b/tempest/api/identity/admin/v2/test_tenants.py index f68754e5b9..5f73e1cd23 100644 --- a/tempest/api/identity/admin/v2/test_tenants.py +++ b/tempest/api/identity/admin/v2/test_tenants.py @@ -19,10 +19,14 @@ from tempest.lib import decorators class TenantsTestJSON(base.BaseIdentityV2AdminTest): + """Test identity tenants via v2 API""" @decorators.idempotent_id('16c6e05c-6112-4b0e-b83f-5e43f221b6b0') def test_tenant_list_delete(self): - # Create several tenants and delete them + """Test listing and deleting tenants via v2 API + + Create several tenants and delete them + """ tenants = [] for _ in range(3): tenant = self.setup_test_tenant() @@ -41,7 +45,7 @@ class TenantsTestJSON(base.BaseIdentityV2AdminTest): @decorators.idempotent_id('d25e9f24-1310-4d29-b61b-d91299c21d6d') def test_tenant_create_with_description(self): - # Create tenant with a description + """Test creating tenant with a description via v2 API""" tenant_desc = data_utils.rand_name(name='desc') tenant = self.setup_test_tenant(description=tenant_desc) tenant_id = tenant['id'] @@ -56,7 +60,7 @@ class TenantsTestJSON(base.BaseIdentityV2AdminTest): @decorators.idempotent_id('670bdddc-1cd7-41c7-b8e2-751cfb67df50') def test_tenant_create_enabled(self): - # Create a tenant that is enabled + """Test creating a tenant that is enabled via v2 API""" tenant = self.setup_test_tenant(enabled=True) tenant_id = tenant['id'] self.assertTrue(tenant['enabled'], 'Enable should be True in response') @@ -66,7 +70,7 @@ class TenantsTestJSON(base.BaseIdentityV2AdminTest): @decorators.idempotent_id('3be22093-b30f-499d-b772-38340e5e16fb') def test_tenant_create_not_enabled(self): - # Create a tenant that is not enabled + """Test creating a tenant that is not enabled via v2 API""" tenant = self.setup_test_tenant(enabled=False) tenant_id = tenant['id'] self.assertFalse(tenant['enabled'], @@ -78,7 +82,7 @@ class TenantsTestJSON(base.BaseIdentityV2AdminTest): @decorators.idempotent_id('781f2266-d128-47f3-8bdb-f70970add238') def test_tenant_update_name(self): - # Update name attribute of a tenant + """Test updating name attribute of a tenant via v2 API""" t_name1 = data_utils.rand_name(name='tenant') tenant = self.setup_test_tenant(name=t_name1) t_id = tenant['id'] @@ -100,7 +104,7 @@ class TenantsTestJSON(base.BaseIdentityV2AdminTest): @decorators.idempotent_id('859fcfe1-3a03-41ef-86f9-b19a47d1cd87') def test_tenant_update_desc(self): - # Update description attribute of a tenant + """Test updating description attribute of a tenant via v2 API""" t_desc = data_utils.rand_name(name='desc') tenant = self.setup_test_tenant(description=t_desc) t_id = tenant['id'] @@ -123,7 +127,7 @@ class TenantsTestJSON(base.BaseIdentityV2AdminTest): @decorators.idempotent_id('8fc8981f-f12d-4c66-9972-2bdcf2bc2e1a') def test_tenant_update_enable(self): - # Update the enabled attribute of a tenant + """Test updating the enabled attribute of a tenant via v2 API""" t_en = False tenant = self.setup_test_tenant(enabled=t_en) t_id = tenant['id'] diff --git a/tempest/api/identity/admin/v2/test_users_negative.py b/tempest/api/identity/admin/v2/test_users_negative.py index 4f47e41d8c..eda1fdd4f1 100644 --- a/tempest/api/identity/admin/v2/test_users_negative.py +++ b/tempest/api/identity/admin/v2/test_users_negative.py @@ -20,6 +20,7 @@ from tempest.lib import exceptions as lib_exc class UsersNegativeTestJSON(base.BaseIdentityV2AdminTest): + """Negative tests of identity users via v2 API""" @classmethod def resource_setup(cls): @@ -31,7 +32,7 @@ class UsersNegativeTestJSON(base.BaseIdentityV2AdminTest): @decorators.attr(type=['negative']) @decorators.idempotent_id('60a1f5fa-5744-4cdf-82bf-60b7de2d29a4') def test_create_user_by_unauthorized_user(self): - # Non-administrator should not be authorized to create a user + """Non-admin should not be authorized to create a user via v2 API""" tenant = self.setup_test_tenant() self.assertRaises(lib_exc.Forbidden, self.non_admin_users_client.create_user, @@ -42,7 +43,7 @@ class UsersNegativeTestJSON(base.BaseIdentityV2AdminTest): @decorators.attr(type=['negative']) @decorators.idempotent_id('d80d0c2f-4514-4d1e-806d-0930dfc5a187') def test_create_user_with_empty_name(self): - # User with an empty name should not be created + """User with an empty name should not be created via v2 API""" tenant = self.setup_test_tenant() self.assertRaises(lib_exc.BadRequest, self.users_client.create_user, name='', password=self.alt_password, @@ -52,7 +53,7 @@ class UsersNegativeTestJSON(base.BaseIdentityV2AdminTest): @decorators.attr(type=['negative']) @decorators.idempotent_id('7704b4f3-3b75-4b82-87cc-931d41c8f780') def test_create_user_with_name_length_over_255(self): - # Length of user name filed should be restricted to 255 characters + """Length of user name should not exceed 255 via v2 API""" tenant = self.setup_test_tenant() self.assertRaises(lib_exc.BadRequest, self.users_client.create_user, name='a' * 256, password=self.alt_password, @@ -62,7 +63,7 @@ class UsersNegativeTestJSON(base.BaseIdentityV2AdminTest): @decorators.attr(type=['negative']) @decorators.idempotent_id('57ae8558-120c-4723-9308-3751474e7ecf') def test_create_user_with_duplicate_name(self): - # Duplicate user should not be created + """Duplicate user should not be created via v2 API""" password = data_utils.rand_password() user = self.setup_test_user(password) tenant = self.tenants_client.show_tenant(user['tenantId'])['tenant'] @@ -75,7 +76,7 @@ class UsersNegativeTestJSON(base.BaseIdentityV2AdminTest): @decorators.attr(type=['negative']) @decorators.idempotent_id('0132cc22-7c4f-42e1-9e50-ac6aad31d59a') def test_create_user_for_non_existent_tenant(self): - # Attempt to create a user in a non-existent tenant should fail + """Creating a user in a non-existent tenant via v2 API should fail""" self.assertRaises(lib_exc.NotFound, self.users_client.create_user, name=self.alt_user, password=self.alt_password, @@ -85,7 +86,7 @@ class UsersNegativeTestJSON(base.BaseIdentityV2AdminTest): @decorators.attr(type=['negative']) @decorators.idempotent_id('55bbb103-d1ae-437b-989b-bcdf8175c1f4') def test_create_user_request_without_a_token(self): - # Request to create a user without a valid token should fail + """Creating a user without a valid token via v2 API should fail""" tenant = self.setup_test_tenant() # Get the token of the current client token = self.client.auth_provider.get_token() @@ -103,7 +104,7 @@ class UsersNegativeTestJSON(base.BaseIdentityV2AdminTest): @decorators.attr(type=['negative']) @decorators.idempotent_id('23a2f3da-4a1a-41da-abdd-632328a861ad') def test_create_user_with_enabled_non_bool(self): - # Attempt to create a user with valid enabled para should fail + """Creating a user with invalid enabled para via v2 API should fail""" tenant = self.setup_test_tenant() name = data_utils.rand_name('test_user') self.assertRaises(lib_exc.BadRequest, self.users_client.create_user, @@ -114,7 +115,7 @@ class UsersNegativeTestJSON(base.BaseIdentityV2AdminTest): @decorators.attr(type=['negative']) @decorators.idempotent_id('3d07e294-27a0-4144-b780-a2a1bf6fee19') def test_update_user_for_non_existent_user(self): - # Attempt to update a user non-existent user should fail + """Updating a non-existent user via v2 API should fail""" user_name = data_utils.rand_name('user') non_existent_id = data_utils.rand_uuid() self.assertRaises(lib_exc.NotFound, self.users_client.update_user, @@ -123,7 +124,7 @@ class UsersNegativeTestJSON(base.BaseIdentityV2AdminTest): @decorators.attr(type=['negative']) @decorators.idempotent_id('3cc2a64b-83aa-4b02-88f0-d6ab737c4466') def test_update_user_request_without_a_token(self): - # Request to update a user without a valid token should fail + """Updating a user without a valid token via v2 API should fail""" # Get the token of the current client token = self.client.auth_provider.get_token() @@ -139,7 +140,7 @@ class UsersNegativeTestJSON(base.BaseIdentityV2AdminTest): @decorators.attr(type=['negative']) @decorators.idempotent_id('424868d5-18a7-43e1-8903-a64f95ee3aac') def test_update_user_by_unauthorized_user(self): - # Non-administrator should not be authorized to update user + """Non-admin should not be authorized to update user via v2 API""" self.assertRaises(lib_exc.Forbidden, self.non_admin_users_client.update_user, self.alt_user) @@ -147,7 +148,7 @@ class UsersNegativeTestJSON(base.BaseIdentityV2AdminTest): @decorators.attr(type=['negative']) @decorators.idempotent_id('d45195d5-33ed-41b9-a452-7d0d6a00f6e9') def test_delete_users_by_unauthorized_user(self): - # Non-administrator user should not be authorized to delete a user + """Non-admin should not be authorized to delete a user via v2 API""" user = self.setup_test_user() self.assertRaises(lib_exc.Forbidden, self.non_admin_users_client.delete_user, @@ -156,14 +157,14 @@ class UsersNegativeTestJSON(base.BaseIdentityV2AdminTest): @decorators.attr(type=['negative']) @decorators.idempotent_id('7cc82f7e-9998-4f89-abae-23df36495867') def test_delete_non_existent_user(self): - # Attempt to delete a non-existent user should fail + """Attempt to delete a non-existent user via v2 API should fail""" self.assertRaises(lib_exc.NotFound, self.users_client.delete_user, 'junk12345123') @decorators.attr(type=['negative']) @decorators.idempotent_id('57fe1df8-0aa7-46c0-ae9f-c2e785c7504a') def test_delete_user_request_without_a_token(self): - # Request to delete a user without a valid token should fail + """Deleting a user without a valid token via v2 API should fail""" # Get the token of the current client token = self.client.auth_provider.get_token() @@ -179,7 +180,7 @@ class UsersNegativeTestJSON(base.BaseIdentityV2AdminTest): @decorators.attr(type=['negative']) @decorators.idempotent_id('593a4981-f6d4-460a-99a1-57a78bf20829') def test_authentication_for_disabled_user(self): - # Disabled user's token should not get authenticated + """Disabled user's token should not get authenticated via v2 API""" password = data_utils.rand_password() user = self.setup_test_user(password) tenant = self.tenants_client.show_tenant(user['tenantId'])['tenant'] @@ -192,7 +193,11 @@ class UsersNegativeTestJSON(base.BaseIdentityV2AdminTest): @decorators.attr(type=['negative']) @decorators.idempotent_id('440a7a8d-9328-4b7b-83e0-d717010495e4') def test_authentication_when_tenant_is_disabled(self): - # User's token for a disabled tenant should not be authenticated + """Test User's token for a disabled tenant via v2 API + + User's token for a disabled tenant should not be authenticated via + v2 API. + """ password = data_utils.rand_password() user = self.setup_test_user(password) tenant = self.tenants_client.show_tenant(user['tenantId'])['tenant'] @@ -205,7 +210,11 @@ class UsersNegativeTestJSON(base.BaseIdentityV2AdminTest): @decorators.attr(type=['negative']) @decorators.idempotent_id('921f1ad6-7907-40b8-853f-637e7ee52178') def test_authentication_with_invalid_tenant(self): - # User's token for an invalid tenant should not be authenticated + """Test User's token for an invalid tenant via v2 API + + User's token for an invalid tenant should not be authenticated via V2 + API. + """ password = data_utils.rand_password() user = self.setup_test_user(password) self.assertRaises(lib_exc.Unauthorized, self.token_client.auth, @@ -216,7 +225,7 @@ class UsersNegativeTestJSON(base.BaseIdentityV2AdminTest): @decorators.attr(type=['negative']) @decorators.idempotent_id('bde9aecd-3b1c-4079-858f-beb5deaa5b5e') def test_authentication_with_invalid_username(self): - # Non-existent user's token should not get authenticated + """Non-existent user's token should not get authorized via v2 API""" password = data_utils.rand_password() user = self.setup_test_user(password) tenant = self.tenants_client.show_tenant(user['tenantId'])['tenant'] @@ -226,7 +235,11 @@ class UsersNegativeTestJSON(base.BaseIdentityV2AdminTest): @decorators.attr(type=['negative']) @decorators.idempotent_id('d5308b33-3574-43c3-8d87-1c090c5e1eca') def test_authentication_with_invalid_password(self): - # User's token with invalid password should not be authenticated + """Test User's token with invalid password via v2 API + + User's token with invalid password should not be authenticated via V2 + API. + """ user = self.setup_test_user() tenant = self.tenants_client.show_tenant(user['tenantId'])['tenant'] self.assertRaises(lib_exc.Unauthorized, self.token_client.auth, @@ -235,14 +248,14 @@ class UsersNegativeTestJSON(base.BaseIdentityV2AdminTest): @decorators.attr(type=['negative']) @decorators.idempotent_id('284192ce-fb7c-4909-a63b-9a502e0ddd11') def test_get_users_by_unauthorized_user(self): - # Non-administrator user should not be authorized to get user list + """Non-admin should not be authorized to get user list via v2 API""" self.assertRaises(lib_exc.Forbidden, self.non_admin_users_client.list_users) @decorators.attr(type=['negative']) @decorators.idempotent_id('a73591ec-1903-4ffe-be42-282b39fefc9d') def test_get_users_request_without_token(self): - # Request to get list of users without a valid token should fail + """Listing users without a valid token via v2 API should fail""" token = self.client.auth_provider.get_token() self.client.delete_token(token) @@ -254,8 +267,7 @@ class UsersNegativeTestJSON(base.BaseIdentityV2AdminTest): @decorators.attr(type=['negative']) @decorators.idempotent_id('f5d39046-fc5f-425c-b29e-bac2632da28e') def test_list_users_with_invalid_tenant(self): - # Should not be able to return a list of all - # users for a non-existent tenant + """Listing users for a non-existent tenant via v2 API should fail""" # Assign invalid tenant ids invalid_id = list() invalid_id.append(data_utils.rand_name('999')) diff --git a/tempest/api/identity/admin/v3/test_domains.py b/tempest/api/identity/admin/v3/test_domains.py index 07175f4cf4..32ccb9ef11 100644 --- a/tempest/api/identity/admin/v3/test_domains.py +++ b/tempest/api/identity/admin/v3/test_domains.py @@ -24,6 +24,7 @@ CONF = config.CONF class DomainsTestJSON(base.BaseIdentityV3AdminTest): + """Test identity domains""" @classmethod def resource_setup(cls): @@ -37,7 +38,7 @@ class DomainsTestJSON(base.BaseIdentityV3AdminTest): @decorators.idempotent_id('8cf516ef-2114-48f1-907b-d32726c734d4') def test_list_domains(self): - # Test to list domains + """Test listing domains""" fetched_ids = list() # List and Verify Domains body = self.domains_client.list_domains()['domains'] @@ -49,7 +50,7 @@ class DomainsTestJSON(base.BaseIdentityV3AdminTest): @decorators.idempotent_id('c6aee07b-4981-440c-bb0b-eb598f58ffe9') def test_list_domains_filter_by_name(self): - # List domains filtering by name + """Test listing domains filtering by name""" params = {'name': self.setup_domains[0]['name']} fetched_domains = self.domains_client.list_domains( **params)['domains'] @@ -61,7 +62,7 @@ class DomainsTestJSON(base.BaseIdentityV3AdminTest): @decorators.idempotent_id('3fd19840-65c1-43f8-b48c-51bdd066dff9') def test_list_domains_filter_by_enabled(self): - # List domains filtering by enabled domains + """Test listing domains filtering by enabled domains""" params = {'enabled': True} fetched_domains = self.domains_client.list_domains( **params)['domains'] @@ -74,6 +75,7 @@ class DomainsTestJSON(base.BaseIdentityV3AdminTest): @decorators.attr(type='smoke') @decorators.idempotent_id('f2f5b44a-82e8-4dad-8084-0661ea3b18cf') def test_create_update_delete_domain(self): + """Test creating, updating and deleting domain""" # Create domain d_name = data_utils.rand_name('domain') d_desc = data_utils.rand_name('domain-desc') @@ -118,6 +120,7 @@ class DomainsTestJSON(base.BaseIdentityV3AdminTest): @decorators.idempotent_id('d8d318b7-d1b3-4c37-94c5-3c5ba0b121ea') def test_domain_delete_cascades_content(self): + """Test deleting domain will delete its associated contents""" # Create a domain with a user and a group in it domain = self.setup_test_domain() user = self.create_test_user(domain_id=domain['id']) @@ -134,6 +137,7 @@ class DomainsTestJSON(base.BaseIdentityV3AdminTest): @decorators.idempotent_id('036df86e-bb5d-42c0-a7c2-66b9db3a6046') def test_create_domain_with_disabled_status(self): + """Test creating domain with disabled status""" # Create domain with enabled status as false d_name = data_utils.rand_name('domain') d_desc = data_utils.rand_name('domain-desc') @@ -146,6 +150,7 @@ class DomainsTestJSON(base.BaseIdentityV3AdminTest): @decorators.idempotent_id('2abf8764-309a-4fa9-bc58-201b799817ad') def test_create_domain_without_description(self): + """Test creating domain without description""" # Create domain only with name d_name = data_utils.rand_name('domain') domain = self.domains_client.create_domain(name=d_name)['domain'] diff --git a/tempest/api/identity/admin/v3/test_domains_negative.py b/tempest/api/identity/admin/v3/test_domains_negative.py index b3c68fbc11..c90206d8fc 100644 --- a/tempest/api/identity/admin/v3/test_domains_negative.py +++ b/tempest/api/identity/admin/v3/test_domains_negative.py @@ -20,6 +20,8 @@ from tempest.lib import exceptions as lib_exc class DomainsNegativeTestJSON(base.BaseIdentityV3AdminTest): + """Negative tests of identity domains""" + # NOTE: force_tenant_isolation is true in the base class by default but # overridden to false here to allow test execution for clouds using the # pre-provisioned credentials provider. @@ -28,6 +30,7 @@ class DomainsNegativeTestJSON(base.BaseIdentityV3AdminTest): @decorators.attr(type=['negative', 'gate']) @decorators.idempotent_id('1f3fbff5-4e44-400d-9ca1-d953f05f609b') def test_delete_active_domain(self): + """Test deleting active domain should fail""" domain = self.create_domain() domain_id = domain['id'] @@ -40,14 +43,20 @@ class DomainsNegativeTestJSON(base.BaseIdentityV3AdminTest): @decorators.attr(type=['negative']) @decorators.idempotent_id('9018461d-7d24-408d-b3fe-ae37e8cd5c9e') def test_create_domain_with_empty_name(self): - # Domain name should not be empty + """Test creating domain with empty name should fail + + Domain name should not be empty + """ self.assertRaises(lib_exc.BadRequest, self.domains_client.create_domain, name='') @decorators.attr(type=['negative']) @decorators.idempotent_id('37b1bbf2-d664-4785-9a11-333438586eae') def test_create_domain_with_name_length_over_64(self): - # Domain name length should not ne greater than 64 characters + """Test creating domain with name over length + + Domain name length should not ne greater than 64 characters + """ d_name = 'a' * 65 self.assertRaises(lib_exc.BadRequest, self.domains_client.create_domain, @@ -56,13 +65,14 @@ class DomainsNegativeTestJSON(base.BaseIdentityV3AdminTest): @decorators.attr(type=['negative']) @decorators.idempotent_id('43781c07-764f-4cf2-a405-953c1916f605') def test_delete_non_existent_domain(self): - # Attempt to delete a non existent domain should fail + """Test attempting to delete a non existent domain should fail""" self.assertRaises(lib_exc.NotFound, self.domains_client.delete_domain, data_utils.rand_uuid_hex()) @decorators.attr(type=['negative']) @decorators.idempotent_id('e6f9e4a2-4f36-4be8-bdbc-4e199ae29427') def test_domain_create_duplicate(self): + """Test creating domain with duplicate name should fail""" domain_name = data_utils.rand_name('domain-dup') domain = self.domains_client.create_domain(name=domain_name)['domain'] domain_id = domain['id'] diff --git a/tempest/api/identity/admin/v3/test_endpoints.py b/tempest/api/identity/admin/v3/test_endpoints.py index 366d6a0c85..0199d737c8 100644 --- a/tempest/api/identity/admin/v3/test_endpoints.py +++ b/tempest/api/identity/admin/v3/test_endpoints.py @@ -20,6 +20,8 @@ from tempest.lib import decorators class EndPointsTestJSON(base.BaseIdentityV3AdminTest): + """Test keystone endpoints""" + # NOTE: force_tenant_isolation is true in the base class by default but # overridden to false here to allow test execution for clouds using the # pre-provisioned credentials provider. @@ -71,6 +73,7 @@ class EndPointsTestJSON(base.BaseIdentityV3AdminTest): @decorators.idempotent_id('c19ecf90-240e-4e23-9966-21cee3f6a618') def test_list_endpoints(self): + """Test listing keystone endpoints by filters""" # Get the list of all the endpoints. fetched_endpoints = self.client.list_endpoints()['endpoints'] fetched_endpoint_ids = [e['id'] for e in fetched_endpoints] @@ -111,6 +114,7 @@ class EndPointsTestJSON(base.BaseIdentityV3AdminTest): @decorators.idempotent_id('0e2446d2-c1fd-461b-a729-b9e73e3e3b37') def test_create_list_show_delete_endpoint(self): + """Test creating, listing, showing and deleting keystone endpoint""" region_name = data_utils.rand_name('region') url = data_utils.rand_url() interface = 'public' @@ -152,6 +156,7 @@ class EndPointsTestJSON(base.BaseIdentityV3AdminTest): @decorators.attr(type='smoke') @decorators.idempotent_id('37e8f15e-ee7c-4657-a1e7-f6b61e375eff') def test_update_endpoint(self): + """Test updating keystone endpoint""" # NOTE(zhufl) Service2 should be created before endpoint_for_update # is created, because Service2 must be deleted after # endpoint_for_update is deleted, otherwise we will get a 404 error diff --git a/tempest/api/identity/admin/v3/test_list_projects.py b/tempest/api/identity/admin/v3/test_list_projects.py index cb8ea11764..b33d8bdb86 100644 --- a/tempest/api/identity/admin/v3/test_list_projects.py +++ b/tempest/api/identity/admin/v3/test_list_projects.py @@ -40,6 +40,7 @@ class BaseListProjectsTestJSON(base.BaseIdentityV3AdminTest): class ListProjectsTestJSON(BaseListProjectsTestJSON): + """Test listing projects""" @classmethod def resource_setup(cls): @@ -65,13 +66,13 @@ class ListProjectsTestJSON(BaseListProjectsTestJSON): @decorators.idempotent_id('0fe7a334-675a-4509-b00e-1c4b95d5dae8') def test_list_projects_with_enabled(self): - # List the projects with enabled + """Test listing the projects with enabled""" self._list_projects_with_params( [self.p1], [self.p2, self.p3], {'enabled': False}, 'enabled') @decorators.idempotent_id('6edc66f5-2941-4a17-9526-4073311c1fac') def test_list_projects_with_parent(self): - # List projects with parent + """Test listing projects with parent""" params = {'parent_id': self.p3['parent_id']} fetched_projects = self.projects_client.list_projects( params)['projects'] @@ -81,6 +82,11 @@ class ListProjectsTestJSON(BaseListProjectsTestJSON): class ListProjectsStaticTestJSON(BaseListProjectsTestJSON): + """Test listing projects + + These tests can be executed in clouds using the pre-provisioned users + """ + # NOTE: force_tenant_isolation is true in the base class by default but # overridden to false here to allow test execution for clouds using the # pre-provisioned credentials provider. @@ -102,7 +108,7 @@ class ListProjectsStaticTestJSON(BaseListProjectsTestJSON): @decorators.idempotent_id('1d830662-22ad-427c-8c3e-4ec854b0af44') def test_list_projects(self): - # List projects + """Test listing projects""" list_projects = self.projects_client.list_projects()['projects'] for p in [self.p1, self.p2]: @@ -112,13 +118,13 @@ class ListProjectsStaticTestJSON(BaseListProjectsTestJSON): @decorators.idempotent_id('fa178524-4e6d-4925-907c-7ab9f42c7e26') def test_list_projects_with_name(self): - # List projects with name + """Test listing projects filtered by name""" self._list_projects_with_params( [self.p1], [self.p2], {'name': self.p1['name']}, 'name') @decorators.idempotent_id('fab13f3c-f6a6-4b9f-829b-d32fd44fdf10') def test_list_projects_with_domains(self): - # Verify project list filtered by domain + """Test listing projects filtered by domain""" key = 'domain_id' for p in [self.p1, self.p2]: params = {key: p[key]} diff --git a/tempest/api/identity/admin/v3/test_projects.py b/tempest/api/identity/admin/v3/test_projects.py index e46145d967..be1216ab36 100644 --- a/tempest/api/identity/admin/v3/test_projects.py +++ b/tempest/api/identity/admin/v3/test_projects.py @@ -23,6 +23,8 @@ CONF = config.CONF class ProjectsTestJSON(base.BaseIdentityV3AdminTest): + """Test identity projects""" + # NOTE: force_tenant_isolation is true in the base class by default but # overridden to false here to allow test execution for clouds using the # pre-provisioned credentials provider. @@ -30,7 +32,7 @@ class ProjectsTestJSON(base.BaseIdentityV3AdminTest): @decorators.idempotent_id('0ecf465c-0dc4-4532-ab53-91ffeb74d12d') def test_project_create_with_description(self): - # Create project with a description + """Test creating project with a description""" project_desc = data_utils.rand_name('desc') project = self.setup_test_project(description=project_desc) project_id = project['id'] @@ -44,7 +46,7 @@ class ProjectsTestJSON(base.BaseIdentityV3AdminTest): @decorators.idempotent_id('5f50fe07-8166-430b-a882-3b2ee0abe26f') def test_project_create_with_domain(self): - # Create project with a domain + """Test creating project with a domain""" domain = self.setup_test_domain() project_name = data_utils.rand_name('project') project = self.setup_test_project( @@ -58,7 +60,7 @@ class ProjectsTestJSON(base.BaseIdentityV3AdminTest): @decorators.idempotent_id('1854f9c0-70bc-4d11-a08a-1c789d339e3d') def test_project_create_with_parent(self): - # Create root project without providing a parent_id + """Test creating root project without providing a parent_id""" domain = self.setup_test_domain() domain_id = domain['id'] @@ -83,6 +85,7 @@ class ProjectsTestJSON(base.BaseIdentityV3AdminTest): @decorators.idempotent_id('a7eb9416-6f9b-4dbb-b71b-7f73aaef59d5') def test_create_is_domain_project(self): + """Test creating is_domain project""" project = self.setup_test_project(domain_id=None, is_domain=True) # To delete a domain, we need to disable it first self.addCleanup(self.projects_client.update_project, project['id'], @@ -103,7 +106,7 @@ class ProjectsTestJSON(base.BaseIdentityV3AdminTest): @decorators.idempotent_id('1f66dc76-50cc-4741-a200-af984509e480') def test_project_create_enabled(self): - # Create a project that is enabled + """Test creating a project that is enabled""" project = self.setup_test_project(enabled=True) project_id = project['id'] self.assertTrue(project['enabled'], @@ -113,7 +116,7 @@ class ProjectsTestJSON(base.BaseIdentityV3AdminTest): @decorators.idempotent_id('78f96a9c-e0e0-4ee6-a3ba-fbf6dfd03207') def test_project_create_not_enabled(self): - # Create a project that is not enabled + """Test creating a project that is not enabled""" project = self.setup_test_project(enabled=False) self.assertFalse(project['enabled'], 'Enable should be False in response') @@ -123,7 +126,7 @@ class ProjectsTestJSON(base.BaseIdentityV3AdminTest): @decorators.idempotent_id('f608f368-048c-496b-ad63-d286c26dab6b') def test_project_update_name(self): - # Update name attribute of a project + """Test updating name attribute of a project""" p_name1 = data_utils.rand_name('project') project = self.setup_test_project(name=p_name1) @@ -144,7 +147,7 @@ class ProjectsTestJSON(base.BaseIdentityV3AdminTest): @decorators.idempotent_id('f138b715-255e-4a7d-871d-351e1ef2e153') def test_project_update_desc(self): - # Update description attribute of a project + """Test updating description attribute of a project""" p_desc = data_utils.rand_name('desc') project = self.setup_test_project(description=p_desc) resp1_desc = project['description'] @@ -164,7 +167,7 @@ class ProjectsTestJSON(base.BaseIdentityV3AdminTest): @decorators.idempotent_id('b6b25683-c97f-474d-a595-55d410b68100') def test_project_update_enable(self): - # Update the enabled attribute of a project + """Test updating the enabled attribute of a project""" p_en = False project = self.setup_test_project(enabled=p_en) @@ -189,7 +192,7 @@ class ProjectsTestJSON(base.BaseIdentityV3AdminTest): 'immutable user source and solely ' 'provides read-only access to users.') def test_associate_user_to_project(self): - # Associate a user to a project + """Test associating a user to a project""" # Create a Project project = self.setup_test_project() @@ -215,6 +218,7 @@ class ProjectsTestJSON(base.BaseIdentityV3AdminTest): @decorators.idempotent_id('d1db68b6-aebe-4fa0-b79d-d724d2e21162') def test_project_get_equals_list(self): + """Test the result of getting project equals that of listing""" fields = ['parent_id', 'is_domain', 'description', 'links', 'name', 'enabled', 'domain_id', 'id', 'tags'] diff --git a/tempest/api/identity/admin/v3/test_projects_negative.py b/tempest/api/identity/admin/v3/test_projects_negative.py index 12f1d4a31b..79e3d29cae 100644 --- a/tempest/api/identity/admin/v3/test_projects_negative.py +++ b/tempest/api/identity/admin/v3/test_projects_negative.py @@ -20,11 +20,12 @@ from tempest.lib import exceptions as lib_exc class ProjectsNegativeTestJSON(base.BaseIdentityV3AdminTest): + """Negative tests of projects""" @decorators.attr(type=['negative']) @decorators.idempotent_id('8d68c012-89e0-4394-8d6b-ccd7196def97') def test_project_delete_by_unauthorized_user(self): - # Non-admin user should not be able to delete a project + """Non-admin user should not be able to delete a project""" project = self.setup_test_project() self.assertRaises( lib_exc.Forbidden, self.non_admin_projects_client.delete_project, @@ -32,6 +33,11 @@ class ProjectsNegativeTestJSON(base.BaseIdentityV3AdminTest): class ProjectsNegativeStaticTestJSON(base.BaseIdentityV3AdminTest): + """Negative tests of projects + + These tests can be executed in clouds using the pre-provisioned users + """ + # NOTE: force_tenant_isolation is true in the base class by default but # overridden to false here to allow test execution for clouds using the # pre-provisioned credentials provider. @@ -40,14 +46,14 @@ class ProjectsNegativeStaticTestJSON(base.BaseIdentityV3AdminTest): @decorators.attr(type=['negative']) @decorators.idempotent_id('24c49279-45dd-4155-887a-cb738c2385aa') def test_list_projects_by_unauthorized_user(self): - # Non-admin user should not be able to list projects + """Non-admin user should not be able to list projects""" self.assertRaises(lib_exc.Forbidden, self.non_admin_projects_client.list_projects) @decorators.attr(type=['negative']) @decorators.idempotent_id('874c3e84-d174-4348-a16b-8c01f599561b') def test_project_create_duplicate(self): - # Project names should be unique + """Project names should be unique""" project_name = data_utils.rand_name('project-dup') self.setup_test_project(name=project_name) @@ -57,7 +63,7 @@ class ProjectsNegativeStaticTestJSON(base.BaseIdentityV3AdminTest): @decorators.attr(type=['negative']) @decorators.idempotent_id('8fba9de2-3e1f-4e77-812a-60cb68f8df13') def test_create_project_by_unauthorized_user(self): - # Non-admin user should not be authorized to create a project + """Non-admin user should not be authorized to create a project""" project_name = data_utils.rand_name('project') self.assertRaises( lib_exc.Forbidden, self.non_admin_projects_client.create_project, @@ -66,14 +72,14 @@ class ProjectsNegativeStaticTestJSON(base.BaseIdentityV3AdminTest): @decorators.attr(type=['negative']) @decorators.idempotent_id('7828db17-95e5-475b-9432-9a51b4aa79a9') def test_create_project_with_empty_name(self): - # Project name should not be empty + """Project name should not be empty""" self.assertRaises(lib_exc.BadRequest, self.projects_client.create_project, name='') @decorators.attr(type=['negative']) @decorators.idempotent_id('502b6ceb-b0c8-4422-bf53-f08fdb21e2f0') def test_create_projects_name_length_over_64(self): - # Project name length should not be greater than 64 characters + """Project name length should not be greater than 64 characters""" project_name = 'a' * 65 self.assertRaises(lib_exc.BadRequest, self.projects_client.create_project, project_name) @@ -81,7 +87,7 @@ class ProjectsNegativeStaticTestJSON(base.BaseIdentityV3AdminTest): @decorators.attr(type=['negative']) @decorators.idempotent_id('7965b581-60c1-43b7-8169-95d4ab7fc6fb') def test_delete_non_existent_project(self): - # Attempt to delete a non existent project should fail + """Attempt to delete a non existent project should fail""" self.assertRaises(lib_exc.NotFound, self.projects_client.delete_project, data_utils.rand_uuid_hex())