blob: 729fac3b7f51e5367a1ed33b0b3a65f82f0b84b2 [file] [log] [blame]
Matteo Scandolo920e8fd2017-08-08 13:05:24 -07001
2# Copyright 2017-present Open Networking Foundation
3#
4# Licensed under the Apache License, Version 2.0 (the "License");
5# you may not use this file except in compliance with the License.
6# You may obtain a copy of the License at
7#
8# http://www.apache.org/licenses/LICENSE-2.0
9#
10# Unless required by applicable law or agreed to in writing, software
11# distributed under the License is distributed on an "AS IS" BASIS,
12# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13# See the License for the specific language governing permissions and
14# limitations under the License.
15
16
Matteo Scandolo485b7132017-06-30 11:46:47 -070017import unittest
18from mock import patch, MagicMock
19from grpc_client.models_accessor import GRPCModelsAccessor
20from grpc_client.resources import RESOURCES
Matteo Scandolo1bd10762017-10-18 09:53:14 +020021from grpc_client.KEYS import TOSCA_KEYS
Matteo Scandolo485b7132017-06-30 11:46:47 -070022
23class FakeObj:
24 new = None
25 filter = None
26
27class FakeResource:
28 objects = FakeObj
29
30class FakeModel:
31 pass
32
33class FakeExistingModel:
34 pass
35
36mock_resources = {
Matteo Scandolo21dde412017-07-11 18:54:12 -070037 'username~pass': {
Matteo Scandolo1bd10762017-10-18 09:53:14 +020038 'test-model': FakeResource,
39 'single-key': FakeResource,
40 'double-key': FakeResource
Matteo Scandolo21dde412017-07-11 18:54:12 -070041 }
Matteo Scandolo485b7132017-06-30 11:46:47 -070042}
43
Matteo Scandolo1bd10762017-10-18 09:53:14 +020044mock_keys = {
45 'i-do-not-exists': ['name'],
46 'test-model': ['name'],
47 'empty-key': [],
48 'single-key': ['fake_key'],
49 'double-key': ['key_1', 'key_2'],
50}
51
Matteo Scandolo21dde412017-07-11 18:54:12 -070052USERNAME = 'username'
53PASSWORD = 'pass'
54
Matteo Scandolo485b7132017-06-30 11:46:47 -070055class GRPCModelsAccessor_Create_or_update_Test(unittest.TestCase):
56
Matteo Scandolo1bd10762017-10-18 09:53:14 +020057 @patch.dict(TOSCA_KEYS, mock_keys, clear=True)
Matteo Scandolo21dde412017-07-11 18:54:12 -070058 def test_unkown_user(self):
59 """
60 [GRPCModelsAccessor] get_model_from_classname: If a user does not have orm classes, raise
61 """
62 data = {
63 "name": "test"
64 }
65 with self.assertRaises(Exception) as e:
66 GRPCModelsAccessor.get_model_from_classname('i-do-not-exists', data, USERNAME, PASSWORD)
67 self.assertEqual(e.exception.message, "[XOS-TOSCA] User 'username' does not have ready resources")
68
69 @patch.dict(RESOURCES, mock_resources, clear=True)
Matteo Scandolo1bd10762017-10-18 09:53:14 +020070 @patch.dict(TOSCA_KEYS, mock_keys, clear=True)
Matteo Scandolo485b7132017-06-30 11:46:47 -070071 def test_unkown_module(self):
72 """
73 [GRPCModelsAccessor] get_model_from_classname: If a model is not know by the grpc api, raise
74 """
75 data = {
76 "name": "test"
77 }
78 with self.assertRaises(Exception) as e:
Matteo Scandolo21dde412017-07-11 18:54:12 -070079 GRPCModelsAccessor.get_model_from_classname('i-do-not-exists', data, USERNAME, PASSWORD)
Matteo Scandolo1bd10762017-10-18 09:53:14 +020080 self.assertEqual(e.exception.message, "[XOS-TOSCA] The model you are trying to create (class: i-do-not-exists, properties, {'name': 'test'}) is not know by xos-core")
81
82 def test_unkown_tosca_key(self):
83 """
84 [GRPCModelsAccessor] get_model_from_classname: If a model does not have a tosca_key, raise
85 """
86 data = {
87 "name": "test"
88 }
89 with self.assertRaises(Exception) as e:
90 GRPCModelsAccessor.get_model_from_classname('no-key', data, USERNAME, PASSWORD)
91 self.assertEqual(e.exception.message, "[XOS-TOSCA] Model no-key doesn't have a tosca_key specified")
92
93 @patch.dict(TOSCA_KEYS, mock_keys, clear=True)
94 def test_empty_tosca_key(self):
95 """
96 [GRPCModelsAccessor] get_model_from_classname: If a model does not have a tosca_key, raise
97 """
98 data = {
99 "name": "test"
100 }
101 with self.assertRaises(Exception) as e:
102 GRPCModelsAccessor.get_model_from_classname('empty-key', data, USERNAME, PASSWORD)
103 self.assertEqual(e.exception.message, "[XOS-TOSCA] Model empty-key doesn't have a tosca_key specified")
104
105 @patch.dict(TOSCA_KEYS, mock_keys, clear=True)
106 def test_tosca_key_are_defined(self):
107 """
108 [GRPCModelsAccessor] get_model_from_classname: a model should have a property for it's tosca_key
109 """
110 data = {
111 "name": "test",
112 }
113 with self.assertRaises(Exception) as e:
114 GRPCModelsAccessor.get_model_from_classname('single-key', data, USERNAME, PASSWORD)
115 self.assertEqual(e.exception.message, "[XOS-TOSCA] Model single-key doesn't have a property for the specified tosca_key ('fake_key')")
Matteo Scandolo485b7132017-06-30 11:46:47 -0700116
117 @patch.object(FakeResource.objects, "filter")
118 @patch.object(FakeResource.objects, "new", MagicMock(return_value=FakeModel))
Matteo Scandolo1bd10762017-10-18 09:53:14 +0200119 @patch.dict(TOSCA_KEYS, mock_keys, clear=True)
120 def test_composite_key(self, mock_filter):
121 """
122 [GRPCModelsAccessor] get_model_from_classname: should use a composite key to lookup a model
123 """
124 data = {
125 "name": "test",
126 "key_1": "key1",
127 "key_2": "key2"
128 }
129 with patch.dict(RESOURCES, mock_resources, clear=True):
130 model = GRPCModelsAccessor.get_model_from_classname('double-key', data, USERNAME, PASSWORD)
131 mock_filter.assert_called_with(key_1="key1", key_2="key2")
132 self.assertEqual(model, FakeModel)
133
134 @patch.object(FakeResource.objects, "filter")
135 @patch.object(FakeResource.objects, "new", MagicMock(return_value=FakeModel))
136 @patch.dict(TOSCA_KEYS, mock_keys, clear=True)
Matteo Scandolo485b7132017-06-30 11:46:47 -0700137 def test_new_model(self, mock_filter):
138 """
139 [GRPCModelsAccessor] get_model_from_classname: should create a new model
140 """
141 data = {
Matteo Scandolo1bd10762017-10-18 09:53:14 +0200142 "name": "test",
143 "fake_key": "key"
Matteo Scandolo485b7132017-06-30 11:46:47 -0700144 }
145 with patch.dict(RESOURCES, mock_resources, clear=True):
Matteo Scandolo1bd10762017-10-18 09:53:14 +0200146 model = GRPCModelsAccessor.get_model_from_classname('single-key', data, USERNAME, PASSWORD)
147 mock_filter.assert_called_with(fake_key="key")
Matteo Scandolo485b7132017-06-30 11:46:47 -0700148 self.assertEqual(model, FakeModel)
149
150 @patch.object(FakeResource.objects, "filter", MagicMock(return_value=[FakeExistingModel]))
Matteo Scandolo1bd10762017-10-18 09:53:14 +0200151 @patch.dict(TOSCA_KEYS, mock_keys, clear=True)
Matteo Scandolo485b7132017-06-30 11:46:47 -0700152 def test_existing_model(self):
153 """
154 [GRPCModelsAccessor] get_model_from_classname: should update an existing model
155 """
156 data = {
Matteo Scandolo1bd10762017-10-18 09:53:14 +0200157 "name": "test",
158 "fake_key": "key"
Matteo Scandolo485b7132017-06-30 11:46:47 -0700159 }
160 with patch.dict(RESOURCES, mock_resources, clear=True):
Matteo Scandolo1bd10762017-10-18 09:53:14 +0200161 model = GRPCModelsAccessor.get_model_from_classname('single-key', data, USERNAME, PASSWORD)
Matteo Scandolo485b7132017-06-30 11:46:47 -0700162 self.assertEqual(model, FakeExistingModel)
163
164 @patch.object(FakeResource.objects, "filter", MagicMock(return_value=['a', 'b']))
Matteo Scandolo1bd10762017-10-18 09:53:14 +0200165 @patch.dict(TOSCA_KEYS, mock_keys, clear=True)
Matteo Scandolo485b7132017-06-30 11:46:47 -0700166 def test_multiple_models(self):
167 """
168 [GRPCModelsAccessor] get_model_from_classname: should raise an exception if multiple instances are found
169 """
170 data = {
171 "name": "test"
172 }
173 with patch.dict(RESOURCES, mock_resources, clear=True):
174 with self.assertRaises(Exception) as e:
Matteo Scandolo21dde412017-07-11 18:54:12 -0700175 GRPCModelsAccessor.get_model_from_classname('test-model', data, USERNAME, PASSWORD)
Matteo Scandolo1bd10762017-10-18 09:53:14 +0200176 self.assertEqual(e.exception.message, "[XOS-Tosca] Model of class test-model and properties {'name': 'test'} has multiple instances, I can't handle it")
Matteo Scandolo1fedfae2017-10-09 13:57:00 -0700177
Matteo Scandolo485b7132017-06-30 11:46:47 -0700178if __name__ == '__main__':
179 unittest.main()