Add mapping rules integration tests
This patch adds the tests for the Mappings API (part of the
Federated Identity API).
The tests added here are not intended to cover all negative and
corner cases, they are rather testing the API in a higher level
and its integration in a working environment.
Change-Id: If245a12a407f960a7ad5f73aa7af717229976ea2
diff --git a/keystone_tempest_plugin/clients.py b/keystone_tempest_plugin/clients.py
index 1a85bce..a72c9f5 100644
--- a/keystone_tempest_plugin/clients.py
+++ b/keystone_tempest_plugin/clients.py
@@ -15,6 +15,8 @@
from keystone_tempest_plugin.services.identity.v3 import (
identity_providers_client)
from keystone_tempest_plugin.services.identity.v3 import (
+ mapping_rules_client)
+from keystone_tempest_plugin.services.identity.v3 import (
service_providers_client)
from tempest import clients
@@ -28,6 +30,9 @@
self.identity_providers_client = (
identity_providers_client.IdentityProvidersClient(
self.auth_provider))
+ self.mapping_rules_client = (
+ mapping_rules_client.MappingRulesClient(
+ self.auth_provider))
self.service_providers_client = (
service_providers_client.ServiceProvidersClient(
self.auth_provider))
diff --git a/keystone_tempest_plugin/services/identity/v3/mapping_rules_client.py b/keystone_tempest_plugin/services/identity/v3/mapping_rules_client.py
new file mode 100644
index 0000000..5554756
--- /dev/null
+++ b/keystone_tempest_plugin/services/identity/v3/mapping_rules_client.py
@@ -0,0 +1,60 @@
+# Copyright 2016 Red Hat, 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 oslo_serialization import jsonutils
+
+from tempest.lib.common import rest_client
+
+from keystone_tempest_plugin.services.identity import clients
+
+
+class MappingRulesClient(clients.Federation):
+
+ subpath_suffix = 'mappings'
+
+ def create_mapping_rule(self, mapping_id, rules):
+ """Create a mapping rule."""
+ put_body = jsonutils.dumps({'mapping': rules})
+ resp, body = self._put(mapping_id, put_body)
+ self.expected_success(201, resp.status)
+ body = jsonutils.loads(body)
+ return rest_client.ResponseBody(resp, body)
+
+ def list_mapping_rules(self):
+ """List the mapping rules."""
+ resp, body = self._get()
+ self.expected_success(200, resp.status)
+ body = jsonutils.loads(body)
+ return rest_client.ResponseBody(resp, body)
+
+ def show_mapping_rule(self, mapping_id):
+ """Get a mapping rule."""
+ resp, body = self._get(mapping_id)
+ self.expected_success(200, resp.status)
+ body = jsonutils.loads(body)
+ return rest_client.ResponseBody(resp, body)
+
+ def delete_mapping_rule(self, mapping_id):
+ """Delete a mapping rule."""
+ resp, body = self._delete(mapping_id)
+ self.expected_success(204, resp.status)
+ return rest_client.ResponseBody(resp, body)
+
+ def update_mapping_rule(self, mapping_id, rules):
+ """Update a mapping rule."""
+ patch_body = jsonutils.dumps({'mapping': rules})
+ resp, body = self._patch(mapping_id, patch_body)
+ self.expected_success(200, resp.status)
+ body = jsonutils.loads(body)
+ return rest_client.ResponseBody(resp, body)
diff --git a/keystone_tempest_plugin/tests/api/identity/base.py b/keystone_tempest_plugin/tests/api/identity/base.py
index d8924c4..8fa3c79 100644
--- a/keystone_tempest_plugin/tests/api/identity/base.py
+++ b/keystone_tempest_plugin/tests/api/identity/base.py
@@ -34,4 +34,5 @@
cls.credential_type, identity_version=cls.identity_version)
cls.keystone_manager = clients.Manager(credentials=credentials)
cls.idps_client = cls.keystone_manager.identity_providers_client
+ cls.mappings_client = cls.keystone_manager.mapping_rules_client
cls.sps_client = cls.keystone_manager.service_providers_client
diff --git a/keystone_tempest_plugin/tests/api/identity/v3/fixtures.py b/keystone_tempest_plugin/tests/api/identity/v3/fixtures.py
index 434ade7..4e5899c 100644
--- a/keystone_tempest_plugin/tests/api/identity/v3/fixtures.py
+++ b/keystone_tempest_plugin/tests/api/identity/v3/fixtures.py
@@ -28,6 +28,30 @@
return ref
+def mapping_ref():
+ rules = [{
+ 'local': [
+ {
+ 'user': {'name': '{0}'}
+ },
+ {
+ 'group_ids': '{1}'
+ }
+ ],
+ 'remote': [
+ {
+ 'type': 'openstack_username'
+ },
+ {
+ 'type': 'group_ids',
+ 'whitelist': ['abc', '123']
+ }
+
+ ]
+ }]
+ return {'rules': rules}
+
+
def sp_ref(enabled=None, relay_state_prefix=None):
ref = {
'auth_url': data_utils.rand_url(),
diff --git a/keystone_tempest_plugin/tests/api/identity/v3/test_mapping_rules.py b/keystone_tempest_plugin/tests/api/identity/v3/test_mapping_rules.py
new file mode 100644
index 0000000..f544671
--- /dev/null
+++ b/keystone_tempest_plugin/tests/api/identity/v3/test_mapping_rules.py
@@ -0,0 +1,98 @@
+# Copyright 2016 Red Hat, 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 tempest.lib.common.utils import data_utils
+from tempest.lib import decorators
+from tempest.lib import exceptions as lib_exc
+from tempest import test
+
+from keystone_tempest_plugin.tests.api.identity import base
+from keystone_tempest_plugin.tests.api.identity.v3 import fixtures
+
+
+class MappingRulesTest(base.BaseIdentityTest):
+
+ _MAPPING_REF = fixtures.mapping_ref()
+
+ def _assert_mapping_rules_attributes(self, mapping, mapping_id,
+ mapping_ref=None):
+ self.assertIn('id', mapping)
+ self.assertEqual(mapping_id, mapping['id'])
+
+ self.assertIn('rules', mapping)
+
+ if mapping_ref:
+ self.assertItemsEqual(mapping_ref['rules'], mapping['rules'])
+
+ def _create_mapping_rule(self, mapping_id, mapping_ref):
+ mapping = self.mappings_client.create_mapping_rule(
+ mapping_id, mapping_ref)['mapping']
+ self.addCleanup(self.mappings_client.delete_mapping_rule, mapping_id)
+ return mapping
+
+ @decorators.idempotent_id('4ca48c01-b6da-4759-acb6-007e15ad712a')
+ def test_mapping_rules_create(self):
+ mapping_id = data_utils.rand_uuid_hex()
+ mapping = self._create_mapping_rule(mapping_id, self._MAPPING_REF)
+ self._assert_mapping_rules_attributes(
+ mapping, mapping_id, self._MAPPING_REF)
+
+ @test.attr(type=['negative'])
+ @decorators.idempotent_id('341dac45-ce1f-4f15-afdc-1f9a7d7d7c40')
+ def test_mapping_rules_create_without_mandatory_attributes(self):
+ mapping_id = data_utils.rand_uuid_hex()
+ self.assertRaises(
+ lib_exc.BadRequest,
+ self.mappings_client.create_mapping_rule,
+ mapping_id,
+ {})
+
+ @decorators.idempotent_id('8db213e3-1db0-48c6-863c-7a3ed23577ec')
+ def test_mapping_rules_get(self):
+ mapping_id = data_utils.rand_uuid_hex()
+ mapping_create = self._create_mapping_rule(
+ mapping_id, self._MAPPING_REF)
+
+ mapping_get = self.mappings_client.show_mapping_rule(mapping_id)[
+ 'mapping']
+ self._assert_mapping_rules_attributes(
+ mapping_get, mapping_id, mapping_create)
+
+ @decorators.idempotent_id('bb80b242-2a6a-4d29-b45f-4035be574a6e')
+ def test_mapping_rules_list(self):
+ mapping_ids = []
+ for _ in range(3):
+ mapping_id = data_utils.rand_uuid_hex()
+ self._create_mapping_rule(mapping_id, self._MAPPING_REF)
+ mapping_ids.append(mapping_id)
+
+ mappings_list = self.mappings_client.list_mapping_rules()['mappings']
+ fetched_ids = [mapping['id'] for mapping in mappings_list]
+
+ for mapping_id in mapping_ids:
+ self.assertIn(mapping_id, fetched_ids)
+
+ @decorators.idempotent_id('1fc5d104-faf5-4809-8c89-29b5c1666a96')
+ def test_mapping_rule_update(self):
+ mapping_id = data_utils.rand_uuid_hex()
+ mapping_ref = fixtures.mapping_ref()
+ mapping = self._create_mapping_rule(mapping_id, mapping_ref)
+
+ new_local = [{'group': {'id': data_utils.rand_uuid_hex()}}]
+ mapping_ref['rules'][0]['local'] = new_local
+
+ mapping = self.mappings_client.update_mapping_rule(
+ mapping_id, mapping_ref)['mapping']
+ self._assert_mapping_rules_attributes(
+ mapping, mapping_id, mapping_ref)