# Copyright 2014 NEC Corporation
# All Rights Reserved.
#
#    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.api.identity import base
from tempest import test


class ExtensionTestJSON(base.BaseIdentityV2AdminTest):
    _interface = 'json'

    @test.attr(type='gate')
    def test_list_extensions(self):
        # List all the extensions
        resp, body = self.non_admin_client.list_extensions()
        self.assertEqual(200, resp.status)
        self.assertNotEmpty(body)
        keys = ['name', 'updated', 'alias', 'links',
                'namespace', 'description']
        for value in body:
            for key in keys:
                self.assertIn(key, value)


class ExtensionTestXML(ExtensionTestJSON):
    _interface = 'xml'
