ooi/ooi/tests/unit/occi/renderings/test_json.py

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))