blob: 0ac10b136eca1dde5ea33684a35a8af8f5817056 [file] [log] [blame]
# Copyright 2017-present Open Networking Foundation
#
# 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 __future__ import absolute_import
from . import helpers # noqa: F401
import unittest
try: # python 3
from unittest.mock import patch, MagicMock
except ImportError: # python 2
from mock import patch, MagicMock
from grpc_client.models_accessor import GRPCModelsAccessor
from grpc_client.resources import RESOURCES
from grpc_client.KEYS import TOSCA_KEYS
class FakeObj:
new = None
filter = None
class FakeResource:
objects = FakeObj
class FakeModel:
pass
class FakeExistingModel:
pass
mock_resources = {
"username~pass": {
"test-model": FakeResource,
"single-key": FakeResource,
"double-key": FakeResource,
"one-of-key": FakeResource,
}
}
mock_keys = {
"i-do-not-exists": ["name"],
"test-model": ["name"],
"empty-key": [],
"single-key": ["fake_key"],
"double-key": ["key_1", "key_2"],
"one-of-key": ["key_1", ["key_2", "key_3"]],
}
USERNAME = "username"
PASSWORD = "pass"
class GRPCModelsAccessor_Create_or_update_Test(unittest.TestCase):
@patch.dict(TOSCA_KEYS, mock_keys, clear=True)
def test_unkown_user(self):
"""
[GRPCModelsAccessor] get_model_from_classname: If a user does not have orm classes, raise
"""
data = {"name": "test"}
with self.assertRaises(Exception) as e:
GRPCModelsAccessor.get_model_from_classname(
"i-do-not-exists", data, USERNAME, PASSWORD
)
self.assertEqual(
str(e.exception),
"[XOS-TOSCA] User 'username' does not have ready resources",
)
@patch.dict(RESOURCES, mock_resources, clear=True)
@patch.dict(TOSCA_KEYS, mock_keys, clear=True)
def test_unkown_module(self):
"""
[GRPCModelsAccessor] get_model_from_classname: If a model is not know by the grpc api, raise
"""
data = {"name": "test"}
with self.assertRaises(Exception) as e:
GRPCModelsAccessor.get_model_from_classname(
"i-do-not-exists", data, USERNAME, PASSWORD
)
self.assertEqual(
str(e.exception),
"[XOS-TOSCA] The model you are trying to create "
"(class: i-do-not-exists, properties, {'name': 'test'}) is not know by xos-core",
)
def test_unkown_tosca_key(self):
"""
[GRPCModelsAccessor] get_model_from_classname: If a model does not have a tosca_key, raise
"""
data = {"name": "test"}
with self.assertRaises(Exception) as e:
GRPCModelsAccessor.get_model_from_classname(
"no-key", data, USERNAME, PASSWORD
)
self.assertEqual(
str(e.exception),
"[XOS-TOSCA] Model no-key doesn't have a tosca_key specified",
)
@patch.dict(TOSCA_KEYS, mock_keys, clear=True)
def test_empty_tosca_key(self):
"""
[GRPCModelsAccessor] get_model_from_classname: If a model does not have a tosca_key, raise
"""
data = {"name": "test"}
with self.assertRaises(Exception) as e:
GRPCModelsAccessor.get_model_from_classname(
"empty-key", data, USERNAME, PASSWORD
)
self.assertEqual(
str(e.exception),
"[XOS-TOSCA] Model empty-key doesn't have a tosca_key specified",
)
@patch.dict(TOSCA_KEYS, mock_keys, clear=True)
def test_tosca_key_are_defined(self):
"""
[GRPCModelsAccessor] get_model_from_classname: a model should have a property for it's tosca_key
"""
data = {"name": "test"}
with self.assertRaises(Exception) as e:
GRPCModelsAccessor.get_model_from_classname(
"single-key", data, USERNAME, PASSWORD
)
self.assertEqual(
str(e.exception),
"[XOS-TOSCA] Model single-key doesn't have a property for the specified tosca_key ('fake_key')",
)
@patch.object(FakeResource.objects, "filter")
@patch.object(FakeResource.objects, "new", MagicMock(return_value=FakeModel))
@patch.dict(TOSCA_KEYS, mock_keys, clear=True)
def test_composite_key(self, mock_filter):
"""
[GRPCModelsAccessor] get_model_from_classname: should use a composite key to lookup a model
"""
data = {"name": "test", "key_1": "key1", "key_2": "key2"}
with patch.dict(RESOURCES, mock_resources, clear=True):
model = GRPCModelsAccessor.get_model_from_classname(
"double-key", data, USERNAME, PASSWORD
)
mock_filter.assert_called_with(key_1="key1", key_2="key2")
self.assertEqual(model, FakeModel)
@patch.object(FakeResource.objects, "filter")
@patch.object(FakeResource.objects, "new", MagicMock(return_value=FakeModel))
@patch.dict(TOSCA_KEYS, mock_keys, clear=True)
def test_one_of_key(self, mock_filter):
"""
[GRPCModelsAccessor] get_model_from_classname: should use a composite with one_of key to lookup a model
"""
# NOTE it should be valid for items with either one of the keys
data2 = {"name": "test", "key_1": "key1", "key_2": "key2"}
with patch.dict(RESOURCES, mock_resources, clear=True):
model = GRPCModelsAccessor.get_model_from_classname(
"one-of-key", data2, USERNAME, PASSWORD
)
mock_filter.assert_called_with(key_1="key1", key_2="key2")
self.assertEqual(model, FakeModel)
data3 = {"name": "test", "key_1": "key1", "key_3": "key3"}
with patch.dict(RESOURCES, mock_resources, clear=True):
model = GRPCModelsAccessor.get_model_from_classname(
"one-of-key", data3, USERNAME, PASSWORD
)
mock_filter.assert_called_with(key_1="key1", key_3="key3")
self.assertEqual(model, FakeModel)
@patch.object(FakeResource.objects, "filter")
@patch.object(FakeResource.objects, "new", MagicMock(return_value=FakeModel))
@patch.dict(TOSCA_KEYS, mock_keys, clear=True)
def test_one_of_key_error(self, mock_filter):
data = {"name": "test", "key_1": "key1"}
with self.assertRaises(Exception) as e:
GRPCModelsAccessor.get_model_from_classname(
"one-of-key", data, USERNAME, PASSWORD
)
self.assertEqual(
str(e.exception),
"[XOS-TOSCA] Model one-of-key doesn't have a property "
"for the specified tosca_key_one_of (['key_2', 'key_3'])",
)
@patch.object(FakeResource.objects, "filter")
@patch.object(FakeResource.objects, "new", MagicMock(return_value=FakeModel))
@patch.dict(TOSCA_KEYS, mock_keys, clear=True)
def test_new_model(self, mock_filter):
"""
[GRPCModelsAccessor] get_model_from_classname: should create a new model
"""
data = {"name": "test", "fake_key": "key"}
with patch.dict(RESOURCES, mock_resources, clear=True):
model = GRPCModelsAccessor.get_model_from_classname(
"single-key", data, USERNAME, PASSWORD
)
mock_filter.assert_called_with(fake_key="key")
self.assertEqual(model, FakeModel)
@patch.object(
FakeResource.objects, "filter", MagicMock(return_value=[FakeExistingModel])
)
@patch.dict(TOSCA_KEYS, mock_keys, clear=True)
def test_existing_model(self):
"""
[GRPCModelsAccessor] get_model_from_classname: should update an existing model
"""
data = {"name": "test", "fake_key": "key"}
with patch.dict(RESOURCES, mock_resources, clear=True):
model = GRPCModelsAccessor.get_model_from_classname(
"single-key", data, USERNAME, PASSWORD
)
self.assertEqual(model, FakeExistingModel)
@patch.object(FakeResource.objects, "filter", MagicMock(return_value=["a", "b"]))
@patch.dict(TOSCA_KEYS, mock_keys, clear=True)
def test_multiple_models(self):
"""
[GRPCModelsAccessor] get_model_from_classname: should raise an exception if multiple instances are found
"""
data = {"name": "test"}
with patch.dict(RESOURCES, mock_resources, clear=True):
with self.assertRaises(Exception) as e:
GRPCModelsAccessor.get_model_from_classname(
"test-model", data, USERNAME, PASSWORD
)
self.assertEqual(
str(e.exception),
"[XOS-TOSCA] Model of class test-model and properties "
"{'name': 'test'} has multiple instances, I can't handle it",
)
if __name__ == "__main__":
unittest.main()