blob: 0ac10b136eca1dde5ea33684a35a8af8f5817056 [file] [log] [blame]
Matteo Scandolo920e8fd2017-08-08 13:05:24 -07001# Copyright 2017-present Open Networking Foundation
2#
3# Licensed under the Apache License, Version 2.0 (the "License");
4# you may not use this file except in compliance with the License.
5# You may obtain a copy of the License at
6#
7# http://www.apache.org/licenses/LICENSE-2.0
8#
9# Unless required by applicable law or agreed to in writing, software
10# distributed under the License is distributed on an "AS IS" BASIS,
11# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12# See the License for the specific language governing permissions and
13# limitations under the License.
14
Zack Williams6bb2cfe2019-03-27 15:01:45 -070015from __future__ import absolute_import
16from . import helpers # noqa: F401
Matteo Scandolo485b7132017-06-30 11:46:47 -070017import unittest
Zack Williams6bb2cfe2019-03-27 15:01:45 -070018
19try: # python 3
20 from unittest.mock import patch, MagicMock
21except ImportError: # python 2
22 from mock import patch, MagicMock
23
Matteo Scandolo485b7132017-06-30 11:46:47 -070024from grpc_client.models_accessor import GRPCModelsAccessor
25from grpc_client.resources import RESOURCES
Matteo Scandolo1bd10762017-10-18 09:53:14 +020026from grpc_client.KEYS import TOSCA_KEYS
Matteo Scandolo485b7132017-06-30 11:46:47 -070027
Zack Williams6bb2cfe2019-03-27 15:01:45 -070028
Matteo Scandolo485b7132017-06-30 11:46:47 -070029class FakeObj:
30 new = None
31 filter = None
32
Zack Williams6bb2cfe2019-03-27 15:01:45 -070033
Matteo Scandolo485b7132017-06-30 11:46:47 -070034class FakeResource:
35 objects = FakeObj
36
Zack Williams6bb2cfe2019-03-27 15:01:45 -070037
Matteo Scandolo485b7132017-06-30 11:46:47 -070038class FakeModel:
39 pass
40
Zack Williams6bb2cfe2019-03-27 15:01:45 -070041
Matteo Scandolo485b7132017-06-30 11:46:47 -070042class FakeExistingModel:
43 pass
44
Zack Williams6bb2cfe2019-03-27 15:01:45 -070045
Matteo Scandolo485b7132017-06-30 11:46:47 -070046mock_resources = {
Zack Williams6bb2cfe2019-03-27 15:01:45 -070047 "username~pass": {
48 "test-model": FakeResource,
49 "single-key": FakeResource,
50 "double-key": FakeResource,
51 "one-of-key": FakeResource,
Matteo Scandolo21dde412017-07-11 18:54:12 -070052 }
Matteo Scandolo485b7132017-06-30 11:46:47 -070053}
54
Matteo Scandolo1bd10762017-10-18 09:53:14 +020055mock_keys = {
Zack Williams6bb2cfe2019-03-27 15:01:45 -070056 "i-do-not-exists": ["name"],
57 "test-model": ["name"],
58 "empty-key": [],
59 "single-key": ["fake_key"],
60 "double-key": ["key_1", "key_2"],
61 "one-of-key": ["key_1", ["key_2", "key_3"]],
Matteo Scandolo1bd10762017-10-18 09:53:14 +020062}
63
Zack Williams6bb2cfe2019-03-27 15:01:45 -070064USERNAME = "username"
65PASSWORD = "pass"
66
Matteo Scandolo21dde412017-07-11 18:54:12 -070067
Matteo Scandolo485b7132017-06-30 11:46:47 -070068class GRPCModelsAccessor_Create_or_update_Test(unittest.TestCase):
Matteo Scandolo1bd10762017-10-18 09:53:14 +020069 @patch.dict(TOSCA_KEYS, mock_keys, clear=True)
Matteo Scandolo21dde412017-07-11 18:54:12 -070070 def test_unkown_user(self):
71 """
72 [GRPCModelsAccessor] get_model_from_classname: If a user does not have orm classes, raise
73 """
Zack Williams6bb2cfe2019-03-27 15:01:45 -070074 data = {"name": "test"}
Matteo Scandolo21dde412017-07-11 18:54:12 -070075 with self.assertRaises(Exception) as e:
Zack Williams6bb2cfe2019-03-27 15:01:45 -070076 GRPCModelsAccessor.get_model_from_classname(
77 "i-do-not-exists", data, USERNAME, PASSWORD
78 )
79 self.assertEqual(
80 str(e.exception),
81 "[XOS-TOSCA] User 'username' does not have ready resources",
82 )
Matteo Scandolo21dde412017-07-11 18:54:12 -070083
84 @patch.dict(RESOURCES, mock_resources, clear=True)
Matteo Scandolo1bd10762017-10-18 09:53:14 +020085 @patch.dict(TOSCA_KEYS, mock_keys, clear=True)
Matteo Scandolo485b7132017-06-30 11:46:47 -070086 def test_unkown_module(self):
87 """
88 [GRPCModelsAccessor] get_model_from_classname: If a model is not know by the grpc api, raise
89 """
Zack Williams6bb2cfe2019-03-27 15:01:45 -070090 data = {"name": "test"}
Matteo Scandolo485b7132017-06-30 11:46:47 -070091 with self.assertRaises(Exception) as e:
Zack Williams6bb2cfe2019-03-27 15:01:45 -070092 GRPCModelsAccessor.get_model_from_classname(
93 "i-do-not-exists", data, USERNAME, PASSWORD
94 )
95 self.assertEqual(
96 str(e.exception),
97 "[XOS-TOSCA] The model you are trying to create "
98 "(class: i-do-not-exists, properties, {'name': 'test'}) is not know by xos-core",
99 )
Matteo Scandolo1bd10762017-10-18 09:53:14 +0200100
101 def test_unkown_tosca_key(self):
102 """
103 [GRPCModelsAccessor] get_model_from_classname: If a model does not have a tosca_key, raise
104 """
Zack Williams6bb2cfe2019-03-27 15:01:45 -0700105 data = {"name": "test"}
Matteo Scandolo1bd10762017-10-18 09:53:14 +0200106 with self.assertRaises(Exception) as e:
Zack Williams6bb2cfe2019-03-27 15:01:45 -0700107 GRPCModelsAccessor.get_model_from_classname(
108 "no-key", data, USERNAME, PASSWORD
109 )
110 self.assertEqual(
111 str(e.exception),
112 "[XOS-TOSCA] Model no-key doesn't have a tosca_key specified",
113 )
Matteo Scandolo1bd10762017-10-18 09:53:14 +0200114
115 @patch.dict(TOSCA_KEYS, mock_keys, clear=True)
116 def test_empty_tosca_key(self):
117 """
118 [GRPCModelsAccessor] get_model_from_classname: If a model does not have a tosca_key, raise
119 """
Zack Williams6bb2cfe2019-03-27 15:01:45 -0700120 data = {"name": "test"}
Matteo Scandolo1bd10762017-10-18 09:53:14 +0200121 with self.assertRaises(Exception) as e:
Zack Williams6bb2cfe2019-03-27 15:01:45 -0700122 GRPCModelsAccessor.get_model_from_classname(
123 "empty-key", data, USERNAME, PASSWORD
124 )
125 self.assertEqual(
126 str(e.exception),
127 "[XOS-TOSCA] Model empty-key doesn't have a tosca_key specified",
128 )
Matteo Scandolo1bd10762017-10-18 09:53:14 +0200129
130 @patch.dict(TOSCA_KEYS, mock_keys, clear=True)
131 def test_tosca_key_are_defined(self):
132 """
133 [GRPCModelsAccessor] get_model_from_classname: a model should have a property for it's tosca_key
134 """
Zack Williams6bb2cfe2019-03-27 15:01:45 -0700135 data = {"name": "test"}
Matteo Scandolo1bd10762017-10-18 09:53:14 +0200136 with self.assertRaises(Exception) as e:
Zack Williams6bb2cfe2019-03-27 15:01:45 -0700137 GRPCModelsAccessor.get_model_from_classname(
138 "single-key", data, USERNAME, PASSWORD
139 )
140 self.assertEqual(
141 str(e.exception),
142 "[XOS-TOSCA] Model single-key doesn't have a property for the specified tosca_key ('fake_key')",
143 )
Matteo Scandolo485b7132017-06-30 11:46:47 -0700144
145 @patch.object(FakeResource.objects, "filter")
146 @patch.object(FakeResource.objects, "new", MagicMock(return_value=FakeModel))
Matteo Scandolo1bd10762017-10-18 09:53:14 +0200147 @patch.dict(TOSCA_KEYS, mock_keys, clear=True)
148 def test_composite_key(self, mock_filter):
149 """
150 [GRPCModelsAccessor] get_model_from_classname: should use a composite key to lookup a model
151 """
Zack Williams6bb2cfe2019-03-27 15:01:45 -0700152 data = {"name": "test", "key_1": "key1", "key_2": "key2"}
Matteo Scandolo1bd10762017-10-18 09:53:14 +0200153 with patch.dict(RESOURCES, mock_resources, clear=True):
Zack Williams6bb2cfe2019-03-27 15:01:45 -0700154 model = GRPCModelsAccessor.get_model_from_classname(
155 "double-key", data, USERNAME, PASSWORD
156 )
Matteo Scandolo1bd10762017-10-18 09:53:14 +0200157 mock_filter.assert_called_with(key_1="key1", key_2="key2")
158 self.assertEqual(model, FakeModel)
159
160 @patch.object(FakeResource.objects, "filter")
161 @patch.object(FakeResource.objects, "new", MagicMock(return_value=FakeModel))
162 @patch.dict(TOSCA_KEYS, mock_keys, clear=True)
Matteo Scandolo24197a12017-12-13 12:21:59 -0800163 def test_one_of_key(self, mock_filter):
164 """
165 [GRPCModelsAccessor] get_model_from_classname: should use a composite with one_of key to lookup a model
166 """
167 # NOTE it should be valid for items with either one of the keys
Zack Williams6bb2cfe2019-03-27 15:01:45 -0700168 data2 = {"name": "test", "key_1": "key1", "key_2": "key2"}
Matteo Scandolo24197a12017-12-13 12:21:59 -0800169 with patch.dict(RESOURCES, mock_resources, clear=True):
Zack Williams6bb2cfe2019-03-27 15:01:45 -0700170 model = GRPCModelsAccessor.get_model_from_classname(
171 "one-of-key", data2, USERNAME, PASSWORD
172 )
Matteo Scandolo24197a12017-12-13 12:21:59 -0800173 mock_filter.assert_called_with(key_1="key1", key_2="key2")
174 self.assertEqual(model, FakeModel)
175
Zack Williams6bb2cfe2019-03-27 15:01:45 -0700176 data3 = {"name": "test", "key_1": "key1", "key_3": "key3"}
Matteo Scandolo24197a12017-12-13 12:21:59 -0800177 with patch.dict(RESOURCES, mock_resources, clear=True):
Zack Williams6bb2cfe2019-03-27 15:01:45 -0700178 model = GRPCModelsAccessor.get_model_from_classname(
179 "one-of-key", data3, USERNAME, PASSWORD
180 )
Matteo Scandolo24197a12017-12-13 12:21:59 -0800181 mock_filter.assert_called_with(key_1="key1", key_3="key3")
182 self.assertEqual(model, FakeModel)
183
184 @patch.object(FakeResource.objects, "filter")
185 @patch.object(FakeResource.objects, "new", MagicMock(return_value=FakeModel))
186 @patch.dict(TOSCA_KEYS, mock_keys, clear=True)
187 def test_one_of_key_error(self, mock_filter):
Zack Williams6bb2cfe2019-03-27 15:01:45 -0700188 data = {"name": "test", "key_1": "key1"}
Matteo Scandolo24197a12017-12-13 12:21:59 -0800189 with self.assertRaises(Exception) as e:
Zack Williams6bb2cfe2019-03-27 15:01:45 -0700190 GRPCModelsAccessor.get_model_from_classname(
191 "one-of-key", data, USERNAME, PASSWORD
192 )
193 self.assertEqual(
194 str(e.exception),
195 "[XOS-TOSCA] Model one-of-key doesn't have a property "
196 "for the specified tosca_key_one_of (['key_2', 'key_3'])",
197 )
Matteo Scandolo24197a12017-12-13 12:21:59 -0800198
199 @patch.object(FakeResource.objects, "filter")
200 @patch.object(FakeResource.objects, "new", MagicMock(return_value=FakeModel))
201 @patch.dict(TOSCA_KEYS, mock_keys, clear=True)
Matteo Scandolo485b7132017-06-30 11:46:47 -0700202 def test_new_model(self, mock_filter):
203 """
204 [GRPCModelsAccessor] get_model_from_classname: should create a new model
205 """
Zack Williams6bb2cfe2019-03-27 15:01:45 -0700206 data = {"name": "test", "fake_key": "key"}
Matteo Scandolo485b7132017-06-30 11:46:47 -0700207 with patch.dict(RESOURCES, mock_resources, clear=True):
Zack Williams6bb2cfe2019-03-27 15:01:45 -0700208 model = GRPCModelsAccessor.get_model_from_classname(
209 "single-key", data, USERNAME, PASSWORD
210 )
Matteo Scandolo1bd10762017-10-18 09:53:14 +0200211 mock_filter.assert_called_with(fake_key="key")
Matteo Scandolo485b7132017-06-30 11:46:47 -0700212 self.assertEqual(model, FakeModel)
213
Zack Williams6bb2cfe2019-03-27 15:01:45 -0700214 @patch.object(
215 FakeResource.objects, "filter", MagicMock(return_value=[FakeExistingModel])
216 )
Matteo Scandolo1bd10762017-10-18 09:53:14 +0200217 @patch.dict(TOSCA_KEYS, mock_keys, clear=True)
Matteo Scandolo485b7132017-06-30 11:46:47 -0700218 def test_existing_model(self):
219 """
220 [GRPCModelsAccessor] get_model_from_classname: should update an existing model
221 """
Zack Williams6bb2cfe2019-03-27 15:01:45 -0700222 data = {"name": "test", "fake_key": "key"}
Matteo Scandolo485b7132017-06-30 11:46:47 -0700223 with patch.dict(RESOURCES, mock_resources, clear=True):
Zack Williams6bb2cfe2019-03-27 15:01:45 -0700224 model = GRPCModelsAccessor.get_model_from_classname(
225 "single-key", data, USERNAME, PASSWORD
226 )
Matteo Scandolo485b7132017-06-30 11:46:47 -0700227 self.assertEqual(model, FakeExistingModel)
228
Zack Williams6bb2cfe2019-03-27 15:01:45 -0700229 @patch.object(FakeResource.objects, "filter", MagicMock(return_value=["a", "b"]))
Matteo Scandolo1bd10762017-10-18 09:53:14 +0200230 @patch.dict(TOSCA_KEYS, mock_keys, clear=True)
Matteo Scandolo485b7132017-06-30 11:46:47 -0700231 def test_multiple_models(self):
232 """
233 [GRPCModelsAccessor] get_model_from_classname: should raise an exception if multiple instances are found
234 """
Zack Williams6bb2cfe2019-03-27 15:01:45 -0700235 data = {"name": "test"}
Matteo Scandolo485b7132017-06-30 11:46:47 -0700236 with patch.dict(RESOURCES, mock_resources, clear=True):
237 with self.assertRaises(Exception) as e:
Zack Williams6bb2cfe2019-03-27 15:01:45 -0700238 GRPCModelsAccessor.get_model_from_classname(
239 "test-model", data, USERNAME, PASSWORD
240 )
241 self.assertEqual(
242 str(e.exception),
243 "[XOS-TOSCA] Model of class test-model and properties "
244 "{'name': 'test'} has multiple instances, I can't handle it",
245 )
Matteo Scandolo1fedfae2017-10-09 13:57:00 -0700246
Zack Williams6bb2cfe2019-03-27 15:01:45 -0700247
248if __name__ == "__main__":
249 unittest.main()