summaryrefslogtreecommitdiff
path: root/openstackclient/tests/unit/identity/v3
diff options
context:
space:
mode:
Diffstat (limited to 'openstackclient/tests/unit/identity/v3')
-rw-r--r--openstackclient/tests/unit/identity/v3/__init__.py0
-rw-r--r--openstackclient/tests/unit/identity/v3/fakes.py914
-rw-r--r--openstackclient/tests/unit/identity/v3/test_catalog.py142
-rw-r--r--openstackclient/tests/unit/identity/v3/test_consumer.py219
-rw-r--r--openstackclient/tests/unit/identity/v3/test_credential.py357
-rw-r--r--openstackclient/tests/unit/identity/v3/test_domain.py401
-rw-r--r--openstackclient/tests/unit/identity/v3/test_endpoint.py750
-rw-r--r--openstackclient/tests/unit/identity/v3/test_group.py569
-rw-r--r--openstackclient/tests/unit/identity/v3/test_identity_provider.py593
-rw-r--r--openstackclient/tests/unit/identity/v3/test_mappings.py244
-rw-r--r--openstackclient/tests/unit/identity/v3/test_oauth.py173
-rw-r--r--openstackclient/tests/unit/identity/v3/test_project.py978
-rw-r--r--openstackclient/tests/unit/identity/v3/test_protocol.py188
-rw-r--r--openstackclient/tests/unit/identity/v3/test_region.py348
-rw-r--r--openstackclient/tests/unit/identity/v3/test_role.py1105
-rw-r--r--openstackclient/tests/unit/identity/v3/test_role_assignment.py683
-rw-r--r--openstackclient/tests/unit/identity/v3/test_service.py504
-rw-r--r--openstackclient/tests/unit/identity/v3/test_service_provider.py408
-rw-r--r--openstackclient/tests/unit/identity/v3/test_token.py138
-rw-r--r--openstackclient/tests/unit/identity/v3/test_trust.py236
-rw-r--r--openstackclient/tests/unit/identity/v3/test_unscoped_saml.py133
-rw-r--r--openstackclient/tests/unit/identity/v3/test_user.py1063
22 files changed, 10146 insertions, 0 deletions
diff --git a/openstackclient/tests/unit/identity/v3/__init__.py b/openstackclient/tests/unit/identity/v3/__init__.py
new file mode 100644
index 00000000..e69de29b
--- /dev/null
+++ b/openstackclient/tests/unit/identity/v3/__init__.py
diff --git a/openstackclient/tests/unit/identity/v3/fakes.py b/openstackclient/tests/unit/identity/v3/fakes.py
new file mode 100644
index 00000000..7b76fa60
--- /dev/null
+++ b/openstackclient/tests/unit/identity/v3/fakes.py
@@ -0,0 +1,914 @@
+# Copyright 2013 Nebula Inc.
+#
+# 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 copy
+import mock
+import uuid
+
+from keystoneauth1 import access
+from keystoneauth1 import fixture
+
+from openstackclient.tests.unit import fakes
+from openstackclient.tests.unit import utils
+
+base_url = 'http://identity:5000/v3/'
+
+domain_id = 'd1'
+domain_name = 'oftheking'
+domain_description = 'domain description'
+
+DOMAIN = {
+ 'id': domain_id,
+ 'name': domain_name,
+ 'description': domain_description,
+ 'enabled': True,
+ 'links': base_url + 'domains/' + domain_id,
+}
+
+group_id = 'gr-010'
+group_name = 'spencer davis'
+
+GROUP = {
+ 'id': group_id,
+ 'name': group_name,
+ 'links': base_url + 'groups/' + group_id,
+}
+
+mapping_id = 'test_mapping'
+mapping_rules_file_path = '/tmp/path/to/file'
+# Copied from
+# (https://github.com/openstack/keystone/blob\
+# master/keystone/tests/mapping_fixtures.py
+EMPLOYEE_GROUP_ID = "0cd5e9"
+DEVELOPER_GROUP_ID = "xyz"
+MAPPING_RULES = [
+ {
+ "local": [
+ {
+ "group": {
+ "id": EMPLOYEE_GROUP_ID
+ }
+ }
+ ],
+ "remote": [
+ {
+ "type": "orgPersonType",
+ "not_any_of": [
+ "Contractor",
+ "Guest"
+ ]
+ }
+ ]
+ }
+]
+
+MAPPING_RULES_2 = [
+ {
+ "local": [
+ {
+ "group": {
+ "id": DEVELOPER_GROUP_ID
+ }
+ }
+ ],
+ "remote": [
+ {
+ "type": "orgPersonType",
+ "any_one_of": [
+ "Contractor"
+ ]
+ }
+ ]
+ }
+]
+
+
+MAPPING_RESPONSE = {
+ "id": mapping_id,
+ "rules": MAPPING_RULES
+}
+
+MAPPING_RESPONSE_2 = {
+ "id": mapping_id,
+ "rules": MAPPING_RULES_2
+}
+
+project_id = '8-9-64'
+project_name = 'beatles'
+project_description = 'Fab Four'
+
+PROJECT = {
+ 'id': project_id,
+ 'name': project_name,
+ 'description': project_description,
+ 'enabled': True,
+ 'domain_id': domain_id,
+ 'links': base_url + 'projects/' + project_id,
+}
+
+PROJECT_2 = {
+ 'id': project_id + '-2222',
+ 'name': project_name + ' reprise',
+ 'description': project_description + 'plus four more',
+ 'enabled': True,
+ 'domain_id': domain_id,
+ 'links': base_url + 'projects/' + project_id,
+}
+
+region_id = 'region_one'
+region_parent_region_id = 'region_two'
+region_description = 'region one'
+
+REGION = {
+ 'id': region_id,
+ 'description': region_description,
+ 'parent_region_id': region_parent_region_id,
+ 'links': base_url + 'regions/' + region_id,
+}
+
+PROJECT_WITH_PARENT = {
+ 'id': project_id + '-with-parent',
+ 'name': project_name + ' and their parents',
+ 'description': project_description + ' plus another four',
+ 'enabled': True,
+ 'domain_id': domain_id,
+ 'parent_id': project_id,
+ 'links': base_url + 'projects/' + (project_id + '-with-parent'),
+}
+
+PROJECT_WITH_GRANDPARENT = {
+ 'id': project_id + '-with-grandparent',
+ 'name': project_name + ', granny and grandpa',
+ 'description': project_description + ' plus another eight?',
+ 'enabled': True,
+ 'domain_id': domain_id,
+ 'parent_id': PROJECT_WITH_PARENT['id'],
+ 'links': base_url + 'projects/' + (project_id + '-with-grandparent'),
+}
+
+parents = [{'project': PROJECT}]
+grandparents = [{'project': PROJECT}, {'project': PROJECT_WITH_PARENT}]
+ids_for_parents = [PROJECT['id']]
+ids_for_parents_and_grandparents = [PROJECT['id'], PROJECT_WITH_PARENT['id']]
+
+children = [{'project': PROJECT_WITH_GRANDPARENT}]
+ids_for_children = [PROJECT_WITH_GRANDPARENT['id']]
+
+
+role_id = 'r1'
+role_name = 'roller'
+
+ROLE = {
+ 'id': role_id,
+ 'name': role_name,
+ 'domain': None,
+ 'links': base_url + 'roles/' + role_id,
+}
+
+ROLE_2 = {
+ 'id': 'r2',
+ 'name': 'Rolls Royce',
+ 'domain': domain_id,
+ 'links': base_url + 'roles/' + 'r2',
+}
+
+service_id = 's-123'
+service_name = 'Texaco'
+service_type = 'gas'
+service_description = 'oil brand'
+
+SERVICE = {
+ 'id': service_id,
+ 'name': service_name,
+ 'type': service_type,
+ 'description': service_description,
+ 'enabled': True,
+ 'links': base_url + 'services/' + service_id,
+}
+
+SERVICE_WITHOUT_NAME = {
+ 'id': service_id,
+ 'type': service_type,
+ 'description': service_description,
+ 'enabled': True,
+ 'links': base_url + 'services/' + service_id,
+}
+
+endpoint_id = 'e-123'
+endpoint_url = 'http://127.0.0.1:35357'
+endpoint_region = 'RegionOne'
+endpoint_interface = 'admin'
+
+ENDPOINT = {
+ 'id': endpoint_id,
+ 'url': endpoint_url,
+ 'region': endpoint_region,
+ 'interface': endpoint_interface,
+ 'service_id': service_id,
+ 'enabled': True,
+ 'links': base_url + 'endpoints/' + endpoint_id,
+}
+
+user_id = 'bbbbbbb-aaaa-aaaa-aaaa-bbbbbbbaaaa'
+user_name = 'paul'
+user_description = 'Sir Paul'
+user_email = 'paul@applecorps.com'
+
+USER = {
+ 'id': user_id,
+ 'name': user_name,
+ 'default_project_id': project_id,
+ 'email': user_email,
+ 'enabled': True,
+ 'domain_id': domain_id,
+ 'links': base_url + 'users/' + user_id,
+}
+
+trust_id = 't-456'
+trust_expires = None
+trust_impersonation = False
+trust_roles = {"id": role_id, "name": role_name},
+
+TRUST = {
+ 'expires_at': trust_expires,
+ 'id': trust_id,
+ 'impersonation': trust_impersonation,
+ 'links': base_url + 'trusts/' + trust_id,
+ 'project_id': project_id,
+ 'roles': trust_roles,
+ 'trustee_user_id': user_id,
+ 'trustor_user_id': user_id,
+}
+
+token_expires = '2016-09-05T18:04:52+0000'
+token_id = 'tttttttt-tttt-tttt-tttt-tttttttttttt'
+
+UNSCOPED_TOKEN = {
+ 'expires': token_expires,
+ 'id': token_id,
+ 'user_id': user_id,
+}
+
+TOKEN_WITH_PROJECT_ID = {
+ 'expires': token_expires,
+ 'id': token_id,
+ 'project_id': project_id,
+ 'user_id': user_id,
+}
+
+TOKEN_WITH_DOMAIN_ID = {
+ 'expires': token_expires,
+ 'id': token_id,
+ 'domain_id': domain_id,
+ 'user_id': user_id,
+}
+
+idp_id = 'test_idp'
+idp_description = 'super exciting IdP description'
+idp_remote_ids = ['entity1', 'entity2']
+formatted_idp_remote_ids = 'entity1, entity2'
+
+IDENTITY_PROVIDER = {
+ 'id': idp_id,
+ 'remote_ids': idp_remote_ids,
+ 'enabled': True,
+ 'description': idp_description
+}
+
+protocol_id = 'protocol'
+
+mapping_id = 'test_mapping'
+mapping_id_updated = 'prod_mapping'
+
+sp_id = 'BETA'
+sp_description = 'Service Provider to burst into'
+service_provider_url = 'https://beta.example.com/Shibboleth.sso/POST/SAML'
+sp_auth_url = ('https://beta.example.com/v3/OS-FEDERATION/identity_providers/'
+ 'idp/protocol/saml2/auth')
+
+SERVICE_PROVIDER = {
+ 'id': sp_id,
+ 'enabled': True,
+ 'description': sp_description,
+ 'sp_url': service_provider_url,
+ 'auth_url': sp_auth_url
+}
+
+PROTOCOL_ID_MAPPING = {
+ 'id': protocol_id,
+ 'mapping': mapping_id
+}
+
+PROTOCOL_OUTPUT = {
+ 'id': protocol_id,
+ 'mapping_id': mapping_id,
+ 'identity_provider': idp_id
+}
+
+PROTOCOL_OUTPUT_UPDATED = {
+ 'id': protocol_id,
+ 'mapping_id': mapping_id_updated,
+ 'identity_provider': idp_id
+}
+
+# Assignments
+
+ASSIGNMENT_WITH_PROJECT_ID_AND_USER_ID = {
+ 'scope': {'project': {'id': project_id}},
+ 'user': {'id': user_id},
+ 'role': {'id': role_id},
+}
+
+ASSIGNMENT_WITH_PROJECT_ID_AND_USER_ID_INCLUDE_NAMES = {
+ 'scope': {
+ 'project': {
+ 'domain': {'id': domain_id,
+ 'name': domain_name},
+ 'id': project_id,
+ 'name': project_name}},
+ 'user': {
+ 'domain': {'id': domain_id,
+ 'name': domain_name},
+ 'id': user_id,
+ 'name': user_name},
+ 'role': {'id': role_id,
+ 'name': role_name},
+}
+
+ASSIGNMENT_WITH_PROJECT_ID_AND_USER_ID_INHERITED = {
+ 'scope': {'project': {'id': project_id},
+ 'OS-INHERIT:inherited_to': 'projects'},
+ 'user': {'id': user_id},
+ 'role': {'id': role_id},
+}
+
+ASSIGNMENT_WITH_PROJECT_ID_AND_GROUP_ID = {
+ 'scope': {'project': {'id': project_id}},
+ 'group': {'id': group_id},
+ 'role': {'id': role_id},
+}
+
+ASSIGNMENT_WITH_DOMAIN_ID_AND_USER_ID = {
+ 'scope': {'domain': {'id': domain_id}},
+ 'user': {'id': user_id},
+ 'role': {'id': role_id},
+}
+
+ASSIGNMENT_WITH_DOMAIN_ROLE = {
+ 'scope': {'domain': {'id': domain_id}},
+ 'user': {'id': user_id},
+ 'role': {'id': ROLE_2['id']},
+}
+
+ASSIGNMENT_WITH_DOMAIN_ID_AND_USER_ID_INCLUDE_NAMES = {
+ 'scope': {
+ 'domain': {'id': domain_id,
+ 'name': domain_name}},
+ 'user': {
+ 'domain': {'id': domain_id,
+ 'name': domain_name},
+ 'id': user_id,
+ 'name': user_name},
+ 'role': {'id': role_id,
+ 'name': role_name},
+}
+
+ASSIGNMENT_WITH_DOMAIN_ID_AND_USER_ID_INHERITED = {
+ 'scope': {'domain': {'id': domain_id},
+ 'OS-INHERIT:inherited_to': 'projects'},
+ 'user': {'id': user_id},
+ 'role': {'id': role_id},
+}
+
+ASSIGNMENT_WITH_DOMAIN_ID_AND_GROUP_ID = {
+ 'scope': {'domain': {'id': domain_id}},
+ 'group': {'id': group_id},
+ 'role': {'id': role_id},
+}
+
+consumer_id = 'test consumer id'
+consumer_description = 'someone we trust'
+consumer_secret = 'test consumer secret'
+
+OAUTH_CONSUMER = {
+ 'id': consumer_id,
+ 'secret': consumer_secret,
+ 'description': consumer_description
+}
+
+access_token_id = 'test access token id'
+access_token_secret = 'test access token secret'
+access_token_expires = '2014-05-18T03:13:18.152071Z'
+
+OAUTH_ACCESS_TOKEN = {
+ 'id': access_token_id,
+ 'expires': access_token_expires,
+ 'key': access_token_id,
+ 'secret': access_token_secret
+}
+
+request_token_id = 'test request token id'
+request_token_secret = 'test request token secret'
+request_token_expires = '2014-05-17T11:10:51.511336Z'
+
+OAUTH_REQUEST_TOKEN = {
+ 'id': request_token_id,
+ 'expires': request_token_expires,
+ 'key': request_token_id,
+ 'secret': request_token_secret
+}
+
+oauth_verifier_pin = '6d74XaDS'
+OAUTH_VERIFIER = {
+ 'oauth_verifier': oauth_verifier_pin
+}
+
+
+def fake_auth_ref(fake_token, fake_service=None):
+ """Create an auth_ref using keystoneauth's fixtures"""
+ token_copy = copy.deepcopy(fake_token)
+ token_id = token_copy.pop('id')
+ token = fixture.V3Token(**token_copy)
+ # An auth_ref is actually an access info object
+ auth_ref = access.create(
+ body=token,
+ auth_token=token_id,
+ )
+
+ # Create a service catalog
+ if fake_service:
+ service = token.add_service(
+ fake_service['type'],
+ fake_service['name'],
+ )
+ # TODO(dtroyer): Add an 'id' element to KSA's _Service fixure
+ service['id'] = fake_service['id']
+ for e in fake_service['endpoints']:
+ region = e.get('region_id') or e.get('region', '<none>')
+ service.add_endpoint(
+ e['interface'],
+ e['url'],
+ region=region,
+ )
+
+ return auth_ref
+
+
+class FakeAuth(object):
+
+ def __init__(self, auth_method_class=None):
+ self._auth_method_class = auth_method_class
+
+ def get_token(self, *args, **kwargs):
+ return token_id
+
+
+class FakeSession(object):
+
+ def __init__(self, **kwargs):
+ self.auth = FakeAuth()
+
+
+class FakeIdentityv3Client(object):
+
+ def __init__(self, **kwargs):
+ self.domains = mock.Mock()
+ self.domains.resource_class = fakes.FakeResource(None, {})
+ self.credentials = mock.Mock()
+ self.credentials.resource_class = fakes.FakeResource(None, {})
+ self.endpoints = mock.Mock()
+ self.endpoints.resource_class = fakes.FakeResource(None, {})
+ self.groups = mock.Mock()
+ self.groups.resource_class = fakes.FakeResource(None, {})
+ self.oauth1 = mock.Mock()
+ self.oauth1.resource_class = fakes.FakeResource(None, {})
+ self.projects = mock.Mock()
+ self.projects.resource_class = fakes.FakeResource(None, {})
+ self.regions = mock.Mock()
+ self.regions.resource_class = fakes.FakeResource(None, {})
+ self.roles = mock.Mock()
+ self.roles.resource_class = fakes.FakeResource(None, {})
+ self.services = mock.Mock()
+ self.services.resource_class = fakes.FakeResource(None, {})
+ self.session = mock.Mock()
+ self.session.auth.auth_ref.service_catalog.resource_class = \
+ fakes.FakeResource(None, {})
+ self.tokens = mock.Mock()
+ self.tokens.resource_class = fakes.FakeResource(None, {})
+ self.trusts = mock.Mock()
+ self.trusts.resource_class = fakes.FakeResource(None, {})
+ self.users = mock.Mock()
+ self.users.resource_class = fakes.FakeResource(None, {})
+ self.role_assignments = mock.Mock()
+ self.role_assignments.resource_class = fakes.FakeResource(None, {})
+ self.auth_token = kwargs['token']
+ self.management_url = kwargs['endpoint']
+ self.auth = FakeAuth()
+ self.auth.client = mock.Mock()
+ self.auth.client.resource_class = fakes.FakeResource(None, {})
+
+
+class FakeFederationManager(object):
+
+ def __init__(self, **kwargs):
+ self.identity_providers = mock.Mock()
+ self.identity_providers.resource_class = fakes.FakeResource(None, {})
+ self.mappings = mock.Mock()
+ self.mappings.resource_class = fakes.FakeResource(None, {})
+ self.protocols = mock.Mock()
+ self.protocols.resource_class = fakes.FakeResource(None, {})
+ self.projects = mock.Mock()
+ self.projects.resource_class = fakes.FakeResource(None, {})
+ self.domains = mock.Mock()
+ self.domains.resource_class = fakes.FakeResource(None, {})
+ self.service_providers = mock.Mock()
+ self.service_providers.resource_class = fakes.FakeResource(None, {})
+
+
+class FakeFederatedClient(FakeIdentityv3Client):
+
+ def __init__(self, **kwargs):
+ super(FakeFederatedClient, self).__init__(**kwargs)
+ self.federation = FakeFederationManager()
+
+
+class FakeOAuth1Client(FakeIdentityv3Client):
+
+ def __init__(self, **kwargs):
+ super(FakeOAuth1Client, self).__init__(**kwargs)
+
+ self.access_tokens = mock.Mock()
+ self.access_tokens.resource_class = fakes.FakeResource(None, {})
+ self.consumers = mock.Mock()
+ self.consumers.resource_class = fakes.FakeResource(None, {})
+ self.request_tokens = mock.Mock()
+ self.request_tokens.resource_class = fakes.FakeResource(None, {})
+
+
+class TestIdentityv3(utils.TestCommand):
+
+ def setUp(self):
+ super(TestIdentityv3, self).setUp()
+
+ self.app.client_manager.identity = FakeIdentityv3Client(
+ endpoint=fakes.AUTH_URL,
+ token=fakes.AUTH_TOKEN,
+ )
+
+
+class TestFederatedIdentity(utils.TestCommand):
+
+ def setUp(self):
+ super(TestFederatedIdentity, self).setUp()
+
+ self.app.client_manager.identity = FakeFederatedClient(
+ endpoint=fakes.AUTH_URL,
+ token=fakes.AUTH_TOKEN
+ )
+
+
+class TestOAuth1(utils.TestCommand):
+
+ def setUp(self):
+ super(TestOAuth1, self).setUp()
+
+ self.app.client_manager.identity = FakeOAuth1Client(
+ endpoint=fakes.AUTH_URL,
+ token=fakes.AUTH_TOKEN
+ )
+
+
+class FakeProject(object):
+ """Fake one or more project."""
+
+ @staticmethod
+ def create_one_project(attrs=None):
+ """Create a fake project.
+
+ :param Dictionary attrs:
+ A dictionary with all attributes
+ :return:
+ A FakeResource object, with id, name, and so on
+ """
+
+ attrs = attrs or {}
+
+ # set default attributes.
+ project_info = {
+ 'id': 'project-id-' + uuid.uuid4().hex,
+ 'name': 'project-name-' + uuid.uuid4().hex,
+ 'description': 'project-description-' + uuid.uuid4().hex,
+ 'enabled': True,
+ 'is_domain': False,
+ 'domain_id': 'domain-id-' + uuid.uuid4().hex,
+ 'parent_id': 'parent-id-' + uuid.uuid4().hex,
+ 'links': 'links-' + uuid.uuid4().hex,
+ }
+ project_info.update(attrs)
+
+ project = fakes.FakeResource(info=copy.deepcopy(project_info),
+ loaded=True)
+ return project
+
+
+class FakeDomain(object):
+ """Fake one or more domain."""
+
+ @staticmethod
+ def create_one_domain(attrs=None):
+ """Create a fake domain.
+
+ :param Dictionary attrs:
+ A dictionary with all attributes
+ :return:
+ A FakeResource object, with id, name, and so on
+ """
+
+ attrs = attrs or {}
+
+ # set default attributes.
+ domain_info = {
+ 'id': 'domain-id-' + uuid.uuid4().hex,
+ 'name': 'domain-name-' + uuid.uuid4().hex,
+ 'description': 'domain-description-' + uuid.uuid4().hex,
+ 'enabled': True,
+ 'links': 'links-' + uuid.uuid4().hex,
+ }
+ domain_info.update(attrs)
+
+ domain = fakes.FakeResource(info=copy.deepcopy(domain_info),
+ loaded=True)
+ return domain
+
+
+class FakeCredential(object):
+ """Fake one or more credential."""
+
+ @staticmethod
+ def create_one_credential(attrs=None):
+ """Create a fake credential.
+
+ :param Dictionary attrs:
+ A dictionary with all attributes
+ :return:
+ A FakeResource object, with id, type, and so on
+ """
+
+ attrs = attrs or {}
+
+ # set default attributes.
+ credential_info = {
+ 'id': 'credential-id-' + uuid.uuid4().hex,
+ 'type': 'cert',
+ 'user_id': 'user-id-' + uuid.uuid4().hex,
+ 'blob': 'credential-data-' + uuid.uuid4().hex,
+ 'project_id': 'project-id-' + uuid.uuid4().hex,
+ 'links': 'links-' + uuid.uuid4().hex,
+ }
+ credential_info.update(attrs)
+
+ credential = fakes.FakeResource(
+ info=copy.deepcopy(credential_info), loaded=True)
+ return credential
+
+ @staticmethod
+ def create_credentials(attrs=None, count=2):
+ """Create multiple fake credentials.
+
+ :param Dictionary attrs:
+ A dictionary with all attributes
+ :param int count:
+ The number of credentials to fake
+ :return:
+ A list of FakeResource objects faking the credentials
+ """
+ credentials = []
+ for i in range(0, count):
+ credential = FakeCredential.create_one_credential(attrs)
+ credentials.append(credential)
+
+ return credentials
+
+ @staticmethod
+ def get_credentials(credentials=None, count=2):
+ """Get an iterable MagicMock object with a list of faked credentials.
+
+ If credentials list is provided, then initialize the Mock object with
+ the list. Otherwise create one.
+
+ :param List credentials:
+ A list of FakeResource objects faking credentials
+ :param Integer count:
+ The number of credentials to be faked
+ :return
+ An iterable Mock object with side_effect set to a list of faked
+ credentials
+ """
+ if credentials is None:
+ credentials = FakeCredential.create_credentials(count)
+
+ return mock.MagicMock(side_effect=credentials)
+
+
+class FakeUser(object):
+ """Fake one or more user."""
+
+ @staticmethod
+ def create_one_user(attrs=None):
+ """Create a fake user.
+
+ :param Dictionary attrs:
+ A dictionary with all attributes
+ :return:
+ A FakeResource object, with id, name, and so on
+ """
+
+ attrs = attrs or {}
+
+ # set default attributes.
+ user_info = {
+ 'id': 'user-id-' + uuid.uuid4().hex,
+ 'name': 'user-name-' + uuid.uuid4().hex,
+ 'default_project_id': 'project-' + uuid.uuid4().hex,
+ 'email': 'user-email-' + uuid.uuid4().hex,
+ 'enabled': True,
+ 'domain_id': 'domain-id-' + uuid.uuid4().hex,
+ 'links': 'links-' + uuid.uuid4().hex,
+ }
+ user_info.update(attrs)
+
+ user = fakes.FakeResource(info=copy.deepcopy(user_info),
+ loaded=True)
+ return user
+
+
+class FakeGroup(object):
+ """Fake one or more group."""
+
+ @staticmethod
+ def create_one_group(attrs=None):
+ """Create a fake group.
+
+ :param Dictionary attrs:
+ A dictionary with all attributes
+ :return:
+ A FakeResource object, with id, name, and so on
+ """
+
+ attrs = attrs or {}
+
+ # set default attributes.
+ group_info = {
+ 'id': 'group-id-' + uuid.uuid4().hex,
+ 'name': 'group-name-' + uuid.uuid4().hex,
+ 'links': 'links-' + uuid.uuid4().hex,
+ 'domain_id': 'domain-id-' + uuid.uuid4().hex,
+ 'description': 'group-description-' + uuid.uuid4().hex,
+ }
+ group_info.update(attrs)
+
+ group = fakes.FakeResource(info=copy.deepcopy(group_info),
+ loaded=True)
+ return group
+
+ @staticmethod
+ def create_groups(attrs=None, count=2):
+ """Create multiple fake groups.
+
+ :param Dictionary attrs:
+ A dictionary with all attributes
+ :param int count:
+ The number of groups to fake
+ :return:
+ A list of FakeResource objects faking the groups
+ """
+ groups = []
+ for i in range(0, count):
+ group = FakeGroup.create_one_group(attrs)
+ groups.append(group)
+
+ return groups
+
+ @staticmethod
+ def get_groups(groups=None, count=2):
+ """Get an iterable MagicMock object with a list of faked groups.
+
+ If groups list is provided, then initialize the Mock object with
+ the list. Otherwise create one.
+
+ :param List groups:
+ A list of FakeResource objects faking groups
+ :param Integer count:
+ The number of groups to be faked
+ :return
+ An iterable Mock object with side_effect set to a list of faked
+ groups
+ """
+ if groups is None:
+ groups = FakeGroup.create_groups(count)
+
+ return mock.MagicMock(side_effect=groups)
+
+
+class FakeEndpoint(object):
+ """Fake one or more endpoint."""
+
+ @staticmethod
+ def create_one_endpoint(attrs=None):
+ """Create a fake endpoint.
+
+ :param Dictionary attrs:
+ A dictionary with all attributes
+ :return:
+ A FakeResource object, with id, url, and so on
+ """
+
+ attrs = attrs or {}
+
+ # set default attributes.
+ endpoint_info = {
+ 'id': 'endpoint-id-' + uuid.uuid4().hex,
+ 'url': 'url-' + uuid.uuid4().hex,
+ 'region': 'endpoint-region-' + uuid.uuid4().hex,
+ 'interface': 'admin',
+ 'service_id': 'service-id-' + uuid.uuid4().hex,
+ 'enabled': True,
+ 'links': 'links-' + uuid.uuid4().hex,
+ }
+ endpoint_info.update(attrs)
+
+ endpoint = fakes.FakeResource(info=copy.deepcopy(endpoint_info),
+ loaded=True)
+ return endpoint
+
+
+class FakeService(object):
+ """Fake one or more service."""
+
+ @staticmethod
+ def create_one_service(attrs=None):
+ """Create a fake service.
+
+ :param Dictionary attrs:
+ A dictionary with all attributes
+ :return:
+ A FakeResource object, with id, name, and so on
+ """
+
+ attrs = attrs or {}
+
+ # set default attributes.
+ service_info = {
+ 'id': 'service-id-' + uuid.uuid4().hex,
+ 'name': 'service-name-' + uuid.uuid4().hex,
+ 'type': 'service-type-' + uuid.uuid4().hex,
+ 'description': 'service-description-' + uuid.uuid4().hex,
+ 'enabled': True,
+ 'links': 'links-' + uuid.uuid4().hex,
+ }
+ service_info.update(attrs)
+
+ service = fakes.FakeResource(info=copy.deepcopy(service_info),
+ loaded=True)
+ return service
+
+
+class FakeRoleAssignment(object):
+ """Fake one or more role assignment."""
+
+ @staticmethod
+ def create_one_role_assignment(attrs=None):
+ """Create a fake role assignment.
+
+ :param Dictionary attrs:
+ A dictionary with all attributes
+ :return:
+ A FakeResource object, with scope, user, and so on
+ """
+
+ attrs = attrs or {}
+
+ # set default attributes.
+ role_assignment_info = {
+ 'scope': {'project': {'id': 'project-id-' + uuid.uuid4().hex}},
+ 'user': {'id': 'user-id-' + uuid.uuid4().hex},
+ 'role': {'id': 'role-id-' + uuid.uuid4().hex},
+ }
+ role_assignment_info.update(attrs)
+
+ role_assignment = fakes.FakeResource(
+ info=copy.deepcopy(role_assignment_info), loaded=True)
+
+ return role_assignment
diff --git a/openstackclient/tests/unit/identity/v3/test_catalog.py b/openstackclient/tests/unit/identity/v3/test_catalog.py
new file mode 100644
index 00000000..986c05f3
--- /dev/null
+++ b/openstackclient/tests/unit/identity/v3/test_catalog.py
@@ -0,0 +1,142 @@
+# 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 mock
+
+from openstackclient.identity.v3 import catalog
+from openstackclient.tests.unit.identity.v3 import fakes as identity_fakes
+from openstackclient.tests.unit import utils
+
+
+class TestCatalog(utils.TestCommand):
+
+ fake_service = {
+ 'id': 'qwertyuiop',
+ 'type': 'compute',
+ 'name': 'supernova',
+ 'endpoints': [
+ {
+ 'region': 'onlyone',
+ 'url': 'https://public.example.com',
+ 'interface': 'public',
+ },
+ {
+ 'region_id': 'onlyone',
+ 'url': 'https://admin.example.com',
+ 'interface': 'admin',
+ },
+ {
+ 'url': 'https://internal.example.com',
+ 'interface': 'internal',
+ },
+ {
+ 'region': None,
+ 'url': 'https://none.example.com',
+ 'interface': 'none',
+ },
+ ],
+ }
+
+ def setUp(self):
+ super(TestCatalog, self).setUp()
+
+ self.sc_mock = mock.MagicMock()
+ self.sc_mock.service_catalog.catalog.return_value = [
+ self.fake_service,
+ ]
+
+ self.auth_mock = mock.MagicMock()
+ self.app.client_manager.session = self.auth_mock
+
+ self.auth_mock.auth.get_auth_ref.return_value = self.sc_mock
+
+
+class TestCatalogList(TestCatalog):
+
+ def setUp(self):
+ super(TestCatalogList, self).setUp()
+
+ # Get the command object to test
+ self.cmd = catalog.ListCatalog(self.app, None)
+
+ def test_catalog_list(self):
+ auth_ref = identity_fakes.fake_auth_ref(
+ identity_fakes.TOKEN_WITH_PROJECT_ID,
+ fake_service=self.fake_service,
+ )
+ self.ar_mock = mock.PropertyMock(return_value=auth_ref)
+ type(self.app.client_manager).auth_ref = self.ar_mock
+
+ arglist = []
+ verifylist = []
+ parsed_args = self.check_parser(self.cmd, arglist, verifylist)
+
+ # In base command class Lister in cliff, abstract method take_action()
+ # returns a tuple containing the column names and an iterable
+ # containing the data to be listed.
+ columns, data = self.cmd.take_action(parsed_args)
+
+ collist = ('Name', 'Type', 'Endpoints')
+ self.assertEqual(collist, columns)
+ datalist = ((
+ 'supernova',
+ 'compute',
+ 'onlyone\n public: https://public.example.com\n'
+ 'onlyone\n admin: https://admin.example.com\n'
+ '<none>\n internal: https://internal.example.com\n'
+ '<none>\n none: https://none.example.com\n',
+ ), )
+ self.assertEqual(datalist, tuple(data))
+
+
+class TestCatalogShow(TestCatalog):
+
+ def setUp(self):
+ super(TestCatalogShow, self).setUp()
+
+ # Get the command object to test
+ self.cmd = catalog.ShowCatalog(self.app, None)
+
+ def test_catalog_show(self):
+ auth_ref = identity_fakes.fake_auth_ref(
+ identity_fakes.TOKEN_WITH_PROJECT_ID,
+ fake_service=self.fake_service,
+ )
+ self.ar_mock = mock.PropertyMock(return_value=auth_ref)
+ type(self.app.client_manager).auth_ref = self.ar_mock
+
+ arglist = [
+ 'compute',
+ ]
+ verifylist = [
+ ('service', 'compute'),
+ ]
+ parsed_args = self.check_parser(self.cmd, arglist, verifylist)
+
+ # In base command class ShowOne in cliff, abstract method take_action()
+ # returns a two-part tuple with a tuple of column names and a tuple of
+ # data to be shown.
+ columns, data = self.cmd.take_action(parsed_args)
+
+ collist = ('endpoints', 'id', 'name', 'type')
+ self.assertEqual(collist, columns)
+ datalist = (
+ 'onlyone\n public: https://public.example.com\nonlyone\n'
+ ' admin: https://admin.example.com\n'
+ '<none>\n internal: https://internal.example.com\n'
+ '<none>\n none: https://none.example.com\n',
+ 'qwertyuiop',
+ 'supernova',
+ 'compute',
+ )
+ self.assertEqual(datalist, data)
diff --git a/openstackclient/tests/unit/identity/v3/test_consumer.py b/openstackclient/tests/unit/identity/v3/test_consumer.py
new file mode 100644
index 00000000..403250ef
--- /dev/null
+++ b/openstackclient/tests/unit/identity/v3/test_consumer.py
@@ -0,0 +1,219 @@
+# 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 copy
+
+from openstackclient.identity.v3 import consumer
+from openstackclient.tests.unit import fakes
+from openstackclient.tests.unit.identity.v3 import fakes as identity_fakes
+
+
+class TestOAuth1(identity_fakes.TestOAuth1):
+
+ def setUp(self):
+ super(TestOAuth1, self).setUp()
+ identity_client = self.app.client_manager.identity
+ self.consumers_mock = identity_client.oauth1.consumers
+ self.consumers_mock.reset_mock()
+
+
+class TestConsumerCreate(TestOAuth1):
+
+ def setUp(self):
+ super(TestConsumerCreate, self).setUp()
+
+ self.consumers_mock.create.return_value = fakes.FakeResource(
+ None,
+ copy.deepcopy(identity_fakes.OAUTH_CONSUMER),
+ loaded=True,
+ )
+
+ self.cmd = consumer.CreateConsumer(self.app, None)
+
+ def test_create_consumer(self):
+ arglist = [
+ '--description', identity_fakes.consumer_description,
+ ]
+ verifylist = [
+ ('description', identity_fakes.consumer_description),
+ ]
+ parsed_args = self.check_parser(self.cmd, arglist, verifylist)
+ columns, data = self.cmd.take_action(parsed_args)
+
+ self.consumers_mock.create.assert_called_with(
+ identity_fakes.consumer_description,
+ )
+
+ collist = ('description', 'id', 'secret')
+ self.assertEqual(collist, columns)
+ datalist = (
+ identity_fakes.consumer_description,
+ identity_fakes.consumer_id,
+ identity_fakes.consumer_secret,
+ )
+ self.assertEqual(datalist, data)
+
+
+class TestConsumerDelete(TestOAuth1):
+
+ def setUp(self):
+ super(TestConsumerDelete, self).setUp()
+
+ # This is the return value for utils.find_resource()
+ self.consumers_mock.get.return_value = fakes.FakeResource(
+ None,
+ copy.deepcopy(identity_fakes.OAUTH_CONSUMER),
+ loaded=True,
+ )
+
+ self.consumers_mock.delete.return_value = None
+ self.cmd = consumer.DeleteConsumer(self.app, None)
+
+ def test_delete_consumer(self):
+ arglist = [
+ identity_fakes.consumer_id,
+ ]
+ verifylist = [
+ ('consumer', [identity_fakes.consumer_id]),
+ ]
+ parsed_args = self.check_parser(self.cmd, arglist, verifylist)
+
+ result = self.cmd.take_action(parsed_args)
+
+ self.consumers_mock.delete.assert_called_with(
+ identity_fakes.consumer_id,
+ )
+ self.assertIsNone(result)
+
+
+class TestConsumerList(TestOAuth1):
+
+ def setUp(self):
+ super(TestConsumerList, self).setUp()
+
+ self.consumers_mock.get.return_value = fakes.FakeResource(
+ None,
+ copy.deepcopy(identity_fakes.OAUTH_CONSUMER),
+ loaded=True,
+ )
+ self.consumers_mock.list.return_value = [
+ fakes.FakeResource(
+ None,
+ copy.deepcopy(identity_fakes.OAUTH_CONSUMER),
+ loaded=True,
+ ),
+ ]
+
+ # Get the command object to test
+ self.cmd = consumer.ListConsumer(self.app, None)
+
+ def test_consumer_list(self):
+ arglist = []
+ verifylist = []
+ parsed_args = self.check_parser(self.cmd, arglist, verifylist)
+
+ # In base command class Lister in cliff, abstract method take_action()
+ # returns a tuple containing the column names and an iterable
+ # containing the data to be listed.
+ columns, data = self.cmd.take_action(parsed_args)
+ self.consumers_mock.list.assert_called_with()
+
+ collist = ('ID', 'Description')
+ self.assertEqual(collist, columns)
+ datalist = ((
+ identity_fakes.consumer_id,
+ identity_fakes.consumer_description,
+ ), )
+ self.assertEqual(datalist, tuple(data))
+
+
+class TestConsumerSet(TestOAuth1):
+
+ def setUp(self):
+ super(TestConsumerSet, self).setUp()
+
+ self.consumers_mock.get.return_value = fakes.FakeResource(
+ None,
+ copy.deepcopy(identity_fakes.OAUTH_CONSUMER),
+ loaded=True,
+ )
+
+ consumer_updated = copy.deepcopy(identity_fakes.OAUTH_CONSUMER)
+ consumer_updated['description'] = "consumer new description"
+ self.consumers_mock.update.return_value = fakes.FakeResource(
+ None,
+ consumer_updated,
+ loaded=True,
+ )
+
+ self.cmd = consumer.SetConsumer(self.app, None)
+
+ def test_consumer_update(self):
+ new_description = "consumer new description"
+
+ arglist = [
+ '--description', new_description,
+ identity_fakes.consumer_id,
+ ]
+ verifylist = [
+ ('description', new_description),
+ ('consumer', identity_fakes.consumer_id),
+ ]
+ parsed_args = self.check_parser(self.cmd, arglist, verifylist)
+
+ result = self.cmd.take_action(parsed_args)
+
+ kwargs = {'description': new_description}
+ self.consumers_mock.update.assert_called_with(
+ identity_fakes.consumer_id,
+ **kwargs
+ )
+ self.assertIsNone(result)
+
+
+class TestConsumerShow(TestOAuth1):
+
+ def setUp(self):
+ super(TestConsumerShow, self).setUp()
+
+ consumer_no_secret = copy.deepcopy(identity_fakes.OAUTH_CONSUMER)
+ del consumer_no_secret['secret']
+ self.consumers_mock.get.return_value = fakes.FakeResource(
+ None,
+ consumer_no_secret,
+ loaded=True,
+ )
+
+ # Get the command object to test
+ self.cmd = consumer.ShowConsumer(self.app, None)
+
+ def test_consumer_show(self):
+ arglist = [
+ identity_fakes.consumer_id,
+ ]
+ verifylist = [
+ ('consumer', identity_fakes.consumer_id),
+ ]
+ parsed_args = self.check_parser(self.cmd, arglist, verifylist)
+ columns, data = self.cmd.take_action(parsed_args)
+
+ self.consumers_mock.get.assert_called_with(
+ identity_fakes.consumer_id,
+ )
+
+ collist = ('description', 'id')
+ self.assertEqual(collist, columns)
+ datalist = (
+ identity_fakes.consumer_description,
+ identity_fakes.consumer_id,
+ )
+ self.assertEqual(datalist, data)
diff --git a/openstackclient/tests/unit/identity/v3/test_credential.py b/openstackclient/tests/unit/identity/v3/test_credential.py
new file mode 100644
index 00000000..fd3ae6b2
--- /dev/null
+++ b/openstackclient/tests/unit/identity/v3/test_credential.py
@@ -0,0 +1,357 @@
+# 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 mock
+from mock import call
+
+from osc_lib import exceptions
+
+from openstackclient.identity.v3 import credential
+from openstackclient.tests.unit.identity.v3 import fakes as identity_fakes
+from openstackclient.tests.unit import utils
+
+
+class TestCredential(identity_fakes.TestIdentityv3):
+
+ def setUp(self):
+ super(TestCredential, self).setUp()
+
+ # Get a shortcut to the CredentialManager Mock
+ self.credentials_mock = self.app.client_manager.identity.credentials
+ self.credentials_mock.reset_mock()
+
+ # Get a shortcut to the UserManager Mock
+ self.users_mock = self.app.client_manager.identity.users
+ self.users_mock.reset_mock()
+
+ # Get a shortcut to the ProjectManager Mock
+ self.projects_mock = self.app.client_manager.identity.projects
+ self.projects_mock.reset_mock()
+
+
+class TestCredentialCreate(TestCredential):
+
+ user = identity_fakes.FakeUser.create_one_user()
+ project = identity_fakes.FakeProject.create_one_project()
+ columns = (
+ 'blob',
+ 'id',
+ 'project_id',
+ 'type',
+ 'user_id',
+ )
+
+ def setUp(self):
+ super(TestCredentialCreate, self).setUp()
+
+ self.credential = identity_fakes.FakeCredential.create_one_credential(
+ attrs={'user_id': self.user.id, 'project_id': self.project.id})
+ self.credentials_mock.create.return_value = self.credential
+ self.users_mock.get.return_value = self.user
+ self.projects_mock.get.return_value = self.project
+ self.data = (
+ self.credential.blob,
+ self.credential.id,
+ self.credential.project_id,
+ self.credential.type,
+ self.credential.user_id,
+ )
+
+ self.cmd = credential.CreateCredential(self.app, None)
+
+ def test_credential_create_no_options(self):
+ arglist = [
+ self.credential.user_id,
+ self.credential.blob,
+ ]
+ verifylist = [
+ ('user', self.credential.user_id),
+ ('data', self.credential.blob),
+ ]
+ parsed_args = self.check_parser(self.cmd, arglist, verifylist)
+
+ columns, data = self.cmd.take_action(parsed_args)
+
+ kwargs = {
+ 'user': self.credential.user_id,
+ 'type': self.credential.type,
+ 'blob': self.credential.blob,
+ 'project': None,
+ }
+ self.credentials_mock.create.assert_called_once_with(
+ **kwargs
+ )
+
+ self.assertEqual(self.columns, columns)
+ self.assertEqual(self.data, data)
+
+ def test_credential_create_with_options(self):
+ arglist = [
+ self.credential.user_id,
+ self.credential.blob,
+ '--type', self.credential.type,
+ '--project', self.credential.project_id,
+ ]
+ verifylist = [
+ ('user', self.credential.user_id),
+ ('data', self.credential.blob),
+ ('type', self.credential.type),
+ ('project', self.credential.project_id),
+ ]
+ parsed_args = self.check_parser(self.cmd, arglist, verifylist)
+
+ columns, data = self.cmd.take_action(parsed_args)
+
+ kwargs = {
+ 'user': self.credential.user_id,
+ 'type': self.credential.type,
+ 'blob': self.credential.blob,
+ 'project': self.credential.project_id,
+ }
+ self.credentials_mock.create.assert_called_once_with(
+ **kwargs
+ )
+
+ self.assertEqual(self.columns, columns)
+ self.assertEqual(self.data, data)
+
+ def test_credential_create_with_invalid_type(self):
+ arglist = [
+ self.credential.user_id,
+ self.credential.blob,
+ '--type', 'invalid_type',
+ ]
+ verifylist = [
+ ('user', self.credential.user_id),
+ ('data', self.credential.blob),
+ ('type', 'invalid_type'),
+ ]
+ self.assertRaises(utils.ParserException, self.check_parser,
+ self.cmd, arglist, verifylist)
+
+
+class TestCredentialDelete(TestCredential):
+
+ credentials = identity_fakes.FakeCredential.create_credentials(count=2)
+
+ def setUp(self):
+ super(TestCredentialDelete, self).setUp()
+
+ self.credentials_mock.delete.return_value = None
+
+ # Get the command object to test
+ self.cmd = credential.DeleteCredential(self.app, None)
+
+ def test_credential_delete(self):
+ arglist = [
+ self.credentials[0].id,
+ ]
+ verifylist = [
+ ('credential', [self.credentials[0].id]),
+ ]
+ parsed_args = self.check_parser(self.cmd, arglist, verifylist)
+
+ result = self.cmd.take_action(parsed_args)
+
+ self.credentials_mock.delete.assert_called_with(
+ self.credentials[0].id,
+ )
+ self.assertIsNone(result)
+
+ def test_credential_multi_delete(self):
+ arglist = []
+ for c in self.credentials:
+ arglist.append(c.id)
+ verifylist = [
+ ('credential', arglist),
+ ]
+
+ parsed_args = self.check_parser(self.cmd, arglist, verifylist)
+ result = self.cmd.take_action(parsed_args)
+
+ calls = []
+ for c in self.credentials:
+ calls.append(call(c.id))
+ self.credentials_mock.delete.assert_has_calls(calls)
+ self.assertIsNone(result)
+
+ def test_credential_multi_delete_with_exception(self):
+ arglist = [
+ self.credentials[0].id,
+ 'unexist_credential',
+ ]
+ verifylist = [
+ ('credential', [self.credentials[0].id, 'unexist_credential'])
+ ]
+ parsed_args = self.check_parser(self.cmd, arglist, verifylist)
+
+ delete_mock_result = [None, exceptions.CommandError]
+ self.credentials_mock.delete = (
+ mock.MagicMock(side_effect=delete_mock_result)
+ )
+
+ try:
+ self.cmd.take_action(parsed_args)
+ self.fail('CommandError should be raised.')
+ except exceptions.CommandError as e:
+ self.assertEqual('1 of 2 credential failed to delete.', str(e))
+
+ self.credentials_mock.delete.assert_any_call(self.credentials[0].id)
+ self.credentials_mock.delete.assert_any_call('unexist_credential')
+
+
+class TestCredentialList(TestCredential):
+
+ credential = identity_fakes.FakeCredential.create_one_credential()
+
+ columns = ('ID', 'Type', 'User ID', 'Data', 'Project ID')
+ data = ((
+ credential.id,
+ credential.type,
+ credential.user_id,
+ credential.blob,
+ credential.project_id,
+ ), )
+
+ def setUp(self):
+ super(TestCredentialList, self).setUp()
+
+ self.credentials_mock.list.return_value = [self.credential]
+
+ # Get the command object to test
+ self.cmd = credential.ListCredential(self.app, None)
+
+ def test_domain_list_no_options(self):
+ arglist = []
+ verifylist = []
+ parsed_args = self.check_parser(self.cmd, arglist, verifylist)
+
+ columns, data = self.cmd.take_action(parsed_args)
+
+ self.credentials_mock.list.assert_called_with()
+ self.assertEqual(self.columns, columns)
+ self.assertEqual(self.data, tuple(data))
+
+
+class TestCredentialSet(TestCredential):
+
+ credential = identity_fakes.FakeCredential.create_one_credential()
+
+ def setUp(self):
+ super(TestCredentialSet, self).setUp()
+ self.cmd = credential.SetCredential(self.app, None)
+
+ def test_credential_set_no_options(self):
+ arglist = [
+ self.credential.id,
+ ]
+
+ self.assertRaises(utils.ParserException,
+ self.check_parser, self.cmd, arglist, [])
+
+ def test_credential_set_missing_user(self):
+ arglist = [
+ '--type', 'ec2',
+ '--data', self.credential.blob,
+ self.credential.id,
+ ]
+
+ self.assertRaises(utils.ParserException,
+ self.check_parser, self.cmd, arglist, [])
+
+ def test_credential_set_missing_type(self):
+ arglist = [
+ '--user', self.credential.user_id,
+ '--data', self.credential.blob,
+ self.credential.id,
+ ]
+
+ self.assertRaises(utils.ParserException,
+ self.check_parser, self.cmd, arglist, [])
+
+ def test_credential_set_missing_data(self):
+ arglist = [
+ '--user', self.credential.user_id,
+ '--type', 'ec2',
+ self.credential.id,
+ ]
+
+ self.assertRaises(utils.ParserException,
+ self.check_parser, self.cmd, arglist, [])
+
+ def test_credential_set_valid(self):
+ arglist = [
+ '--user', self.credential.user_id,
+ '--type', 'ec2',
+ '--data', self.credential.blob,
+ self.credential.id,
+ ]
+ parsed_args = self.check_parser(self.cmd, arglist, [])
+
+ result = self.cmd.take_action(parsed_args)
+
+ self.assertIsNone(result)
+
+ def test_credential_set_valid_with_project(self):
+ arglist = [
+ '--user', self.credential.user_id,
+ '--type', 'ec2',
+ '--data', self.credential.blob,
+ '--project', self.credential.project_id,
+ self.credential.id,
+ ]
+ parsed_args = self.check_parser(self.cmd, arglist, [])
+
+ result = self.cmd.take_action(parsed_args)
+
+ self.assertIsNone(result)
+
+
+class TestCredentialShow(TestCredential):
+
+ columns = (
+ 'blob',
+ 'id',
+ 'project_id',
+ 'type',
+ 'user_id',
+ )
+
+ def setUp(self):
+ super(TestCredentialShow, self).setUp()
+
+ self.credential = identity_fakes.FakeCredential.create_one_credential()
+ self.credentials_mock.get.return_value = self.credential
+ self.data = (
+ self.credential.blob,
+ self.credential.id,
+ self.credential.project_id,
+ self.credential.type,
+ self.credential.user_id,
+ )
+
+ self.cmd = credential.ShowCredential(self.app, None)
+
+ def test_credential_show(self):
+ arglist = [
+ self.credential.id,
+ ]
+ verifylist = [
+ ('credential', self.credential.id),
+ ]
+ parsed_args = self.check_parser(self.cmd, arglist, verifylist)
+
+ columns, data = self.cmd.take_action(parsed_args)
+
+ self.credentials_mock.get.assert_called_once_with(self.credential.id)
+ self.assertEqual(self.columns, columns)
+ self.assertEqual(self.data, data)
diff --git a/openstackclient/tests/unit/identity/v3/test_domain.py b/openstackclient/tests/unit/identity/v3/test_domain.py
new file mode 100644
index 00000000..36f13d33
--- /dev/null
+++ b/openstackclient/tests/unit/identity/v3/test_domain.py
@@ -0,0 +1,401 @@
+# 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 openstackclient.identity.v3 import domain
+from openstackclient.tests.unit.identity.v3 import fakes as identity_fakes
+
+
+class TestDomain(identity_fakes.TestIdentityv3):
+
+ def setUp(self):
+ super(TestDomain, self).setUp()
+
+ # Get a shortcut to the DomainManager Mock
+ self.domains_mock = self.app.client_manager.identity.domains
+ self.domains_mock.reset_mock()
+
+
+class TestDomainCreate(TestDomain):
+
+ columns = (
+ 'description',
+ 'enabled',
+ 'id',
+ 'name',
+ )
+
+ def setUp(self):
+ super(TestDomainCreate, self).setUp()
+
+ self.domain = identity_fakes.FakeDomain.create_one_domain()
+ self.domains_mock.create.return_value = self.domain
+ self.datalist = (
+ self.domain.description,
+ True,
+ self.domain.id,
+ self.domain.name,
+ )
+
+ # Get the command object to test
+ self.cmd = domain.CreateDomain(self.app, None)
+
+ def test_domain_create_no_options(self):
+ arglist = [
+ self.domain.name,
+ ]
+ verifylist = [
+ ('name', self.domain.name),
+ ]
+ parsed_args = self.check_parser(self.cmd, arglist, verifylist)
+
+ # In base command class ShowOne in cliff, abstract method take_action()
+ # returns a two-part tuple with a tuple of column names and a tuple of
+ # data to be shown.
+ columns, data = self.cmd.take_action(parsed_args)
+
+ # Set expected values
+ kwargs = {
+ 'name': self.domain.name,
+ 'description': None,
+ 'enabled': True,
+ }
+ self.domains_mock.create.assert_called_with(
+ **kwargs
+ )
+
+ self.assertEqual(self.columns, columns)
+ self.assertEqual(self.datalist, data)
+
+ def test_domain_create_description(self):
+ arglist = [
+ '--description', 'new desc',
+ self.domain.name,
+ ]
+ verifylist = [
+ ('description', 'new desc'),
+ ('name', self.domain.name),
+ ]
+ parsed_args = self.check_parser(self.cmd, arglist, verifylist)
+
+ # In base command class ShowOne in cliff, abstract method take_action()
+ # returns a two-part tuple with a tuple of column names and a tuple of
+ # data to be shown.
+ columns, data = self.cmd.take_action(parsed_args)
+
+ # Set expected values
+ kwargs = {
+ 'name': self.domain.name,
+ 'description': 'new desc',
+ 'enabled': True,
+ }
+ self.domains_mock.create.assert_called_with(
+ **kwargs
+ )
+
+ self.assertEqual(self.columns, columns)
+ self.assertEqual(self.datalist, data)
+
+ def test_domain_create_enable(self):
+ arglist = [
+ '--enable',
+ self.domain.name,
+ ]
+ verifylist = [
+ ('enable', True),
+ ('name', self.domain.name),
+ ]
+ parsed_args = self.check_parser(self.cmd, arglist, verifylist)
+
+ # In base command class ShowOne in cliff, abstract method take_action()
+ # returns a two-part tuple with a tuple of column names and a tuple of
+ # data to be shown.
+ columns, data = self.cmd.take_action(parsed_args)
+
+ # Set expected values
+ kwargs = {
+ 'name': self.domain.name,
+ 'description': None,
+ 'enabled': True,
+ }
+ self.domains_mock.create.assert_called_with(
+ **kwargs
+ )
+
+ self.assertEqual(self.columns, columns)
+ self.assertEqual(self.datalist, data)
+
+ def test_domain_create_disable(self):
+ arglist = [
+ '--disable',
+ self.domain.name,
+ ]
+ verifylist = [
+ ('disable', True),
+ ('name', self.domain.name),
+ ]
+ parsed_args = self.check_parser(self.cmd, arglist, verifylist)
+
+ # In base command class ShowOne in cliff, abstract method take_action()
+ # returns a two-part tuple with a tuple of column names and a tuple of
+ # data to be shown.
+ columns, data = self.cmd.take_action(parsed_args)
+
+ # Set expected values
+ kwargs = {
+ 'name': self.domain.name,
+ 'description': None,
+ 'enabled': False,
+ }
+ self.domains_mock.create.assert_called_with(
+ **kwargs
+ )
+
+ self.assertEqual(self.columns, columns)
+ self.assertEqual(self.datalist, data)
+
+
+class TestDomainDelete(TestDomain):
+
+ domain = identity_fakes.FakeDomain.create_one_domain()
+
+ def setUp(self):
+ super(TestDomainDelete, self).setUp()
+
+ # This is the return value for utils.find_resource()
+ self.domains_mock.get.return_value = self.domain
+ self.domains_mock.delete.return_value = None
+
+ # Get the command object to test
+ self.cmd = domain.DeleteDomain(self.app, None)
+
+ def test_domain_delete(self):
+ arglist = [
+ self.domain.id,
+ ]
+ verifylist = [
+ ('domain', [self.domain.id]),
+ ]
+ parsed_args = self.check_parser(self.cmd, arglist, verifylist)
+
+ result = self.cmd.take_action(parsed_args)
+
+ self.domains_mock.delete.assert_called_with(
+ self.domain.id,
+ )
+ self.assertIsNone(result)
+
+
+class TestDomainList(TestDomain):
+
+ domain = identity_fakes.FakeDomain.create_one_domain()
+
+ def setUp(self):
+ super(TestDomainList, self).setUp()
+
+ self.domains_mock.list.return_value = [self.domain]
+
+ # Get the command object to test
+ self.cmd = domain.ListDomain(self.app, None)
+
+ def test_domain_list_no_options(self):
+ arglist = []
+ verifylist = []
+ parsed_args = self.check_parser(self.cmd, arglist, verifylist)
+
+ # In base command class Lister in cliff, abstract method take_action()
+ # returns a tuple containing the column names and an iterable
+ # containing the data to be listed.
+ columns, data = self.cmd.take_action(parsed_args)
+ self.domains_mock.list.assert_called_with()
+
+ collist = ('ID', 'Name', 'Enabled', 'Description')
+ self.assertEqual(collist, columns)
+ datalist = ((
+ self.domain.id,
+ self.domain.name,
+ True,
+ self.domain.description,
+ ), )
+ self.assertEqual(datalist, tuple(data))
+
+
+class TestDomainSet(TestDomain):
+
+ domain = identity_fakes.FakeDomain.create_one_domain()
+
+ def setUp(self):
+ super(TestDomainSet, self).setUp()
+
+ self.domains_mock.get.return_value = self.domain
+
+ self.domains_mock.update.return_value = self.domain
+
+ # Get the command object to test
+ self.cmd = domain.SetDomain(self.app, None)
+
+ def test_domain_set_no_options(self):
+ arglist = [
+ self.domain.name,
+ ]
+ verifylist = [
+ ('domain', self.domain.name),
+ ]
+ parsed_args = self.check_parser(self.cmd, arglist, verifylist)
+
+ result = self.cmd.take_action(parsed_args)
+
+ kwargs = {}
+ self.domains_mock.update.assert_called_with(
+ self.domain.id,
+ **kwargs
+ )
+ self.assertIsNone(result)
+
+ def test_domain_set_name(self):
+ arglist = [
+ '--name', 'qwerty',
+ self.domain.id,
+ ]
+ verifylist = [
+ ('name', 'qwerty'),
+ ('domain', self.domain.id),
+ ]
+ parsed_args = self.check_parser(self.cmd, arglist, verifylist)
+
+ result = self.cmd.take_action(parsed_args)
+
+ # Set expected values
+ kwargs = {
+ 'name': 'qwerty',
+ }
+ self.domains_mock.update.assert_called_with(
+ self.domain.id,
+ **kwargs
+ )
+ self.assertIsNone(result)
+
+ def test_domain_set_description(self):
+ arglist = [
+ '--description', 'new desc',
+ self.domain.id,
+ ]
+ verifylist = [
+ ('description', 'new desc'),
+ ('domain', self.domain.id),
+ ]
+ parsed_args = self.check_parser(self.cmd, arglist, verifylist)
+
+ result = self.cmd.take_action(parsed_args)
+
+ # Set expected values
+ kwargs = {
+ 'description': 'new desc',
+ }
+ self.domains_mock.update.assert_called_with(
+ self.domain.id,
+ **kwargs
+ )
+ self.assertIsNone(result)
+
+ def test_domain_set_enable(self):
+ arglist = [
+ '--enable',
+ self.domain.id,
+ ]
+ verifylist = [
+ ('enable', True),
+ ('domain', self.domain.id),
+ ]
+ parsed_args = self.check_parser(self.cmd, arglist, verifylist)
+
+ result = self.cmd.take_action(parsed_args)
+
+ # Set expected values
+ kwargs = {
+ 'enabled': True,
+ }
+ self.domains_mock.update.assert_called_with(
+ self.domain.id,
+ **kwargs
+ )
+ self.assertIsNone(result)
+
+ def test_domain_set_disable(self):
+ arglist = [
+ '--disable',
+ self.domain.id,
+ ]
+ verifylist = [
+ ('disable', True),
+ ('domain', self.domain.id),
+ ]
+ parsed_args = self.check_parser(self.cmd, arglist, verifylist)
+
+ result = self.cmd.take_action(parsed_args)
+
+ # Set expected values
+ kwargs = {
+ 'enabled': False,
+ }
+ self.domains_mock.update.assert_called_with(
+ self.domain.id,
+ **kwargs
+ )
+ self.assertIsNone(result)
+
+
+class TestDomainShow(TestDomain):
+
+ def setUp(self):
+ super(TestDomainShow, self).setUp()
+
+ self.domain = identity_fakes.FakeDomain.create_one_domain()
+ self.domains_mock.get.return_value = self.domain
+ # Get the command object to test
+ self.cmd = domain.ShowDomain(self.app, None)
+
+ def test_domain_show(self):
+ arglist = [
+ self.domain.id,
+ ]
+ verifylist = [
+ ('domain', self.domain.id),
+ ]
+ parsed_args = self.check_parser(self.cmd, arglist, verifylist)
+ self.app.client_manager.identity.tokens.get_token_data.return_value = \
+ {'token':
+ {'project':
+ {'domain':
+ {'id': 'd1',
+ 'name': 'd1'
+ }
+ }
+ }
+ }
+
+ # In base command class ShowOne in cliff, abstract method take_action()
+ # returns a two-part tuple with a tuple of column names and a tuple of
+ # data to be shown.
+ columns, data = self.cmd.take_action(parsed_args)
+ self.domains_mock.get.assert_called_with(
+ self.domain.id,
+ )
+
+ collist = ('description', 'enabled', 'id', 'name')
+ self.assertEqual(collist, columns)
+ datalist = (
+ self.domain.description,
+ True,
+ self.domain.id,
+ self.domain.name,
+ )
+ self.assertEqual(datalist, data)
diff --git a/openstackclient/tests/unit/identity/v3/test_endpoint.py b/openstackclient/tests/unit/identity/v3/test_endpoint.py
new file mode 100644
index 00000000..765fbedd
--- /dev/null
+++ b/openstackclient/tests/unit/identity/v3/test_endpoint.py
@@ -0,0 +1,750 @@
+# 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 openstackclient.identity.v3 import endpoint
+from openstackclient.tests.unit.identity.v3 import fakes as identity_fakes
+
+
+class TestEndpoint(identity_fakes.TestIdentityv3):
+
+ def setUp(self):
+ super(TestEndpoint, self).setUp()
+
+ # Get a shortcut to the EndpointManager Mock
+ self.endpoints_mock = self.app.client_manager.identity.endpoints
+ self.endpoints_mock.reset_mock()
+
+ # Get a shortcut to the ServiceManager Mock
+ self.services_mock = self.app.client_manager.identity.services
+ self.services_mock.reset_mock()
+
+
+class TestEndpointCreate(TestEndpoint):
+
+ service = identity_fakes.FakeService.create_one_service()
+
+ columns = (
+ 'enabled',
+ 'id',
+ 'interface',
+ 'region',
+ 'service_id',
+ 'service_name',
+ 'service_type',
+ 'url',
+ )
+
+ def setUp(self):
+ super(TestEndpointCreate, self).setUp()
+
+ self.endpoint = identity_fakes.FakeEndpoint.create_one_endpoint(
+ attrs={'service_id': self.service.id})
+ self.endpoints_mock.create.return_value = self.endpoint
+
+ # This is the return value for common.find_resource(service)
+ self.services_mock.get.return_value = self.service
+
+ # Get the command object to test
+ self.cmd = endpoint.CreateEndpoint(self.app, None)
+
+ def test_endpoint_create_no_options(self):
+ arglist = [
+ self.service.id,
+ self.endpoint.interface,
+ self.endpoint.url,
+ ]
+ verifylist = [
+ ('enabled', True),
+ ('service', self.service.id),
+ ('interface', self.endpoint.interface),
+ ('url', self.endpoint.url),
+ ]
+ parsed_args = self.check_parser(self.cmd, arglist, verifylist)
+
+ # In base command class ShowOne in cliff, abstract method take_action()
+ # returns a two-part tuple with a tuple of column names and a tuple of
+ # data to be shown.
+ columns, data = self.cmd.take_action(parsed_args)
+
+ # Set expected values
+ kwargs = {
+ 'service': self.service.id,
+ 'url': self.endpoint.url,
+ 'interface': self.endpoint.interface,
+ 'enabled': True,
+ 'region': None,
+ }
+
+ self.endpoints_mock.create.assert_called_with(
+ **kwargs
+ )
+
+ self.assertEqual(self.columns, columns)
+ datalist = (
+ True,
+ self.endpoint.id,
+ self.endpoint.interface,
+ self.endpoint.region,
+ self.service.id,
+ self.service.name,
+ self.service.type,
+ self.endpoint.url,
+ )
+ self.assertEqual(datalist, data)
+
+ def test_endpoint_create_region(self):
+ arglist = [
+ self.service.id,
+ self.endpoint.interface,
+ self.endpoint.url,
+ '--region', self.endpoint.region,
+ ]
+ verifylist = [
+ ('enabled', True),
+ ('service', self.service.id),
+ ('interface', self.endpoint.interface),
+ ('url', self.endpoint.url),
+ ('region', self.endpoint.region),
+ ]
+ parsed_args = self.check_parser(self.cmd, arglist, verifylist)
+
+ # In base command class ShowOne in cliff, abstract method take_action()
+ # returns a two-part tuple with a tuple of column names and a tuple of
+ # data to be shown.
+ columns, data = self.cmd.take_action(parsed_args)
+
+ # Set expected values
+ kwargs = {
+ 'service': self.service.id,
+ 'url': self.endpoint.url,
+ 'interface': self.endpoint.interface,
+ 'enabled': True,
+ 'region': self.endpoint.region,
+ }
+
+ self.endpoints_mock.create.assert_called_with(
+ **kwargs
+ )
+
+ self.assertEqual(self.columns, columns)
+ datalist = (
+ True,
+ self.endpoint.id,
+ self.endpoint.interface,
+ self.endpoint.region,
+ self.service.id,
+ self.service.name,
+ self.service.type,
+ self.endpoint.url,
+ )
+ self.assertEqual(datalist, data)
+
+ def test_endpoint_create_enable(self):
+ arglist = [
+ self.service.id,
+ self.endpoint.interface,
+ self.endpoint.url,
+ '--enable'
+ ]
+ verifylist = [
+ ('enabled', True),
+ ('service', self.service.id),
+ ('interface', self.endpoint.interface),
+ ('url', self.endpoint.url),
+ ]
+ parsed_args = self.check_parser(self.cmd, arglist, verifylist)
+
+ # In base command class ShowOne in cliff, abstract method take_action()
+ # returns a two-part tuple with a tuple of column names and a tuple of
+ # data to be shown.
+ columns, data = self.cmd.take_action(parsed_args)
+
+ # Set expected values
+ kwargs = {
+ 'service': self.service.id,
+ 'url': self.endpoint.url,
+ 'interface': self.endpoint.interface,
+ 'enabled': True,
+ 'region': None,
+ }
+
+ self.endpoints_mock.create.assert_called_with(
+ **kwargs
+ )
+
+ self.assertEqual(self.columns, columns)
+ datalist = (
+ True,
+ self.endpoint.id,
+ self.endpoint.interface,
+ self.endpoint.region,
+ self.service.id,
+ self.service.name,
+ self.service.type,
+ self.endpoint.url,
+ )
+ self.assertEqual(datalist, data)
+
+ def test_endpoint_create_disable(self):
+ arglist = [
+ self.service.id,
+ self.endpoint.interface,
+ self.endpoint.url,
+ '--disable',
+ ]
+ verifylist = [
+ ('enabled', False),
+ ('service', self.service.id),
+ ('interface', self.endpoint.interface),
+ ('url', self.endpoint.url),
+ ]
+ parsed_args = self.check_parser(self.cmd, arglist, verifylist)
+
+ # In base command class ShowOne in cliff, abstract method take_action()
+ # returns a two-part tuple with a tuple of column names and a tuple of
+ # data to be shown.
+ columns, data = self.cmd.take_action(parsed_args)
+
+ # Set expected values
+ kwargs = {
+ 'service': self.service.id,
+ 'url': self.endpoint.url,
+ 'interface': self.endpoint.interface,
+ 'enabled': False,
+ 'region': None,
+ }
+
+ self.endpoints_mock.create.assert_called_with(
+ **kwargs
+ )
+
+ self.assertEqual(self.columns, columns)
+ datalist = (
+ True,
+ self.endpoint.id,
+ self.endpoint.interface,
+ self.endpoint.region,
+ self.service.id,
+ self.service.name,
+ self.service.type,
+ self.endpoint.url,
+ )
+ self.assertEqual(datalist, data)
+
+
+class TestEndpointDelete(TestEndpoint):
+
+ endpoint = identity_fakes.FakeEndpoint.create_one_endpoint()
+
+ def setUp(self):
+ super(TestEndpointDelete, self).setUp()
+
+ # This is the return value for utils.find_resource(endpoint)
+ self.endpoints_mock.get.return_value = self.endpoint
+ self.endpoints_mock.delete.return_value = None
+
+ # Get the command object to test
+ self.cmd = endpoint.DeleteEndpoint(self.app, None)
+
+ def test_endpoint_delete(self):
+ arglist = [
+ self.endpoint.id,
+ ]
+ verifylist = [
+ ('endpoint', [self.endpoint.id]),
+ ]
+ parsed_args = self.check_parser(self.cmd, arglist, verifylist)
+
+ result = self.cmd.take_action(parsed_args)
+
+ self.endpoints_mock.delete.assert_called_with(
+ self.endpoint.id,
+ )
+ self.assertIsNone(result)
+
+
+class TestEndpointList(TestEndpoint):
+
+ service = identity_fakes.FakeService.create_one_service()
+ endpoint = identity_fakes.FakeEndpoint.create_one_endpoint(
+ attrs={'service_id': service.id})
+
+ columns = (
+ 'ID',
+ 'Region',
+ 'Service Name',
+ 'Service Type',
+ 'Enabled',
+ 'Interface',
+ 'URL',
+ )
+
+ def setUp(self):
+ super(TestEndpointList, self).setUp()
+
+ self.endpoints_mock.list.return_value = [self.endpoint]
+
+ # This is the return value for common.find_resource(service)
+ self.services_mock.get.return_value = self.service
+
+ # Get the command object to test
+ self.cmd = endpoint.ListEndpoint(self.app, None)
+
+ def test_endpoint_list_no_options(self):
+ arglist = []
+ verifylist = []
+ parsed_args = self.check_parser(self.cmd, arglist, verifylist)
+
+ # In base command class Lister in cliff, abstract method take_action()
+ # returns a tuple containing the column names and an iterable
+ # containing the data to be listed.
+ columns, data = self.cmd.take_action(parsed_args)
+ self.endpoints_mock.list.assert_called_with()
+
+ self.assertEqual(self.columns, columns)
+ datalist = (
+ (
+ self.endpoint.id,
+ self.endpoint.region,
+ self.service.name,
+ self.service.type,
+ True,
+ self.endpoint.interface,
+ self.endpoint.url,
+ ),
+ )
+ self.assertEqual(datalist, tuple(data))
+
+ def test_endpoint_list_service(self):
+ arglist = [
+ '--service', self.service.id,
+ ]
+ verifylist = [
+ ('service', self.service.id),
+ ]
+ parsed_args = self.check_parser(self.cmd, arglist, verifylist)
+
+ # In base command class Lister in cliff, abstract method take_action()
+ # returns a tuple containing the column names and an iterable
+ # containing the data to be listed.
+ columns, data = self.cmd.take_action(parsed_args)
+
+ # Set expected values
+ kwargs = {
+ 'service': self.service.id,
+ }
+ self.endpoints_mock.list.assert_called_with(**kwargs)
+
+ self.assertEqual(self.columns, columns)
+ datalist = (
+ (
+ self.endpoint.id,
+ self.endpoint.region,
+ self.service.name,
+ self.service.type,
+ True,
+ self.endpoint.interface,
+ self.endpoint.url,
+ ),
+ )
+ self.assertEqual(datalist, tuple(data))
+
+ def test_endpoint_list_interface(self):
+ arglist = [
+ '--interface', self.endpoint.interface,
+ ]
+ verifylist = [
+ ('interface', self.endpoint.interface),
+ ]
+ parsed_args = self.check_parser(self.cmd, arglist, verifylist)
+
+ # In base command class Lister in cliff, abstract method take_action()
+ # returns a tuple containing the column names and an iterable
+ # containing the data to be listed.
+ columns, data = self.cmd.take_action(parsed_args)
+
+ # Set expected values
+ kwargs = {
+ 'interface': self.endpoint.interface,
+ }
+ self.endpoints_mock.list.assert_called_with(**kwargs)
+
+ self.assertEqual(self.columns, columns)
+ datalist = (
+ (
+ self.endpoint.id,
+ self.endpoint.region,
+ self.service.name,
+ self.service.type,
+ True,
+ self.endpoint.interface,
+ self.endpoint.url,
+ ),
+ )
+ self.assertEqual(datalist, tuple(data))
+
+ def test_endpoint_list_region(self):
+ arglist = [
+ '--region', self.endpoint.region,
+ ]
+ verifylist = [
+ ('region', self.endpoint.region),
+ ]
+ parsed_args = self.check_parser(self.cmd, arglist, verifylist)
+
+ # In base command class Lister in cliff, abstract method take_action()
+ # returns a tuple containing the column names and an iterable
+ # containing the data to be listed.
+ columns, data = self.cmd.take_action(parsed_args)
+
+ # Set expected values
+ kwargs = {
+ 'region': self.endpoint.region,
+ }
+ self.endpoints_mock.list.assert_called_with(**kwargs)
+
+ self.assertEqual(self.columns, columns)
+ datalist = (
+ (
+ self.endpoint.id,
+ self.endpoint.region,
+ self.service.name,
+ self.service.type,
+ True,
+ self.endpoint.interface,
+ self.endpoint.url,
+ ),
+ )
+ self.assertEqual(datalist, tuple(data))
+
+
+class TestEndpointSet(TestEndpoint):
+
+ service = identity_fakes.FakeService.create_one_service()
+ endpoint = identity_fakes.FakeEndpoint.create_one_endpoint(
+ attrs={'service_id': service.id})
+
+ def setUp(self):
+ super(TestEndpointSet, self).setUp()
+
+ # This is the return value for utils.find_resource(endpoint)
+ self.endpoints_mock.get.return_value = self.endpoint
+
+ self.endpoints_mock.update.return_value = self.endpoint
+
+ # This is the return value for common.find_resource(service)
+ self.services_mock.get.return_value = self.service
+
+ # Get the command object to test
+ self.cmd = endpoint.SetEndpoint(self.app, None)
+
+ def test_endpoint_set_no_options(self):
+ arglist = [
+ self.endpoint.id,
+ ]
+ verifylist = [
+ ('endpoint', self.endpoint.id),
+ ]
+ parsed_args = self.check_parser(self.cmd, arglist, verifylist)
+
+ result = self.cmd.take_action(parsed_args)
+
+ kwargs = {
+ 'enabled': None,
+ 'interface': None,
+ 'region': None,
+ 'service': None,
+ 'url': None,
+ }
+ self.endpoints_mock.update.assert_called_with(
+ self.endpoint.id,
+ **kwargs
+ )
+ self.assertIsNone(result)
+
+ def test_endpoint_set_interface(self):
+ arglist = [
+ '--interface', 'public',
+ self.endpoint.id
+ ]
+ verifylist = [
+ ('interface', 'public'),
+ ('endpoint', self.endpoint.id),
+ ]
+ parsed_args = self.check_parser(self.cmd, arglist, verifylist)
+
+ result = self.cmd.take_action(parsed_args)
+
+ # Set expected values
+ kwargs = {
+ 'enabled': None,
+ 'interface': 'public',
+ 'url': None,
+ 'region': None,
+ 'service': None,
+ }
+ self.endpoints_mock.update.assert_called_with(
+ self.endpoint.id,
+ **kwargs
+ )
+ self.assertIsNone(result)
+
+ def test_endpoint_set_url(self):
+ arglist = [
+ '--url', 'http://localhost:5000',
+ self.endpoint.id
+ ]
+ verifylist = [
+ ('url', 'http://localhost:5000'),
+ ('endpoint', self.endpoint.id),
+ ]
+ parsed_args = self.check_parser(self.cmd, arglist, verifylist)
+
+ result = self.cmd.take_action(parsed_args)
+
+ # Set expected values
+ kwargs = {
+ 'enabled': None,
+ 'interface': None,
+ 'url': 'http://localhost:5000',
+ 'region': None,
+ 'service': None,
+ }
+ self.endpoints_mock.update.assert_called_with(
+ self.endpoint.id,
+ **kwargs
+ )
+ self.assertIsNone(result)
+
+ def test_endpoint_set_service(self):
+ arglist = [
+ '--service', self.service.id,
+ self.endpoint.id
+ ]
+ verifylist = [
+ ('service', self.service.id),
+ ('endpoint', self.endpoint.id),
+ ]
+ parsed_args = self.check_parser(self.cmd, arglist, verifylist)
+
+ result = self.cmd.take_action(parsed_args)
+
+ # Set expected values
+ kwargs = {
+ 'enabled': None,
+ 'interface': None,
+ 'url': None,
+ 'region': None,
+ 'service': self.service.id,
+ }
+ self.endpoints_mock.update.assert_called_with(
+ self.endpoint.id,
+ **kwargs
+ )
+ self.assertIsNone(result)
+
+ def test_endpoint_set_region(self):
+ arglist = [
+ '--region', 'e-rzzz',
+ self.endpoint.id
+ ]
+ verifylist = [
+ ('region', 'e-rzzz'),
+ ('endpoint', self.endpoint.id),
+ ]
+ parsed_args = self.check_parser(self.cmd, arglist, verifylist)
+
+ result = self.cmd.take_action(parsed_args)
+
+ # Set expected values
+ kwargs = {
+ 'enabled': None,
+ 'interface': None,
+ 'url': None,
+ 'region': 'e-rzzz',
+ 'service': None,
+ }
+ self.endpoints_mock.update.assert_called_with(
+ self.endpoint.id,
+ **kwargs
+ )
+ self.assertIsNone(result)
+
+ def test_endpoint_set_enable(self):
+ arglist = [
+ '--enable',
+ self.endpoint.id
+ ]
+ verifylist = [
+ ('enabled', True),
+ ('endpoint', self.endpoint.id),
+ ]
+ parsed_args = self.check_parser(self.cmd, arglist, verifylist)
+
+ result = self.cmd.take_action(parsed_args)
+
+ # Set expected values
+ kwargs = {
+ 'enabled': True,
+ 'interface': None,
+ 'url': None,
+ 'region': None,
+ 'service': None,
+ }
+ self.endpoints_mock.update.assert_called_with(
+ self.endpoint.id,
+ **kwargs
+ )
+ self.assertIsNone(result)
+
+ def test_endpoint_set_disable(self):
+ arglist = [
+ '--disable',
+ self.endpoint.id
+ ]
+ verifylist = [
+ ('disabled', True),
+ ('endpoint', self.endpoint.id),
+ ]
+ parsed_args = self.check_parser(self.cmd, arglist, verifylist)
+
+ result = self.cmd.take_action(parsed_args)
+
+ # Set expected values
+ kwargs = {
+ 'enabled': False,
+ 'interface': None,
+ 'url': None,
+ 'region': None,
+ 'service': None,
+ }
+ self.endpoints_mock.update.assert_called_with(
+ self.endpoint.id,
+ **kwargs
+ )
+ self.assertIsNone(result)
+
+
+class TestEndpointShow(TestEndpoint):
+
+ service = identity_fakes.FakeService.create_one_service()
+ endpoint = identity_fakes.FakeEndpoint.create_one_endpoint(
+ attrs={'service_id': service.id})
+
+ def setUp(self):
+ super(TestEndpointShow, self).setUp()
+
+ self.endpoints_mock.get.return_value = self.endpoint
+
+ # This is the return value for common.find_resource(service)
+ self.services_mock.get.return_value = self.service
+
+ # Get the command object to test
+ self.cmd = endpoint.ShowEndpoint(self.app, None)
+
+ def test_endpoint_show(self):
+ arglist = [
+ self.endpoint.id,
+ ]
+ verifylist = [
+ ('endpoint', self.endpoint.id),
+ ]
+ parsed_args = self.check_parser(self.cmd, arglist, verifylist)
+
+ # In base command class ShowOne in cliff, abstract method take_action()
+ # returns a two-part tuple with a tuple of column names and a tuple of
+ # data to be shown.
+ columns, data = self.cmd.take_action(parsed_args)
+ self.endpoints_mock.get.assert_called_with(
+ self.endpoint.id,
+ )
+
+ collist = (
+ 'enabled',
+ 'id',
+ 'interface',
+ 'region',
+ 'service_id',
+ 'service_name',
+ 'service_type',
+ 'url',
+ )
+ self.assertEqual(collist, columns)
+ datalist = (
+ True,
+ self.endpoint.id,
+ self.endpoint.interface,
+ self.endpoint.region,
+ self.service.id,
+ self.service.name,
+ self.service.type,
+ self.endpoint.url,
+ )
+ self.assertEqual(datalist, data)
+
+
+class TestEndpointCreateServiceWithoutName(TestEndpointCreate):
+
+ service = identity_fakes.FakeService.create_one_service(
+ attrs={'service_name': ''})
+
+ def setUp(self):
+ super(TestEndpointCreate, self).setUp()
+
+ self.endpoint = identity_fakes.FakeEndpoint.create_one_endpoint(
+ attrs={'service_id': self.service.id})
+
+ self.endpoints_mock.create.return_value = self.endpoint
+
+ # This is the return value for common.find_resource(service)
+ self.services_mock.get.return_value = self.service
+
+ # Get the command object to test
+ self.cmd = endpoint.CreateEndpoint(self.app, None)
+
+
+class TestEndpointListServiceWithoutName(TestEndpointList):
+
+ service = identity_fakes.FakeService.create_one_service(
+ attrs={'service_name': ''})
+ endpoint = identity_fakes.FakeEndpoint.create_one_endpoint(
+ attrs={'service_id': service.id})
+
+ def setUp(self):
+ super(TestEndpointList, self).setUp()
+
+ self.endpoints_mock.list.return_value = [self.endpoint]
+
+ # This is the return value for common.find_resource(service)
+ self.services_mock.get.return_value = self.service
+
+ # Get the command object to test
+ self.cmd = endpoint.ListEndpoint(self.app, None)
+
+
+class TestEndpointShowServiceWithoutName(TestEndpointShow):
+
+ service = identity_fakes.FakeService.create_one_service(
+ attrs={'service_name': ''})
+ endpoint = identity_fakes.FakeEndpoint.create_one_endpoint(
+ attrs={'service_id': service.id})
+
+ def setUp(self):
+ super(TestEndpointShow, self).setUp()
+
+ self.endpoints_mock.get.return_value = self.endpoint
+
+ # This is the return value for common.find_resource(service)
+ self.services_mock.get.return_value = self.service
+
+ # Get the command object to test
+ self.cmd = endpoint.ShowEndpoint(self.app, None)
diff --git a/openstackclient/tests/unit/identity/v3/test_group.py b/openstackclient/tests/unit/identity/v3/test_group.py
new file mode 100644
index 00000000..d35e98c6
--- /dev/null
+++ b/openstackclient/tests/unit/identity/v3/test_group.py
@@ -0,0 +1,569 @@
+# 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 mock
+from mock import call
+
+from keystoneauth1 import exceptions as ks_exc
+from osc_lib import exceptions
+
+from openstackclient.identity.v3 import group
+from openstackclient.tests.unit.identity.v3 import fakes as identity_fakes
+
+
+class TestGroup(identity_fakes.TestIdentityv3):
+
+ def setUp(self):
+ super(TestGroup, self).setUp()
+
+ # Get a shortcut to the DomainManager Mock
+ self.domains_mock = self.app.client_manager.identity.domains
+ self.domains_mock.reset_mock()
+
+ # Get a shortcut to the GroupManager Mock
+ self.groups_mock = self.app.client_manager.identity.groups
+ self.groups_mock.reset_mock()
+
+ # Get a shortcut to the UserManager Mock
+ self.users_mock = self.app.client_manager.identity.users
+ self.users_mock.reset_mock()
+
+
+class TestGroupAddUser(TestGroup):
+
+ group = identity_fakes.FakeGroup.create_one_group()
+ user = identity_fakes.FakeUser.create_one_user()
+
+ def setUp(self):
+ super(TestGroupAddUser, self).setUp()
+
+ self.groups_mock.get.return_value = self.group
+ self.users_mock.get.return_value = self.user
+ self.users_mock.add_to_group.return_value = None
+
+ self.cmd = group.AddUserToGroup(self.app, None)
+
+ def test_group_add_user(self):
+ arglist = [
+ self.group.name,
+ self.user.name,
+ ]
+ verifylist = [
+ ('group', self.group.name),
+ ('user', self.user.name),
+ ]
+ parsed_args = self.check_parser(self.cmd, arglist, verifylist)
+
+ result = self.cmd.take_action(parsed_args)
+ self.users_mock.add_to_group.assert_called_once_with(
+ self.user.id, self.group.id)
+ self.assertIsNone(result)
+
+
+class TestGroupCheckUser(TestGroup):
+
+ group = identity_fakes.FakeGroup.create_one_group()
+ user = identity_fakes.FakeUser.create_one_user()
+
+ def setUp(self):
+ super(TestGroupCheckUser, self).setUp()
+
+ self.groups_mock.get.return_value = self.group
+ self.users_mock.get.return_value = self.user
+ self.users_mock.check_in_group.return_value = None
+
+ self.cmd = group.CheckUserInGroup(self.app, None)
+
+ def test_group_check_user(self):
+ arglist = [
+ self.group.name,
+ self.user.name,
+ ]
+ verifylist = [
+ ('group', self.group.name),
+ ('user', self.user.name),
+ ]
+ parsed_args = self.check_parser(self.cmd, arglist, verifylist)
+
+ result = self.cmd.take_action(parsed_args)
+ self.users_mock.check_in_group.assert_called_once_with(
+ self.user.id, self.group.id)
+ self.assertIsNone(result)
+
+
+class TestGroupCreate(TestGroup):
+
+ domain = identity_fakes.FakeDomain.create_one_domain()
+
+ columns = (
+ 'description',
+ 'domain_id',
+ 'id',
+ 'name',
+ )
+
+ def setUp(self):
+ super(TestGroupCreate, self).setUp()
+ self.group = identity_fakes.FakeGroup.create_one_group(
+ attrs={'domain_id': self.domain.id})
+ self.data = (
+ self.group.description,
+ self.group.domain_id,
+ self.group.id,
+ self.group.name,
+ )
+
+ self.groups_mock.create.return_value = self.group
+ self.groups_mock.get.return_value = self.group
+ self.domains_mock.get.return_value = self.domain
+
+ self.cmd = group.CreateGroup(self.app, None)
+
+ def test_group_create(self):
+ arglist = [
+ self.group.name,
+ ]
+ verifylist = [
+ ('name', self.group.name),
+ ]
+ parsed_args = self.check_parser(self.cmd, arglist, verifylist)
+
+ columns, data = self.cmd.take_action(parsed_args)
+ self.groups_mock.create.assert_called_once_with(
+ name=self.group.name,
+ domain=None,
+ description=None,
+ )
+ self.assertEqual(self.columns, columns)
+ self.assertEqual(self.data, data)
+
+ def test_group_create_with_options(self):
+ arglist = [
+ '--domain', self.domain.name,
+ '--description', self.group.description,
+ self.group.name,
+ ]
+ verifylist = [
+ ('domain', self.domain.name),
+ ('description', self.group.description),
+ ('name', self.group.name),
+ ]
+ parsed_args = self.check_parser(self.cmd, arglist, verifylist)
+
+ columns, data = self.cmd.take_action(parsed_args)
+ self.groups_mock.create.assert_called_once_with(
+ name=self.group.name,
+ domain=self.domain.id,
+ description=self.group.description,
+ )
+ self.assertEqual(self.columns, columns)
+ self.assertEqual(self.data, data)
+
+ def test_group_create_or_show(self):
+ self.groups_mock.create.side_effect = ks_exc.Conflict()
+ arglist = [
+ '--or-show',
+ self.group.name,
+ ]
+ verifylist = [
+ ('or_show', True),
+ ('name', self.group.name),
+ ]
+ parsed_args = self.check_parser(self.cmd, arglist, verifylist)
+
+ columns, data = self.cmd.take_action(parsed_args)
+ self.groups_mock.get.assert_called_once_with(self.group.name)
+ self.assertEqual(self.columns, columns)
+ self.assertEqual(self.data, data)
+
+
+class TestGroupDelete(TestGroup):
+
+ domain = identity_fakes.FakeDomain.create_one_domain()
+ groups = identity_fakes.FakeGroup.create_groups(
+ attrs={'domain_id': domain.id}, count=2)
+
+ def setUp(self):
+ super(TestGroupDelete, self).setUp()
+
+ self.groups_mock.get = (
+ identity_fakes.FakeGroup.get_groups(self.groups))
+ self.groups_mock.delete.return_value = None
+ self.domains_mock.get.return_value = self.domain
+
+ self.cmd = group.DeleteGroup(self.app, None)
+
+ def test_group_delete(self):
+ arglist = [
+ self.groups[0].id,
+ ]
+ verifylist = [
+ ('groups', [self.groups[0].id]),
+ ]
+ parsed_args = self.check_parser(self.cmd, arglist, verifylist)
+
+ result = self.cmd.take_action(parsed_args)
+ self.groups_mock.get.assert_called_once_with(self.groups[0].id)
+ self.groups_mock.delete.assert_called_once_with(self.groups[0].id)
+ self.assertIsNone(result)
+
+ def test_group_multi_delete(self):
+ arglist = []
+ verifylist = []
+
+ for g in self.groups:
+ arglist.append(g.id)
+ verifylist = [
+ ('groups', arglist),
+ ]
+ parsed_args = self.check_parser(self.cmd, arglist, verifylist)
+
+ result = self.cmd.take_action(parsed_args)
+
+ calls = []
+ for g in self.groups:
+ calls.append(call(g.id))
+ self.groups_mock.delete.assert_has_calls(calls)
+ self.assertIsNone(result)
+
+ def test_group_delete_with_domain(self):
+ get_mock_result = [exceptions.CommandError, self.groups[0]]
+ self.groups_mock.get = (
+ mock.MagicMock(side_effect=get_mock_result))
+
+ arglist = [
+ '--domain', self.domain.id,
+ self.groups[0].id,
+ ]
+ verifylist = [
+ ('domain', self.groups[0].domain_id),
+ ('groups', [self.groups[0].id]),
+ ]
+ parsed_args = self.check_parser(self.cmd, arglist, verifylist)
+
+ result = self.cmd.take_action(parsed_args)
+ self.groups_mock.get.assert_any_call(
+ self.groups[0].id, domain_id=self.domain.id)
+ self.groups_mock.delete.assert_called_once_with(self.groups[0].id)
+ self.assertIsNone(result)
+
+
+class TestGroupList(TestGroup):
+
+ domain = identity_fakes.FakeDomain.create_one_domain()
+ group = identity_fakes.FakeGroup.create_one_group()
+ user = identity_fakes.FakeUser.create_one_user()
+
+ columns = (
+ 'ID',
+ 'Name',
+ )
+ datalist = (
+ (
+ group.id,
+ group.name,
+ ),
+ )
+
+ def setUp(self):
+ super(TestGroupList, self).setUp()
+
+ self.groups_mock.get.return_value = self.group
+ self.groups_mock.list.return_value = [self.group]
+
+ self.domains_mock.get.return_value = self.domain
+
+ self.users_mock.get.return_value = self.user
+
+ # Get the command object to test
+ self.cmd = group.ListGroup(self.app, None)
+
+ def test_group_list_no_options(self):
+ arglist = []
+ verifylist = []
+ parsed_args = self.check_parser(self.cmd, arglist, verifylist)
+
+ # In base command class Lister in cliff, abstract method take_action()
+ # returns a tuple containing the column names and an iterable
+ # containing the data to be listed.
+ columns, data = self.cmd.take_action(parsed_args)
+
+ # Set expected values
+ kwargs = {
+ 'domain': None,
+ 'user': None,
+ }
+
+ self.groups_mock.list.assert_called_with(
+ **kwargs
+ )
+
+ self.assertEqual(self.columns, columns)
+ self.assertEqual(self.datalist, tuple(data))
+
+ def test_group_list_domain(self):
+ arglist = [
+ '--domain', self.domain.id,
+ ]
+ verifylist = [
+ ('domain', self.domain.id),
+ ]
+ parsed_args = self.check_parser(self.cmd, arglist, verifylist)
+
+ # In base command class Lister in cliff, abstract method take_action()
+ # returns a tuple containing the column names and an iterable
+ # containing the data to be listed.
+ columns, data = self.cmd.take_action(parsed_args)
+
+ # Set expected values
+ kwargs = {
+ 'domain': self.domain.id,
+ 'user': None,
+ }
+
+ self.groups_mock.list.assert_called_with(
+ **kwargs
+ )
+
+ self.assertEqual(self.columns, columns)
+ self.assertEqual(self.datalist, tuple(data))
+
+ def test_group_list_user(self):
+ arglist = [
+ '--user', self.user.name,
+ ]
+ verifylist = [
+ ('user', self.user.name),
+ ]
+ parsed_args = self.check_parser(self.cmd, arglist, verifylist)
+
+ # In base command class Lister in cliff, abstract method take_action()
+ # returns a tuple containing the column names and an iterable
+ # containing the data to be listed.
+ columns, data = self.cmd.take_action(parsed_args)
+
+ # Set expected values
+ kwargs = {
+ 'domain': None,
+ 'user': self.user.id,
+ }
+
+ self.groups_mock.list.assert_called_with(
+ **kwargs
+ )
+
+ self.assertEqual(self.columns, columns)
+ self.assertEqual(self.datalist, tuple(data))
+
+ def test_group_list_long(self):
+ arglist = [
+ '--long',
+ ]
+ verifylist = [
+ ('long', True),
+ ]
+ parsed_args = self.check_parser(self.cmd, arglist, verifylist)
+
+ # In base command class Lister in cliff, abstract method take_action()
+ # returns a tuple containing the column names and an iterable
+ # containing the data to be listed.
+ columns, data = self.cmd.take_action(parsed_args)
+
+ # Set expected values
+ kwargs = {
+ 'domain': None,
+ 'user': None,
+ }
+
+ self.groups_mock.list.assert_called_with(
+ **kwargs
+ )
+
+ columns = self.columns + (
+ 'Domain ID',
+ 'Description',
+ )
+ datalist = ((
+ self.group.id,
+ self.group.name,
+ self.group.domain_id,
+ self.group.description,
+ ), )
+ self.assertEqual(columns, columns)
+ self.assertEqual(datalist, tuple(data))
+
+
+class TestGroupRemoveUser(TestGroup):
+
+ group = identity_fakes.FakeGroup.create_one_group()
+ user = identity_fakes.FakeUser.create_one_user()
+
+ def setUp(self):
+ super(TestGroupRemoveUser, self).setUp()
+
+ self.groups_mock.get.return_value = self.group
+ self.users_mock.get.return_value = self.user
+ self.users_mock.remove_from_group.return_value = None
+
+ self.cmd = group.RemoveUserFromGroup(self.app, None)
+
+ def test_group_remove_user(self):
+ arglist = [
+ self.group.id,
+ self.user.id,
+ ]
+ verifylist = [
+ ('group', self.group.id),
+ ('user', self.user.id),
+ ]
+ parsed_args = self.check_parser(self.cmd, arglist, verifylist)
+
+ result = self.cmd.take_action(parsed_args)
+ self.users_mock.remove_from_group.assert_called_once_with(
+ self.user.id, self.group.id)
+ self.assertIsNone(result)
+
+
+class TestGroupSet(TestGroup):
+
+ domain = identity_fakes.FakeDomain.create_one_domain()
+ group = identity_fakes.FakeGroup.create_one_group(
+ attrs={'domain_id': domain.id})
+
+ def setUp(self):
+ super(TestGroupSet, self).setUp()
+
+ self.groups_mock.get.return_value = self.group
+ self.domains_mock.get.return_value = self.domain
+ self.groups_mock.update.return_value = None
+
+ self.cmd = group.SetGroup(self.app, None)
+
+ def test_group_set_nothing(self):
+ arglist = [
+ self.group.id,
+ ]
+ verifylist = [
+ ('group', self.group.id),
+ ]
+ parsed_args = self.check_parser(self.cmd, arglist, verifylist)
+
+ result = self.cmd.take_action(parsed_args)
+ self.groups_mock.update.assert_called_once_with(self.group.id)
+ self.assertIsNone(result)
+
+ def test_group_set_name_and_description(self):
+ arglist = [
+ '--name', 'new_name',
+ '--description', 'new_description',
+ self.group.id,
+ ]
+ verifylist = [
+ ('name', 'new_name'),
+ ('description', 'new_description'),
+ ('group', self.group.id),
+ ]
+ parsed_args = self.check_parser(self.cmd, arglist, verifylist)
+
+ result = self.cmd.take_action(parsed_args)
+ kwargs = {
+ 'name': 'new_name',
+ 'description': 'new_description',
+ }
+ self.groups_mock.update.assert_called_once_with(
+ self.group.id, **kwargs)
+ self.assertIsNone(result)
+
+ def test_group_set_with_domain(self):
+ get_mock_result = [exceptions.CommandError, self.group]
+ self.groups_mock.get = (
+ mock.MagicMock(side_effect=get_mock_result))
+
+ arglist = [
+ '--domain', self.domain.id,
+ self.group.id,
+ ]
+ verifylist = [
+ ('domain', self.domain.id),
+ ('group', self.group.id),
+ ]
+ parsed_args = self.check_parser(self.cmd, arglist, verifylist)
+
+ result = self.cmd.take_action(parsed_args)
+ self.groups_mock.get.assert_any_call(
+ self.group.id, domain_id=self.domain.id)
+ self.groups_mock.update.assert_called_once_with(self.group.id)
+ self.assertIsNone(result)
+
+
+class TestGroupShow(TestGroup):
+
+ domain = identity_fakes.FakeDomain.create_one_domain()
+
+ columns = (
+ 'description',
+ 'domain_id',
+ 'id',
+ 'name',
+ )
+
+ def setUp(self):
+ super(TestGroupShow, self).setUp()
+ self.group = identity_fakes.FakeGroup.create_one_group(
+ attrs={'domain_id': self.domain.id})
+ self.data = (
+ self.group.description,
+ self.group.domain_id,
+ self.group.id,
+ self.group.name,
+ )
+
+ self.groups_mock.get.return_value = self.group
+ self.domains_mock.get.return_value = self.domain
+
+ self.cmd = group.ShowGroup(self.app, None)
+
+ def test_group_show(self):
+ arglist = [
+ self.group.id,
+ ]
+ verifylist = [
+ ('group', self.group.id),
+ ]
+ parsed_args = self.check_parser(self.cmd, arglist, verifylist)
+
+ columns, data = self.cmd.take_action(parsed_args)
+ self.groups_mock.get.assert_called_once_with(self.group.id)
+ self.assertEqual(self.columns, columns)
+ self.assertEqual(self.data, data)
+
+ def test_group_show_with_domain(self):
+ get_mock_result = [exceptions.CommandError, self.group]
+ self.groups_mock.get = (
+ mock.MagicMock(side_effect=get_mock_result))
+
+ arglist = [
+ '--domain', self.domain.id,
+ self.group.id,
+ ]
+ verifylist = [
+ ('domain', self.domain.id),
+ ('group', self.group.id),
+ ]
+ parsed_args = self.check_parser(self.cmd, arglist, verifylist)
+
+ columns, data = self.cmd.take_action(parsed_args)
+ self.groups_mock.get.assert_any_call(
+ self.group.id, domain_id=self.domain.id)
+ self.assertEqual(self.columns, columns)
+ self.assertEqual(self.data, data)
diff --git a/openstackclient/tests/unit/identity/v3/test_identity_provider.py b/openstackclient/tests/unit/identity/v3/test_identity_provider.py
new file mode 100644
index 00000000..cb672a92
--- /dev/null
+++ b/openstackclient/tests/unit/identity/v3/test_identity_provider.py
@@ -0,0 +1,593 @@
+# Copyright 2014 CERN.
+#
+# 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 copy
+import mock
+
+from openstackclient.identity.v3 import identity_provider
+from openstackclient.tests.unit import fakes
+from openstackclient.tests.unit.identity.v3 import fakes as identity_fakes
+
+
+class TestIdentityProvider(identity_fakes.TestFederatedIdentity):
+
+ def setUp(self):
+ super(TestIdentityProvider, self).setUp()
+
+ federation_lib = self.app.client_manager.identity.federation
+ self.identity_providers_mock = federation_lib.identity_providers
+ self.identity_providers_mock.reset_mock()
+
+
+class TestIdentityProviderCreate(TestIdentityProvider):
+
+ columns = (
+ 'description',
+ 'enabled',
+ 'id',
+ 'remote_ids',
+ )
+ datalist = (
+ identity_fakes.idp_description,
+ True,
+ identity_fakes.idp_id,
+ identity_fakes.formatted_idp_remote_ids,
+ )
+
+ def setUp(self):
+ super(TestIdentityProviderCreate, self).setUp()
+
+ copied_idp = copy.deepcopy(identity_fakes.IDENTITY_PROVIDER)
+ resource = fakes.FakeResource(None, copied_idp, loaded=True)
+ self.identity_providers_mock.create.return_value = resource
+ self.cmd = identity_provider.CreateIdentityProvider(self.app, None)
+
+ def test_create_identity_provider_no_options(self):
+ arglist = [
+ identity_fakes.idp_id,
+ ]
+ verifylist = [
+ ('identity_provider_id', identity_fakes.idp_id),
+ ]
+ parsed_args = self.check_parser(self.cmd, arglist, verifylist)
+ columns, data = self.cmd.take_action(parsed_args)
+
+ # Set expected values
+ kwargs = {
+ 'remote_ids': None,
+ 'enabled': True,
+ 'description': None,
+ }
+
+ self.identity_providers_mock.create.assert_called_with(
+ id=identity_fakes.idp_id,
+ **kwargs
+ )
+
+ self.assertEqual(self.columns, columns)
+ self.assertEqual(self.datalist, data)
+
+ def test_create_identity_provider_description(self):
+ arglist = [
+ '--description', identity_fakes.idp_description,
+ identity_fakes.idp_id,
+ ]
+ verifylist = [
+ ('identity_provider_id', identity_fakes.idp_id),
+ ('description', identity_fakes.idp_description),
+ ]
+ parsed_args = self.check_parser(self.cmd, arglist, verifylist)
+ columns, data = self.cmd.take_action(parsed_args)
+
+ # Set expected values
+ kwargs = {
+ 'remote_ids': None,
+ 'description': identity_fakes.idp_description,
+ 'enabled': True,
+ }
+
+ self.identity_providers_mock.create.assert_called_with(
+ id=identity_fakes.idp_id,
+ **kwargs
+ )
+
+ self.assertEqual(self.columns, columns)
+ self.assertEqual(self.datalist, data)
+
+ def test_create_identity_provider_remote_id(self):
+ arglist = [
+ identity_fakes.idp_id,
+ '--remote-id', identity_fakes.idp_remote_ids[0]
+ ]
+ verifylist = [
+ ('identity_provider_id', identity_fakes.idp_id),
+ ('remote_id', identity_fakes.idp_remote_ids[:1]),
+ ]
+ parsed_args = self.check_parser(self.cmd, arglist, verifylist)
+ columns, data = self.cmd.take_action(parsed_args)
+
+ # Set expected values
+ kwargs = {
+ 'remote_ids': identity_fakes.idp_remote_ids[:1],
+ 'description': None,
+ 'enabled': True,
+ }
+
+ self.identity_providers_mock.create.assert_called_with(
+ id=identity_fakes.idp_id,
+ **kwargs
+ )
+
+ self.assertEqual(self.columns, columns)
+ self.assertEqual(self.datalist, data)
+
+ def test_create_identity_provider_remote_ids_multiple(self):
+ arglist = [
+ '--remote-id', identity_fakes.idp_remote_ids[0],
+ '--remote-id', identity_fakes.idp_remote_ids[1],
+ identity_fakes.idp_id
+ ]
+ verifylist = [
+ ('identity_provider_id', identity_fakes.idp_id),
+ ('remote_id', identity_fakes.idp_remote_ids),
+ ]
+ parsed_args = self.check_parser(self.cmd, arglist, verifylist)
+ columns, data = self.cmd.take_action(parsed_args)
+
+ # Set expected values
+ kwargs = {
+ 'remote_ids': identity_fakes.idp_remote_ids,
+ 'description': None,
+ 'enabled': True,
+ }
+
+ self.identity_providers_mock.create.assert_called_with(
+ id=identity_fakes.idp_id,
+ **kwargs
+ )
+
+ self.assertEqual(self.columns, columns)
+ self.assertEqual(self.datalist, data)
+
+ def test_create_identity_provider_remote_ids_file(self):
+ arglist = [
+ '--remote-id-file', '/tmp/file_name',
+ identity_fakes.idp_id,
+ ]
+ verifylist = [
+ ('identity_provider_id', identity_fakes.idp_id),
+ ('remote_id_file', '/tmp/file_name'),
+ ]
+ parsed_args = self.check_parser(self.cmd, arglist, verifylist)
+
+ mocker = mock.Mock()
+ mocker.return_value = "\n".join(identity_fakes.idp_remote_ids)
+ with mock.patch("openstackclient.identity.v3.identity_provider."
+ "utils.read_blob_file_contents", mocker):
+ columns, data = self.cmd.take_action(parsed_args)
+
+ # Set expected values
+ kwargs = {
+ 'remote_ids': identity_fakes.idp_remote_ids,
+ 'description': None,
+ 'enabled': True,
+ }
+
+ self.identity_providers_mock.create.assert_called_with(
+ id=identity_fakes.idp_id,
+ **kwargs
+ )
+
+ self.assertEqual(self.columns, columns)
+ self.assertEqual(self.datalist, data)
+
+ def test_create_identity_provider_disabled(self):
+
+ # Prepare FakeResource object
+ IDENTITY_PROVIDER = copy.deepcopy(identity_fakes.IDENTITY_PROVIDER)
+ IDENTITY_PROVIDER['enabled'] = False
+ IDENTITY_PROVIDER['description'] = None
+
+ resource = fakes.FakeResource(None, IDENTITY_PROVIDER, loaded=True)
+ self.identity_providers_mock.create.return_value = resource
+
+ arglist = [
+ '--disable',
+ identity_fakes.idp_id,
+ ]
+ verifylist = [
+ ('identity_provider_id', identity_fakes.idp_id),
+ ]
+ parsed_args = self.check_parser(self.cmd, arglist, verifylist)
+ columns, data = self.cmd.take_action(parsed_args)
+
+ # Set expected values
+ kwargs = {
+ 'remote_ids': None,
+ 'enabled': False,
+ 'description': None,
+ }
+
+ self.identity_providers_mock.create.assert_called_with(
+ id=identity_fakes.idp_id,
+ **kwargs
+ )
+
+ self.assertEqual(self.columns, columns)
+ datalist = (
+ None,
+ False,
+ identity_fakes.idp_id,
+ identity_fakes.formatted_idp_remote_ids
+ )
+ self.assertEqual(datalist, data)
+
+
+class TestIdentityProviderDelete(TestIdentityProvider):
+
+ def setUp(self):
+ super(TestIdentityProviderDelete, self).setUp()
+
+ # This is the return value for utils.find_resource()
+ self.identity_providers_mock.get.return_value = fakes.FakeResource(
+ None,
+ copy.deepcopy(identity_fakes.IDENTITY_PROVIDER),
+ loaded=True,
+ )
+
+ self.identity_providers_mock.delete.return_value = None
+ self.cmd = identity_provider.DeleteIdentityProvider(self.app, None)
+
+ def test_delete_identity_provider(self):
+ arglist = [
+ identity_fakes.idp_id,
+ ]
+ verifylist = [
+ ('identity_provider', [identity_fakes.idp_id]),
+ ]
+ parsed_args = self.check_parser(self.cmd, arglist, verifylist)
+
+ result = self.cmd.take_action(parsed_args)
+
+ self.identity_providers_mock.delete.assert_called_with(
+ identity_fakes.idp_id,
+ )
+ self.assertIsNone(result)
+
+
+class TestIdentityProviderList(TestIdentityProvider):
+
+ def setUp(self):
+ super(TestIdentityProviderList, self).setUp()
+
+ self.identity_providers_mock.get.return_value = fakes.FakeResource(
+ None,
+ copy.deepcopy(identity_fakes.IDENTITY_PROVIDER),
+ loaded=True,
+ )
+ self.identity_providers_mock.list.return_value = [
+ fakes.FakeResource(
+ None,
+ copy.deepcopy(identity_fakes.IDENTITY_PROVIDER),
+ loaded=True,
+ ),
+ ]
+
+ # Get the command object to test
+ self.cmd = identity_provider.ListIdentityProvider(self.app, None)
+
+ def test_identity_provider_list_no_options(self):
+ arglist = []
+ verifylist = []
+ parsed_args = self.check_parser(self.cmd, arglist, verifylist)
+
+ # In base command class Lister in cliff, abstract method take_action()
+ # returns a tuple containing the column names and an iterable
+ # containing the data to be listed.
+ columns, data = self.cmd.take_action(parsed_args)
+
+ self.identity_providers_mock.list.assert_called_with()
+
+ collist = ('ID', 'Enabled', 'Description')
+ self.assertEqual(collist, columns)
+ datalist = ((
+ identity_fakes.idp_id,
+ True,
+ identity_fakes.idp_description,
+ ), )
+ self.assertEqual(datalist, tuple(data))
+
+
+class TestIdentityProviderSet(TestIdentityProvider):
+
+ columns = (
+ 'description',
+ 'enabled',
+ 'id',
+ 'remote_ids',
+ )
+ datalist = (
+ identity_fakes.idp_description,
+ True,
+ identity_fakes.idp_id,
+ identity_fakes.idp_remote_ids,
+ )
+
+ def setUp(self):
+ super(TestIdentityProviderSet, self).setUp()
+ self.cmd = identity_provider.SetIdentityProvider(self.app, None)
+
+ def test_identity_provider_set_description(self):
+ """Set Identity Provider's description. """
+
+ def prepare(self):
+ """Prepare fake return objects before the test is executed"""
+ updated_idp = copy.deepcopy(identity_fakes.IDENTITY_PROVIDER)
+ updated_idp['enabled'] = False
+ resources = fakes.FakeResource(
+ None,
+ updated_idp,
+ loaded=True
+ )
+ self.identity_providers_mock.update.return_value = resources
+
+ prepare(self)
+ new_description = 'new desc'
+ arglist = [
+ '--description', new_description,
+ identity_fakes.idp_id
+ ]
+ verifylist = [
+ ('identity_provider', identity_fakes.idp_id),
+ ('description', new_description),
+ ('enable', False),
+ ('disable', False),
+ ('remote_id', None)
+ ]
+ parsed_args = self.check_parser(self.cmd, arglist, verifylist)
+ self.cmd.take_action(parsed_args)
+ self.identity_providers_mock.update.assert_called_with(
+ identity_fakes.idp_id,
+ description=new_description,
+ )
+
+ def test_identity_provider_disable(self):
+ """Disable Identity Provider
+
+ Set Identity Provider's ``enabled`` attribute to False.
+ """
+
+ def prepare(self):
+ """Prepare fake return objects before the test is executed"""
+ updated_idp = copy.deepcopy(identity_fakes.IDENTITY_PROVIDER)
+ updated_idp['enabled'] = False
+ resources = fakes.FakeResource(
+ None,
+ updated_idp,
+ loaded=True
+ )
+ self.identity_providers_mock.update.return_value = resources
+
+ prepare(self)
+ arglist = [
+ '--disable', identity_fakes.idp_id,
+ '--remote-id', identity_fakes.idp_remote_ids[0],
+ '--remote-id', identity_fakes.idp_remote_ids[1]
+ ]
+ verifylist = [
+ ('identity_provider', identity_fakes.idp_id),
+ ('description', None),
+ ('enable', False),
+ ('disable', True),
+ ('remote_id', identity_fakes.idp_remote_ids)
+ ]
+ parsed_args = self.check_parser(self.cmd, arglist, verifylist)
+
+ self.cmd.take_action(parsed_args)
+ self.identity_providers_mock.update.assert_called_with(
+ identity_fakes.idp_id,
+ enabled=False,
+ remote_ids=identity_fakes.idp_remote_ids
+ )
+
+ def test_identity_provider_enable(self):
+ """Enable Identity Provider.
+
+ Set Identity Provider's ``enabled`` attribute to True.
+ """
+
+ def prepare(self):
+ """Prepare fake return objects before the test is executed"""
+ resources = fakes.FakeResource(
+ None,
+ copy.deepcopy(identity_fakes.IDENTITY_PROVIDER),
+ loaded=True
+ )
+ self.identity_providers_mock.update.return_value = resources
+
+ prepare(self)
+ arglist = [
+ '--enable', identity_fakes.idp_id,
+ '--remote-id', identity_fakes.idp_remote_ids[0],
+ '--remote-id', identity_fakes.idp_remote_ids[1]
+ ]
+ verifylist = [
+ ('identity_provider', identity_fakes.idp_id),
+ ('description', None),
+ ('enable', True),
+ ('disable', False),
+ ('remote_id', identity_fakes.idp_remote_ids)
+ ]
+ parsed_args = self.check_parser(self.cmd, arglist, verifylist)
+
+ self.cmd.take_action(parsed_args)
+ self.identity_providers_mock.update.assert_called_with(
+ identity_fakes.idp_id, enabled=True,
+ remote_ids=identity_fakes.idp_remote_ids)
+
+ def test_identity_provider_replace_remote_ids(self):
+ """Enable Identity Provider.
+
+ Set Identity Provider's ``enabled`` attribute to True.
+ """
+
+ def prepare(self):
+ """Prepare fake return objects before the test is executed"""
+ self.new_remote_id = 'new_entity'
+
+ updated_idp = copy.deepcopy(identity_fakes.IDENTITY_PROVIDER)
+ updated_idp['remote_ids'] = [self.new_remote_id]
+ resources = fakes.FakeResource(
+ None,
+ updated_idp,
+ loaded=True
+ )
+ self.identity_providers_mock.update.return_value = resources
+
+ prepare(self)
+ arglist = [
+ '--enable', identity_fakes.idp_id,
+ '--remote-id', self.new_remote_id
+ ]
+ verifylist = [
+ ('identity_provider', identity_fakes.idp_id),
+ ('description', None),
+ ('enable', True),
+ ('disable', False),
+ ('remote_id', [self.new_remote_id])
+ ]
+ parsed_args = self.check_parser(self.cmd, arglist, verifylist)
+
+ self.cmd.take_action(parsed_args)
+ self.identity_providers_mock.update.assert_called_with(
+ identity_fakes.idp_id, enabled=True,
+ remote_ids=[self.new_remote_id])
+
+ def test_identity_provider_replace_remote_ids_file(self):
+ """Enable Identity Provider.
+
+ Set Identity Provider's ``enabled`` attribute to True.
+ """
+
+ def prepare(self):
+ """Prepare fake return objects before the test is executed"""
+ self.new_remote_id = 'new_entity'
+
+ updated_idp = copy.deepcopy(identity_fakes.IDENTITY_PROVIDER)
+ updated_idp['remote_ids'] = [self.new_remote_id]
+ resources = fakes.FakeResource(
+ None,
+ updated_idp,
+ loaded=True
+ )
+ self.identity_providers_mock.update.return_value = resources
+
+ prepare(self)
+ arglist = [
+ '--enable', identity_fakes.idp_id,
+ '--remote-id-file', self.new_remote_id,
+ ]
+ verifylist = [
+ ('identity_provider', identity_fakes.idp_id),
+ ('description', None),
+ ('enable', True),
+ ('disable', False),
+ ('remote_id_file', self.new_remote_id),
+ ]
+ parsed_args = self.check_parser(self.cmd, arglist, verifylist)
+
+ mocker = mock.Mock()
+ mocker.return_value = self.new_remote_id
+ with mock.patch("openstackclient.identity.v3.identity_provider."
+ "utils.read_blob_file_contents", mocker):
+ self.cmd.take_action(parsed_args)
+ self.identity_providers_mock.update.assert_called_with(
+ identity_fakes.idp_id, enabled=True,
+ remote_ids=[self.new_remote_id])
+
+ def test_identity_provider_no_options(self):
+ def prepare(self):
+ """Prepare fake return objects before the test is executed"""
+ resources = fakes.FakeResource(
+ None,
+ copy.deepcopy(identity_fakes.IDENTITY_PROVIDER),
+ loaded=True
+ )
+ self.identity_providers_mock.get.return_value = resources
+
+ resources = fakes.FakeResource(
+ None,
+ copy.deepcopy(identity_fakes.IDENTITY_PROVIDER),
+ loaded=True,
+ )
+ self.identity_providers_mock.update.return_value = resources
+
+ prepare(self)
+ arglist = [
+ identity_fakes.idp_id,
+ ]
+ verifylist = [
+ ('identity_provider', identity_fakes.idp_id),
+ ('enable', False),
+ ('disable', False),
+ ('remote_id', None)
+ ]
+ parsed_args = self.check_parser(self.cmd, arglist, verifylist)
+
+ self.cmd.take_action(parsed_args)
+
+
+class TestIdentityProviderShow(TestIdentityProvider):
+
+ def setUp(self):
+ super(TestIdentityProviderShow, self).setUp()
+
+ ret = fakes.FakeResource(
+ None,
+ copy.deepcopy(identity_fakes.IDENTITY_PROVIDER),
+ loaded=True,
+ )
+
+ self.identity_providers_mock.get.side_effect = [Exception("Not found"),
+ ret]
+ self.identity_providers_mock.get.return_value = ret
+
+ # Get the command object to test
+ self.cmd = identity_provider.ShowIdentityProvider(self.app, None)
+
+ def test_identity_provider_show(self):
+ arglist = [
+ identity_fakes.idp_id,
+ ]
+ verifylist = [
+ ('identity_provider', identity_fakes.idp_id),
+ ]
+ parsed_args = self.check_parser(self.cmd, arglist, verifylist)
+
+ columns, data = self.cmd.take_action(parsed_args)
+
+ self.identity_providers_mock.get.assert_called_with(
+ identity_fakes.idp_id,
+ id='test_idp'
+ )
+
+ collist = ('description', 'enabled', 'id', 'remote_ids')
+ self.assertEqual(collist, columns)
+ datalist = (
+ identity_fakes.idp_description,
+ True,
+ identity_fakes.idp_id,
+ identity_fakes.formatted_idp_remote_ids
+ )
+ self.assertEqual(datalist, data)
diff --git a/openstackclient/tests/unit/identity/v3/test_mappings.py b/openstackclient/tests/unit/identity/v3/test_mappings.py
new file mode 100644
index 00000000..5086724c
--- /dev/null
+++ b/openstackclient/tests/unit/identity/v3/test_mappings.py
@@ -0,0 +1,244 @@
+# Copyright 2014 CERN.
+#
+# 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 copy
+import mock
+
+from osc_lib import exceptions
+
+from openstackclient.identity.v3 import mapping
+from openstackclient.tests.unit import fakes
+from openstackclient.tests.unit.identity.v3 import fakes as identity_fakes
+
+
+class TestMapping(identity_fakes.TestFederatedIdentity):
+
+ def setUp(self):
+ super(TestMapping, self).setUp()
+
+ federation_lib = self.app.client_manager.identity.federation
+ self.mapping_mock = federation_lib.mappings
+ self.mapping_mock.reset_mock()
+
+
+class TestMappingCreate(TestMapping):
+
+ def setUp(self):
+ super(TestMappingCreate, self).setUp()
+ self.mapping_mock.create.return_value = fakes.FakeResource(
+ None,
+ copy.deepcopy(identity_fakes.MAPPING_RESPONSE),
+ loaded=True
+ )
+ self.cmd = mapping.CreateMapping(self.app, None)
+
+ def test_create_mapping(self):
+ arglist = [
+ '--rules', identity_fakes.mapping_rules_file_path,
+ identity_fakes.mapping_id
+ ]
+ verifylist = [
+ ('mapping', identity_fakes.mapping_id),
+ ('rules', identity_fakes.mapping_rules_file_path)
+ ]
+
+ parsed_args = self.check_parser(self.cmd, arglist, verifylist)
+
+ mocker = mock.Mock()
+ mocker.return_value = identity_fakes.MAPPING_RULES
+ with mock.patch("openstackclient.identity.v3.mapping."
+ "CreateMapping._read_rules", mocker):
+ columns, data = self.cmd.take_action(parsed_args)
+
+ self.mapping_mock.create.assert_called_with(
+ mapping_id=identity_fakes.mapping_id,
+ rules=identity_fakes.MAPPING_RULES)
+
+ collist = ('id', 'rules')
+ self.assertEqual(collist, columns)
+
+ datalist = (identity_fakes.mapping_id,
+ identity_fakes.MAPPING_RULES)
+ self.assertEqual(datalist, data)
+
+
+class TestMappingDelete(TestMapping):
+
+ def setUp(self):
+ super(TestMappingDelete, self).setUp()
+ self.mapping_mock.get.return_value = fakes.FakeResource(
+ None,
+ copy.deepcopy(identity_fakes.MAPPING_RESPONSE),
+ loaded=True)
+
+ self.mapping_mock.delete.return_value = None
+ self.cmd = mapping.DeleteMapping(self.app, None)
+
+ def test_delete_mapping(self):
+ arglist = [
+ identity_fakes.mapping_id
+ ]
+ verifylist = [
+ ('mapping', [identity_fakes.mapping_id])
+ ]
+ parsed_args = self.check_parser(self.cmd, arglist, verifylist)
+
+ result = self.cmd.take_action(parsed_args)
+
+ self.mapping_mock.delete.assert_called_with(
+ identity_fakes.mapping_id)
+ self.assertIsNone(result)
+
+
+class TestMappingList(TestMapping):
+
+ def setUp(self):
+ super(TestMappingList, self).setUp()
+ self.mapping_mock.get.return_value = fakes.FakeResource(
+ None,
+ {'id': identity_fakes.mapping_id},
+ loaded=True)
+ # Pretend list command returns list of two mappings.
+ # NOTE(marek-denis): We are returning FakeResources with mapping id
+ # only as ShowMapping class is implemented in a way where rules will
+ # not be displayed, only mapping ids.
+ self.mapping_mock.list.return_value = [
+ fakes.FakeResource(
+ None,
+ {'id': identity_fakes.mapping_id},
+ loaded=True,
+ ),
+ fakes.FakeResource(
+ None,
+ {'id': 'extra_mapping'},
+ loaded=True,
+ ),
+ ]
+
+ # Get the command object to test
+ self.cmd = mapping.ListMapping(self.app, None)
+
+ def test_mapping_list(self):
+ arglist = []
+ verifylist = []
+ parsed_args = self.check_parser(self.cmd, arglist, verifylist)
+
+ columns, data = self.cmd.take_action(parsed_args)
+
+ self.mapping_mock.list.assert_called_with()
+
+ collist = ('ID',)
+ self.assertEqual(collist, columns)
+
+ datalist = [(identity_fakes.mapping_id,), ('extra_mapping',)]
+ self.assertEqual(datalist, data)
+
+
+class TestMappingSet(TestMapping):
+
+ def setUp(self):
+ super(TestMappingSet, self).setUp()
+
+ self.mapping_mock.get.return_value = fakes.FakeResource(
+ None,
+ copy.deepcopy(identity_fakes.MAPPING_RESPONSE),
+ loaded=True
+ )
+
+ self.mapping_mock.update.return_value = fakes.FakeResource(
+ None,
+ identity_fakes.MAPPING_RESPONSE_2,
+ loaded=True
+ )
+
+ # Get the command object to test
+ self.cmd = mapping.SetMapping(self.app, None)
+
+ def test_set_new_rules(self):
+ arglist = [
+ '--rules', identity_fakes.mapping_rules_file_path,
+ identity_fakes.mapping_id
+ ]
+ verifylist = [
+ ('mapping', identity_fakes.mapping_id),
+ ('rules', identity_fakes.mapping_rules_file_path)
+ ]
+
+ parsed_args = self.check_parser(self.cmd, arglist, verifylist)
+
+ mocker = mock.Mock()
+ mocker.return_value = identity_fakes.MAPPING_RULES_2
+ with mock.patch("openstackclient.identity.v3.mapping."
+ "SetMapping._read_rules", mocker):
+ columns, data = self.cmd.take_action(parsed_args)
+ self.mapping_mock.update.assert_called_with(
+ mapping=identity_fakes.mapping_id,
+ rules=identity_fakes.MAPPING_RULES_2)
+
+ collist = ('id', 'rules')
+ self.assertEqual(collist, columns)
+ datalist = (identity_fakes.mapping_id,
+ identity_fakes.MAPPING_RULES_2)
+ self.assertEqual(datalist, data)
+
+ def test_set_rules_wrong_file_path(self):
+ arglist = [
+ '--rules', identity_fakes.mapping_rules_file_path,
+ identity_fakes.mapping_id
+ ]
+ verifylist = [
+ ('mapping', identity_fakes.mapping_id),
+ ('rules', identity_fakes.mapping_rules_file_path)
+ ]
+ parsed_args = self.check_parser(self.cmd, arglist, verifylist)
+
+ self.assertRaises(
+ exceptions.CommandError,
+ self.cmd.take_action,
+ parsed_args)
+
+
+class TestMappingShow(TestMapping):
+
+ def setUp(self):
+ super(TestMappingShow, self).setUp()
+
+ self.mapping_mock.get.return_value = fakes.FakeResource(
+ None,
+ copy.deepcopy(identity_fakes.MAPPING_RESPONSE),
+ loaded=True
+ )
+
+ self.cmd = mapping.ShowMapping(self.app, None)
+
+ def test_mapping_show(self):
+ arglist = [
+ identity_fakes.mapping_id
+ ]
+ verifylist = [
+ ('mapping', identity_fakes.mapping_id)
+ ]
+ parsed_args = self.check_parser(self.cmd, arglist, verifylist)
+
+ columns, data = self.cmd.take_action(parsed_args)
+
+ self.mapping_mock.get.assert_called_with(
+ identity_fakes.mapping_id)
+
+ collist = ('id', 'rules')
+ self.assertEqual(collist, columns)
+
+ datalist = (identity_fakes.mapping_id,
+ identity_fakes.MAPPING_RULES)
+ self.assertEqual(datalist, data)
diff --git a/openstackclient/tests/unit/identity/v3/test_oauth.py b/openstackclient/tests/unit/identity/v3/test_oauth.py
new file mode 100644
index 00000000..3aabd9b8
--- /dev/null
+++ b/openstackclient/tests/unit/identity/v3/test_oauth.py
@@ -0,0 +1,173 @@
+# 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 copy
+
+from openstackclient.identity.v3 import token
+from openstackclient.tests.unit import fakes
+from openstackclient.tests.unit.identity.v3 import fakes as identity_fakes
+
+
+class TestOAuth1(identity_fakes.TestOAuth1):
+
+ def setUp(self):
+ super(TestOAuth1, self).setUp()
+ identity_client = self.app.client_manager.identity
+ self.access_tokens_mock = identity_client.oauth1.access_tokens
+ self.access_tokens_mock.reset_mock()
+ self.request_tokens_mock = identity_client.oauth1.request_tokens
+ self.request_tokens_mock.reset_mock()
+ self.projects_mock = identity_client.projects
+ self.projects_mock.reset_mock()
+ self.roles_mock = identity_client.roles
+ self.roles_mock.reset_mock()
+
+
+class TestAccessTokenCreate(TestOAuth1):
+
+ def setUp(self):
+ super(TestAccessTokenCreate, self).setUp()
+
+ self.access_tokens_mock.create.return_value = fakes.FakeResource(
+ None,
+ copy.deepcopy(identity_fakes.OAUTH_ACCESS_TOKEN),
+ loaded=True,
+ )
+
+ self.cmd = token.CreateAccessToken(self.app, None)
+
+ def test_create_access_tokens(self):
+ arglist = [
+ '--consumer-key', identity_fakes.consumer_id,
+ '--consumer-secret', identity_fakes.consumer_secret,
+ '--request-key', identity_fakes.request_token_id,
+ '--request-secret', identity_fakes.request_token_secret,
+ '--verifier', identity_fakes.oauth_verifier_pin,
+ ]
+ verifylist = [
+ ('consumer_key', identity_fakes.consumer_id),
+ ('consumer_secret', identity_fakes.consumer_secret),
+ ('request_key', identity_fakes.request_token_id),
+ ('request_secret', identity_fakes.request_token_secret),
+ ('verifier', identity_fakes.oauth_verifier_pin),
+ ]
+ parsed_args = self.check_parser(self.cmd, arglist, verifylist)
+ columns, data = self.cmd.take_action(parsed_args)
+
+ self.access_tokens_mock.create.assert_called_with(
+ identity_fakes.consumer_id,
+ identity_fakes.consumer_secret,
+ identity_fakes.request_token_id,
+ identity_fakes.request_token_secret,
+ identity_fakes.oauth_verifier_pin,
+ )
+
+ collist = ('expires', 'id', 'key', 'secret')
+ self.assertEqual(collist, columns)
+ datalist = (
+ identity_fakes.access_token_expires,
+ identity_fakes.access_token_id,
+ identity_fakes.access_token_id,
+ identity_fakes.access_token_secret,
+ )
+ self.assertEqual(datalist, data)
+
+
+class TestRequestTokenAuthorize(TestOAuth1):
+
+ def setUp(self):
+ super(TestRequestTokenAuthorize, self).setUp()
+
+ self.roles_mock.get.return_value = fakes.FakeResource(
+ None,
+ copy.deepcopy(identity_fakes.ROLE),
+ loaded=True,
+ )
+
+ copied_verifier = copy.deepcopy(identity_fakes.OAUTH_VERIFIER)
+ resource = fakes.FakeResource(None, copied_verifier, loaded=True)
+ self.request_tokens_mock.authorize.return_value = resource
+ self.cmd = token.AuthorizeRequestToken(self.app, None)
+
+ def test_authorize_request_tokens(self):
+ arglist = [
+ '--request-key', identity_fakes.request_token_id,
+ '--role', identity_fakes.role_name,
+ ]
+ verifylist = [
+ ('request_key', identity_fakes.request_token_id),
+ ('role', [identity_fakes.role_name]),
+ ]
+ parsed_args = self.check_parser(self.cmd, arglist, verifylist)
+ columns, data = self.cmd.take_action(parsed_args)
+
+ self.request_tokens_mock.authorize.assert_called_with(
+ identity_fakes.request_token_id,
+ [identity_fakes.role_id],
+ )
+
+ collist = ('oauth_verifier',)
+ self.assertEqual(collist, columns)
+ datalist = (
+ identity_fakes.oauth_verifier_pin,
+ )
+ self.assertEqual(datalist, data)
+
+
+class TestRequestTokenCreate(TestOAuth1):
+
+ def setUp(self):
+ super(TestRequestTokenCreate, self).setUp()
+
+ self.request_tokens_mock.create.return_value = fakes.FakeResource(
+ None,
+ copy.deepcopy(identity_fakes.OAUTH_REQUEST_TOKEN),
+ loaded=True,
+ )
+
+ self.projects_mock.get.return_value = fakes.FakeResource(
+ None,
+ copy.deepcopy(identity_fakes.PROJECT),
+ loaded=True,
+ )
+
+ self.cmd = token.CreateRequestToken(self.app, None)
+
+ def test_create_request_tokens(self):
+ arglist = [
+ '--consumer-key', identity_fakes.consumer_id,
+ '--consumer-secret', identity_fakes.consumer_secret,
+ '--project', identity_fakes.project_id,
+ ]
+ verifylist = [
+ ('consumer_key', identity_fakes.consumer_id),
+ ('consumer_secret', identity_fakes.consumer_secret),
+ ('project', identity_fakes.project_id),
+ ]
+ parsed_args = self.check_parser(self.cmd, arglist, verifylist)
+ columns, data = self.cmd.take_action(parsed_args)
+
+ self.request_tokens_mock.create.assert_called_with(
+ identity_fakes.consumer_id,
+ identity_fakes.consumer_secret,
+ identity_fakes.project_id,
+ )
+
+ collist = ('expires', 'id', 'key', 'secret')
+ self.assertEqual(collist, columns)
+ datalist = (
+ identity_fakes.request_token_expires,
+ identity_fakes.request_token_id,
+ identity_fakes.request_token_id,
+ identity_fakes.request_token_secret,
+ )
+ self.assertEqual(datalist, data)
diff --git a/openstackclient/tests/unit/identity/v3/test_project.py b/openstackclient/tests/unit/identity/v3/test_project.py
new file mode 100644
index 00000000..702d9209
--- /dev/null
+++ b/openstackclient/tests/unit/identity/v3/test_project.py
@@ -0,0 +1,978 @@
+# Copyright 2013 Nebula Inc.
+#
+# 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 mock
+
+from osc_lib import exceptions
+
+from openstackclient.identity.v3 import project
+from openstackclient.tests.unit.identity.v3 import fakes as identity_fakes
+
+
+class TestProject(identity_fakes.TestIdentityv3):
+
+ def setUp(self):
+ super(TestProject, self).setUp()
+
+ # Get a shortcut to the DomainManager Mock
+ self.domains_mock = self.app.client_manager.identity.domains
+ self.domains_mock.reset_mock()
+
+ # Get a shortcut to the ProjectManager Mock
+ self.projects_mock = self.app.client_manager.identity.projects
+ self.projects_mock.reset_mock()
+
+
+class TestProjectCreate(TestProject):
+
+ domain = identity_fakes.FakeDomain.create_one_domain()
+
+ columns = (
+ 'description',
+ 'domain_id',
+ 'enabled',
+ 'id',
+ 'is_domain',
+ 'name',
+ 'parent_id',
+ )
+
+ def setUp(self):
+ super(TestProjectCreate, self).setUp()
+
+ self.project = identity_fakes.FakeProject.create_one_project(
+ attrs={'domain_id': self.domain.id})
+ self.domains_mock.get.return_value = self.domain
+ self.projects_mock.create.return_value = self.project
+ self.datalist = (
+ self.project.description,
+ self.project.domain_id,
+ True,
+ self.project.id,
+ False,
+ self.project.name,
+ self.project.parent_id,
+ )
+ # Get the command object to test
+ self.cmd = project.CreateProject(self.app, None)
+
+ def test_project_create_no_options(self):
+ arglist = [
+ self.project.name,
+ ]
+ verifylist = [
+ ('parent', None),
+ ('enable', False),
+ ('disable', False),
+ ('name', self.project.name),
+ ]
+ parsed_args = self.check_parser(self.cmd, arglist, verifylist)
+
+ # In base command class ShowOne in cliff, abstract method take_action()
+ # returns a two-part tuple with a tuple of column names and a tuple of
+ # data to be shown.
+ columns, data = self.cmd.take_action(parsed_args)
+
+ # Set expected values
+ kwargs = {
+ 'name': self.project.name,
+ 'domain': None,
+ 'description': None,
+ 'enabled': True,
+ 'parent': None,
+ }
+ # ProjectManager.create(name=, domain=, description=,
+ # enabled=, **kwargs)
+ self.projects_mock.create.assert_called_with(
+ **kwargs
+ )
+
+ collist = (
+ 'description',
+ 'domain_id',
+ 'enabled',
+ 'id',
+ 'is_domain',
+ 'name',
+ 'parent_id',
+ )
+ self.assertEqual(collist, columns)
+ datalist = (
+ self.project.description,
+ self.project.domain_id,
+ True,
+ self.project.id,
+ False,
+ self.project.name,
+ self.project.parent_id,
+ )
+ self.assertEqual(datalist, data)
+
+ def test_project_create_description(self):
+ arglist = [
+ '--description', 'new desc',
+ self.project.name,
+ ]
+ verifylist = [
+ ('description', 'new desc'),
+ ('enable', False),
+ ('disable', False),
+ ('name', self.project.name),
+ ('parent', None),
+ ]
+ parsed_args = self.check_parser(self.cmd, arglist, verifylist)
+
+ # In base command class ShowOne in cliff, abstract method take_action()
+ # returns a two-part tuple with a tuple of column names and a tuple of
+ # data to be shown.
+ columns, data = self.cmd.take_action(parsed_args)
+
+ # Set expected values
+ kwargs = {
+ 'name': self.project.name,
+ 'domain': None,
+ 'description': 'new desc',
+ 'enabled': True,
+ 'parent': None,
+ }
+ # ProjectManager.create(name=, domain=, description=,
+ # enabled=, **kwargs)
+ self.projects_mock.create.assert_called_with(
+ **kwargs
+ )
+
+ self.assertEqual(self.columns, columns)
+ self.assertEqual(self.datalist, data)
+
+ def test_project_create_domain(self):
+ arglist = [
+ '--domain', self.project.domain_id,
+ self.project.name,
+ ]
+ verifylist = [
+ ('domain', self.project.domain_id),
+ ('enable', False),
+ ('disable', False),
+ ('name', self.project.name),
+ ('parent', None),
+ ]
+ parsed_args = self.check_parser(self.cmd, arglist, verifylist)
+
+ # In base command class ShowOne in cliff, abstract method take_action()
+ # returns a two-part tuple with a tuple of column names and a tuple of
+ # data to be shown.
+ columns, data = self.cmd.take_action(parsed_args)
+
+ # Set expected values
+ kwargs = {
+ 'name': self.project.name,
+ 'domain': self.project.domain_id,
+ 'description': None,
+ 'enabled': True,
+ 'parent': None,
+ }
+ # ProjectManager.create(name=, domain=, description=,
+ # enabled=, **kwargs)
+ self.projects_mock.create.assert_called_with(
+ **kwargs
+ )
+
+ self.assertEqual(self.columns, columns)
+ self.assertEqual(self.datalist, data)
+
+ def test_project_create_domain_no_perms(self):
+ arglist = [
+ '--domain', self.project.domain_id,
+ self.project.name,
+ ]
+ verifylist = [
+ ('domain', self.project.domain_id),
+ ('enable', False),
+ ('disable', False),
+ ('name', self.project.name),
+ ('parent', None),
+ ]
+ parsed_args = self.check_parser(self.cmd, arglist, verifylist)
+ mocker = mock.Mock()
+ mocker.return_value = None
+
+ with mock.patch("osc_lib.utils.find_resource", mocker):
+ columns, data = self.cmd.take_action(parsed_args)
+
+ # Set expected values
+ kwargs = {
+ 'name': self.project.name,
+ 'domain': self.project.domain_id,
+ 'description': None,
+ 'enabled': True,
+ 'parent': None,
+ }
+ self.projects_mock.create.assert_called_with(
+ **kwargs
+ )
+ self.assertEqual(self.columns, columns)
+ self.assertEqual(self.datalist, data)
+
+ def test_project_create_enable(self):
+ arglist = [
+ '--enable',
+ self.project.name,
+ ]
+ verifylist = [
+ ('enable', True),
+ ('disable', False),
+ ('name', self.project.name),
+ ('parent', None),
+ ]
+ parsed_args = self.check_parser(self.cmd, arglist, verifylist)
+
+ # In base command class ShowOne in cliff, abstract method take_action()
+ # returns a two-part tuple with a tuple of column names and a tuple of
+ # data to be shown.
+ columns, data = self.cmd.take_action(parsed_args)
+
+ # Set expected values
+ kwargs = {
+ 'name': self.project.name,
+ 'domain': None,
+ 'description': None,
+ 'enabled': True,
+ 'parent': None,
+ }
+ # ProjectManager.create(name=, domain=, description=,
+ # enabled=, **kwargs)
+ self.projects_mock.create.assert_called_with(
+ **kwargs
+ )
+
+ self.assertEqual(self.columns, columns)
+ self.assertEqual(self.datalist, data)
+
+ def test_project_create_disable(self):
+ arglist = [
+ '--disable',
+ self.project.name,
+ ]
+ verifylist = [
+ ('enable', False),
+ ('disable', True),
+ ('name', self.project.name),
+ ('parent', None),
+ ]
+ parsed_args = self.check_parser(self.cmd, arglist, verifylist)
+
+ # In base command class ShowOne in cliff, abstract method take_action()
+ # returns a two-part tuple with a tuple of column names and a tuple of
+ # data to be shown.
+ columns, data = self.cmd.take_action(parsed_args)
+
+ # Set expected values
+ kwargs = {
+ 'name': self.project.name,
+ 'domain': None,
+ 'description': None,
+ 'enabled': False,
+ 'parent': None,
+ }
+ # ProjectManager.create(name=, domain=,
+ # description=, enabled=, **kwargs)
+ self.projects_mock.create.assert_called_with(
+ **kwargs
+ )
+
+ self.assertEqual(self.columns, columns)
+ self.assertEqual(self.datalist, data)
+
+ def test_project_create_property(self):
+ arglist = [
+ '--property', 'fee=fi',
+ '--property', 'fo=fum',
+ self.project.name,
+ ]
+ verifylist = [
+ ('property', {'fee': 'fi', 'fo': 'fum'}),
+ ('name', self.project.name),
+ ]
+ parsed_args = self.check_parser(self.cmd, arglist, verifylist)
+
+ # In base command class ShowOne in cliff, abstract method take_action()
+ # returns a two-part tuple with a tuple of column names and a tuple of
+ # data to be shown.
+ columns, data = self.cmd.take_action(parsed_args)
+
+ # Set expected values
+ kwargs = {
+ 'name': self.project.name,
+ 'domain': None,
+ 'description': None,
+ 'enabled': True,
+ 'parent': None,
+ 'fee': 'fi',
+ 'fo': 'fum',
+ }
+ # ProjectManager.create(name=, domain=, description=,
+ # enabled=, **kwargs)
+ self.projects_mock.create.assert_called_with(
+ **kwargs
+ )
+
+ self.assertEqual(self.columns, columns)
+ self.assertEqual(self.datalist, data)
+
+ def test_project_create_parent(self):
+ self.parent = identity_fakes.FakeProject.create_one_project()
+ self.project = identity_fakes.FakeProject.create_one_project(
+ attrs={'domain_id': self.domain.id, 'parent_id': self.parent.id})
+ self.projects_mock.get.return_value = self.parent
+ self.projects_mock.create.return_value = self.project
+
+ arglist = [
+ '--domain', self.project.domain_id,
+ '--parent', self.parent.name,
+ self.project.name,
+ ]
+ verifylist = [
+ ('domain', self.project.domain_id),
+ ('parent', self.parent.name),
+ ('enable', False),
+ ('disable', False),
+ ('name', self.project.name),
+ ]
+ parsed_args = self.check_parser(self.cmd, arglist, verifylist)
+
+ columns, data = self.cmd.take_action(parsed_args)
+
+ kwargs = {
+ 'name': self.project.name,
+ 'domain': self.project.domain_id,
+ 'parent': self.parent.id,
+ 'description': None,
+ 'enabled': True,
+ }
+
+ self.projects_mock.create.assert_called_with(
+ **kwargs
+ )
+
+ collist = (
+ 'description',
+ 'domain_id',
+ 'enabled',
+ 'id',
+ 'is_domain',
+ 'name',
+ 'parent_id',
+ )
+ self.assertEqual(columns, collist)
+ datalist = (
+ self.project.description,
+ self.project.domain_id,
+ self.project.enabled,
+ self.project.id,
+ self.project.is_domain,
+ self.project.name,
+ self.parent.id,
+ )
+ self.assertEqual(data, datalist)
+
+ def test_project_create_invalid_parent(self):
+ self.projects_mock.resource_class.__name__ = 'Project'
+ self.projects_mock.get.side_effect = exceptions.NotFound(
+ 'Invalid parent')
+ self.projects_mock.find.side_effect = exceptions.NotFound(
+ 'Invalid parent')
+
+ arglist = [
+ '--domain', self.project.domain_id,
+ '--parent', 'invalid',
+ self.project.name,
+ ]
+ verifylist = [
+ ('domain', self.project.domain_id),
+ ('parent', 'invalid'),
+ ('enable', False),
+ ('disable', False),
+ ('name', self.project.name),
+ ]
+ parsed_args = self.check_parser(self.cmd, arglist, verifylist)
+
+ self.assertRaises(
+ exceptions.CommandError,
+ self.cmd.take_action,
+ parsed_args,
+ )
+
+
+class TestProjectDelete(TestProject):
+
+ project = identity_fakes.FakeProject.create_one_project()
+
+ def setUp(self):
+ super(TestProjectDelete, self).setUp()
+
+ # This is the return value for utils.find_resource()
+ self.projects_mock.get.return_value = self.project
+ self.projects_mock.delete.return_value = None
+
+ # Get the command object to test
+ self.cmd = project.DeleteProject(self.app, None)
+
+ def test_project_delete_no_options(self):
+ arglist = [
+ self.project.id,
+ ]
+ verifylist = [
+ ('projects', [self.project.id]),
+ ]
+ parsed_args = self.check_parser(self.cmd, arglist, verifylist)
+
+ result = self.cmd.take_action(parsed_args)
+
+ self.projects_mock.delete.assert_called_with(
+ self.project.id,
+ )
+ self.assertIsNone(result)
+
+
+class TestProjectList(TestProject):
+
+ domain = identity_fakes.FakeDomain.create_one_domain()
+ project = identity_fakes.FakeProject.create_one_project(
+ attrs={'domain_id': domain.id})
+
+ columns = (
+ 'ID',
+ 'Name',
+ )
+ datalist = (
+ (
+ project.id,
+ project.name,
+ ),
+ )
+
+ def setUp(self):
+ super(TestProjectList, self).setUp()
+
+ self.projects_mock.list.return_value = [self.project]
+
+ # Get the command object to test
+ self.cmd = project.ListProject(self.app, None)
+
+ def test_project_list_no_options(self):
+ arglist = []
+ verifylist = []
+ parsed_args = self.check_parser(self.cmd, arglist, verifylist)
+
+ # In base command class Lister in cliff, abstract method take_action()
+ # returns a tuple containing the column names and an iterable
+ # containing the data to be listed.
+ columns, data = self.cmd.take_action(parsed_args)
+ self.projects_mock.list.assert_called_with()
+
+ self.assertEqual(self.columns, columns)
+ self.assertEqual(self.datalist, tuple(data))
+
+ def test_project_list_long(self):
+ arglist = [
+ '--long',
+ ]
+ verifylist = [
+ ('long', True),
+ ]
+ parsed_args = self.check_parser(self.cmd, arglist, verifylist)
+
+ # In base command class Lister in cliff, abstract method take_action()
+ # returns a tuple containing the column names and an iterable
+ # containing the data to be listed.
+ columns, data = self.cmd.take_action(parsed_args)
+ self.projects_mock.list.assert_called_with()
+
+ collist = ('ID', 'Name', 'Domain ID', 'Description', 'Enabled')
+ self.assertEqual(collist, columns)
+ datalist = ((
+ self.project.id,
+ self.project.name,
+ self.project.domain_id,
+ self.project.description,
+ True,
+ ), )
+ self.assertEqual(datalist, tuple(data))
+
+ def test_project_list_domain(self):
+ arglist = [
+ '--domain', self.project.domain_id,
+ ]
+ verifylist = [
+ ('domain', self.project.domain_id),
+ ]
+
+ self.domains_mock.get.return_value = self.domain
+
+ parsed_args = self.check_parser(self.cmd, arglist, verifylist)
+
+ # In base command class Lister in cliff, abstract method take_action()
+ # returns a tuple containing the column names and an iterable
+ # containing the data to be listed.
+ columns, data = self.cmd.take_action(parsed_args)
+ self.projects_mock.list.assert_called_with(
+ domain=self.project.domain_id)
+
+ self.assertEqual(self.columns, columns)
+ self.assertEqual(self.datalist, tuple(data))
+
+ def test_project_list_domain_no_perms(self):
+ arglist = [
+ '--domain', self.project.domain_id,
+ ]
+ verifylist = [
+ ('domain', self.project.domain_id),
+ ]
+ parsed_args = self.check_parser(self.cmd, arglist, verifylist)
+ mocker = mock.Mock()
+ mocker.return_value = None
+
+ with mock.patch("osc_lib.utils.find_resource", mocker):
+ columns, data = self.cmd.take_action(parsed_args)
+
+ self.projects_mock.list.assert_called_with(
+ domain=self.project.domain_id)
+ self.assertEqual(self.columns, columns)
+ self.assertEqual(self.datalist, tuple(data))
+
+
+class TestProjectSet(TestProject):
+
+ domain = identity_fakes.FakeDomain.create_one_domain()
+ project = identity_fakes.FakeProject.create_one_project(
+ attrs={'domain_id': domain.id})
+
+ def setUp(self):
+ super(TestProjectSet, self).setUp()
+
+ self.domains_mock.get.return_value = self.domain
+
+ self.projects_mock.get.return_value = self.project
+ self.projects_mock.update.return_value = self.project
+
+ # Get the command object to test
+ self.cmd = project.SetProject(self.app, None)
+
+ def test_project_set_no_options(self):
+ arglist = [
+ self.project.name,
+ ]
+ verifylist = [
+ ('project', self.project.name),
+ ('enable', False),
+ ('disable', False),
+ ]
+ parsed_args = self.check_parser(self.cmd, arglist, verifylist)
+
+ result = self.cmd.take_action(parsed_args)
+
+ self.assertIsNone(result)
+
+ def test_project_set_name(self):
+ arglist = [
+ '--name', 'qwerty',
+ '--domain', self.project.domain_id,
+ self.project.name,
+ ]
+ verifylist = [
+ ('name', 'qwerty'),
+ ('domain', self.project.domain_id),
+ ('enable', False),
+ ('disable', False),
+ ('project', self.project.name),
+ ]
+ parsed_args = self.check_parser(self.cmd, arglist, verifylist)
+
+ result = self.cmd.take_action(parsed_args)
+
+ # Set expected values
+ kwargs = {
+ 'name': 'qwerty',
+ }
+ # ProjectManager.update(project, name=, domain=, description=,
+ # enabled=, **kwargs)
+ self.projects_mock.update.assert_called_with(
+ self.project.id,
+ **kwargs
+ )
+ self.assertIsNone(result)
+
+ def test_project_set_description(self):
+ arglist = [
+ '--domain', self.project.domain_id,
+ '--description', 'new desc',
+ self.project.name,
+ ]
+ verifylist = [
+ ('domain', self.project.domain_id),
+ ('description', 'new desc'),
+ ('enable', False),
+ ('disable', False),
+ ('project', self.project.name),
+ ]
+ parsed_args = self.check_parser(self.cmd, arglist, verifylist)
+
+ result = self.cmd.take_action(parsed_args)
+
+ # Set expected values
+ kwargs = {
+ 'description': 'new desc',
+ }
+ self.projects_mock.update.assert_called_with(
+ self.project.id,
+ **kwargs
+ )
+ self.assertIsNone(result)
+
+ def test_project_set_enable(self):
+ arglist = [
+ '--domain', self.project.domain_id,
+ '--enable',
+ self.project.name,
+ ]
+ verifylist = [
+ ('domain', self.project.domain_id),
+ ('enable', True),
+ ('disable', False),
+ ('project', self.project.name),
+ ]
+ parsed_args = self.check_parser(self.cmd, arglist, verifylist)
+
+ result = self.cmd.take_action(parsed_args)
+
+ # Set expected values
+ kwargs = {
+ 'enabled': True,
+ }
+ self.projects_mock.update.assert_called_with(
+ self.project.id,
+ **kwargs
+ )
+ self.assertIsNone(result)
+
+ def test_project_set_disable(self):
+ arglist = [
+ '--domain', self.project.domain_id,
+ '--disable',
+ self.project.name,
+ ]
+ verifylist = [
+ ('domain', self.project.domain_id),
+ ('enable', False),
+ ('disable', True),
+ ('project', self.project.name),
+ ]
+ parsed_args = self.check_parser(self.cmd, arglist, verifylist)
+
+ result = self.cmd.take_action(parsed_args)
+
+ # Set expected values
+ kwargs = {
+ 'enabled': False,
+ }
+ self.projects_mock.update.assert_called_with(
+ self.project.id,
+ **kwargs
+ )
+ self.assertIsNone(result)
+
+ def test_project_set_property(self):
+ arglist = [
+ '--domain', self.project.domain_id,
+ '--property', 'fee=fi',
+ '--property', 'fo=fum',
+ self.project.name,
+ ]
+ verifylist = [
+ ('domain', self.project.domain_id),
+ ('property', {'fee': 'fi', 'fo': 'fum'}),
+ ('project', self.project.name),
+ ]
+ parsed_args = self.check_parser(self.cmd, arglist, verifylist)
+
+ result = self.cmd.take_action(parsed_args)
+
+ # Set expected values
+ kwargs = {
+ 'fee': 'fi',
+ 'fo': 'fum',
+ }
+ self.projects_mock.update.assert_called_with(
+ self.project.id,
+ **kwargs
+ )
+ self.assertIsNone(result)
+
+
+class TestProjectShow(TestProject):
+
+ domain = identity_fakes.FakeDomain.create_one_domain()
+
+ def setUp(self):
+ super(TestProjectShow, self).setUp()
+
+ self.project = identity_fakes.FakeProject.create_one_project(
+ attrs={'domain_id': self.domain.id})
+
+ # Get the command object to test
+ self.cmd = project.ShowProject(self.app, None)
+
+ def test_project_show(self):
+
+ self.projects_mock.get.side_effect = [Exception("Not found"),
+ self.project]
+ self.projects_mock.get.return_value = self.project
+
+ arglist = [
+ self.project.id,
+ ]
+ verifylist = [
+ ('project', self.project.id),
+ ]
+ parsed_args = self.check_parser(self.cmd, arglist, verifylist)
+
+ self.app.client_manager.identity.tokens.get_token_data.return_value = \
+ {'token':
+ {'project':
+ {'domain': {},
+ 'name': parsed_args.project,
+ 'id': parsed_args.project
+ }
+ }
+ }
+
+ # In base command class ShowOne in cliff, abstract method take_action()
+ # returns a two-part tuple with a tuple of column names and a tuple of
+ # data to be shown.
+ columns, data = self.cmd.take_action(parsed_args)
+
+ self.projects_mock.get.assert_called_with(
+ self.project.id,
+ parents_as_list=False,
+ subtree_as_list=False,
+ )
+
+ collist = (
+ 'description',
+ 'domain_id',
+ 'enabled',
+ 'id',
+ 'is_domain',
+ 'name',
+ 'parent_id',
+ )
+ self.assertEqual(collist, columns)
+ datalist = (
+ self.project.description,
+ self.project.domain_id,
+ True,
+ self.project.id,
+ False,
+ self.project.name,
+ self.project.parent_id,
+ )
+ self.assertEqual(datalist, data)
+
+ def test_project_show_parents(self):
+ self.project = identity_fakes.FakeProject.create_one_project(
+ attrs={
+ 'parent_id': self.project.parent_id,
+ 'parents': [{'project': {'id': self.project.parent_id}}]
+ }
+ )
+ self.projects_mock.get.side_effect = [Exception("Not found"),
+ self.project]
+ self.projects_mock.get.return_value = self.project
+
+ arglist = [
+ self.project.id,
+ '--parents',
+ ]
+ verifylist = [
+ ('project', self.project.id),
+ ('parents', True),
+ ('children', False),
+ ]
+ parsed_args = self.check_parser(self.cmd, arglist, verifylist)
+ self.app.client_manager.identity.tokens.get_token_data.return_value = \
+ {'token':
+ {'project':
+ {'domain': {},
+ 'name': parsed_args.project,
+ 'id': parsed_args.project
+ }
+ }
+ }
+
+ columns, data = self.cmd.take_action(parsed_args)
+ self.projects_mock.get.assert_called_with(
+ self.project.id,
+ parents_as_list=True,
+ subtree_as_list=False,
+ )
+
+ collist = (
+ 'description',
+ 'domain_id',
+ 'enabled',
+ 'id',
+ 'is_domain',
+ 'name',
+ 'parent_id',
+ 'parents',
+ )
+ self.assertEqual(columns, collist)
+ datalist = (
+ self.project.description,
+ self.project.domain_id,
+ self.project.enabled,
+ self.project.id,
+ self.project.is_domain,
+ self.project.name,
+ self.project.parent_id,
+ [self.project.parent_id],
+ )
+ self.assertEqual(data, datalist)
+
+ def test_project_show_subtree(self):
+ self.project = identity_fakes.FakeProject.create_one_project(
+ attrs={
+ 'parent_id': self.project.parent_id,
+ 'subtree': [{'project': {'id': 'children-id'}}]
+ }
+ )
+ self.projects_mock.get.side_effect = [Exception("Not found"),
+ self.project]
+ self.projects_mock.get.return_value = self.project
+
+ arglist = [
+ self.project.id,
+ '--children',
+ ]
+ verifylist = [
+ ('project', self.project.id),
+ ('parents', False),
+ ('children', True),
+ ]
+ parsed_args = self.check_parser(self.cmd, arglist, verifylist)
+ self.app.client_manager.identity.tokens.get_token_data.return_value = \
+ {'token':
+ {'project':
+ {'domain': {},
+ 'name': parsed_args.project,
+ 'id': parsed_args.project
+ }
+ }
+ }
+
+ columns, data = self.cmd.take_action(parsed_args)
+ self.projects_mock.get.assert_called_with(
+ self.project.id,
+ parents_as_list=False,
+ subtree_as_list=True,
+ )
+
+ collist = (
+ 'description',
+ 'domain_id',
+ 'enabled',
+ 'id',
+ 'is_domain',
+ 'name',
+ 'parent_id',
+ 'subtree',
+ )
+ self.assertEqual(columns, collist)
+ datalist = (
+ self.project.description,
+ self.project.domain_id,
+ self.project.enabled,
+ self.project.id,
+ self.project.is_domain,
+ self.project.name,
+ self.project.parent_id,
+ ['children-id'],
+ )
+ self.assertEqual(data, datalist)
+
+ def test_project_show_parents_and_children(self):
+ self.project = identity_fakes.FakeProject.create_one_project(
+ attrs={
+ 'parent_id': self.project.parent_id,
+ 'parents': [{'project': {'id': self.project.parent_id}}],
+ 'subtree': [{'project': {'id': 'children-id'}}]
+ }
+ )
+ self.projects_mock.get.side_effect = [Exception("Not found"),
+ self.project]
+ self.projects_mock.get.return_value = self.project
+
+ arglist = [
+ self.project.id,
+ '--parents',
+ '--children',
+ ]
+ verifylist = [
+ ('project', self.project.id),
+ ('parents', True),
+ ('children', True),
+ ]
+ parsed_args = self.check_parser(self.cmd, arglist, verifylist)
+ self.app.client_manager.identity.tokens.get_token_data.return_value = \
+ {'token':
+ {'project':
+ {'domain': {},
+ 'name': parsed_args.project,
+ 'id': parsed_args.project
+ }
+ }
+ }
+
+ columns, data = self.cmd.take_action(parsed_args)
+ self.projects_mock.get.assert_called_with(
+ self.project.id,
+ parents_as_list=True,
+ subtree_as_list=True,
+ )
+
+ collist = (
+ 'description',
+ 'domain_id',
+ 'enabled',
+ 'id',
+ 'is_domain',
+ 'name',
+ 'parent_id',
+ 'parents',
+ 'subtree',
+ )
+ self.assertEqual(columns, collist)
+ datalist = (
+ self.project.description,
+ self.project.domain_id,
+ self.project.enabled,
+ self.project.id,
+ self.project.is_domain,
+ self.project.name,
+ self.project.parent_id,
+ [self.project.parent_id],
+ ['children-id'],
+ )
+ self.assertEqual(data, datalist)
diff --git a/openstackclient/tests/unit/identity/v3/test_protocol.py b/openstackclient/tests/unit/identity/v3/test_protocol.py
new file mode 100644
index 00000000..30b4aa4a
--- /dev/null
+++ b/openstackclient/tests/unit/identity/v3/test_protocol.py
@@ -0,0 +1,188 @@
+# Copyright 2014 CERN.
+#
+# 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 copy
+
+from openstackclient.identity.v3 import federation_protocol
+from openstackclient.tests.unit import fakes
+from openstackclient.tests.unit.identity.v3 import fakes as identity_fakes
+
+
+class TestProtocol(identity_fakes.TestFederatedIdentity):
+
+ def setUp(self):
+ super(TestProtocol, self).setUp()
+
+ federation_lib = self.app.client_manager.identity.federation
+ self.protocols_mock = federation_lib.protocols
+ self.protocols_mock.reset_mock()
+
+
+class TestProtocolCreate(TestProtocol):
+
+ def setUp(self):
+ super(TestProtocolCreate, self).setUp()
+
+ proto = copy.deepcopy(identity_fakes.PROTOCOL_OUTPUT)
+ resource = fakes.FakeResource(None, proto, loaded=True)
+ self.protocols_mock.create.return_value = resource
+ self.cmd = federation_protocol.CreateProtocol(self.app, None)
+
+ def test_create_protocol(self):
+ argslist = [
+ identity_fakes.protocol_id,
+ '--identity-provider', identity_fakes.idp_id,
+ '--mapping', identity_fakes.mapping_id
+ ]
+
+ verifylist = [
+ ('federation_protocol', identity_fakes.protocol_id),
+ ('identity_provider', identity_fakes.idp_id),
+ ('mapping', identity_fakes.mapping_id)
+ ]
+ parsed_args = self.check_parser(self.cmd, argslist, verifylist)
+ columns, data = self.cmd.take_action(parsed_args)
+ self.protocols_mock.create.assert_called_with(
+ protocol_id=identity_fakes.protocol_id,
+ identity_provider=identity_fakes.idp_id,
+ mapping=identity_fakes.mapping_id)
+
+ collist = ('id', 'identity_provider', 'mapping')
+ self.assertEqual(collist, columns)
+
+ datalist = (identity_fakes.protocol_id,
+ identity_fakes.idp_id,
+ identity_fakes.mapping_id)
+ self.assertEqual(datalist, data)
+
+
+class TestProtocolDelete(TestProtocol):
+
+ def setUp(self):
+ super(TestProtocolDelete, self).setUp()
+
+ # This is the return value for utils.find_resource()
+ self.protocols_mock.get.return_value = fakes.FakeResource(
+ None,
+ copy.deepcopy(identity_fakes.PROTOCOL_OUTPUT),
+ loaded=True,
+ )
+
+ self.protocols_mock.delete.return_value = None
+ self.cmd = federation_protocol.DeleteProtocol(self.app, None)
+
+ def test_delete_identity_provider(self):
+ arglist = [
+ '--identity-provider', identity_fakes.idp_id,
+ identity_fakes.protocol_id
+ ]
+ verifylist = [
+ ('federation_protocol', [identity_fakes.protocol_id]),
+ ('identity_provider', identity_fakes.idp_id),
+ ]
+ parsed_args = self.check_parser(self.cmd, arglist, verifylist)
+
+ result = self.cmd.take_action(parsed_args)
+
+ self.protocols_mock.delete.assert_called_with(
+ identity_fakes.idp_id, identity_fakes.protocol_id)
+ self.assertIsNone(result)
+
+
+class TestProtocolList(TestProtocol):
+
+ def setUp(self):
+ super(TestProtocolList, self).setUp()
+
+ self.protocols_mock.get.return_value = fakes.FakeResource(
+ None, identity_fakes.PROTOCOL_ID_MAPPING, loaded=True)
+
+ self.protocols_mock.list.return_value = [fakes.FakeResource(
+ None, identity_fakes.PROTOCOL_ID_MAPPING, loaded=True)]
+
+ self.cmd = federation_protocol.ListProtocols(self.app, None)
+
+ def test_list_protocols(self):
+ arglist = ['--identity-provider', identity_fakes.idp_id]
+ verifylist = [('identity_provider', identity_fakes.idp_id)]
+
+ parsed_args = self.check_parser(self.cmd, arglist, verifylist)
+ columns, data = self.cmd.take_action(parsed_args)
+
+ self.protocols_mock.list.assert_called_with(identity_fakes.idp_id)
+
+
+class TestProtocolSet(TestProtocol):
+
+ def setUp(self):
+ super(TestProtocolSet, self).setUp()
+ self.protocols_mock.get.return_value = fakes.FakeResource(
+ None, identity_fakes.PROTOCOL_OUTPUT, loaded=True)
+ self.protocols_mock.update.return_value = fakes.FakeResource(
+ None, identity_fakes.PROTOCOL_OUTPUT_UPDATED, loaded=True)
+
+ self.cmd = federation_protocol.SetProtocol(self.app, None)
+
+ def test_set_new_mapping(self):
+ arglist = [
+ identity_fakes.protocol_id,
+ '--identity-provider', identity_fakes.idp_id,
+ '--mapping', identity_fakes.mapping_id
+ ]
+ verifylist = [('identity_provider', identity_fakes.idp_id),
+ ('federation_protocol', identity_fakes.protocol_id),
+ ('mapping', identity_fakes.mapping_id)]
+
+ parsed_args = self.check_parser(self.cmd, arglist, verifylist)
+ columns, data = self.cmd.take_action(parsed_args)
+
+ self.protocols_mock.update.assert_called_with(
+ identity_fakes.idp_id, identity_fakes.protocol_id,
+ identity_fakes.mapping_id)
+
+ collist = ('id', 'identity_provider', 'mapping')
+ self.assertEqual(collist, columns)
+
+ datalist = (identity_fakes.protocol_id, identity_fakes.idp_id,
+ identity_fakes.mapping_id_updated)
+ self.assertEqual(datalist, data)
+
+
+class TestProtocolShow(TestProtocol):
+
+ def setUp(self):
+ super(TestProtocolShow, self).setUp()
+ self.protocols_mock.get.return_value = fakes.FakeResource(
+ None, identity_fakes.PROTOCOL_OUTPUT, loaded=False)
+
+ self.cmd = federation_protocol.ShowProtocol(self.app, None)
+
+ def test_show_protocol(self):
+ arglist = [identity_fakes.protocol_id, '--identity-provider',
+ identity_fakes.idp_id]
+ verifylist = [('federation_protocol', identity_fakes.protocol_id),
+ ('identity_provider', identity_fakes.idp_id)]
+ parsed_args = self.check_parser(self.cmd, arglist, verifylist)
+
+ columns, data = self.cmd.take_action(parsed_args)
+ self.protocols_mock.get.assert_called_with(identity_fakes.idp_id,
+ identity_fakes.protocol_id)
+
+ collist = ('id', 'identity_provider', 'mapping')
+ self.assertEqual(collist, columns)
+
+ datalist = (identity_fakes.protocol_id,
+ identity_fakes.idp_id,
+ identity_fakes.mapping_id)
+ self.assertEqual(datalist, data)
diff --git a/openstackclient/tests/unit/identity/v3/test_region.py b/openstackclient/tests/unit/identity/v3/test_region.py
new file mode 100644
index 00000000..e83a4e9f
--- /dev/null
+++ b/openstackclient/tests/unit/identity/v3/test_region.py
@@ -0,0 +1,348 @@
+# 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 copy
+
+from openstackclient.identity.v3 import region
+from openstackclient.tests.unit import fakes
+from openstackclient.tests.unit.identity.v3 import fakes as identity_fakes
+
+
+class TestRegion(identity_fakes.TestIdentityv3):
+
+ def setUp(self):
+ super(TestRegion, self).setUp()
+
+ # Get a shortcut to the RegionManager Mock
+ self.regions_mock = self.app.client_manager.identity.regions
+ self.regions_mock.reset_mock()
+
+
+class TestRegionCreate(TestRegion):
+
+ columns = (
+ 'description',
+ 'parent_region',
+ 'region',
+ )
+ datalist = (
+ identity_fakes.region_description,
+ identity_fakes.region_parent_region_id,
+ identity_fakes.region_id,
+ )
+
+ def setUp(self):
+ super(TestRegionCreate, self).setUp()
+
+ self.regions_mock.create.return_value = fakes.FakeResource(
+ None,
+ copy.deepcopy(identity_fakes.REGION),
+ loaded=True,
+ )
+
+ # Get the command object to test
+ self.cmd = region.CreateRegion(self.app, None)
+
+ def test_region_create_description(self):
+ arglist = [
+ identity_fakes.region_id,
+ '--description', identity_fakes.region_description,
+ ]
+ verifylist = [
+ ('region', identity_fakes.region_id),
+ ('description', identity_fakes.region_description)
+ ]
+ parsed_args = self.check_parser(self.cmd, arglist, verifylist)
+
+ # In base command class ShowOne in cliff, abstract method take_action()
+ # returns a two-part tuple with a tuple of column names and a tuple of
+ # data to be shown.
+ columns, data = self.cmd.take_action(parsed_args)
+
+ # Set expected values
+ kwargs = {
+ 'description': identity_fakes.region_description,
+ 'id': identity_fakes.region_id,
+ 'parent_region': None,
+ }
+ self.regions_mock.create.assert_called_with(
+ **kwargs
+ )
+
+ self.assertEqual(self.columns, columns)
+ self.assertEqual(self.datalist, data)
+
+ def test_region_create_no_options(self):
+ arglist = [
+ identity_fakes.region_id,
+ ]
+ verifylist = [
+ ('region', identity_fakes.region_id),
+ ]
+ parsed_args = self.check_parser(self.cmd, arglist, verifylist)
+
+ # In base command class ShowOne in cliff, abstract method take_action()
+ # returns a two-part tuple with a tuple of column names and a tuple of
+ # data to be shown.
+ columns, data = self.cmd.take_action(parsed_args)
+
+ # Set expected values
+ kwargs = {
+ 'description': None,
+ 'id': identity_fakes.region_id,
+ 'parent_region': None,
+ }
+ self.regions_mock.create.assert_called_with(
+ **kwargs
+ )
+
+ self.assertEqual(self.columns, columns)
+ self.assertEqual(self.datalist, data)
+
+ def test_region_create_parent_region_id(self):
+ arglist = [
+ identity_fakes.region_id,
+ '--parent-region', identity_fakes.region_parent_region_id,
+ ]
+ verifylist = [
+ ('region', identity_fakes.region_id),
+ ('parent_region', identity_fakes.region_parent_region_id),
+ ]
+ parsed_args = self.check_parser(self.cmd, arglist, verifylist)
+
+ # In base command class ShowOne in cliff, abstract method take_action()
+ # returns a two-part tuple with a tuple of column names and a tuple of
+ # data to be shown.
+ columns, data = self.cmd.take_action(parsed_args)
+
+ # Set expected values
+ kwargs = {
+ 'description': None,
+ 'id': identity_fakes.region_id,
+ 'parent_region': identity_fakes.region_parent_region_id,
+ }
+ self.regions_mock.create.assert_called_with(
+ **kwargs
+ )
+ self.assertEqual(self.columns, columns)
+ self.assertEqual(self.datalist, data)
+
+
+class TestRegionDelete(TestRegion):
+
+ def setUp(self):
+ super(TestRegionDelete, self).setUp()
+
+ self.regions_mock.delete.return_value = None
+
+ # Get the command object to test
+ self.cmd = region.DeleteRegion(self.app, None)
+
+ def test_region_delete_no_options(self):
+ arglist = [
+ identity_fakes.region_id,
+ ]
+ verifylist = [
+ ('region', [identity_fakes.region_id]),
+ ]
+ parsed_args = self.check_parser(self.cmd, arglist, verifylist)
+
+ result = self.cmd.take_action(parsed_args)
+
+ self.regions_mock.delete.assert_called_with(
+ identity_fakes.region_id,
+ )
+ self.assertIsNone(result)
+
+
+class TestRegionList(TestRegion):
+
+ columns = (
+ 'Region',
+ 'Parent Region',
+ 'Description',
+ )
+ datalist = (
+ (
+ identity_fakes.region_id,
+ identity_fakes.region_parent_region_id,
+ identity_fakes.region_description,
+ ),
+ )
+
+ def setUp(self):
+ super(TestRegionList, self).setUp()
+
+ self.regions_mock.list.return_value = [
+ fakes.FakeResource(
+ None,
+ copy.deepcopy(identity_fakes.REGION),
+ loaded=True,
+ ),
+ ]
+
+ # Get the command object to test
+ self.cmd = region.ListRegion(self.app, None)
+
+ def test_region_list_no_options(self):
+ arglist = []
+ verifylist = []
+ parsed_args = self.check_parser(self.cmd, arglist, verifylist)
+
+ # In base command class Lister in cliff, abstract method take_action()
+ # returns a tuple containing the column names and an iterable
+ # containing the data to be listed.
+ columns, data = self.cmd.take_action(parsed_args)
+ self.regions_mock.list.assert_called_with()
+
+ self.assertEqual(self.columns, columns)
+ self.assertEqual(self.datalist, tuple(data))
+
+ def test_region_list_parent_region_id(self):
+ arglist = [
+ '--parent-region', identity_fakes.region_parent_region_id,
+ ]
+ verifylist = [
+ ('parent_region', identity_fakes.region_parent_region_id),
+ ]
+ parsed_args = self.check_parser(self.cmd, arglist, verifylist)
+
+ # In base command class Lister in cliff, abstract method take_action()
+ # returns a tuple containing the column names and an iterable
+ # containing the data to be listed.
+ columns, data = self.cmd.take_action(parsed_args)
+ self.regions_mock.list.assert_called_with(
+ parent_region_id=identity_fakes.region_parent_region_id)
+
+ self.assertEqual(self.columns, columns)
+ self.assertEqual(self.datalist, tuple(data))
+
+
+class TestRegionSet(TestRegion):
+
+ def setUp(self):
+ super(TestRegionSet, self).setUp()
+
+ self.regions_mock.update.return_value = fakes.FakeResource(
+ None,
+ copy.deepcopy(identity_fakes.REGION),
+ loaded=True,
+ )
+
+ # Get the command object to test
+ self.cmd = region.SetRegion(self.app, None)
+
+ def test_region_set_no_options(self):
+ arglist = [
+ identity_fakes.region_id,
+ ]
+ verifylist = [
+ ('region', identity_fakes.region_id),
+ ]
+ parsed_args = self.check_parser(self.cmd, arglist, verifylist)
+
+ result = self.cmd.take_action(parsed_args)
+
+ kwargs = {}
+ self.regions_mock.update.assert_called_with(
+ identity_fakes.region_id,
+ **kwargs
+ )
+ self.assertIsNone(result)
+
+ def test_region_set_description(self):
+ arglist = [
+ '--description', 'qwerty',
+ identity_fakes.region_id,
+ ]
+ verifylist = [
+ ('description', 'qwerty'),
+ ('region', identity_fakes.region_id),
+ ]
+ parsed_args = self.check_parser(self.cmd, arglist, verifylist)
+
+ result = self.cmd.take_action(parsed_args)
+
+ # Set expected values
+ kwargs = {
+ 'description': 'qwerty',
+ }
+ self.regions_mock.update.assert_called_with(
+ identity_fakes.region_id,
+ **kwargs
+ )
+ self.assertIsNone(result)
+
+ def test_region_set_parent_region_id(self):
+ arglist = [
+ '--parent-region', 'new_parent',
+ identity_fakes.region_id,
+ ]
+ verifylist = [
+ ('parent_region', 'new_parent'),
+ ('region', identity_fakes.region_id),
+ ]
+ parsed_args = self.check_parser(self.cmd, arglist, verifylist)
+
+ result = self.cmd.take_action(parsed_args)
+
+ # Set expected values
+ kwargs = {
+ 'parent_region': 'new_parent',
+ }
+ self.regions_mock.update.assert_called_with(
+ identity_fakes.region_id,
+ **kwargs
+ )
+ self.assertIsNone(result)
+
+
+class TestRegionShow(TestRegion):
+
+ def setUp(self):
+ super(TestRegionShow, self).setUp()
+
+ self.regions_mock.get.return_value = fakes.FakeResource(
+ None,
+ copy.deepcopy(identity_fakes.REGION),
+ loaded=True,
+ )
+
+ # Get the command object to test
+ self.cmd = region.ShowRegion(self.app, None)
+
+ def test_region_show(self):
+ arglist = [
+ identity_fakes.region_id,
+ ]
+ verifylist = [
+ ('region', identity_fakes.region_id),
+ ]
+ parsed_args = self.check_parser(self.cmd, arglist, verifylist)
+
+ # In base command class ShowOne in cliff, abstract method take_action()
+ # returns a two-part tuple with a tuple of column names and a tuple of
+ # data to be shown.
+ columns, data = self.cmd.take_action(parsed_args)
+ self.regions_mock.get.assert_called_with(
+ identity_fakes.region_id,
+ )
+
+ collist = ('description', 'parent_region', 'region')
+ self.assertEqual(collist, columns)
+ datalist = (
+ identity_fakes.region_description,
+ identity_fakes.region_parent_region_id,
+ identity_fakes.region_id,
+ )
+ self.assertEqual(datalist, data)
diff --git a/openstackclient/tests/unit/identity/v3/test_role.py b/openstackclient/tests/unit/identity/v3/test_role.py
new file mode 100644
index 00000000..448e18d3
--- /dev/null
+++ b/openstackclient/tests/unit/identity/v3/test_role.py
@@ -0,0 +1,1105 @@
+# Copyright 2013 Nebula Inc.
+#
+# 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 copy
+
+from openstackclient.identity.v3 import role
+from openstackclient.tests.unit import fakes
+from openstackclient.tests.unit.identity.v3 import fakes as identity_fakes
+
+
+class TestRole(identity_fakes.TestIdentityv3):
+
+ def setUp(self):
+ super(TestRole, self).setUp()
+
+ # Get a shortcut to the UserManager Mock
+ self.users_mock = self.app.client_manager.identity.users
+ self.users_mock.reset_mock()
+
+ # Get a shortcut to the UserManager Mock
+ self.groups_mock = self.app.client_manager.identity.groups
+ self.groups_mock.reset_mock()
+
+ # Get a shortcut to the DomainManager Mock
+ self.domains_mock = self.app.client_manager.identity.domains
+ self.domains_mock.reset_mock()
+
+ # Get a shortcut to the ProjectManager Mock
+ self.projects_mock = self.app.client_manager.identity.projects
+ self.projects_mock.reset_mock()
+
+ # Get a shortcut to the RoleManager Mock
+ self.roles_mock = self.app.client_manager.identity.roles
+ self.roles_mock.reset_mock()
+
+ def _is_inheritance_testcase(self):
+ return False
+
+
+class TestRoleInherited(TestRole):
+
+ def _is_inheritance_testcase(self):
+ return True
+
+
+class TestRoleAdd(TestRole):
+
+ def setUp(self):
+ super(TestRoleAdd, self).setUp()
+
+ self.users_mock.get.return_value = fakes.FakeResource(
+ None,
+ copy.deepcopy(identity_fakes.USER),
+ loaded=True,
+ )
+
+ self.groups_mock.get.return_value = fakes.FakeResource(
+ None,
+ copy.deepcopy(identity_fakes.GROUP),
+ loaded=True,
+ )
+
+ self.domains_mock.get.return_value = fakes.FakeResource(
+ None,
+ copy.deepcopy(identity_fakes.DOMAIN),
+ loaded=True,
+ )
+
+ self.projects_mock.get.return_value = fakes.FakeResource(
+ None,
+ copy.deepcopy(identity_fakes.PROJECT),
+ loaded=True,
+ )
+
+ self.roles_mock.get.return_value = fakes.FakeResource(
+ None,
+ copy.deepcopy(identity_fakes.ROLE),
+ loaded=True,
+ )
+ self.roles_mock.grant.return_value = fakes.FakeResource(
+ None,
+ copy.deepcopy(identity_fakes.ROLE),
+ loaded=True,
+ )
+
+ # Get the command object to test
+ self.cmd = role.AddRole(self.app, None)
+
+ def test_role_add_user_domain(self):
+ arglist = [
+ '--user', identity_fakes.user_name,
+ '--domain', identity_fakes.domain_name,
+ identity_fakes.role_name,
+ ]
+ if self._is_inheritance_testcase():
+ arglist.append('--inherited')
+ verifylist = [
+ ('user', identity_fakes.user_name),
+ ('group', None),
+ ('domain', identity_fakes.domain_name),
+ ('project', None),
+ ('role', identity_fakes.role_name),
+ ('inherited', self._is_inheritance_testcase()),
+ ]
+ parsed_args = self.check_parser(self.cmd, arglist, verifylist)
+
+ result = self.cmd.take_action(parsed_args)
+
+ # Set expected values
+ kwargs = {
+ 'user': identity_fakes.user_id,
+ 'domain': identity_fakes.domain_id,
+ 'os_inherit_extension_inherited': self._is_inheritance_testcase(),
+ }
+ # RoleManager.grant(role, user=, group=, domain=, project=)
+ self.roles_mock.grant.assert_called_with(
+ identity_fakes.role_id,
+ **kwargs
+ )
+ self.assertIsNone(result)
+
+ def test_role_add_user_project(self):
+ arglist = [
+ '--user', identity_fakes.user_name,
+ '--project', identity_fakes.project_name,
+ identity_fakes.role_name,
+ ]
+ if self._is_inheritance_testcase():
+ arglist.append('--inherited')
+ verifylist = [
+ ('user', identity_fakes.user_name),
+ ('group', None),
+ ('domain', None),
+ ('project', identity_fakes.project_name),
+ ('role', identity_fakes.role_name),
+ ('inherited', self._is_inheritance_testcase()),
+ ]
+ parsed_args = self.check_parser(self.cmd, arglist, verifylist)
+
+ result = self.cmd.take_action(parsed_args)
+
+ # Set expected values
+ kwargs = {
+ 'user': identity_fakes.user_id,
+ 'project': identity_fakes.project_id,
+ 'os_inherit_extension_inherited': self._is_inheritance_testcase(),
+ }
+ # RoleManager.grant(role, user=, group=, domain=, project=)
+ self.roles_mock.grant.assert_called_with(
+ identity_fakes.role_id,
+ **kwargs
+ )
+ self.assertIsNone(result)
+
+ def test_role_add_group_domain(self):
+ arglist = [
+ '--group', identity_fakes.group_name,
+ '--domain', identity_fakes.domain_name,
+ identity_fakes.role_name,
+ ]
+ if self._is_inheritance_testcase():
+ arglist.append('--inherited')
+ verifylist = [
+ ('user', None),
+ ('group', identity_fakes.group_name),
+ ('domain', identity_fakes.domain_name),
+ ('project', None),
+ ('role', identity_fakes.role_name),
+ ('inherited', self._is_inheritance_testcase()),
+ ]
+ parsed_args = self.check_parser(self.cmd, arglist, verifylist)
+
+ result = self.cmd.take_action(parsed_args)
+
+ # Set expected values
+ kwargs = {
+ 'group': identity_fakes.group_id,
+ 'domain': identity_fakes.domain_id,
+ 'os_inherit_extension_inherited': self._is_inheritance_testcase(),
+ }
+ # RoleManager.grant(role, user=, group=, domain=, project=)
+ self.roles_mock.grant.assert_called_with(
+ identity_fakes.role_id,
+ **kwargs
+ )
+ self.assertIsNone(result)
+
+ def test_role_add_group_project(self):
+ arglist = [
+ '--group', identity_fakes.group_name,
+ '--project', identity_fakes.project_name,
+ identity_fakes.role_name,
+ ]
+ if self._is_inheritance_testcase():
+ arglist.append('--inherited')
+ verifylist = [
+ ('user', None),
+ ('group', identity_fakes.group_name),
+ ('domain', None),
+ ('project', identity_fakes.project_name),
+ ('role', identity_fakes.role_name),
+ ('inherited', self._is_inheritance_testcase()),
+ ]
+ parsed_args = self.check_parser(self.cmd, arglist, verifylist)
+
+ result = self.cmd.take_action(parsed_args)
+
+ # Set expected values
+ kwargs = {
+ 'group': identity_fakes.group_id,
+ 'project': identity_fakes.project_id,
+ 'os_inherit_extension_inherited': self._is_inheritance_testcase(),
+ }
+ # RoleManager.grant(role, user=, group=, domain=, project=)
+ self.roles_mock.grant.assert_called_with(
+ identity_fakes.role_id,
+ **kwargs
+ )
+ self.assertIsNone(result)
+
+ def test_role_add_domain_role_on_user_project(self):
+ self.roles_mock.get.return_value = fakes.FakeResource(
+ None,
+ copy.deepcopy(identity_fakes.ROLE_2),
+ loaded=True,
+ )
+ arglist = [
+ '--user', identity_fakes.user_name,
+ '--project', identity_fakes.project_name,
+ '--role-domain', identity_fakes.domain_name,
+ identity_fakes.ROLE_2['name'],
+ ]
+ if self._is_inheritance_testcase():
+ arglist.append('--inherited')
+ verifylist = [
+ ('user', identity_fakes.user_name),
+ ('group', None),
+ ('domain', None),
+ ('project', identity_fakes.project_name),
+ ('role', identity_fakes.ROLE_2['name']),
+ ('inherited', self._is_inheritance_testcase()),
+ ]
+ parsed_args = self.check_parser(self.cmd, arglist, verifylist)
+
+ result = self.cmd.take_action(parsed_args)
+
+ # Set expected values
+ kwargs = {
+ 'user': identity_fakes.user_id,
+ 'project': identity_fakes.project_id,
+ 'os_inherit_extension_inherited': self._is_inheritance_testcase(),
+ }
+ # RoleManager.grant(role, user=, group=, domain=, project=)
+ self.roles_mock.grant.assert_called_with(
+ identity_fakes.ROLE_2['id'],
+ **kwargs
+ )
+ self.assertIsNone(result)
+
+
+class TestRoleAddInherited(TestRoleAdd, TestRoleInherited):
+ pass
+
+
+class TestRoleCreate(TestRole):
+
+ def setUp(self):
+ super(TestRoleCreate, self).setUp()
+
+ self.domains_mock.get.return_value = fakes.FakeResource(
+ None,
+ copy.deepcopy(identity_fakes.DOMAIN),
+ loaded=True,
+ )
+
+ self.roles_mock.create.return_value = fakes.FakeResource(
+ None,
+ copy.deepcopy(identity_fakes.ROLE),
+ loaded=True,
+ )
+
+ # Get the command object to test
+ self.cmd = role.CreateRole(self.app, None)
+
+ def test_role_create_no_options(self):
+ arglist = [
+ identity_fakes.role_name,
+ ]
+ verifylist = [
+ ('name', identity_fakes.role_name),
+ ]
+ parsed_args = self.check_parser(self.cmd, arglist, verifylist)
+
+ # In base command class ShowOne in cliff, abstract method take_action()
+ # returns a two-part tuple with a tuple of column names and a tuple of
+ # data to be shown.
+ columns, data = self.cmd.take_action(parsed_args)
+
+ # Set expected values
+ kwargs = {
+ 'domain': None,
+ 'name': identity_fakes.role_name,
+ }
+
+ # RoleManager.create(name=, domain=)
+ self.roles_mock.create.assert_called_with(
+ **kwargs
+ )
+
+ collist = ('domain', 'id', 'name')
+ self.assertEqual(collist, columns)
+ datalist = (
+ None,
+ identity_fakes.role_id,
+ identity_fakes.role_name,
+ )
+ self.assertEqual(datalist, data)
+
+ def test_role_create_with_domain(self):
+
+ self.roles_mock.create.return_value = fakes.FakeResource(
+ None,
+ copy.deepcopy(identity_fakes.ROLE_2),
+ loaded=True,
+ )
+
+ arglist = [
+ '--domain', identity_fakes.domain_name,
+ identity_fakes.ROLE_2['name'],
+ ]
+ verifylist = [
+ ('domain', identity_fakes.domain_name),
+ ('name', identity_fakes.ROLE_2['name']),
+ ]
+ parsed_args = self.check_parser(self.cmd, arglist, verifylist)
+
+ # In base command class ShowOne in cliff, abstract method take_action()
+ # returns a two-part tuple with a tuple of column names and a tuple of
+ # data to be shown.
+ columns, data = self.cmd.take_action(parsed_args)
+
+ # Set expected values
+ kwargs = {
+ 'domain': identity_fakes.domain_id,
+ 'name': identity_fakes.ROLE_2['name'],
+ }
+
+ # RoleManager.create(name=, domain=)
+ self.roles_mock.create.assert_called_with(
+ **kwargs
+ )
+
+ collist = ('domain', 'id', 'name')
+ self.assertEqual(collist, columns)
+ datalist = (
+ identity_fakes.domain_id,
+ identity_fakes.ROLE_2['id'],
+ identity_fakes.ROLE_2['name'],
+ )
+ self.assertEqual(datalist, data)
+
+
+class TestRoleDelete(TestRole):
+
+ def setUp(self):
+ super(TestRoleDelete, self).setUp()
+
+ self.roles_mock.get.return_value = fakes.FakeResource(
+ None,
+ copy.deepcopy(identity_fakes.ROLE),
+ loaded=True,
+ )
+ self.roles_mock.delete.return_value = None
+
+ # Get the command object to test
+ self.cmd = role.DeleteRole(self.app, None)
+
+ def test_role_delete_no_options(self):
+ arglist = [
+ identity_fakes.role_name,
+ ]
+ verifylist = [
+ ('roles', [identity_fakes.role_name]),
+ ]
+ parsed_args = self.check_parser(self.cmd, arglist, verifylist)
+
+ result = self.cmd.take_action(parsed_args)
+
+ self.roles_mock.delete.assert_called_with(
+ identity_fakes.role_id,
+ )
+ self.assertIsNone(result)
+
+ def test_role_delete_with_domain(self):
+ self.roles_mock.get.return_value = fakes.FakeResource(
+ None,
+ copy.deepcopy(identity_fakes.ROLE_2),
+ loaded=True,
+ )
+ self.roles_mock.delete.return_value = None
+
+ arglist = [
+ '--domain', identity_fakes.domain_name,
+ identity_fakes.ROLE_2['name'],
+ ]
+ verifylist = [
+ ('roles', [identity_fakes.ROLE_2['name']]),
+ ('domain', identity_fakes.domain_name),
+ ]
+ parsed_args = self.check_parser(self.cmd, arglist, verifylist)
+
+ result = self.cmd.take_action(parsed_args)
+
+ self.roles_mock.delete.assert_called_with(
+ identity_fakes.ROLE_2['id'],
+ )
+ self.assertIsNone(result)
+
+
+class TestRoleList(TestRole):
+
+ columns = (
+ 'ID',
+ 'Name',
+ )
+ datalist = (
+ (
+ identity_fakes.role_id,
+ identity_fakes.role_name,
+ ),
+ )
+
+ def setUp(self):
+ super(TestRoleList, self).setUp()
+
+ self.roles_mock.list.return_value = [
+ fakes.FakeResource(
+ None,
+ copy.deepcopy(identity_fakes.ROLE),
+ loaded=True,
+ ),
+ ]
+
+ self.domains_mock.get.return_value = fakes.FakeResource(
+ None,
+ copy.deepcopy(identity_fakes.DOMAIN),
+ loaded=True,
+ )
+ self.projects_mock.get.return_value = fakes.FakeResource(
+ None,
+ copy.deepcopy(identity_fakes.PROJECT),
+ loaded=True,
+ )
+ self.users_mock.get.return_value = fakes.FakeResource(
+ None,
+ copy.deepcopy(identity_fakes.USER),
+ loaded=True,
+ )
+ self.groups_mock.get.return_value = fakes.FakeResource(
+ None,
+ copy.deepcopy(identity_fakes.GROUP),
+ loaded=True,
+ )
+
+ # Get the command object to test
+ self.cmd = role.ListRole(self.app, None)
+
+ def test_role_list_no_options(self):
+ arglist = []
+ verifylist = []
+ parsed_args = self.check_parser(self.cmd, arglist, verifylist)
+
+ # In base command class Lister in cliff, abstract method take_action()
+ # returns a tuple containing the column names and an iterable
+ # containing the data to be listed.
+ columns, data = self.cmd.take_action(parsed_args)
+
+ self.roles_mock.list.assert_called_with()
+
+ self.assertEqual(self.columns, columns)
+ self.assertEqual(self.datalist, tuple(data))
+
+ def test_user_list_inherited(self):
+ arglist = [
+ '--user', identity_fakes.user_id,
+ '--inherited',
+ ]
+ verifylist = [
+ ('user', identity_fakes.user_id),
+ ('inherited', True),
+ ]
+ parsed_args = self.check_parser(self.cmd, arglist, verifylist)
+
+ # In base command class Lister in cliff, abstract method take_action()
+ # returns a tuple containing the column names and an iterable
+ # containing the data to be listed.
+ columns, data = self.cmd.take_action(parsed_args)
+
+ # Set expected values
+ kwargs = {
+ 'domain': 'default',
+ 'user': self.users_mock.get(),
+ 'os_inherit_extension_inherited': True,
+ }
+ # RoleManager.list(user=, group=, domain=, project=, **kwargs)
+ self.roles_mock.list.assert_called_with(
+ **kwargs
+ )
+
+ self.assertEqual(self.columns, columns)
+ self.assertEqual(self.datalist, tuple(data))
+
+ def test_user_list_user(self):
+ arglist = [
+ '--user', identity_fakes.user_id,
+ ]
+ verifylist = [
+ ('user', identity_fakes.user_id),
+ ]
+ parsed_args = self.check_parser(self.cmd, arglist, verifylist)
+
+ # In base command class Lister in cliff, abstract method take_action()
+ # returns a tuple containing the column names and an iterable
+ # containing the data to be listed.
+ columns, data = self.cmd.take_action(parsed_args)
+
+ # Set expected values
+ kwargs = {
+ 'domain': 'default',
+ 'user': self.users_mock.get(),
+ 'os_inherit_extension_inherited': False
+ }
+ # RoleManager.list(user=, group=, domain=, project=, **kwargs)
+ self.roles_mock.list.assert_called_with(
+ **kwargs
+ )
+
+ self.assertEqual(self.columns, columns)
+ self.assertEqual(self.datalist, tuple(data))
+
+ def test_role_list_domain_user(self):
+ arglist = [
+ '--domain', identity_fakes.domain_name,
+ '--user', identity_fakes.user_id,
+ ]
+ verifylist = [
+ ('domain', identity_fakes.domain_name),
+ ('user', identity_fakes.user_id),
+ ]
+ parsed_args = self.check_parser(self.cmd, arglist, verifylist)
+
+ # In base command class Lister in cliff, abstract method take_action()
+ # returns a tuple containing the column names and an iterable
+ # containing the data to be listed.
+ columns, data = self.cmd.take_action(parsed_args)
+
+ # Set expected values
+ kwargs = {
+ 'domain': self.domains_mock.get(),
+ 'user': self.users_mock.get(),
+ 'os_inherit_extension_inherited': False
+ }
+ # RoleManager.list(user=, group=, domain=, project=, **kwargs)
+ self.roles_mock.list.assert_called_with(
+ **kwargs
+ )
+
+ collist = ('ID', 'Name', 'Domain', 'User')
+ self.assertEqual(collist, columns)
+ datalist = ((
+ identity_fakes.role_id,
+ identity_fakes.role_name,
+ identity_fakes.domain_name,
+ identity_fakes.user_name,
+ ), )
+ self.assertEqual(datalist, tuple(data))
+
+ def test_role_list_domain_group(self):
+ arglist = [
+ '--domain', identity_fakes.domain_name,
+ '--group', identity_fakes.group_id,
+ ]
+ verifylist = [
+ ('domain', identity_fakes.domain_name),
+ ('group', identity_fakes.group_id),
+ ]
+ parsed_args = self.check_parser(self.cmd, arglist, verifylist)
+
+ # In base command class Lister in cliff, abstract method take_action()
+ # returns a tuple containing the column names and an iterable
+ # containing the data to be listed.
+ columns, data = self.cmd.take_action(parsed_args)
+
+ # Set expected values
+ kwargs = {
+ 'domain': self.domains_mock.get(),
+ 'group': self.groups_mock.get(),
+ 'os_inherit_extension_inherited': False
+ }
+ # RoleManager.list(user=, group=, domain=, project=, **kwargs)
+ self.roles_mock.list.assert_called_with(
+ **kwargs
+ )
+
+ collist = ('ID', 'Name', 'Domain', 'Group')
+ self.assertEqual(collist, columns)
+ datalist = ((
+ identity_fakes.role_id,
+ identity_fakes.role_name,
+ identity_fakes.domain_name,
+ identity_fakes.group_name,
+ ), )
+ self.assertEqual(datalist, tuple(data))
+
+ def test_role_list_project_user(self):
+ arglist = [
+ '--project', identity_fakes.project_name,
+ '--user', identity_fakes.user_id,
+ ]
+ verifylist = [
+ ('project', identity_fakes.project_name),
+ ('user', identity_fakes.user_id),
+ ]
+ parsed_args = self.check_parser(self.cmd, arglist, verifylist)
+
+ # In base command class Lister in cliff, abstract method take_action()
+ # returns a tuple containing the column names and an iterable
+ # containing the data to be listed.
+ columns, data = self.cmd.take_action(parsed_args)
+
+ # Set expected values
+ kwargs = {
+ 'project': self.projects_mock.get(),
+ 'user': self.users_mock.get(),
+ 'os_inherit_extension_inherited': False
+ }
+ # RoleManager.list(user=, group=, domain=, project=, **kwargs)
+ self.roles_mock.list.assert_called_with(
+ **kwargs
+ )
+
+ collist = ('ID', 'Name', 'Project', 'User')
+ self.assertEqual(collist, columns)
+ datalist = ((
+ identity_fakes.role_id,
+ identity_fakes.role_name,
+ identity_fakes.project_name,
+ identity_fakes.user_name,
+ ), )
+ self.assertEqual(datalist, tuple(data))
+
+ def test_role_list_project_group(self):
+ arglist = [
+ '--project', identity_fakes.project_name,
+ '--group', identity_fakes.group_id,
+ ]
+ verifylist = [
+ ('project', identity_fakes.project_name),
+ ('group', identity_fakes.group_id),
+ ]
+ parsed_args = self.check_parser(self.cmd, arglist, verifylist)
+
+ # In base command class Lister in cliff, abstract method take_action()
+ # returns a tuple containing the column names and an iterable
+ # containing the data to be listed.
+ columns, data = self.cmd.take_action(parsed_args)
+
+ # Set expected values
+ kwargs = {
+ 'project': self.projects_mock.get(),
+ 'group': self.groups_mock.get(),
+ 'os_inherit_extension_inherited': False
+ }
+ # RoleManager.list(user=, group=, domain=, project=, **kwargs)
+ self.roles_mock.list.assert_called_with(
+ **kwargs
+ )
+
+ collist = ('ID', 'Name', 'Project', 'Group')
+ self.assertEqual(collist, columns)
+ datalist = ((
+ identity_fakes.role_id,
+ identity_fakes.role_name,
+ identity_fakes.project_name,
+ identity_fakes.group_name,
+ ), )
+ self.assertEqual(datalist, tuple(data))
+
+ def test_role_list_domain_role(self):
+ self.roles_mock.list.return_value = [
+ fakes.FakeResource(
+ None,
+ copy.deepcopy(identity_fakes.ROLE_2),
+ loaded=True,
+ ),
+ ]
+ arglist = [
+ '--domain', identity_fakes.domain_name,
+ ]
+ verifylist = [
+ ('domain', identity_fakes.domain_name),
+ ]
+ parsed_args = self.check_parser(self.cmd, arglist, verifylist)
+
+ # In base command class Lister in cliff, abstract method take_action()
+ # returns a tuple containing the column names and an iterable
+ # containing the data to be listed.
+ columns, data = self.cmd.take_action(parsed_args)
+
+ # Set expected values
+ kwargs = {
+ 'domain_id': identity_fakes.domain_id
+ }
+ # RoleManager.list(user=, group=, domain=, project=, **kwargs)
+ self.roles_mock.list.assert_called_with(
+ **kwargs
+ )
+
+ collist = ('ID', 'Name', 'Domain')
+ self.assertEqual(collist, columns)
+ datalist = ((
+ identity_fakes.ROLE_2['id'],
+ identity_fakes.ROLE_2['name'],
+ identity_fakes.domain_name,
+ ), )
+ self.assertEqual(datalist, tuple(data))
+
+
+class TestRoleRemove(TestRole):
+
+ def setUp(self):
+ super(TestRoleRemove, self).setUp()
+
+ self.users_mock.get.return_value = fakes.FakeResource(
+ None,
+ copy.deepcopy(identity_fakes.USER),
+ loaded=True,
+ )
+
+ self.groups_mock.get.return_value = fakes.FakeResource(
+ None,
+ copy.deepcopy(identity_fakes.GROUP),
+ loaded=True,
+ )
+
+ self.domains_mock.get.return_value = fakes.FakeResource(
+ None,
+ copy.deepcopy(identity_fakes.DOMAIN),
+ loaded=True,
+ )
+
+ self.projects_mock.get.return_value = fakes.FakeResource(
+ None,
+ copy.deepcopy(identity_fakes.PROJECT),
+ loaded=True,
+ )
+
+ self.roles_mock.get.return_value = fakes.FakeResource(
+ None,
+ copy.deepcopy(identity_fakes.ROLE),
+ loaded=True,
+ )
+ self.roles_mock.revoke.return_value = None
+
+ # Get the command object to test
+ self.cmd = role.RemoveRole(self.app, None)
+
+ def test_role_remove_user_domain(self):
+ arglist = [
+ '--user', identity_fakes.user_name,
+ '--domain', identity_fakes.domain_name,
+ identity_fakes.role_name,
+ ]
+ if self._is_inheritance_testcase():
+ arglist.append('--inherited')
+ verifylist = [
+ ('user', identity_fakes.user_name),
+ ('group', None),
+ ('domain', identity_fakes.domain_name),
+ ('project', None),
+ ('role', identity_fakes.role_name),
+ ('inherited', self._is_inheritance_testcase()),
+ ]
+ parsed_args = self.check_parser(self.cmd, arglist, verifylist)
+
+ result = self.cmd.take_action(parsed_args)
+
+ # Set expected values
+ kwargs = {
+ 'user': identity_fakes.user_id,
+ 'domain': identity_fakes.domain_id,
+ 'os_inherit_extension_inherited': self._is_inheritance_testcase(),
+ }
+ # RoleManager.revoke(role, user=, group=, domain=, project=)
+ self.roles_mock.revoke.assert_called_with(
+ identity_fakes.role_id,
+ **kwargs
+ )
+ self.assertIsNone(result)
+
+ def test_role_remove_user_project(self):
+ arglist = [
+ '--user', identity_fakes.user_name,
+ '--project', identity_fakes.project_name,
+ identity_fakes.role_name,
+ ]
+ if self._is_inheritance_testcase():
+ arglist.append('--inherited')
+ verifylist = [
+ ('user', identity_fakes.user_name),
+ ('group', None),
+ ('domain', None),
+ ('project', identity_fakes.project_name),
+ ('role', identity_fakes.role_name),
+ ('inherited', self._is_inheritance_testcase()),
+ ]
+ parsed_args = self.check_parser(self.cmd, arglist, verifylist)
+
+ result = self.cmd.take_action(parsed_args)
+
+ # Set expected values
+ kwargs = {
+ 'user': identity_fakes.user_id,
+ 'project': identity_fakes.project_id,
+ 'os_inherit_extension_inherited': self._is_inheritance_testcase(),
+ }
+ # RoleManager.revoke(role, user=, group=, domain=, project=)
+ self.roles_mock.revoke.assert_called_with(
+ identity_fakes.role_id,
+ **kwargs
+ )
+ self.assertIsNone(result)
+
+ def test_role_remove_group_domain(self):
+ arglist = [
+ '--group', identity_fakes.group_name,
+ '--domain', identity_fakes.domain_name,
+ identity_fakes.role_name,
+ ]
+ if self._is_inheritance_testcase():
+ arglist.append('--inherited')
+ verifylist = [
+ ('user', None),
+ ('group', identity_fakes.group_name),
+ ('domain', identity_fakes.domain_name),
+ ('project', None),
+ ('role', identity_fakes.role_name),
+ ('role', identity_fakes.role_name),
+ ('inherited', self._is_inheritance_testcase()),
+ ]
+ parsed_args = self.check_parser(self.cmd, arglist, verifylist)
+
+ result = self.cmd.take_action(parsed_args)
+
+ # Set expected values
+ kwargs = {
+ 'group': identity_fakes.group_id,
+ 'domain': identity_fakes.domain_id,
+ 'os_inherit_extension_inherited': self._is_inheritance_testcase(),
+ }
+ # RoleManager.revoke(role, user=, group=, domain=, project=)
+ self.roles_mock.revoke.assert_called_with(
+ identity_fakes.role_id,
+ **kwargs
+ )
+ self.assertIsNone(result)
+
+ def test_role_remove_group_project(self):
+ arglist = [
+ '--group', identity_fakes.group_name,
+ '--project', identity_fakes.project_name,
+ identity_fakes.role_name,
+ ]
+ if self._is_inheritance_testcase():
+ arglist.append('--inherited')
+ verifylist = [
+ ('user', None),
+ ('group', identity_fakes.group_name),
+ ('domain', None),
+ ('project', identity_fakes.project_name),
+ ('role', identity_fakes.role_name),
+ ('inherited', self._is_inheritance_testcase()),
+ ]
+ parsed_args = self.check_parser(self.cmd, arglist, verifylist)
+
+ result = self.cmd.take_action(parsed_args)
+
+ # Set expected values
+ kwargs = {
+ 'group': identity_fakes.group_id,
+ 'project': identity_fakes.project_id,
+ 'os_inherit_extension_inherited': self._is_inheritance_testcase(),
+ }
+ # RoleManager.revoke(role, user=, group=, domain=, project=)
+ self.roles_mock.revoke.assert_called_with(
+ identity_fakes.role_id,
+ **kwargs
+ )
+ self.assertIsNone(result)
+
+ def test_role_remove_domain_role_on_group_domain(self):
+ self.roles_mock.get.return_value = fakes.FakeResource(
+ None,
+ copy.deepcopy(identity_fakes.ROLE_2),
+ loaded=True,
+ )
+ arglist = [
+ '--group', identity_fakes.group_name,
+ '--domain', identity_fakes.domain_name,
+ identity_fakes.ROLE_2['name'],
+ ]
+ if self._is_inheritance_testcase():
+ arglist.append('--inherited')
+ verifylist = [
+ ('user', None),
+ ('group', identity_fakes.group_name),
+ ('domain', identity_fakes.domain_name),
+ ('project', None),
+ ('role', identity_fakes.ROLE_2['name']),
+ ('inherited', self._is_inheritance_testcase()),
+ ]
+ parsed_args = self.check_parser(self.cmd, arglist, verifylist)
+
+ result = self.cmd.take_action(parsed_args)
+
+ # Set expected values
+ kwargs = {
+ 'group': identity_fakes.group_id,
+ 'domain': identity_fakes.domain_id,
+ 'os_inherit_extension_inherited': self._is_inheritance_testcase(),
+ }
+ # RoleManager.revoke(role, user=, group=, domain=, project=)
+ self.roles_mock.revoke.assert_called_with(
+ identity_fakes.ROLE_2['id'],
+ **kwargs
+ )
+ self.assertIsNone(result)
+
+
+class TestRoleSet(TestRole):
+
+ def setUp(self):
+ super(TestRoleSet, self).setUp()
+
+ self.roles_mock.get.return_value = fakes.FakeResource(
+ None,
+ copy.deepcopy(identity_fakes.ROLE),
+ loaded=True,
+ )
+ self.roles_mock.update.return_value = None
+
+ # Get the command object to test
+ self.cmd = role.SetRole(self.app, None)
+
+ def test_role_set_no_options(self):
+ arglist = [
+ '--name', 'over',
+ identity_fakes.role_name,
+ ]
+ verifylist = [
+ ('name', 'over'),
+ ('role', identity_fakes.role_name),
+ ]
+ parsed_args = self.check_parser(self.cmd, arglist, verifylist)
+
+ result = self.cmd.take_action(parsed_args)
+
+ # Set expected values
+ kwargs = {
+ 'name': 'over',
+ }
+ # RoleManager.update(role, name=)
+ self.roles_mock.update.assert_called_with(
+ identity_fakes.role_id,
+ **kwargs
+ )
+ self.assertIsNone(result)
+
+ def test_role_set_domain_role(self):
+ self.roles_mock.get.return_value = fakes.FakeResource(
+ None,
+ copy.deepcopy(identity_fakes.ROLE_2),
+ loaded=True,
+ )
+ arglist = [
+ '--name', 'over',
+ '--domain', identity_fakes.domain_name,
+ identity_fakes.ROLE_2['name'],
+ ]
+ verifylist = [
+ ('name', 'over'),
+ ('domain', identity_fakes.domain_name),
+ ('role', identity_fakes.ROLE_2['name']),
+ ]
+ parsed_args = self.check_parser(self.cmd, arglist, verifylist)
+
+ result = self.cmd.take_action(parsed_args)
+
+ # Set expected values
+ kwargs = {
+ 'name': 'over',
+ }
+ # RoleManager.update(role, name=)
+ self.roles_mock.update.assert_called_with(
+ identity_fakes.ROLE_2['id'],
+ **kwargs
+ )
+ self.assertIsNone(result)
+
+
+class TestRoleShow(TestRole):
+
+ def setUp(self):
+ super(TestRoleShow, self).setUp()
+
+ self.roles_mock.get.return_value = fakes.FakeResource(
+ None,
+ copy.deepcopy(identity_fakes.ROLE),
+ loaded=True,
+ )
+
+ # Get the command object to test
+ self.cmd = role.ShowRole(self.app, None)
+
+ def test_role_show(self):
+ arglist = [
+ identity_fakes.role_name,
+ ]
+ verifylist = [
+ ('role', identity_fakes.role_name),
+ ]
+ parsed_args = self.check_parser(self.cmd, arglist, verifylist)
+
+ # In base command class ShowOne in cliff, abstract method take_action()
+ # returns a two-part tuple with a tuple of column names and a tuple of
+ # data to be shown.
+ columns, data = self.cmd.take_action(parsed_args)
+
+ # RoleManager.get(role)
+ self.roles_mock.get.assert_called_with(
+ identity_fakes.role_name,
+ )
+
+ collist = ('domain', 'id', 'name')
+ self.assertEqual(collist, columns)
+ datalist = (
+ None,
+ identity_fakes.role_id,
+ identity_fakes.role_name,
+ )
+ self.assertEqual(datalist, data)
+
+ def test_role_show_domain_role(self):
+ self.roles_mock.get.return_value = fakes.FakeResource(
+ None,
+ copy.deepcopy(identity_fakes.ROLE_2),
+ loaded=True,
+ )
+ arglist = [
+ '--domain', identity_fakes.domain_name,
+ identity_fakes.ROLE_2['name'],
+ ]
+ verifylist = [
+ ('domain', identity_fakes.domain_name),
+ ('role', identity_fakes.ROLE_2['name']),
+ ]
+ parsed_args = self.check_parser(self.cmd, arglist, verifylist)
+
+ # In base command class ShowOne in cliff, abstract method take_action()
+ # returns a two-part tuple with a tuple of column names and a tuple of
+ # data to be shown.
+ columns, data = self.cmd.take_action(parsed_args)
+
+ # RoleManager.get(role). This is called from utils.find_resource().
+ # In fact, the current implementation calls the get(role) first with
+ # just the name, then with the name+domain_id. So technically we should
+ # mock this out with a call list, with the first call returning None
+ # and the second returning the object. However, if we did that we are
+ # then just testing the current sequencing within the utils method, and
+ # would become brittle to changes within that method. Hence we just
+ # check for the first call which is always lookup by name.
+ self.roles_mock.get.assert_called_with(
+ identity_fakes.ROLE_2['name'],
+ )
+
+ collist = ('domain', 'id', 'name')
+ self.assertEqual(collist, columns)
+ datalist = (
+ identity_fakes.domain_id,
+ identity_fakes.ROLE_2['id'],
+ identity_fakes.ROLE_2['name'],
+ )
+ self.assertEqual(datalist, data)
diff --git a/openstackclient/tests/unit/identity/v3/test_role_assignment.py b/openstackclient/tests/unit/identity/v3/test_role_assignment.py
new file mode 100644
index 00000000..7102a0cd
--- /dev/null
+++ b/openstackclient/tests/unit/identity/v3/test_role_assignment.py
@@ -0,0 +1,683 @@
+# 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 copy
+import mock
+
+from openstackclient.identity.v3 import role_assignment
+from openstackclient.tests.unit import fakes
+from openstackclient.tests.unit.identity.v3 import fakes as identity_fakes
+
+
+class TestRoleAssignment(identity_fakes.TestIdentityv3):
+
+ def setUp(self):
+ super(TestRoleAssignment, self).setUp()
+
+
+class TestRoleAssignmentList(TestRoleAssignment):
+
+ columns = (
+ 'Role',
+ 'User',
+ 'Group',
+ 'Project',
+ 'Domain',
+ 'Inherited',
+ )
+
+ def setUp(self):
+ super(TestRoleAssignment, self).setUp()
+
+ # Get a shortcut to the UserManager Mock
+ self.users_mock = self.app.client_manager.identity.users
+ self.users_mock.reset_mock()
+
+ # Get a shortcut to the GroupManager Mock
+ self.groups_mock = self.app.client_manager.identity.groups
+ self.groups_mock.reset_mock()
+
+ # Get a shortcut to the DomainManager Mock
+ self.domains_mock = self.app.client_manager.identity.domains
+ self.domains_mock.reset_mock()
+
+ # Get a shortcut to the ProjectManager Mock
+ self.projects_mock = self.app.client_manager.identity.projects
+ self.projects_mock.reset_mock()
+
+ # Get a shortcut to the RoleManager Mock
+ self.roles_mock = self.app.client_manager.identity.roles
+ self.roles_mock.reset_mock()
+
+ self.role_assignments_mock = self.app.client_manager.identity.\
+ role_assignments
+ self.role_assignments_mock.reset_mock()
+
+ # Get the command object to test
+ self.cmd = role_assignment.ListRoleAssignment(self.app, None)
+
+ def test_role_assignment_list_no_filters(self):
+
+ self.role_assignments_mock.list.return_value = [
+ fakes.FakeResource(
+ None,
+ copy.deepcopy(
+ identity_fakes.ASSIGNMENT_WITH_PROJECT_ID_AND_USER_ID),
+ loaded=True,
+ ),
+ fakes.FakeResource(
+ None,
+ copy.deepcopy(
+ identity_fakes.ASSIGNMENT_WITH_PROJECT_ID_AND_GROUP_ID),
+ loaded=True,
+ ),
+ ]
+
+ arglist = []
+ verifylist = []
+ parsed_args = self.check_parser(self.cmd, arglist, verifylist)
+
+ # In base command class Lister in cliff, abstract method take_action()
+ # returns a tuple containing the column names and an iterable
+ # containing the data to be listed.
+ columns, data = self.cmd.take_action(parsed_args)
+
+ self.role_assignments_mock.list.assert_called_with(
+ domain=None,
+ group=None,
+ effective=False,
+ role=None,
+ user=None,
+ project=None,
+ os_inherit_extension_inherited_to=None,
+ include_names=False)
+
+ self.assertEqual(self.columns, columns)
+ datalist = ((
+ identity_fakes.role_id,
+ identity_fakes.user_id,
+ '',
+ identity_fakes.project_id,
+ '',
+ False
+ ), (identity_fakes.role_id,
+ '',
+ identity_fakes.group_id,
+ identity_fakes.project_id,
+ '',
+ False
+ ),)
+ self.assertEqual(datalist, tuple(data))
+
+ def test_role_assignment_list_user(self):
+
+ self.role_assignments_mock.list.return_value = [
+ fakes.FakeResource(
+ None,
+ copy.deepcopy(
+ identity_fakes.ASSIGNMENT_WITH_DOMAIN_ID_AND_USER_ID),
+ loaded=True,
+ ),
+ fakes.FakeResource(
+ None,
+ copy.deepcopy(
+ identity_fakes.ASSIGNMENT_WITH_PROJECT_ID_AND_USER_ID),
+ loaded=True,
+ ),
+ ]
+
+ arglist = [
+ '--user', identity_fakes.user_name
+ ]
+ verifylist = [
+ ('user', identity_fakes.user_name),
+ ('group', None),
+ ('domain', None),
+ ('project', None),
+ ('role', None),
+ ('effective', False),
+ ('inherited', False),
+ ('names', False),
+ ]
+ parsed_args = self.check_parser(self.cmd, arglist, verifylist)
+
+ # In base command class Lister in cliff, abstract method take_action()
+ # returns a tuple containing the column names and an iterable
+ # containing the data to be listed.
+ columns, data = self.cmd.take_action(parsed_args)
+
+ self.role_assignments_mock.list.assert_called_with(
+ domain=None,
+ user=self.users_mock.get(),
+ group=None,
+ project=None,
+ role=None,
+ effective=False,
+ os_inherit_extension_inherited_to=None,
+ include_names=False)
+
+ self.assertEqual(self.columns, columns)
+ datalist = ((
+ identity_fakes.role_id,
+ identity_fakes.user_id,
+ '',
+ '',
+ identity_fakes.domain_id,
+ False
+ ), (identity_fakes.role_id,
+ identity_fakes.user_id,
+ '',
+ identity_fakes.project_id,
+ '',
+ False
+ ),)
+ self.assertEqual(datalist, tuple(data))
+
+ def test_role_assignment_list_group(self):
+
+ self.role_assignments_mock.list.return_value = [
+ fakes.FakeResource(
+ None,
+ copy.deepcopy(
+ identity_fakes.ASSIGNMENT_WITH_DOMAIN_ID_AND_GROUP_ID),
+ loaded=True,
+ ),
+ fakes.FakeResource(
+ None,
+ copy.deepcopy(
+ identity_fakes.ASSIGNMENT_WITH_PROJECT_ID_AND_GROUP_ID),
+ loaded=True,
+ ),
+ ]
+
+ arglist = [
+ '--group', identity_fakes.group_name
+ ]
+ verifylist = [
+ ('user', None),
+ ('group', identity_fakes.group_name),
+ ('domain', None),
+ ('project', None),
+ ('role', None),
+ ('effective', False),
+ ('inherited', False),
+ ('names', False),
+ ]
+ parsed_args = self.check_parser(self.cmd, arglist, verifylist)
+
+ # In base command class Lister in cliff, abstract method take_action()
+ # returns a tuple containing the column names and an iterable
+ # containing the data to be listed.
+ columns, data = self.cmd.take_action(parsed_args)
+
+ self.role_assignments_mock.list.assert_called_with(
+ domain=None,
+ group=self.groups_mock.get(),
+ effective=False,
+ project=None,
+ role=None,
+ user=None,
+ os_inherit_extension_inherited_to=None,
+ include_names=False)
+
+ self.assertEqual(self.columns, columns)
+ datalist = ((
+ identity_fakes.role_id,
+ '',
+ identity_fakes.group_id,
+ '',
+ identity_fakes.domain_id,
+ False
+ ), (identity_fakes.role_id,
+ '',
+ identity_fakes.group_id,
+ identity_fakes.project_id,
+ '',
+ False
+ ),)
+ self.assertEqual(datalist, tuple(data))
+
+ def test_role_assignment_list_domain(self):
+
+ self.role_assignments_mock.list.return_value = [
+ fakes.FakeResource(
+ None,
+ copy.deepcopy(
+ identity_fakes.ASSIGNMENT_WITH_DOMAIN_ID_AND_USER_ID),
+ loaded=True,
+ ),
+ fakes.FakeResource(
+ None,
+ copy.deepcopy(
+ identity_fakes.ASSIGNMENT_WITH_DOMAIN_ID_AND_GROUP_ID),
+ loaded=True,
+ ),
+ ]
+
+ arglist = [
+ '--domain', identity_fakes.domain_name
+ ]
+ verifylist = [
+ ('user', None),
+ ('group', None),
+ ('domain', identity_fakes.domain_name),
+ ('project', None),
+ ('role', None),
+ ('effective', False),
+ ('inherited', False),
+ ('names', False),
+ ]
+ parsed_args = self.check_parser(self.cmd, arglist, verifylist)
+
+ # In base command class Lister in cliff, abstract method take_action()
+ # returns a tuple containing the column names and an iterable
+ # containing the data to be listed.
+ columns, data = self.cmd.take_action(parsed_args)
+
+ self.role_assignments_mock.list.assert_called_with(
+ domain=self.domains_mock.get(),
+ group=None,
+ effective=False,
+ project=None,
+ role=None,
+ user=None,
+ os_inherit_extension_inherited_to=None,
+ include_names=False)
+
+ self.assertEqual(self.columns, columns)
+ datalist = ((
+ identity_fakes.role_id,
+ identity_fakes.user_id,
+ '',
+ '',
+ identity_fakes.domain_id,
+ False
+ ), (identity_fakes.role_id,
+ '',
+ identity_fakes.group_id,
+ '',
+ identity_fakes.domain_id,
+ False
+ ),)
+ self.assertEqual(datalist, tuple(data))
+
+ def test_role_assignment_list_project(self):
+
+ self.role_assignments_mock.list.return_value = [
+ fakes.FakeResource(
+ None,
+ copy.deepcopy(
+ identity_fakes.ASSIGNMENT_WITH_PROJECT_ID_AND_USER_ID),
+ loaded=True,
+ ),
+ fakes.FakeResource(
+ None,
+ copy.deepcopy(
+ identity_fakes.ASSIGNMENT_WITH_PROJECT_ID_AND_GROUP_ID),
+ loaded=True,
+ ),
+ ]
+
+ arglist = [
+ '--project', identity_fakes.project_name
+ ]
+ verifylist = [
+ ('user', None),
+ ('group', None),
+ ('domain', None),
+ ('project', identity_fakes.project_name),
+ ('role', None),
+ ('effective', False),
+ ('inherited', False),
+ ('names', False),
+ ]
+ parsed_args = self.check_parser(self.cmd, arglist, verifylist)
+
+ # In base command class Lister in cliff, abstract method take_action()
+ # returns a tuple containing the column names and an iterable
+ # containing the data to be listed.
+ columns, data = self.cmd.take_action(parsed_args)
+
+ self.role_assignments_mock.list.assert_called_with(
+ domain=None,
+ group=None,
+ effective=False,
+ project=self.projects_mock.get(),
+ role=None,
+ user=None,
+ os_inherit_extension_inherited_to=None,
+ include_names=False)
+
+ self.assertEqual(self.columns, columns)
+ datalist = ((
+ identity_fakes.role_id,
+ identity_fakes.user_id,
+ '',
+ identity_fakes.project_id,
+ '',
+ False
+ ), (identity_fakes.role_id,
+ '',
+ identity_fakes.group_id,
+ identity_fakes.project_id,
+ '',
+ False
+ ),)
+ self.assertEqual(datalist, tuple(data))
+
+ def test_role_assignment_list_def_creds(self):
+
+ auth_ref = self.app.client_manager.auth_ref = mock.MagicMock()
+ auth_ref.project_id.return_value = identity_fakes.project_id
+ auth_ref.user_id.return_value = identity_fakes.user_id
+
+ self.role_assignments_mock.list.return_value = [
+ fakes.FakeResource(
+ None,
+ copy.deepcopy(
+ identity_fakes.ASSIGNMENT_WITH_PROJECT_ID_AND_USER_ID),
+ loaded=True,
+ ),
+ ]
+
+ arglist = [
+ '--auth-user',
+ '--auth-project',
+ ]
+ verifylist = [
+ ('user', None),
+ ('group', None),
+ ('domain', None),
+ ('project', None),
+ ('role', None),
+ ('effective', False),
+ ('inherited', False),
+ ('names', False),
+ ('authuser', True),
+ ('authproject', True),
+ ]
+ parsed_args = self.check_parser(self.cmd, arglist, verifylist)
+
+ # In base command class Lister in cliff, abstract method take_action()
+ # returns a tuple containing the column names and an iterable
+ # containing the data to be listed.
+ columns, data = self.cmd.take_action(parsed_args)
+
+ self.role_assignments_mock.list.assert_called_with(
+ domain=None,
+ user=self.users_mock.get(),
+ group=None,
+ project=self.projects_mock.get(),
+ role=None,
+ effective=False,
+ os_inherit_extension_inherited_to=None,
+ include_names=False)
+
+ self.assertEqual(self.columns, columns)
+ datalist = ((
+ identity_fakes.role_id,
+ identity_fakes.user_id,
+ '',
+ identity_fakes.project_id,
+ '',
+ False
+ ),)
+ self.assertEqual(datalist, tuple(data))
+
+ def test_role_assignment_list_effective(self):
+
+ self.role_assignments_mock.list.return_value = [
+ fakes.FakeResource(
+ None,
+ copy.deepcopy(
+ identity_fakes.ASSIGNMENT_WITH_PROJECT_ID_AND_USER_ID),
+ loaded=True,
+ ),
+ fakes.FakeResource(
+ None,
+ copy.deepcopy(
+ identity_fakes.ASSIGNMENT_WITH_DOMAIN_ID_AND_USER_ID),
+ loaded=True,
+ ),
+ ]
+
+ arglist = ['--effective']
+ verifylist = [
+ ('user', None),
+ ('group', None),
+ ('domain', None),
+ ('project', None),
+ ('role', None),
+ ('effective', True),
+ ('inherited', False),
+ ('names', False),
+ ]
+ parsed_args = self.check_parser(self.cmd, arglist, verifylist)
+
+ # In base command class Lister in cliff, abstract method take_action()
+ # returns a tuple containing the column names and an iterable
+ # containing the data to be listed.
+ columns, data = self.cmd.take_action(parsed_args)
+
+ self.role_assignments_mock.list.assert_called_with(
+ domain=None,
+ group=None,
+ effective=True,
+ project=None,
+ role=None,
+ user=None,
+ os_inherit_extension_inherited_to=None,
+ include_names=False)
+
+ self.assertEqual(self.columns, columns)
+ datalist = ((
+ identity_fakes.role_id,
+ identity_fakes.user_id,
+ '',
+ identity_fakes.project_id,
+ '',
+ False
+ ), (identity_fakes.role_id,
+ identity_fakes.user_id,
+ '',
+ '',
+ identity_fakes.domain_id,
+ False
+ ),)
+ self.assertEqual(tuple(data), datalist)
+
+ def test_role_assignment_list_inherited(self):
+
+ self.role_assignments_mock.list.return_value = [
+ fakes.FakeResource(
+ None,
+ copy.deepcopy(
+ (identity_fakes.
+ ASSIGNMENT_WITH_PROJECT_ID_AND_USER_ID_INHERITED)),
+ loaded=True,
+ ),
+ fakes.FakeResource(
+ None,
+ copy.deepcopy(
+ (identity_fakes.
+ ASSIGNMENT_WITH_DOMAIN_ID_AND_USER_ID_INHERITED)),
+ loaded=True,
+ ),
+ ]
+
+ arglist = ['--inherited']
+ verifylist = [
+ ('user', None),
+ ('group', None),
+ ('domain', None),
+ ('project', None),
+ ('role', None),
+ ('effective', False),
+ ('inherited', True),
+ ('names', False),
+ ]
+ parsed_args = self.check_parser(self.cmd, arglist, verifylist)
+
+ # In base command class Lister in cliff, abstract method take_action()
+ # returns a tuple containing the column names and an iterable
+ # containing the data to be listed.
+ columns, data = self.cmd.take_action(parsed_args)
+
+ self.role_assignments_mock.list.assert_called_with(
+ domain=None,
+ group=None,
+ effective=False,
+ project=None,
+ role=None,
+ user=None,
+ os_inherit_extension_inherited_to='projects',
+ include_names=False)
+
+ self.assertEqual(self.columns, columns)
+ datalist = ((
+ identity_fakes.role_id,
+ identity_fakes.user_id,
+ '',
+ identity_fakes.project_id,
+ '',
+ True
+ ), (identity_fakes.role_id,
+ identity_fakes.user_id,
+ '',
+ '',
+ identity_fakes.domain_id,
+ True
+ ),)
+ self.assertEqual(datalist, tuple(data))
+
+ def test_role_assignment_list_include_names(self):
+
+ self.role_assignments_mock.list.return_value = [
+ fakes.FakeResource(
+ None,
+ copy.deepcopy(
+ identity_fakes
+ .ASSIGNMENT_WITH_PROJECT_ID_AND_USER_ID_INCLUDE_NAMES),
+ loaded=True,
+ ),
+ fakes.FakeResource(
+ None,
+ copy.deepcopy(
+ identity_fakes
+ .ASSIGNMENT_WITH_DOMAIN_ID_AND_USER_ID_INCLUDE_NAMES),
+ loaded=True,
+ ),
+ ]
+
+ arglist = ['--names']
+ verifylist = [
+ ('user', None),
+ ('group', None),
+ ('domain', None),
+ ('project', None),
+ ('role', None),
+ ('effective', False),
+ ('inherited', False),
+ ('names', True),
+ ]
+ parsed_args = self.check_parser(self.cmd, arglist, verifylist)
+
+ # DisplayCommandBase.take_action() returns two tuples
+
+ # This test will not run correctly until the patch in the python
+ # client is merged. Once that is done 'data' should return the
+ # correct information
+ columns, data = self.cmd.take_action(parsed_args)
+
+ self.role_assignments_mock.list.assert_called_with(
+ domain=None,
+ group=None,
+ effective=False,
+ project=None,
+ role=None,
+ user=None,
+ os_inherit_extension_inherited_to=None,
+ include_names=True)
+
+ collist = ('Role', 'User', 'Group', 'Project', 'Domain', 'Inherited')
+ self.assertEqual(columns, collist)
+
+ datalist1 = ((
+ identity_fakes.role_name,
+ '@'.join([identity_fakes.user_name, identity_fakes.domain_name]),
+ '',
+ '@'.join([identity_fakes.project_name,
+ identity_fakes.domain_name]),
+ '',
+ False
+ ), (identity_fakes.role_name,
+ '@'.join([identity_fakes.user_name, identity_fakes.domain_name]),
+ '',
+ '',
+ identity_fakes.domain_name,
+ False
+ ),)
+ self.assertEqual(tuple(data), datalist1)
+
+ def test_role_assignment_list_domain_role(self):
+
+ self.role_assignments_mock.list.return_value = [
+ fakes.FakeResource(
+ None,
+ copy.deepcopy(
+ identity_fakes.ASSIGNMENT_WITH_DOMAIN_ROLE),
+ loaded=True,
+ ),
+ ]
+
+ arglist = [
+ '--role', identity_fakes.ROLE_2['name'],
+ '--role-domain', identity_fakes.domain_name
+ ]
+ verifylist = [
+ ('user', None),
+ ('group', None),
+ ('domain', None),
+ ('project', None),
+ ('role', identity_fakes.ROLE_2['name']),
+ ('effective', False),
+ ('inherited', False),
+ ('names', False),
+ ]
+ parsed_args = self.check_parser(self.cmd, arglist, verifylist)
+
+ # In base command class Lister in cliff, abstract method take_action()
+ # returns a tuple containing the column names and an iterable
+ # containing the data to be listed.
+ columns, data = self.cmd.take_action(parsed_args)
+
+ self.role_assignments_mock.list.assert_called_with(
+ domain=None,
+ user=None,
+ group=None,
+ project=None,
+ role=self.roles_mock.get(),
+ effective=False,
+ os_inherit_extension_inherited_to=None,
+ include_names=False)
+
+ self.assertEqual(self.columns, columns)
+ datalist = ((
+ identity_fakes.ROLE_2['id'],
+ identity_fakes.user_id,
+ '',
+ '',
+ identity_fakes.domain_id,
+ False
+ ),)
+ self.assertEqual(datalist, tuple(data))
diff --git a/openstackclient/tests/unit/identity/v3/test_service.py b/openstackclient/tests/unit/identity/v3/test_service.py
new file mode 100644
index 00000000..4cba445b
--- /dev/null
+++ b/openstackclient/tests/unit/identity/v3/test_service.py
@@ -0,0 +1,504 @@
+# Copyright 2013 Nebula Inc.
+#
+# 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 keystoneclient import exceptions as identity_exc
+from osc_lib import exceptions
+
+from openstackclient.identity.v3 import service
+from openstackclient.tests.unit.identity.v3 import fakes as identity_fakes
+
+
+class TestService(identity_fakes.TestIdentityv3):
+
+ def setUp(self):
+ super(TestService, self).setUp()
+
+ # Get a shortcut to the ServiceManager Mock
+ self.services_mock = self.app.client_manager.identity.services
+ self.services_mock.reset_mock()
+
+
+class TestServiceCreate(TestService):
+
+ columns = (
+ 'description',
+ 'enabled',
+ 'id',
+ 'name',
+ 'type',
+ )
+
+ def setUp(self):
+ super(TestServiceCreate, self).setUp()
+
+ self.service = identity_fakes.FakeService.create_one_service()
+ self.datalist = (
+ self.service.description,
+ True,
+ self.service.id,
+ self.service.name,
+ self.service.type,
+ )
+ self.services_mock.create.return_value = self.service
+
+ # Get the command object to test
+ self.cmd = service.CreateService(self.app, None)
+
+ def test_service_create_name(self):
+ arglist = [
+ '--name', self.service.name,
+ self.service.type,
+ ]
+ verifylist = [
+ ('name', self.service.name),
+ ('description', None),
+ ('enable', False),
+ ('disable', False),
+ ('type', self.service.type),
+ ]
+ parsed_args = self.check_parser(self.cmd, arglist, verifylist)
+
+ # In base command class ShowOne in cliff, abstract method take_action()
+ # returns a two-part tuple with a tuple of column names and a tuple of
+ # data to be shown.
+ columns, data = self.cmd.take_action(parsed_args)
+
+ # ServiceManager.create(name=, type=, enabled=, **kwargs)
+ self.services_mock.create.assert_called_with(
+ name=self.service.name,
+ type=self.service.type,
+ description=None,
+ enabled=True,
+ )
+
+ self.assertEqual(self.columns, columns)
+ self.assertEqual(self.datalist, data)
+
+ def test_service_create_description(self):
+ arglist = [
+ '--description', self.service.description,
+ self.service.type,
+ ]
+ verifylist = [
+ ('name', None),
+ ('description', self.service.description),
+ ('enable', False),
+ ('disable', False),
+ ('type', self.service.type),
+ ]
+ parsed_args = self.check_parser(self.cmd, arglist, verifylist)
+
+ # In base command class ShowOne in cliff, abstract method take_action()
+ # returns a two-part tuple with a tuple of column names and a tuple of
+ # data to be shown.
+ columns, data = self.cmd.take_action(parsed_args)
+
+ # ServiceManager.create(name=, type=, enabled=, **kwargs)
+ self.services_mock.create.assert_called_with(
+ name=None,
+ type=self.service.type,
+ description=self.service.description,
+ enabled=True,
+ )
+
+ self.assertEqual(self.columns, columns)
+ self.assertEqual(self.datalist, data)
+
+ def test_service_create_enable(self):
+ arglist = [
+ '--enable',
+ self.service.type,
+ ]
+ verifylist = [
+ ('name', None),
+ ('description', None),
+ ('enable', True),
+ ('disable', False),
+ ('type', self.service.type),
+ ]
+ parsed_args = self.check_parser(self.cmd, arglist, verifylist)
+
+ # In base command class ShowOne in cliff, abstract method take_action()
+ # returns a two-part tuple with a tuple of column names and a tuple of
+ # data to be shown.
+ columns, data = self.cmd.take_action(parsed_args)
+
+ # ServiceManager.create(name=, type=, enabled=, **kwargs)
+ self.services_mock.create.assert_called_with(
+ name=None,
+ type=self.service.type,
+ description=None,
+ enabled=True,
+ )
+
+ self.assertEqual(self.columns, columns)
+ self.assertEqual(self.datalist, data)
+
+ def test_service_create_disable(self):
+ arglist = [
+ '--disable',
+ self.service.type,
+ ]
+ verifylist = [
+ ('name', None),
+ ('description', None),
+ ('enable', False),
+ ('disable', True),
+ ('type', self.service.type),
+ ]
+ parsed_args = self.check_parser(self.cmd, arglist, verifylist)
+
+ # In base command class ShowOne in cliff, abstract method take_action()
+ # returns a two-part tuple with a tuple of column names and a tuple of
+ # data to be shown.
+ columns, data = self.cmd.take_action(parsed_args)
+
+ # ServiceManager.create(name=, type=, enabled=, **kwargs)
+ self.services_mock.create.assert_called_with(
+ name=None,
+ type=self.service.type,
+ description=None,
+ enabled=False,
+ )
+
+ self.assertEqual(self.columns, columns)
+ self.assertEqual(self.datalist, data)
+
+
+class TestServiceDelete(TestService):
+
+ service = identity_fakes.FakeService.create_one_service()
+
+ def setUp(self):
+ super(TestServiceDelete, self).setUp()
+
+ self.services_mock.get.side_effect = identity_exc.NotFound(None)
+ self.services_mock.find.return_value = self.service
+ self.services_mock.delete.return_value = None
+
+ # Get the command object to test
+ self.cmd = service.DeleteService(self.app, None)
+
+ def test_service_delete_no_options(self):
+ arglist = [
+ self.service.name,
+ ]
+ verifylist = [
+ ('service', [self.service.name]),
+ ]
+ parsed_args = self.check_parser(self.cmd, arglist, verifylist)
+
+ result = self.cmd.take_action(parsed_args)
+
+ self.services_mock.delete.assert_called_with(
+ self.service.id,
+ )
+ self.assertIsNone(result)
+
+
+class TestServiceList(TestService):
+
+ service = identity_fakes.FakeService.create_one_service()
+
+ def setUp(self):
+ super(TestServiceList, self).setUp()
+
+ self.services_mock.list.return_value = [self.service]
+
+ # Get the command object to test
+ self.cmd = service.ListService(self.app, None)
+
+ def test_service_list_no_options(self):
+ arglist = []
+ verifylist = []
+ parsed_args = self.check_parser(self.cmd, arglist, verifylist)
+
+ # In base command class Lister in cliff, abstract method take_action()
+ # returns a tuple containing the column names and an iterable
+ # containing the data to be listed.
+ columns, data = self.cmd.take_action(parsed_args)
+
+ self.services_mock.list.assert_called_with()
+
+ collist = ('ID', 'Name', 'Type')
+ self.assertEqual(collist, columns)
+ datalist = ((
+ self.service.id,
+ self.service.name,
+ self.service.type,
+ ), )
+ self.assertEqual(datalist, tuple(data))
+
+ def test_service_list_long(self):
+ arglist = [
+ '--long',
+ ]
+ verifylist = [
+ ('long', True),
+ ]
+ parsed_args = self.check_parser(self.cmd, arglist, verifylist)
+
+ # In base command class Lister in cliff, abstract method take_action()
+ # returns a tuple containing the column names and an iterable
+ # containing the data to be listed.
+ columns, data = self.cmd.take_action(parsed_args)
+
+ self.services_mock.list.assert_called_with()
+
+ collist = ('ID', 'Name', 'Type', 'Description', 'Enabled')
+ self.assertEqual(collist, columns)
+ datalist = ((
+ self.service.id,
+ self.service.name,
+ self.service.type,
+ self.service.description,
+ True,
+ ), )
+ self.assertEqual(datalist, tuple(data))
+
+
+class TestServiceSet(TestService):
+
+ service = identity_fakes.FakeService.create_one_service()
+
+ def setUp(self):
+ super(TestServiceSet, self).setUp()
+
+ self.services_mock.get.side_effect = identity_exc.NotFound(None)
+ self.services_mock.find.return_value = self.service
+ self.services_mock.update.return_value = self.service
+
+ # Get the command object to test
+ self.cmd = service.SetService(self.app, None)
+
+ def test_service_set_no_options(self):
+ arglist = [
+ self.service.name,
+ ]
+ verifylist = [
+ ('type', None),
+ ('name', None),
+ ('description', None),
+ ('enable', False),
+ ('disable', False),
+ ('service', self.service.name),
+ ]
+ parsed_args = self.check_parser(self.cmd, arglist, verifylist)
+
+ result = self.cmd.take_action(parsed_args)
+
+ self.assertIsNone(result)
+
+ def test_service_set_type(self):
+ arglist = [
+ '--type', self.service.type,
+ self.service.name,
+ ]
+ verifylist = [
+ ('type', self.service.type),
+ ('name', None),
+ ('description', None),
+ ('enable', False),
+ ('disable', False),
+ ('service', self.service.name),
+ ]
+ parsed_args = self.check_parser(self.cmd, arglist, verifylist)
+
+ result = self.cmd.take_action(parsed_args)
+
+ # Set expected values
+ kwargs = {
+ 'type': self.service.type,
+ }
+ # ServiceManager.update(service, name=, type=, enabled=, **kwargs)
+ self.services_mock.update.assert_called_with(
+ self.service.id,
+ **kwargs
+ )
+ self.assertIsNone(result)
+
+ def test_service_set_name(self):
+ arglist = [
+ '--name', self.service.name,
+ self.service.name,
+ ]
+ verifylist = [
+ ('type', None),
+ ('name', self.service.name),
+ ('description', None),
+ ('enable', False),
+ ('disable', False),
+ ('service', self.service.name),
+ ]
+ parsed_args = self.check_parser(self.cmd, arglist, verifylist)
+
+ result = self.cmd.take_action(parsed_args)
+
+ # Set expected values
+ kwargs = {
+ 'name': self.service.name,
+ }
+ # ServiceManager.update(service, name=, type=, enabled=, **kwargs)
+ self.services_mock.update.assert_called_with(
+ self.service.id,
+ **kwargs
+ )
+ self.assertIsNone(result)
+
+ def test_service_set_description(self):
+ arglist = [
+ '--description', self.service.description,
+ self.service.name,
+ ]
+ verifylist = [
+ ('type', None),
+ ('name', None),
+ ('description', self.service.description),
+ ('enable', False),
+ ('disable', False),
+ ('service', self.service.name),
+ ]
+ parsed_args = self.check_parser(self.cmd, arglist, verifylist)
+
+ result = self.cmd.take_action(parsed_args)
+
+ # Set expected values
+ kwargs = {
+ 'description': self.service.description,
+ }
+ # ServiceManager.update(service, name=, type=, enabled=, **kwargs)
+ self.services_mock.update.assert_called_with(
+ self.service.id,
+ **kwargs
+ )
+ self.assertIsNone(result)
+
+ def test_service_set_enable(self):
+ arglist = [
+ '--enable',
+ self.service.name,
+ ]
+ verifylist = [
+ ('type', None),
+ ('name', None),
+ ('description', None),
+ ('enable', True),
+ ('disable', False),
+ ('service', self.service.name),
+ ]
+ parsed_args = self.check_parser(self.cmd, arglist, verifylist)
+
+ result = self.cmd.take_action(parsed_args)
+
+ # Set expected values
+ kwargs = {
+ 'enabled': True,
+ }
+ # ServiceManager.update(service, name=, type=, enabled=, **kwargs)
+ self.services_mock.update.assert_called_with(
+ self.service.id,
+ **kwargs
+ )
+ self.assertIsNone(result)
+
+ def test_service_set_disable(self):
+ arglist = [
+ '--disable',
+ self.service.name,
+ ]
+ verifylist = [
+ ('type', None),
+ ('name', None),
+ ('description', None),
+ ('enable', False),
+ ('disable', True),
+ ('service', self.service.name),
+ ]
+ parsed_args = self.check_parser(self.cmd, arglist, verifylist)
+
+ result = self.cmd.take_action(parsed_args)
+
+ # Set expected values
+ kwargs = {
+ 'enabled': False,
+ }
+ # ServiceManager.update(service, name=, type=, enabled=, **kwargs)
+ self.services_mock.update.assert_called_with(
+ self.service.id,
+ **kwargs
+ )
+ self.assertIsNone(result)
+
+
+class TestServiceShow(TestService):
+
+ service = identity_fakes.FakeService.create_one_service()
+
+ def setUp(self):
+ super(TestServiceShow, self).setUp()
+
+ self.services_mock.get.side_effect = identity_exc.NotFound(None)
+ self.services_mock.find.return_value = self.service
+
+ # Get the command object to test
+ self.cmd = service.ShowService(self.app, None)
+
+ def test_service_show(self):
+ arglist = [
+ self.service.name,
+ ]
+ verifylist = [
+ ('service', self.service.name),
+ ]
+ parsed_args = self.check_parser(self.cmd, arglist, verifylist)
+
+ # In base command class ShowOne in cliff, abstract method take_action()
+ # returns a two-part tuple with a tuple of column names and a tuple of
+ # data to be shown.
+ columns, data = self.cmd.take_action(parsed_args)
+
+ # ServiceManager.get(id)
+ self.services_mock.find.assert_called_with(
+ name=self.service.name
+ )
+
+ collist = ('description', 'enabled', 'id', 'name', 'type')
+ self.assertEqual(collist, columns)
+ datalist = (
+ self.service.description,
+ True,
+ self.service.id,
+ self.service.name,
+ self.service.type,
+ )
+ self.assertEqual(datalist, data)
+
+ def test_service_show_nounique(self):
+ self.services_mock.find.side_effect = identity_exc.NoUniqueMatch(None)
+ arglist = [
+ 'nounique_service',
+ ]
+ verifylist = [
+ ('service', 'nounique_service'),
+ ]
+ parsed_args = self.check_parser(self.cmd, arglist, verifylist)
+
+ try:
+ self.cmd.take_action(parsed_args)
+ self.fail('CommandError should be raised.')
+ except exceptions.CommandError as e:
+ self.assertEqual(
+ "Multiple service matches found for 'nounique_service',"
+ " use an ID to be more specific.", str(e))
diff --git a/openstackclient/tests/unit/identity/v3/test_service_provider.py b/openstackclient/tests/unit/identity/v3/test_service_provider.py
new file mode 100644
index 00000000..57473ef9
--- /dev/null
+++ b/openstackclient/tests/unit/identity/v3/test_service_provider.py
@@ -0,0 +1,408 @@
+# Copyright 2014 CERN.
+#
+# 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 copy
+
+from openstackclient.identity.v3 import service_provider
+from openstackclient.tests.unit import fakes
+from openstackclient.tests.unit.identity.v3 import fakes as service_fakes
+
+
+class TestServiceProvider(service_fakes.TestFederatedIdentity):
+
+ def setUp(self):
+ super(TestServiceProvider, self).setUp()
+
+ federation_lib = self.app.client_manager.identity.federation
+ self.service_providers_mock = federation_lib.service_providers
+ self.service_providers_mock.reset_mock()
+
+
+class TestServiceProviderCreate(TestServiceProvider):
+
+ columns = (
+ 'auth_url',
+ 'description',
+ 'enabled',
+ 'id',
+ 'sp_url',
+ )
+ datalist = (
+ service_fakes.sp_auth_url,
+ service_fakes.sp_description,
+ True,
+ service_fakes.sp_id,
+ service_fakes.service_provider_url
+ )
+
+ def setUp(self):
+ super(TestServiceProviderCreate, self).setUp()
+
+ copied_sp = copy.deepcopy(service_fakes.SERVICE_PROVIDER)
+ resource = fakes.FakeResource(None, copied_sp, loaded=True)
+ self.service_providers_mock.create.return_value = resource
+ self.cmd = service_provider.CreateServiceProvider(self.app, None)
+
+ def test_create_service_provider_required_options_only(self):
+ arglist = [
+ '--auth-url', service_fakes.sp_auth_url,
+ '--service-provider-url', service_fakes.service_provider_url,
+ service_fakes.sp_id,
+ ]
+ verifylist = [
+ ('auth_url', service_fakes.sp_auth_url),
+ ('service_provider_url', service_fakes.service_provider_url),
+ ('service_provider_id', service_fakes.sp_id),
+
+ ]
+ parsed_args = self.check_parser(self.cmd, arglist, verifylist)
+ columns, data = self.cmd.take_action(parsed_args)
+
+ # Set expected values
+ kwargs = {
+ 'enabled': True,
+ 'description': None,
+ 'auth_url': service_fakes.sp_auth_url,
+ 'sp_url': service_fakes.service_provider_url
+ }
+
+ self.service_providers_mock.create.assert_called_with(
+ id=service_fakes.sp_id,
+ **kwargs
+ )
+
+ self.assertEqual(self.columns, columns)
+ self.assertEqual(self.datalist, data)
+
+ def test_create_service_provider_description(self):
+
+ arglist = [
+ '--description', service_fakes.sp_description,
+ '--auth-url', service_fakes.sp_auth_url,
+ '--service-provider-url', service_fakes.service_provider_url,
+ service_fakes.sp_id,
+ ]
+ verifylist = [
+ ('description', service_fakes.sp_description),
+ ('auth_url', service_fakes.sp_auth_url),
+ ('service_provider_url', service_fakes.service_provider_url),
+ ('service_provider_id', service_fakes.sp_id),
+ ]
+
+ parsed_args = self.check_parser(self.cmd, arglist, verifylist)
+ columns, data = self.cmd.take_action(parsed_args)
+
+ # Set expected values
+ kwargs = {
+ 'description': service_fakes.sp_description,
+ 'auth_url': service_fakes.sp_auth_url,
+ 'sp_url': service_fakes.service_provider_url,
+ 'enabled': True,
+ }
+
+ self.service_providers_mock.create.assert_called_with(
+ id=service_fakes.sp_id,
+ **kwargs
+ )
+
+ self.assertEqual(self.columns, columns)
+ self.assertEqual(self.datalist, data)
+
+ def test_create_service_provider_disabled(self):
+
+ # Prepare FakeResource object
+ service_provider = copy.deepcopy(service_fakes.SERVICE_PROVIDER)
+ service_provider['enabled'] = False
+ service_provider['description'] = None
+
+ resource = fakes.FakeResource(None, service_provider, loaded=True)
+ self.service_providers_mock.create.return_value = resource
+
+ arglist = [
+ '--auth-url', service_fakes.sp_auth_url,
+ '--service-provider-url', service_fakes.service_provider_url,
+ '--disable',
+ service_fakes.sp_id,
+ ]
+ verifylist = [
+ ('auth_url', service_fakes.sp_auth_url),
+ ('service_provider_url', service_fakes.service_provider_url),
+ ('service_provider_id', service_fakes.sp_id),
+ ]
+ parsed_args = self.check_parser(self.cmd, arglist, verifylist)
+ columns, data = self.cmd.take_action(parsed_args)
+ # Set expected values
+ kwargs = {
+ 'auth_url': service_fakes.sp_auth_url,
+ 'sp_url': service_fakes.service_provider_url,
+ 'enabled': False,
+ 'description': None,
+ }
+
+ self.service_providers_mock.create.assert_called_with(
+ id=service_fakes.sp_id,
+ **kwargs
+ )
+ self.assertEqual(self.columns, columns)
+ datalist = (
+ service_fakes.sp_auth_url,
+ None,
+ False,
+ service_fakes.sp_id,
+ service_fakes.service_provider_url
+ )
+ self.assertEqual(datalist, data)
+
+
+class TestServiceProviderDelete(TestServiceProvider):
+
+ def setUp(self):
+ super(TestServiceProviderDelete, self).setUp()
+
+ # This is the return value for utils.find_resource()
+ self.service_providers_mock.get.return_value = fakes.FakeResource(
+ None,
+ copy.deepcopy(service_fakes.SERVICE_PROVIDER),
+ loaded=True,
+ )
+
+ self.service_providers_mock.delete.return_value = None
+ self.cmd = service_provider.DeleteServiceProvider(self.app, None)
+
+ def test_delete_service_provider(self):
+ arglist = [
+ service_fakes.sp_id,
+ ]
+ verifylist = [
+ ('service_provider', [service_fakes.sp_id]),
+ ]
+ parsed_args = self.check_parser(self.cmd, arglist, verifylist)
+
+ result = self.cmd.take_action(parsed_args)
+
+ self.service_providers_mock.delete.assert_called_with(
+ service_fakes.sp_id,
+ )
+ self.assertIsNone(result)
+
+
+class TestServiceProviderList(TestServiceProvider):
+
+ def setUp(self):
+ super(TestServiceProviderList, self).setUp()
+
+ self.service_providers_mock.get.return_value = fakes.FakeResource(
+ None,
+ copy.deepcopy(service_fakes.SERVICE_PROVIDER),
+ loaded=True,
+ )
+ self.service_providers_mock.list.return_value = [
+ fakes.FakeResource(
+ None,
+ copy.deepcopy(service_fakes.SERVICE_PROVIDER),
+ loaded=True,
+ ),
+ ]
+
+ # Get the command object to test
+ self.cmd = service_provider.ListServiceProvider(self.app, None)
+
+ def test_service_provider_list_no_options(self):
+ arglist = []
+ verifylist = []
+ parsed_args = self.check_parser(self.cmd, arglist, verifylist)
+
+ # In base command class Lister in cliff, abstract method take_action()
+ # returns a tuple containing the column names and an iterable
+ # containing the data to be listed.
+ columns, data = self.cmd.take_action(parsed_args)
+
+ self.service_providers_mock.list.assert_called_with()
+
+ collist = ('ID', 'Enabled', 'Description', 'Auth URL')
+ self.assertEqual(collist, columns)
+ datalist = ((
+ service_fakes.sp_id,
+ True,
+ service_fakes.sp_description,
+ service_fakes.sp_auth_url
+ ), )
+ self.assertEqual(tuple(data), datalist)
+
+
+class TestServiceProviderSet(TestServiceProvider):
+
+ columns = (
+ 'auth_url',
+ 'description',
+ 'enabled',
+ 'id',
+ 'sp_url',
+ )
+ datalist = (
+ service_fakes.sp_auth_url,
+ service_fakes.sp_description,
+ False,
+ service_fakes.sp_id,
+ service_fakes.service_provider_url,
+ )
+
+ def setUp(self):
+ super(TestServiceProviderSet, self).setUp()
+ self.cmd = service_provider.SetServiceProvider(self.app, None)
+
+ def test_service_provider_disable(self):
+ """Disable Service Provider
+
+ Set Service Provider's ``enabled`` attribute to False.
+ """
+
+ def prepare(self):
+ """Prepare fake return objects before the test is executed"""
+ updated_sp = copy.deepcopy(service_fakes.SERVICE_PROVIDER)
+ updated_sp['enabled'] = False
+ resources = fakes.FakeResource(
+ None,
+ updated_sp,
+ loaded=True
+ )
+ self.service_providers_mock.update.return_value = resources
+
+ prepare(self)
+ arglist = [
+ '--disable', service_fakes.sp_id,
+ ]
+ verifylist = [
+ ('service_provider', service_fakes.sp_id),
+ ('enable', False),
+ ('disable', True),
+ ]
+ parsed_args = self.check_parser(self.cmd, arglist, verifylist)
+ self.cmd.take_action(parsed_args)
+ self.service_providers_mock.update.assert_called_with(
+ service_fakes.sp_id,
+ enabled=False,
+ description=None,
+ auth_url=None,
+ sp_url=None
+ )
+
+ def test_service_provider_enable(self):
+ """Enable Service Provider.
+
+ Set Service Provider's ``enabled`` attribute to True.
+ """
+
+ def prepare(self):
+ """Prepare fake return objects before the test is executed"""
+ resources = fakes.FakeResource(
+ None,
+ copy.deepcopy(service_fakes.SERVICE_PROVIDER),
+ loaded=True
+ )
+ self.service_providers_mock.update.return_value = resources
+
+ prepare(self)
+ arglist = [
+ '--enable', service_fakes.sp_id,
+ ]
+ verifylist = [
+ ('service_provider', service_fakes.sp_id),
+ ('enable', True),
+ ('disable', False),
+ ]
+ parsed_args = self.check_parser(self.cmd, arglist, verifylist)
+
+ self.cmd.take_action(parsed_args)
+ self.service_providers_mock.update.assert_called_with(
+ service_fakes.sp_id, enabled=True, description=None,
+ auth_url=None, sp_url=None)
+
+ def test_service_provider_no_options(self):
+ def prepare(self):
+ """Prepare fake return objects before the test is executed"""
+ resources = fakes.FakeResource(
+ None,
+ copy.deepcopy(service_fakes.SERVICE_PROVIDER),
+ loaded=True
+ )
+ self.service_providers_mock.get.return_value = resources
+
+ resources = fakes.FakeResource(
+ None,
+ copy.deepcopy(service_fakes.SERVICE_PROVIDER),
+ loaded=True,
+ )
+ self.service_providers_mock.update.return_value = resources
+
+ prepare(self)
+ arglist = [
+ service_fakes.sp_id,
+ ]
+ verifylist = [
+ ('service_provider', service_fakes.sp_id),
+ ('description', None),
+ ('enable', False),
+ ('disable', False),
+ ('auth_url', None),
+ ('service_provider_url', None),
+ ]
+ parsed_args = self.check_parser(self.cmd, arglist, verifylist)
+
+ self.cmd.take_action(parsed_args)
+
+
+class TestServiceProviderShow(TestServiceProvider):
+
+ def setUp(self):
+ super(TestServiceProviderShow, self).setUp()
+
+ ret = fakes.FakeResource(
+ None,
+ copy.deepcopy(service_fakes.SERVICE_PROVIDER),
+ loaded=True,
+ )
+ self.service_providers_mock.get.side_effect = [Exception("Not found"),
+ ret]
+ self.service_providers_mock.get.return_value = ret
+
+ # Get the command object to test
+ self.cmd = service_provider.ShowServiceProvider(self.app, None)
+
+ def test_service_provider_show(self):
+ arglist = [
+ service_fakes.sp_id,
+ ]
+ verifylist = [
+ ('service_provider', service_fakes.sp_id),
+ ]
+ parsed_args = self.check_parser(self.cmd, arglist, verifylist)
+
+ columns, data = self.cmd.take_action(parsed_args)
+
+ self.service_providers_mock.get.assert_called_with(
+ service_fakes.sp_id,
+ id='BETA'
+ )
+
+ collist = ('auth_url', 'description', 'enabled', 'id', 'sp_url')
+ self.assertEqual(collist, columns)
+ datalist = (
+ service_fakes.sp_auth_url,
+ service_fakes.sp_description,
+ True,
+ service_fakes.sp_id,
+ service_fakes.service_provider_url
+ )
+ self.assertEqual(data, datalist)
diff --git a/openstackclient/tests/unit/identity/v3/test_token.py b/openstackclient/tests/unit/identity/v3/test_token.py
new file mode 100644
index 00000000..7321909f
--- /dev/null
+++ b/openstackclient/tests/unit/identity/v3/test_token.py
@@ -0,0 +1,138 @@
+# Copyright 2014 eBay Inc.
+#
+# 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 mock
+
+from openstackclient.identity.v3 import token
+from openstackclient.tests.unit.identity.v3 import fakes as identity_fakes
+
+
+class TestToken(identity_fakes.TestIdentityv3):
+
+ def setUp(self):
+ super(TestToken, self).setUp()
+
+ # Get a shortcut to the Auth Ref Mock
+ self.ar_mock = mock.PropertyMock()
+ type(self.app.client_manager).auth_ref = self.ar_mock
+
+
+class TestTokenIssue(TestToken):
+
+ def setUp(self):
+ super(TestTokenIssue, self).setUp()
+
+ self.cmd = token.IssueToken(self.app, None)
+
+ def test_token_issue_with_project_id(self):
+ auth_ref = identity_fakes.fake_auth_ref(
+ identity_fakes.TOKEN_WITH_PROJECT_ID,
+ )
+ self.ar_mock = mock.PropertyMock(return_value=auth_ref)
+ type(self.app.client_manager).auth_ref = self.ar_mock
+
+ arglist = []
+ verifylist = []
+ parsed_args = self.check_parser(self.cmd, arglist, verifylist)
+
+ # In base command class ShowOne in cliff, abstract method take_action()
+ # returns a two-part tuple with a tuple of column names and a tuple of
+ # data to be shown.
+ columns, data = self.cmd.take_action(parsed_args)
+
+ collist = ('expires', 'id', 'project_id', 'user_id')
+ self.assertEqual(collist, columns)
+ datalist = (
+ identity_fakes.token_expires,
+ identity_fakes.token_id,
+ identity_fakes.project_id,
+ identity_fakes.user_id,
+ )
+ self.assertEqual(datalist, data)
+
+ def test_token_issue_with_domain_id(self):
+ auth_ref = identity_fakes.fake_auth_ref(
+ identity_fakes.TOKEN_WITH_DOMAIN_ID,
+ )
+ self.ar_mock = mock.PropertyMock(return_value=auth_ref)
+ type(self.app.client_manager).auth_ref = self.ar_mock
+
+ arglist = []
+ verifylist = []
+ parsed_args = self.check_parser(self.cmd, arglist, verifylist)
+
+ # In base command class ShowOne in cliff, abstract method take_action()
+ # returns a two-part tuple with a tuple of column names and a tuple of
+ # data to be shown.
+ columns, data = self.cmd.take_action(parsed_args)
+
+ collist = ('domain_id', 'expires', 'id', 'user_id')
+ self.assertEqual(collist, columns)
+ datalist = (
+ identity_fakes.domain_id,
+ identity_fakes.token_expires,
+ identity_fakes.token_id,
+ identity_fakes.user_id,
+ )
+ self.assertEqual(datalist, data)
+
+ def test_token_issue_with_unscoped(self):
+ auth_ref = identity_fakes.fake_auth_ref(
+ identity_fakes.UNSCOPED_TOKEN,
+ )
+ self.ar_mock = mock.PropertyMock(return_value=auth_ref)
+ type(self.app.client_manager).auth_ref = self.ar_mock
+
+ arglist = []
+ verifylist = []
+ parsed_args = self.check_parser(self.cmd, arglist, verifylist)
+
+ # DisplayCommandBase.take_action() returns two tuples
+ columns, data = self.cmd.take_action(parsed_args)
+
+ collist = (
+ 'expires',
+ 'id',
+ 'user_id',
+ )
+ self.assertEqual(collist, columns)
+ datalist = (
+ identity_fakes.token_expires,
+ identity_fakes.token_id,
+ identity_fakes.user_id,
+ )
+ self.assertEqual(datalist, data)
+
+
+class TestTokenRevoke(TestToken):
+
+ TOKEN = 'fob'
+
+ def setUp(self):
+ super(TestTokenRevoke, self).setUp()
+ self.tokens_mock = self.app.client_manager.identity.tokens
+ self.tokens_mock.reset_mock()
+ self.tokens_mock.revoke_token.return_value = True
+ self.cmd = token.RevokeToken(self.app, None)
+
+ def test_token_revoke(self):
+ arglist = [self.TOKEN]
+ verifylist = [('token', self.TOKEN)]
+ parsed_args = self.check_parser(self.cmd, arglist, verifylist)
+
+ result = self.cmd.take_action(parsed_args)
+
+ self.tokens_mock.revoke_token.assert_called_with(self.TOKEN)
+ self.assertIsNone(result)
diff --git a/openstackclient/tests/unit/identity/v3/test_trust.py b/openstackclient/tests/unit/identity/v3/test_trust.py
new file mode 100644
index 00000000..4eeb8bfe
--- /dev/null
+++ b/openstackclient/tests/unit/identity/v3/test_trust.py
@@ -0,0 +1,236 @@
+# 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 copy
+
+from openstackclient.identity.v3 import trust
+from openstackclient.tests.unit import fakes
+from openstackclient.tests.unit.identity.v3 import fakes as identity_fakes
+
+
+class TestTrust(identity_fakes.TestIdentityv3):
+
+ def setUp(self):
+ super(TestTrust, self).setUp()
+
+ self.trusts_mock = self.app.client_manager.identity.trusts
+ self.trusts_mock.reset_mock()
+ self.projects_mock = self.app.client_manager.identity.projects
+ self.projects_mock.reset_mock()
+ self.users_mock = self.app.client_manager.identity.users
+ self.users_mock.reset_mock()
+ self.roles_mock = self.app.client_manager.identity.roles
+ self.roles_mock.reset_mock()
+
+
+class TestTrustCreate(TestTrust):
+
+ def setUp(self):
+ super(TestTrustCreate, self).setUp()
+
+ self.projects_mock.get.return_value = fakes.FakeResource(
+ None,
+ copy.deepcopy(identity_fakes.PROJECT),
+ loaded=True,
+ )
+
+ self.users_mock.get.return_value = fakes.FakeResource(
+ None,
+ copy.deepcopy(identity_fakes.USER),
+ loaded=True,
+ )
+
+ self.roles_mock.get.return_value = fakes.FakeResource(
+ None,
+ copy.deepcopy(identity_fakes.ROLE),
+ loaded=True,
+ )
+
+ self.trusts_mock.create.return_value = fakes.FakeResource(
+ None,
+ copy.deepcopy(identity_fakes.TRUST),
+ loaded=True,
+ )
+
+ # Get the command object to test
+ self.cmd = trust.CreateTrust(self.app, None)
+
+ def test_trust_create_basic(self):
+ arglist = [
+ '--project', identity_fakes.project_id,
+ '--role', identity_fakes.role_id,
+ identity_fakes.user_id,
+ identity_fakes.user_id
+ ]
+ verifylist = [
+ ('project', identity_fakes.project_id),
+ ('impersonate', False),
+ ('role', [identity_fakes.role_id]),
+ ('trustor', identity_fakes.user_id),
+ ('trustee', identity_fakes.user_id),
+ ]
+ parsed_args = self.check_parser(self.cmd, arglist, verifylist)
+
+ # In base command class ShowOne in cliff, abstract method take_action()
+ # returns a two-part tuple with a tuple of column names and a tuple of
+ # data to be shown.
+ columns, data = self.cmd.take_action(parsed_args)
+
+ # Set expected values
+ kwargs = {
+ 'impersonation': False,
+ 'project': identity_fakes.project_id,
+ 'role_names': [identity_fakes.role_name],
+ 'expires_at': None,
+ }
+ # TrustManager.create(trustee_id, trustor_id, impersonation=,
+ # project=, role_names=, expires_at=)
+ self.trusts_mock.create.assert_called_with(
+ identity_fakes.user_id,
+ identity_fakes.user_id,
+ **kwargs
+ )
+
+ collist = ('expires_at', 'id', 'impersonation', 'project_id',
+ 'roles', 'trustee_user_id', 'trustor_user_id')
+ self.assertEqual(collist, columns)
+ datalist = (
+ identity_fakes.trust_expires,
+ identity_fakes.trust_id,
+ identity_fakes.trust_impersonation,
+ identity_fakes.project_id,
+ identity_fakes.role_name,
+ identity_fakes.user_id,
+ identity_fakes.user_id
+ )
+ self.assertEqual(datalist, data)
+
+
+class TestTrustDelete(TestTrust):
+
+ def setUp(self):
+ super(TestTrustDelete, self).setUp()
+
+ # This is the return value for utils.find_resource()
+ self.trusts_mock.get.return_value = fakes.FakeResource(
+ None,
+ copy.deepcopy(identity_fakes.TRUST),
+ loaded=True,
+ )
+ self.trusts_mock.delete.return_value = None
+
+ # Get the command object to test
+ self.cmd = trust.DeleteTrust(self.app, None)
+
+ def test_trust_delete(self):
+ arglist = [
+ identity_fakes.trust_id,
+ ]
+ verifylist = [
+ ('trust', [identity_fakes.trust_id])
+ ]
+ parsed_args = self.check_parser(self.cmd, arglist, verifylist)
+
+ result = self.cmd.take_action(parsed_args)
+
+ self.trusts_mock.delete.assert_called_with(
+ identity_fakes.trust_id,
+ )
+ self.assertIsNone(result)
+
+
+class TestTrustList(TestTrust):
+
+ def setUp(self):
+ super(TestTrustList, self).setUp()
+
+ self.trusts_mock.list.return_value = [
+ fakes.FakeResource(
+ None,
+ copy.deepcopy(identity_fakes.TRUST),
+ loaded=True,
+ ),
+ ]
+
+ # Get the command object to test
+ self.cmd = trust.ListTrust(self.app, None)
+
+ def test_trust_list_no_options(self):
+ arglist = []
+ verifylist = []
+ parsed_args = self.check_parser(self.cmd, arglist, verifylist)
+
+ # In base command class Lister in cliff, abstract method take_action()
+ # returns a tuple containing the column names and an iterable
+ # containing the data to be listed.
+ columns, data = self.cmd.take_action(parsed_args)
+
+ self.trusts_mock.list.assert_called_with()
+
+ collist = ('ID', 'Expires At', 'Impersonation', 'Project ID',
+ 'Trustee User ID', 'Trustor User ID')
+ self.assertEqual(collist, columns)
+ datalist = ((
+ identity_fakes.trust_id,
+ identity_fakes.trust_expires,
+ identity_fakes.trust_impersonation,
+ identity_fakes.project_id,
+ identity_fakes.user_id,
+ identity_fakes.user_id
+ ), )
+ self.assertEqual(datalist, tuple(data))
+
+
+class TestTrustShow(TestTrust):
+
+ def setUp(self):
+ super(TestTrustShow, self).setUp()
+
+ self.trusts_mock.get.return_value = fakes.FakeResource(
+ None,
+ copy.deepcopy(identity_fakes.TRUST),
+ loaded=True,
+ )
+
+ # Get the command object to test
+ self.cmd = trust.ShowTrust(self.app, None)
+
+ def test_trust_show(self):
+ arglist = [
+ identity_fakes.trust_id,
+ ]
+ verifylist = [
+ ('trust', identity_fakes.trust_id),
+ ]
+ parsed_args = self.check_parser(self.cmd, arglist, verifylist)
+
+ # In base command class ShowOne in cliff, abstract method take_action()
+ # returns a two-part tuple with a tuple of column names and a tuple of
+ # data to be shown.
+ columns, data = self.cmd.take_action(parsed_args)
+
+ self.trusts_mock.get.assert_called_with(identity_fakes.trust_id)
+
+ collist = ('expires_at', 'id', 'impersonation', 'project_id',
+ 'roles', 'trustee_user_id', 'trustor_user_id')
+ self.assertEqual(collist, columns)
+ datalist = (
+ identity_fakes.trust_expires,
+ identity_fakes.trust_id,
+ identity_fakes.trust_impersonation,
+ identity_fakes.project_id,
+ identity_fakes.role_name,
+ identity_fakes.user_id,
+ identity_fakes.user_id
+ )
+ self.assertEqual(datalist, data)
diff --git a/openstackclient/tests/unit/identity/v3/test_unscoped_saml.py b/openstackclient/tests/unit/identity/v3/test_unscoped_saml.py
new file mode 100644
index 00000000..9e4e1876
--- /dev/null
+++ b/openstackclient/tests/unit/identity/v3/test_unscoped_saml.py
@@ -0,0 +1,133 @@
+# 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 copy
+
+from osc_lib import exceptions
+
+from openstackclient.identity.v3 import unscoped_saml
+from openstackclient.tests.unit import fakes
+from openstackclient.tests.unit.identity.v3 import fakes as identity_fakes
+
+
+class TestUnscopedSAML(identity_fakes.TestFederatedIdentity):
+
+ def setUp(self):
+ super(TestUnscopedSAML, self).setUp()
+
+ federation_lib = self.app.client_manager.identity.federation
+ self.projects_mock = federation_lib.projects
+ self.projects_mock.reset_mock()
+ self.domains_mock = federation_lib.domains
+ self.domains_mock.reset_mock()
+
+
+class TestDomainList(TestUnscopedSAML):
+
+ def setUp(self):
+ super(TestDomainList, self).setUp()
+
+ self.domains_mock.list.return_value = [
+ fakes.FakeResource(
+ None,
+ copy.deepcopy(identity_fakes.DOMAIN),
+ loaded=True,
+ ),
+ ]
+
+ # Get the command object to test
+ self.cmd = unscoped_saml.ListAccessibleDomains(self.app, None)
+
+ def test_accessible_domains_list(self):
+ self.app.client_manager.auth_plugin_name = 'v3unscopedsaml'
+ arglist = []
+ verifylist = []
+ parsed_args = self.check_parser(self.cmd, arglist, verifylist)
+
+ # In base command class Lister in cliff, abstract method take_action()
+ # returns a tuple containing the column names and an iterable
+ # containing the data to be listed.
+ columns, data = self.cmd.take_action(parsed_args)
+
+ self.domains_mock.list.assert_called_with()
+
+ collist = ('ID', 'Enabled', 'Name', 'Description')
+ self.assertEqual(collist, columns)
+ datalist = ((
+ identity_fakes.domain_id,
+ True,
+ identity_fakes.domain_name,
+ identity_fakes.domain_description,
+ ), )
+ self.assertEqual(datalist, tuple(data))
+
+ def test_accessible_domains_list_wrong_auth(self):
+ auth = identity_fakes.FakeAuth("wrong auth")
+ self.app.client_manager.identity.session.auth = auth
+ arglist = []
+ verifylist = []
+ parsed_args = self.check_parser(self.cmd, arglist, verifylist)
+
+ self.assertRaises(exceptions.CommandError,
+ self.cmd.take_action,
+ parsed_args)
+
+
+class TestProjectList(TestUnscopedSAML):
+
+ def setUp(self):
+ super(TestProjectList, self).setUp()
+
+ self.projects_mock.list.return_value = [
+ fakes.FakeResource(
+ None,
+ copy.deepcopy(identity_fakes.PROJECT),
+ loaded=True,
+ ),
+ ]
+
+ # Get the command object to test
+ self.cmd = unscoped_saml.ListAccessibleProjects(self.app, None)
+
+ def test_accessible_projects_list(self):
+ self.app.client_manager.auth_plugin_name = 'v3unscopedsaml'
+ arglist = []
+ verifylist = []
+ parsed_args = self.check_parser(self.cmd, arglist, verifylist)
+
+ # In base command class Lister in cliff, abstract method take_action()
+ # returns a tuple containing the column names and an iterable
+ # containing the data to be listed.
+ columns, data = self.cmd.take_action(parsed_args)
+
+ self.projects_mock.list.assert_called_with()
+
+ collist = ('ID', 'Domain ID', 'Enabled', 'Name')
+ self.assertEqual(collist, columns)
+ datalist = ((
+ identity_fakes.project_id,
+ identity_fakes.domain_id,
+ True,
+ identity_fakes.project_name,
+ ), )
+ self.assertEqual(datalist, tuple(data))
+
+ def test_accessible_projects_list_wrong_auth(self):
+ auth = identity_fakes.FakeAuth("wrong auth")
+ self.app.client_manager.identity.session.auth = auth
+ arglist = []
+ verifylist = []
+ parsed_args = self.check_parser(self.cmd, arglist, verifylist)
+
+ self.assertRaises(exceptions.CommandError,
+ self.cmd.take_action,
+ parsed_args)
diff --git a/openstackclient/tests/unit/identity/v3/test_user.py b/openstackclient/tests/unit/identity/v3/test_user.py
new file mode 100644
index 00000000..6150a5f3
--- /dev/null
+++ b/openstackclient/tests/unit/identity/v3/test_user.py
@@ -0,0 +1,1063 @@
+# Copyright 2013 Nebula Inc.
+#
+# 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 contextlib
+import mock
+
+from openstackclient.identity.v3 import user
+from openstackclient.tests.unit.identity.v3 import fakes as identity_fakes
+
+
+class TestUser(identity_fakes.TestIdentityv3):
+
+ def setUp(self):
+ super(TestUser, self).setUp()
+
+ # Get a shortcut to the DomainManager Mock
+ self.domains_mock = self.app.client_manager.identity.domains
+ self.domains_mock.reset_mock()
+
+ # Get a shortcut to the ProjectManager Mock
+ self.projects_mock = self.app.client_manager.identity.projects
+ self.projects_mock.reset_mock()
+
+ # Get a shortcut to the GroupManager Mock
+ self.groups_mock = self.app.client_manager.identity.groups
+ self.groups_mock.reset_mock()
+
+ # Get a shortcut to the UserManager Mock
+ self.users_mock = self.app.client_manager.identity.users
+ self.users_mock.reset_mock()
+
+ # Shortcut for RoleAssignmentManager Mock
+ self.role_assignments_mock = self.app.client_manager.identity.\
+ role_assignments
+ self.role_assignments_mock.reset_mock()
+
+
+class TestUserCreate(TestUser):
+
+ domain = identity_fakes.FakeDomain.create_one_domain()
+ project = identity_fakes.FakeProject.create_one_project()
+
+ columns = (
+ 'default_project_id',
+ 'domain_id',
+ 'email',
+ 'enabled',
+ 'id',
+ 'name',
+ )
+
+ def setUp(self):
+ super(TestUserCreate, self).setUp()
+
+ self.user = identity_fakes.FakeUser.create_one_user(
+ attrs={'domain_id': self.domain.id,
+ 'default_project_id': self.project.id}
+ )
+ self.datalist = (
+ self.project.id,
+ self.domain.id,
+ self.user.email,
+ True,
+ self.user.id,
+ self.user.name,
+ )
+
+ self.domains_mock.get.return_value = self.domain
+ self.projects_mock.get.return_value = self.project
+ self.users_mock.create.return_value = self.user
+
+ # Get the command object to test
+ self.cmd = user.CreateUser(self.app, None)
+
+ def test_user_create_no_options(self):
+ arglist = [
+ self.user.name,
+ ]
+ verifylist = [
+ ('enable', False),
+ ('disable', False),
+ ('name', self.user.name),
+ ]
+ parsed_args = self.check_parser(self.cmd, arglist, verifylist)
+
+ # In base command class ShowOne in cliff, abstract method take_action()
+ # returns a two-part tuple with a tuple of column names and a tuple of
+ # data to be shown.
+ columns, data = self.cmd.take_action(parsed_args)
+
+ # Set expected values
+ kwargs = {
+ 'name': self.user.name,
+ 'default_project': None,
+ 'description': None,
+ 'domain': None,
+ 'email': None,
+ 'enabled': True,
+ 'password': None,
+ }
+
+ # UserManager.create(name=, domain=, project=, password=, email=,
+ # description=, enabled=, default_project=)
+ self.users_mock.create.assert_called_with(
+ **kwargs
+ )
+
+ self.assertEqual(self.columns, columns)
+ self.assertEqual(self.datalist, data)
+
+ def test_user_create_password(self):
+ arglist = [
+ '--password', 'secret',
+ self.user.name,
+ ]
+ verifylist = [
+ ('password', 'secret'),
+ ('password_prompt', False),
+ ('enable', False),
+ ('disable', False),
+ ('name', self.user.name),
+ ]
+ parsed_args = self.check_parser(self.cmd, arglist, verifylist)
+
+ # In base command class ShowOne in cliff, abstract method take_action()
+ # returns a two-part tuple with a tuple of column names and a tuple of
+ # data to be shown.
+ columns, data = self.cmd.take_action(parsed_args)
+
+ # Set expected values
+ kwargs = {
+ 'name': self.user.name,
+ 'default_project': None,
+ 'description': None,
+ 'domain': None,
+ 'email': None,
+ 'enabled': True,
+ 'password': 'secret',
+ }
+ # UserManager.create(name=, domain=, project=, password=, email=,
+ # description=, enabled=, default_project=)
+ self.users_mock.create.assert_called_with(
+ **kwargs
+ )
+ self.assertEqual(self.columns, columns)
+ self.assertEqual(self.datalist, data)
+
+ def test_user_create_password_prompt(self):
+ arglist = [
+ '--password-prompt',
+ self.user.name,
+ ]
+ verifylist = [
+ ('password', None),
+ ('password_prompt', True),
+ ('enable', False),
+ ('disable', False),
+ ('name', self.user.name),
+ ]
+ parsed_args = self.check_parser(self.cmd, arglist, verifylist)
+
+ # In base command class ShowOne in cliff, abstract method take_action()
+ # returns a two-part tuple with a tuple of column names and a tuple of
+ # data to be shown.
+ mocker = mock.Mock()
+ mocker.return_value = 'abc123'
+ with mock.patch("osc_lib.utils.get_password", mocker):
+ columns, data = self.cmd.take_action(parsed_args)
+
+ # Set expected values
+ kwargs = {
+ 'name': self.user.name,
+ 'default_project': None,
+ 'description': None,
+ 'domain': None,
+ 'email': None,
+ 'enabled': True,
+ 'password': 'abc123',
+ }
+ # UserManager.create(name=, domain=, project=, password=, email=,
+ # description=, enabled=, default_project=)
+ self.users_mock.create.assert_called_with(
+ **kwargs
+ )
+
+ self.assertEqual(self.columns, columns)
+ self.assertEqual(self.datalist, data)
+
+ def test_user_create_email(self):
+ arglist = [
+ '--email', 'barney@example.com',
+ self.user.name,
+ ]
+ verifylist = [
+ ('email', 'barney@example.com'),
+ ('enable', False),
+ ('disable', False),
+ ('name', self.user.name),
+ ]
+ parsed_args = self.check_parser(self.cmd, arglist, verifylist)
+
+ # In base command class ShowOne in cliff, abstract method take_action()
+ # returns a two-part tuple with a tuple of column names and a tuple of
+ # data to be shown.
+ columns, data = self.cmd.take_action(parsed_args)
+
+ # Set expected values
+ kwargs = {
+ 'name': self.user.name,
+ 'default_project': None,
+ 'description': None,
+ 'domain': None,
+ 'email': 'barney@example.com',
+ 'enabled': True,
+ 'password': None,
+ }
+ # UserManager.create(name=, domain=, project=, password=, email=,
+ # description=, enabled=, default_project=)
+ self.users_mock.create.assert_called_with(
+ **kwargs
+ )
+
+ self.assertEqual(self.columns, columns)
+ self.assertEqual(self.datalist, data)
+
+ def test_user_create_project(self):
+ arglist = [
+ '--project', self.project.name,
+ self.user.name,
+ ]
+ verifylist = [
+ ('project', self.project.name),
+ ('enable', False),
+ ('disable', False),
+ ('name', self.user.name),
+ ]
+ parsed_args = self.check_parser(self.cmd, arglist, verifylist)
+
+ # In base command class ShowOne in cliff, abstract method take_action()
+ # returns a two-part tuple with a tuple of column names and a tuple of
+ # data to be shown.
+ columns, data = self.cmd.take_action(parsed_args)
+
+ # Set expected values
+ kwargs = {
+ 'name': self.user.name,
+ 'default_project': self.project.id,
+ 'description': None,
+ 'domain': None,
+ 'email': None,
+ 'enabled': True,
+ 'password': None,
+ }
+ # UserManager.create(name=, domain=, project=, password=, email=,
+ # description=, enabled=, default_project=)
+ self.users_mock.create.assert_called_with(
+ **kwargs
+ )
+
+ self.assertEqual(self.columns, columns)
+ datalist = (
+ self.project.id,
+ self.domain.id,
+ self.user.email,
+ True,
+ self.user.id,
+ self.user.name,
+ )
+ self.assertEqual(datalist, data)
+
+ def test_user_create_project_domain(self):
+ arglist = [
+ '--project', self.project.name,
+ '--project-domain', self.project.domain_id,
+ self.user.name,
+ ]
+ verifylist = [
+ ('project', self.project.name),
+ ('project_domain', self.project.domain_id),
+ ('enable', False),
+ ('disable', False),
+ ('name', self.user.name),
+ ]
+ parsed_args = self.check_parser(self.cmd, arglist, verifylist)
+
+ # In base command class ShowOne in cliff, abstract method take_action()
+ # returns a two-part tuple with a tuple of column names and a tuple of
+ # data to be shown.
+ columns, data = self.cmd.take_action(parsed_args)
+
+ # Set expected values
+ kwargs = {
+ 'name': self.user.name,
+ 'default_project': self.project.id,
+ 'description': None,
+ 'domain': None,
+ 'email': None,
+ 'enabled': True,
+ 'password': None,
+ }
+ # UserManager.create(name=, domain=, project=, password=, email=,
+ # description=, enabled=, default_project=)
+ self.users_mock.create.assert_called_with(
+ **kwargs
+ )
+
+ self.assertEqual(self.columns, columns)
+ datalist = (
+ self.project.id,
+ self.domain.id,
+ self.user.email,
+ True,
+ self.user.id,
+ self.user.name,
+ )
+ self.assertEqual(datalist, data)
+
+ def test_user_create_domain(self):
+ arglist = [
+ '--domain', self.domain.name,
+ self.user.name,
+ ]
+ verifylist = [
+ ('domain', self.domain.name),
+ ('enable', False),
+ ('disable', False),
+ ('name', self.user.name),
+ ]
+ parsed_args = self.check_parser(self.cmd, arglist, verifylist)
+
+ # In base command class ShowOne in cliff, abstract method take_action()
+ # returns a two-part tuple with a tuple of column names and a tuple of
+ # data to be shown.
+ columns, data = self.cmd.take_action(parsed_args)
+
+ # Set expected values
+ kwargs = {
+ 'name': self.user.name,
+ 'default_project': None,
+ 'description': None,
+ 'domain': self.domain.id,
+ 'email': None,
+ 'enabled': True,
+ 'password': None,
+ }
+ # UserManager.create(name=, domain=, project=, password=, email=,
+ # description=, enabled=, default_project=)
+ self.users_mock.create.assert_called_with(
+ **kwargs
+ )
+
+ self.assertEqual(self.columns, columns)
+ self.assertEqual(self.datalist, data)
+
+ def test_user_create_enable(self):
+ arglist = [
+ '--enable',
+ self.user.name,
+ ]
+ verifylist = [
+ ('enable', True),
+ ('disable', False),
+ ('name', self.user.name),
+ ]
+ parsed_args = self.check_parser(self.cmd, arglist, verifylist)
+
+ # In base command class ShowOne in cliff, abstract method take_action()
+ # returns a two-part tuple with a tuple of column names and a tuple of
+ # data to be shown.
+ columns, data = self.cmd.take_action(parsed_args)
+
+ # Set expected values
+ kwargs = {
+ 'name': self.user.name,
+ 'default_project': None,
+ 'description': None,
+ 'domain': None,
+ 'email': None,
+ 'enabled': True,
+ 'password': None,
+ }
+ # UserManager.create(name=, domain=, project=, password=, email=,
+ # description=, enabled=, default_project=)
+ self.users_mock.create.assert_called_with(
+ **kwargs
+ )
+
+ self.assertEqual(self.columns, columns)
+ self.assertEqual(self.datalist, data)
+
+ def test_user_create_disable(self):
+ arglist = [
+ '--disable',
+ self.user.name,
+ ]
+ verifylist = [
+ ('name', self.user.name),
+ ('enable', False),
+ ('disable', True),
+ ]
+ parsed_args = self.check_parser(self.cmd, arglist, verifylist)
+
+ # In base command class ShowOne in cliff, abstract method take_action()
+ # returns a two-part tuple with a tuple of column names and a tuple of
+ # data to be shown.
+ columns, data = self.cmd.take_action(parsed_args)
+
+ # Set expected values
+ kwargs = {
+ 'name': self.user.name,
+ 'default_project': None,
+ 'description': None,
+ 'domain': None,
+ 'email': None,
+ 'enabled': False,
+ 'password': None,
+ }
+ # users.create(name=, password, email, tenant_id=None, enabled=True)
+ self.users_mock.create.assert_called_with(
+ **kwargs
+ )
+ self.assertEqual(self.columns, columns)
+ self.assertEqual(self.datalist, data)
+
+
+class TestUserDelete(TestUser):
+
+ user = identity_fakes.FakeUser.create_one_user()
+
+ def setUp(self):
+ super(TestUserDelete, self).setUp()
+
+ # This is the return value for utils.find_resource()
+ self.users_mock.get.return_value = self.user
+ self.users_mock.delete.return_value = None
+
+ # Get the command object to test
+ self.cmd = user.DeleteUser(self.app, None)
+
+ def test_user_delete_no_options(self):
+ arglist = [
+ self.user.id,
+ ]
+ verifylist = [
+ ('users', [self.user.id]),
+ ]
+ parsed_args = self.check_parser(self.cmd, arglist, verifylist)
+
+ result = self.cmd.take_action(parsed_args)
+
+ self.users_mock.delete.assert_called_with(
+ self.user.id,
+ )
+ self.assertIsNone(result)
+
+
+class TestUserList(TestUser):
+
+ domain = identity_fakes.FakeDomain.create_one_domain()
+ project = identity_fakes.FakeProject.create_one_project()
+ user = identity_fakes.FakeUser.create_one_user(
+ attrs={'domain_id': domain.id,
+ 'default_project_id': project.id}
+ )
+ group = identity_fakes.FakeGroup.create_one_group()
+ role_assignment = (
+ identity_fakes.FakeRoleAssignment.create_one_role_assignment(
+ attrs={'user': {'id': user.id}}))
+
+ columns = [
+ 'ID',
+ 'Name'
+ ]
+ datalist = (
+ (
+ user.id,
+ user.name,
+ ),
+ )
+
+ def setUp(self):
+ super(TestUserList, self).setUp()
+
+ self.users_mock.get.return_value = self.user
+ self.users_mock.list.return_value = [self.user]
+ self.domains_mock.get.return_value = self.domain
+ self.groups_mock.get.return_value = self.group
+ self.projects_mock.get.return_value = self.project
+ self.role_assignments_mock.list.return_value = [self.role_assignment]
+
+ # Get the command object to test
+ self.cmd = user.ListUser(self.app, None)
+
+ def test_user_list_no_options(self):
+ arglist = []
+ verifylist = []
+ parsed_args = self.check_parser(self.cmd, arglist, verifylist)
+
+ # In base command class Lister in cliff, abstract method take_action()
+ # returns a tuple containing the column names and an iterable
+ # containing the data to be listed.
+ columns, data = self.cmd.take_action(parsed_args)
+
+ # Set expected values
+ kwargs = {
+ 'domain': None,
+ 'group': None,
+ }
+
+ self.users_mock.list.assert_called_with(
+ **kwargs
+ )
+
+ self.assertEqual(self.columns, columns)
+ self.assertEqual(self.datalist, tuple(data))
+
+ def test_user_list_domain(self):
+ arglist = [
+ '--domain', self.domain.id,
+ ]
+ verifylist = [
+ ('domain', self.domain.id),
+ ]
+ parsed_args = self.check_parser(self.cmd, arglist, verifylist)
+
+ # In base command class Lister in cliff, abstract method take_action()
+ # returns a tuple containing the column names and an iterable
+ # containing the data to be listed.
+ columns, data = self.cmd.take_action(parsed_args)
+
+ # Set expected values
+ kwargs = {
+ 'domain': self.domain.id,
+ 'group': None,
+ }
+
+ self.users_mock.list.assert_called_with(
+ **kwargs
+ )
+
+ self.assertEqual(self.columns, columns)
+ self.assertEqual(self.datalist, tuple(data))
+
+ def test_user_list_group(self):
+ arglist = [
+ '--group', self.group.name,
+ ]
+ verifylist = [
+ ('group', self.group.name),
+ ]
+ parsed_args = self.check_parser(self.cmd, arglist, verifylist)
+
+ # In base command class Lister in cliff, abstract method take_action()
+ # returns a tuple containing the column names and an iterable
+ # containing the data to be listed.
+ columns, data = self.cmd.take_action(parsed_args)
+
+ # Set expected values
+ kwargs = {
+ 'domain': None,
+ 'group': self.group.id,
+ }
+
+ self.users_mock.list.assert_called_with(
+ **kwargs
+ )
+
+ self.assertEqual(self.columns, columns)
+ self.assertEqual(self.datalist, tuple(data))
+
+ def test_user_list_long(self):
+ arglist = [
+ '--long',
+ ]
+ verifylist = [
+ ('long', True),
+ ]
+ parsed_args = self.check_parser(self.cmd, arglist, verifylist)
+
+ # In base command class Lister in cliff, abstract method take_action()
+ # returns a tuple containing the column names and an iterable
+ # containing the data to be listed.
+ columns, data = self.cmd.take_action(parsed_args)
+
+ # Set expected values
+ kwargs = {
+ 'domain': None,
+ 'group': None,
+ }
+
+ self.users_mock.list.assert_called_with(
+ **kwargs
+ )
+
+ collist = [
+ 'ID',
+ 'Name',
+ 'Project',
+ 'Domain',
+ 'Description',
+ 'Email',
+ 'Enabled',
+ ]
+ self.assertEqual(collist, columns)
+ datalist = (
+ (
+ self.user.id,
+ self.user.name,
+ self.project.id,
+ self.domain.id,
+ '',
+ self.user.email,
+ True,
+ ),
+ )
+ self.assertEqual(datalist, tuple(data))
+
+ def test_user_list_project(self):
+ arglist = [
+ '--project', self.project.name,
+ ]
+ verifylist = [
+ ('project', self.project.name),
+ ]
+ parsed_args = self.check_parser(self.cmd, arglist, verifylist)
+
+ # In base command class Lister in cliff, abstract method take_action()
+ # returns a tuple containing the column names and an iterable
+ # containing the data to be listed.
+ columns, data = self.cmd.take_action(parsed_args)
+
+ kwargs = {
+ 'project': self.project.id,
+ }
+
+ self.role_assignments_mock.list.assert_called_with(**kwargs)
+ self.users_mock.get.assert_called_with(self.user.id)
+
+ self.assertEqual(self.columns, columns)
+ self.assertEqual(self.datalist, tuple(data))
+
+
+class TestUserSet(TestUser):
+
+ project = identity_fakes.FakeProject.create_one_project()
+ user = identity_fakes.FakeUser.create_one_user(
+ attrs={'default_project_id': project.id}
+ )
+
+ def setUp(self):
+ super(TestUserSet, self).setUp()
+
+ self.projects_mock.get.return_value = self.project
+ self.users_mock.get.return_value = self.user
+ self.users_mock.update.return_value = self.user
+
+ # Get the command object to test
+ self.cmd = user.SetUser(self.app, None)
+
+ def test_user_set_no_options(self):
+ arglist = [
+ self.user.name,
+ ]
+ verifylist = [
+ ('name', None),
+ ('password', None),
+ ('email', None),
+ ('project', None),
+ ('enable', False),
+ ('disable', False),
+ ('user', self.user.name),
+ ]
+ parsed_args = self.check_parser(self.cmd, arglist, verifylist)
+
+ result = self.cmd.take_action(parsed_args)
+
+ self.assertIsNone(result)
+
+ def test_user_set_name(self):
+ arglist = [
+ '--name', 'qwerty',
+ self.user.name,
+ ]
+ verifylist = [
+ ('name', 'qwerty'),
+ ('password', None),
+ ('email', None),
+ ('project', None),
+ ('enable', False),
+ ('disable', False),
+ ('user', self.user.name),
+ ]
+ parsed_args = self.check_parser(self.cmd, arglist, verifylist)
+
+ result = self.cmd.take_action(parsed_args)
+
+ # Set expected values
+ kwargs = {
+ 'enabled': True,
+ 'name': 'qwerty',
+ }
+ # UserManager.update(user, name=, domain=, project=, password=,
+ # email=, description=, enabled=, default_project=)
+ self.users_mock.update.assert_called_with(
+ self.user.id,
+ **kwargs
+ )
+ self.assertIsNone(result)
+
+ def test_user_set_password(self):
+ arglist = [
+ '--password', 'secret',
+ self.user.name,
+ ]
+ verifylist = [
+ ('name', None),
+ ('password', 'secret'),
+ ('password_prompt', False),
+ ('email', None),
+ ('project', None),
+ ('enable', False),
+ ('disable', False),
+ ('user', self.user.name),
+ ]
+ parsed_args = self.check_parser(self.cmd, arglist, verifylist)
+
+ result = self.cmd.take_action(parsed_args)
+
+ # Set expected values
+ kwargs = {
+ 'enabled': True,
+ 'password': 'secret',
+ }
+ # UserManager.update(user, name=, domain=, project=, password=,
+ # email=, description=, enabled=, default_project=)
+ self.users_mock.update.assert_called_with(
+ self.user.id,
+ **kwargs
+ )
+ self.assertIsNone(result)
+
+ def test_user_set_password_prompt(self):
+ arglist = [
+ '--password-prompt',
+ self.user.name,
+ ]
+ verifylist = [
+ ('name', None),
+ ('password', None),
+ ('password_prompt', True),
+ ('email', None),
+ ('project', None),
+ ('enable', False),
+ ('disable', False),
+ ('user', self.user.name),
+ ]
+ parsed_args = self.check_parser(self.cmd, arglist, verifylist)
+
+ mocker = mock.Mock()
+ mocker.return_value = 'abc123'
+ with mock.patch("osc_lib.utils.get_password", mocker):
+ result = self.cmd.take_action(parsed_args)
+
+ # Set expected values
+ kwargs = {
+ 'enabled': True,
+ 'password': 'abc123',
+ }
+ # UserManager.update(user, name=, domain=, project=, password=,
+ # email=, description=, enabled=, default_project=)
+ self.users_mock.update.assert_called_with(
+ self.user.id,
+ **kwargs
+ )
+ self.assertIsNone(result)
+
+ def test_user_set_email(self):
+ arglist = [
+ '--email', 'barney@example.com',
+ self.user.name,
+ ]
+ verifylist = [
+ ('name', None),
+ ('password', None),
+ ('email', 'barney@example.com'),
+ ('project', None),
+ ('enable', False),
+ ('disable', False),
+ ('user', self.user.name),
+ ]
+ parsed_args = self.check_parser(self.cmd, arglist, verifylist)
+
+ result = self.cmd.take_action(parsed_args)
+
+ # Set expected values
+ kwargs = {
+ 'enabled': True,
+ 'email': 'barney@example.com',
+ }
+ # UserManager.update(user, name=, domain=, project=, password=,
+ # email=, description=, enabled=, default_project=)
+ self.users_mock.update.assert_called_with(
+ self.user.id,
+ **kwargs
+ )
+ self.assertIsNone(result)
+
+ def test_user_set_project(self):
+ arglist = [
+ '--project', self.project.id,
+ self.user.name,
+ ]
+ verifylist = [
+ ('name', None),
+ ('password', None),
+ ('email', None),
+ ('project', self.project.id),
+ ('enable', False),
+ ('disable', False),
+ ('user', self.user.name),
+ ]
+ parsed_args = self.check_parser(self.cmd, arglist, verifylist)
+
+ result = self.cmd.take_action(parsed_args)
+
+ # Set expected values
+ kwargs = {
+ 'enabled': True,
+ 'default_project': self.project.id,
+ }
+ # UserManager.update(user, name=, domain=, project=, password=,
+ # email=, description=, enabled=, default_project=)
+ self.users_mock.update.assert_called_with(
+ self.user.id,
+ **kwargs
+ )
+ self.assertIsNone(result)
+
+ def test_user_set_project_domain(self):
+ arglist = [
+ '--project', self.project.id,
+ '--project-domain', self.project.domain_id,
+ self.user.name,
+ ]
+ verifylist = [
+ ('name', None),
+ ('password', None),
+ ('email', None),
+ ('project', self.project.id),
+ ('project_domain', self.project.domain_id),
+ ('enable', False),
+ ('disable', False),
+ ('user', self.user.name),
+ ]
+ parsed_args = self.check_parser(self.cmd, arglist, verifylist)
+
+ result = self.cmd.take_action(parsed_args)
+
+ # Set expected values
+ kwargs = {
+ 'enabled': True,
+ 'default_project': self.project.id,
+ }
+ # UserManager.update(user, name=, domain=, project=, password=,
+ # email=, description=, enabled=, default_project=)
+ self.users_mock.update.assert_called_with(
+ self.user.id,
+ **kwargs
+ )
+ self.assertIsNone(result)
+
+ def test_user_set_enable(self):
+ arglist = [
+ '--enable',
+ self.user.name,
+ ]
+ verifylist = [
+ ('name', None),
+ ('password', None),
+ ('email', None),
+ ('project', None),
+ ('enable', True),
+ ('disable', False),
+ ('user', self.user.name),
+ ]
+ parsed_args = self.check_parser(self.cmd, arglist, verifylist)
+
+ result = self.cmd.take_action(parsed_args)
+
+ # Set expected values
+ kwargs = {
+ 'enabled': True,
+ }
+ # UserManager.update(user, name=, domain=, project=, password=,
+ # email=, description=, enabled=, default_project=)
+ self.users_mock.update.assert_called_with(
+ self.user.id,
+ **kwargs
+ )
+ self.assertIsNone(result)
+
+ def test_user_set_disable(self):
+ arglist = [
+ '--disable',
+ self.user.name,
+ ]
+ verifylist = [
+ ('name', None),
+ ('password', None),
+ ('email', None),
+ ('project', None),
+ ('enable', False),
+ ('disable', True),
+ ('user', self.user.name),
+ ]
+ parsed_args = self.check_parser(self.cmd, arglist, verifylist)
+
+ result = self.cmd.take_action(parsed_args)
+
+ # Set expected values
+ kwargs = {
+ 'enabled': False,
+ }
+ # UserManager.update(user, name=, domain=, project=, password=,
+ # email=, description=, enabled=, default_project=)
+ self.users_mock.update.assert_called_with(
+ self.user.id,
+ **kwargs
+ )
+ self.assertIsNone(result)
+
+
+class TestUserSetPassword(TestUser):
+
+ def setUp(self):
+ super(TestUserSetPassword, self).setUp()
+ self.cmd = user.SetPasswordUser(self.app, None)
+
+ @staticmethod
+ @contextlib.contextmanager
+ def _mock_get_password(*passwords):
+ mocker = mock.Mock(side_effect=passwords)
+ with mock.patch("osc_lib.utils.get_password", mocker):
+ yield
+
+ def test_user_password_change(self):
+ current_pass = 'old_pass'
+ new_pass = 'new_pass'
+ arglist = [
+ '--password', new_pass,
+ ]
+ verifylist = [
+ ('password', new_pass),
+ ]
+ parsed_args = self.check_parser(self.cmd, arglist, verifylist)
+
+ # Mock getting user current password.
+ with self._mock_get_password(current_pass):
+ result = self.cmd.take_action(parsed_args)
+
+ self.users_mock.update_password.assert_called_with(
+ current_pass, new_pass
+ )
+ self.assertIsNone(result)
+
+ def test_user_create_password_prompt(self):
+ current_pass = 'old_pass'
+ new_pass = 'new_pass'
+ parsed_args = self.check_parser(self.cmd, [], [])
+
+ # Mock getting user current and new password.
+ with self._mock_get_password(current_pass, new_pass):
+ result = self.cmd.take_action(parsed_args)
+
+ self.users_mock.update_password.assert_called_with(
+ current_pass, new_pass
+ )
+ self.assertIsNone(result)
+
+ def test_user_password_change_no_prompt(self):
+ current_pass = 'old_pass'
+ new_pass = 'new_pass'
+ arglist = [
+ '--password', new_pass,
+ '--original-password', current_pass,
+ ]
+ verifylist = [
+ ('password', new_pass),
+ ('original_password', current_pass),
+ ]
+ parsed_args = self.check_parser(self.cmd, arglist, verifylist)
+
+ result = self.cmd.take_action(parsed_args)
+
+ self.users_mock.update_password.assert_called_with(
+ current_pass, new_pass
+ )
+ self.assertIsNone(result)
+
+
+class TestUserShow(TestUser):
+
+ user = identity_fakes.FakeUser.create_one_user()
+
+ def setUp(self):
+ super(TestUserShow, self).setUp()
+
+ self.users_mock.get.return_value = self.user
+
+ # Get the command object to test
+ self.cmd = user.ShowUser(self.app, None)
+ self.app.client_manager.identity.auth.client.get_user_id.\
+ return_value = self.user.id
+ self.app.client_manager.identity.tokens.get_token_data.return_value = \
+ {'token':
+ {'user':
+ {'domain': {},
+ 'id': self.user.id,
+ 'name': self.user.name,
+ }
+ }
+ }
+
+ def test_user_show(self):
+ arglist = [
+ self.user.id,
+ ]
+ verifylist = [
+ ('user', self.user.id),
+ ]
+ parsed_args = self.check_parser(self.cmd, arglist, verifylist)
+
+ # In base command class ShowOne in cliff, abstract method take_action()
+ # returns a two-part tuple with a tuple of column names and a tuple of
+ # data to be shown.
+ columns, data = self.cmd.take_action(parsed_args)
+
+ self.users_mock.get.assert_called_with(self.user.id)
+
+ collist = ('default_project_id', 'domain_id', 'email',
+ 'enabled', 'id', 'name')
+ self.assertEqual(collist, columns)
+ datalist = (
+ self.user.default_project_id,
+ self.user.domain_id,
+ self.user.email,
+ True,
+ self.user.id,
+ self.user.name,
+ )
+ self.assertEqual(datalist, data)