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