220 lines
7.4 KiB
Python
220 lines
7.4 KiB
Python
# Copyright 2016 Spanish National Research Council
|
|
#
|
|
# 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.
|
|
|
|
import json
|
|
|
|
import mock
|
|
|
|
from ooi.occi.core import attribute
|
|
from ooi.occi.rendering import occi_json
|
|
from ooi.tests.unit.occi.renderings import base
|
|
|
|
|
|
class TestOCCIJsonRendering(base.BaseRendererTest):
|
|
def setUp(self):
|
|
super(TestOCCIJsonRendering, self).setUp()
|
|
self.renderer = occi_json
|
|
|
|
def assertAction(self, obj, observed):
|
|
expected = {
|
|
"term": obj.term,
|
|
"scheme": obj.scheme,
|
|
"title": obj.title
|
|
}
|
|
self.assertEqual(expected, json.loads(observed))
|
|
|
|
def assertCollection(self, obj, observed):
|
|
observed_json = json.loads(observed)
|
|
for what, fn in [("kinds", self.assertKind),
|
|
("mixins", self.assertMixin),
|
|
("actions", self.assertAction),
|
|
("links", self.assertLink),
|
|
("resources", self.assertResource)]:
|
|
objs = getattr(obj, what)
|
|
if objs:
|
|
dumped_objs = [json.dumps(o) for o in observed_json[what]]
|
|
map(fn, objs, dumped_objs)
|
|
|
|
def assertException(self, obj, observed):
|
|
expected = {
|
|
"code": obj.status_code,
|
|
"message": obj.explanation,
|
|
}
|
|
self.assertEqual(expected, json.loads(observed))
|
|
|
|
def assertKind(self, obj, observed):
|
|
expected = {
|
|
"term": obj.term,
|
|
"scheme": obj.scheme,
|
|
"title": obj.title,
|
|
}
|
|
self.assertEqual(expected, json.loads(observed))
|
|
|
|
def assertKindAttr(self, obj, attr, observed):
|
|
expected = {
|
|
"mutable": isinstance(attr, attribute.MutableAttribute),
|
|
"required": attr.required,
|
|
"type": "string",
|
|
}
|
|
if attr.default:
|
|
expected["default"] = attr.default
|
|
if attr.description:
|
|
expected["description"] = attr.description
|
|
k, v = json.loads(observed)["attributes"].popitem()
|
|
self.assertEqual(k, attr.name)
|
|
self.assertEqual(expected, v)
|
|
|
|
def assertLink(self, obj, observed):
|
|
link = {
|
|
"kind": obj.kind.type_id,
|
|
"id": obj.id,
|
|
"source": {
|
|
"location": obj.source.location,
|
|
"kind": obj.source.kind.type_id
|
|
},
|
|
"target": {
|
|
"location": obj.target.location,
|
|
"kind": obj.target.kind.type_id,
|
|
},
|
|
"title": obj.title,
|
|
}
|
|
if obj.mixins:
|
|
link["mixins"] = [m.type_id for m in obj.mixins]
|
|
self.assertEqual(link, json.loads(observed))
|
|
|
|
def assertMixedCollection(self, kind, resource, observed):
|
|
c = mock.MagicMock()
|
|
c.kinds = [kind]
|
|
c.resources = [resource]
|
|
c.mixins = ()
|
|
c.actions = ()
|
|
c.links = ()
|
|
self.assertCollection(c, observed)
|
|
|
|
def assertMixin(self, obj, observed):
|
|
expected = {
|
|
"term": obj.term,
|
|
"scheme": obj.scheme,
|
|
"title": obj.title
|
|
}
|
|
self.assertEqual(expected, json.loads(observed))
|
|
|
|
def assertResource(self, obj, observed):
|
|
expected = {}
|
|
for attr in ["summary", "title", "id"]:
|
|
v = getattr(obj, attr, None)
|
|
if v is not None:
|
|
expected[attr] = v
|
|
expected["kind"] = obj.kind.type_id
|
|
if obj.mixins:
|
|
expected["mixins"] = [m.type_id for m in obj.mixins]
|
|
if obj.actions:
|
|
expected["actions"] = [a.type_id for a in obj.actions]
|
|
self.assertEqual(expected, json.loads(observed))
|
|
|
|
def assertResourceActions(self, obj, actions, observed):
|
|
self.assertResource(obj, observed)
|
|
|
|
def assertResourceMixins(self, obj, mixins, observed):
|
|
self.assertResource(obj, observed)
|
|
|
|
def assertResourceAttr(self, obj, attr, observed):
|
|
observed_json = json.loads(observed)
|
|
expected = {attr[0]: attr[1]}
|
|
self.assertEqual(expected, observed_json['attributes'])
|
|
|
|
def assertResourceStringAttr(self, obj, attr, observed):
|
|
self.assertResourceAttr(obj, attr, observed)
|
|
|
|
def assertResourceIntAttr(self, obj, attr, observed):
|
|
self.assertResourceAttr(obj, attr, observed)
|
|
|
|
def assertResourceBoolAttr(self, obj, attr, observed):
|
|
self.assertResourceAttr(obj, attr, observed)
|
|
|
|
def assertResourceLink(self, obj1, obj2, observed):
|
|
self.assertLink(obj1.links[0],
|
|
json.dumps(json.loads(observed)["links"][0]))
|
|
|
|
def test_object_attr(self):
|
|
attr = attribute.MutableAttribute("org.example")
|
|
r = self.renderer.get_renderer(attr)
|
|
observed = r.render()
|
|
expected = {
|
|
"org.example": {
|
|
"type": "string", "required": False, "mutable": True,
|
|
}
|
|
}
|
|
self.assertEqual(expected, json.loads(observed))
|
|
|
|
def test_list_attr(self):
|
|
attr = attribute.MutableAttribute(
|
|
"org.example", attr_type=attribute.AttributeType.list_type)
|
|
r = self.renderer.get_renderer(attr)
|
|
observed = r.render()
|
|
expected = {
|
|
"org.example": {
|
|
"type": "array", "required": False, "mutable": True,
|
|
}
|
|
}
|
|
self.assertEqual(expected, json.loads(observed))
|
|
|
|
def test_hash_attr(self):
|
|
attr = attribute.MutableAttribute(
|
|
"org.example", attr_type=attribute.AttributeType.hash_type)
|
|
r = self.renderer.get_renderer(attr)
|
|
observed = r.render()
|
|
expected = {
|
|
"org.example": {
|
|
"type": "object", "required": False, "mutable": True,
|
|
}
|
|
}
|
|
self.assertEqual(expected, json.loads(observed))
|
|
|
|
def test_string_attr(self):
|
|
attr = attribute.MutableAttribute(
|
|
"org.example", attr_type=attribute.AttributeType.string_type)
|
|
r = self.renderer.get_renderer(attr)
|
|
observed = r.render()
|
|
expected = {
|
|
"org.example": {
|
|
"type": "string", "required": False, "mutable": True,
|
|
}
|
|
}
|
|
self.assertEqual(expected, json.loads(observed))
|
|
|
|
def test_number_attr(self):
|
|
attr = attribute.MutableAttribute(
|
|
"org.example", attr_type=attribute.AttributeType.number_type)
|
|
r = self.renderer.get_renderer(attr)
|
|
observed = r.render()
|
|
expected = {
|
|
"org.example": {
|
|
"type": "number", "required": False, "mutable": True,
|
|
}
|
|
}
|
|
self.assertEqual(expected, json.loads(observed))
|
|
|
|
def test_boolean_attr(self):
|
|
attr = attribute.MutableAttribute(
|
|
"org.example", attr_type=attribute.AttributeType.boolean_type)
|
|
r = self.renderer.get_renderer(attr)
|
|
observed = r.render()
|
|
expected = {
|
|
"org.example": {
|
|
"type": "boolean", "required": False, "mutable": True,
|
|
}
|
|
}
|
|
self.assertEqual(expected, json.loads(observed))
|