1#
2#    Licensed under the Apache License, Version 2.0 (the "License"); you may
3#    not use this file except in compliance with the License. You may obtain
4#    a copy of the License at
5#
6#         http://www.apache.org/licenses/LICENSE-2.0
7#
8#    Unless required by applicable law or agreed to in writing, software
9#    distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
10#    WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
11#    License for the specific language governing permissions and limitations
12#    under the License.
13
14from unittest import mock
15
16import testtools
17
18from heatclient.common import utils
19from heatclient.v1 import resource_types
20
21
22class ResourceTypeManagerTest(testtools.TestCase):
23
24    def _base_test(self, expect, key):
25
26        class FakeAPI(object):
27            """Fake API and ensure request url is correct."""
28
29            def get(self, *args, **kwargs):
30                assert ('GET', args[0]) == expect
31
32            def json_request(self, *args, **kwargs):
33                assert args == expect
34                ret = key and {key: []} or {}
35                return {}, {key: ret}
36
37            def raw_request(self, *args, **kwargs):
38                assert args == expect
39                return {}
40
41            def head(self, url, **kwargs):
42                return self.json_request("HEAD", url, **kwargs)
43
44            def post(self, url, **kwargs):
45                return self.json_request("POST", url, **kwargs)
46
47            def put(self, url, **kwargs):
48                return self.json_request("PUT", url, **kwargs)
49
50            def delete(self, url, **kwargs):
51                return self.raw_request("DELETE", url, **kwargs)
52
53            def patch(self, url, **kwargs):
54                return self.json_request("PATCH", url, **kwargs)
55
56        manager = resource_types.ResourceTypeManager(FakeAPI())
57        return manager
58
59    def test_list_types(self):
60        key = 'resource_types'
61        expect = ('GET', '/resource_types')
62
63        class FakeResponse(object):
64            def json(self):
65                return {key: {}}
66
67        class FakeClient(object):
68            def get(self, *args, **kwargs):
69                assert ('GET', args[0]) == expect
70                return FakeResponse()
71
72        manager = resource_types.ResourceTypeManager(FakeClient())
73        manager.list()
74
75    def test_list_types_with_filters(self):
76        filters = {'name': 'OS::Keystone::*',
77                   'version': '5.0.0',
78                   'support_status': 'SUPPORTED'}
79
80        manager = resource_types.ResourceTypeManager(None)
81        with mock.patch.object(manager, '_list') as mock_list:
82            mock_list.return_value = None
83            manager.list(filters=filters)
84            self.assertEqual(1, mock_list.call_count)
85            url, param = mock_list.call_args[0]
86            self.assertEqual("resource_types", param)
87            base_url, query_params = utils.parse_query_url(url)
88            self.assertEqual('/%s' % manager.KEY, base_url)
89            # parameters in query_params is in list format, so filter params
90            # are made to be inline with it
91            filters_params = {}
92            for item in filters:
93                filters_params[item] = [filters[item]]
94
95            self.assertEqual(filters_params, query_params)
96
97    @mock.patch.object(utils, 'get_response_body')
98    def test_get(self, mock_utils):
99        key = 'resource_types'
100        resource_type = 'OS::Nova::KeyPair'
101        expect = ('GET', '/resource_types/OS%3A%3ANova%3A%3AKeyPair')
102        manager = self._base_test(expect, key)
103        mock_utils.return_value = None
104        manager.get(resource_type)
105
106    @mock.patch.object(utils, 'get_response_body')
107    def test_generate_template(self, mock_utils):
108        key = 'resource_types'
109        resource_type = 'OS::Nova::KeyPair'
110        template_type = 'cfn'
111        expect = ('GET', '/resource_types/OS%3A%3ANova%3A%3AKeyPair/template'
112                         '?template_type=cfn')
113        manager = self._base_test(expect, key)
114        mock_utils.return_value = None
115        manager.generate_template(resource_type, template_type)
116