summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorWilliam Wolf <throughnothing@gmail.com>2011-07-25 16:25:19 -0400
committerWilliam Wolf <throughnothing@gmail.com>2011-07-25 16:25:19 -0400
commit71a103822b41df3d90a1e958baffda55a9cb8730 (patch)
tree8d32680be7ccf3ed6783224be0a0eb28d7a9056f
parent810d4b89cbbfa9388fb61f9069ea0104a7d77752 (diff)
xml version detail working with tests
-rw-r--r--nova/api/openstack/versions.py30
-rw-r--r--nova/tests/api/openstack/test_versions.py165
2 files changed, 147 insertions, 48 deletions
diff --git a/nova/api/openstack/versions.py b/nova/api/openstack/versions.py
index 5655edcfc..00fc8d98f 100644
--- a/nova/api/openstack/versions.py
+++ b/nova/api/openstack/versions.py
@@ -209,16 +209,39 @@ class VersionsXMLSerializer(wsgi.XMLDictSerializer):
return root
- def _create_version_node(self, version):
+ def _create_media_types(self, media_types):
+ base = self._xml_doc.createElement('media-types')
+ for type in media_types:
+ node = self._xml_doc.createElement('media-type')
+ node.setAttribute('base', type['base'])
+ node.setAttribute('type', type['type'])
+ base.appendChild(node)
+
+ return base
+
+ def _create_version_node(self, version, create_ns=False):
version_node = self._xml_doc.createElement('version')
+ if create_ns:
+ xmlns = "http://docs.openstack.org/common/api/%s" % version['id']
+ xmlns_atom = "http://www.w3.org/2005/Atom"
+ version_node.setAttribute('xmlns', xmlns)
+ version_node.setAttribute('xmlns:atom', xmlns_atom)
+
version_node.setAttribute('id', version['id'])
version_node.setAttribute('status', version['status'])
version_node.setAttribute('updated', version['updated'])
+ if 'media-types' in version:
+ media_types = self._create_media_types(version['media-types'])
+ version_node.appendChild(media_types)
+
for link in version['links']:
link_node = self._xml_doc.createElement('atom:link')
link_node.setAttribute('rel', link['rel'])
link_node.setAttribute('href', link['href'])
+ if 'type' in link:
+ link_node.setAttribute('type', link['type'])
+
version_node.appendChild(link_node)
return version_node
@@ -230,7 +253,10 @@ class VersionsXMLSerializer(wsgi.XMLDictSerializer):
return self.to_xml_string(node)
def detail(self,data):
- return "<xml></xml>"
+ self._xml_doc = minidom.Document()
+ node = self._create_version_node(data['version'], True)
+
+ return self.to_xml_string(node)
def multi(self, data):
self._xml_doc = minidom.Document()
diff --git a/nova/tests/api/openstack/test_versions.py b/nova/tests/api/openstack/test_versions.py
index 9c4af0787..632d388fa 100644
--- a/nova/tests/api/openstack/test_versions.py
+++ b/nova/tests/api/openstack/test_versions.py
@@ -161,7 +161,40 @@ class VersionsTest(test.TestCase):
self.assertEqual(expected, version)
def test_get_version_1_0_detail_xml(self):
- pass
+ req = webob.Request.blank('/v1.0/')
+ req.accept = "application/xml"
+ res = req.get_response(fakes.wsgi_app())
+ self.assertEqual(res.status_int, 200)
+ self.assertEqual(res.content_type, "application/xml")
+ expected = """
+ <version id="v1.0" status="CURRENT"
+ updated="2011-01-21T11:33:21-06:00"
+ xmlns="http://docs.openstack.org/common/api/v1.0"
+ xmlns:atom="http://www.w3.org/2005/Atom">
+
+ <media-types>
+ <media-type base="application/xml"
+ type="application/vnd.openstack.compute-v1.0+xml"/>
+ <media-type base="application/json"
+ type="application/vnd.openstack.compute-v1.0+json"/>
+ </media-types>
+
+ <atom:link href="http://servers.api.openstack.org/v1.0/"
+ rel="self"/>
+
+ <atom:link href="http://docs.rackspacecloud.com/servers/
+ api/v1.0/cs-devguide-20110125.pdf"
+ rel="describedby"
+ type="application/pdf"/>
+
+ <atom:link href="http://docs.rackspacecloud.com/servers/
+ api/v1.0/application.wadl"
+ rel="describedby"
+ type="application/vnd.sun.wadl+xml"/>
+ </version>""".replace(" ", "").replace("\n", "")
+
+ actual = res.body.replace(" ", "").replace("\n", "")
+ self.assertEqual(expected, actual)
def test_get_version_1_1_detail_xml(self):
req = webob.Request.blank('/v1.1/')
@@ -170,31 +203,31 @@ class VersionsTest(test.TestCase):
self.assertEqual(res.status_int, 200)
self.assertEqual(res.content_type, "application/xml")
expected = """
- <?xml version="1.0" encoding="UTF-8"?>
- <version xmlns="http://docs.openstack.org/common/api/v1.0"
- xmlns:atom="http://www.w3.org/2005/Atom"
- id="v1.1" status="CURRENT" updated="2011-01-21T11:33:21-06:00">
-
- <media-types>
- <media-type base="application/xml"
- type="application/vnd.openstack.compute-v1.1+xml"/>
- <media-type base="application/json"
- type="application/vnd.openstack.compute-v1.1+json"/>
- </media-types>
-
- <atom:link rel="self"
- href="http://servers.api.openstack.org/v1.0/"/>
-
- <atom:link rel="describedby"
- type="application/pdf"
- href="http://docs.rackspacecloud.com/
- servers/api/v1.1/cs-devguide-20110125.pdf" />
-
- <atom:link rel="describedby"
- type="application/vnd.sun.wadl+xml"
- href="http://docs.rackspacecloud.com/
- servers/api/v1.1/application.wadl" />
- </version>""".replace(" ", "").replace("\n", "")
+ <version id="v1.1" status="CURRENT"
+ updated="2011-01-21T11:33:21-06:00"
+ xmlns="http://docs.openstack.org/common/api/v1.1"
+ xmlns:atom="http://www.w3.org/2005/Atom">
+
+ <media-types>
+ <media-type base="application/xml"
+ type="application/vnd.openstack.compute-v1.1+xml"/>
+ <media-type base="application/json"
+ type="application/vnd.openstack.compute-v1.1+json"/>
+ </media-types>
+
+ <atom:link href="http://servers.api.openstack.org/v1.1/"
+ rel="self"/>
+
+ <atom:link href="http://docs.rackspacecloud.com/servers/
+ api/v1.1/cs-devguide-20110125.pdf"
+ rel="describedby"
+ type="application/pdf"/>
+
+ <atom:link href="http://docs.rackspacecloud.com/servers/
+ api/v1.1/application.wadl"
+ rel="describedby"
+ type="application/vnd.sun.wadl+xml"/>
+ </version>""".replace(" ", "").replace("\n", "")
actual = res.body.replace(" ", "").replace("\n", "")
self.assertEqual(expected, actual)
@@ -330,31 +363,70 @@ class VersionsTest(test.TestCase):
def test_versions_detail_xml_serializer(self):
versions_data = {
- 'versions': [
- {
- "id": "2.7.1",
- "updated": "2011-07-18T11:30:00Z",
- "status": "DEPRECATED",
- "links": [
- {
- "rel": "self",
- "href": "http://test/2.7.1",
- }
- ],
- },
- ]
+ "version" : {
+ "id": "v1.0",
+ "status": "CURRENT",
+ "updated": "2011-01-21T11:33:21-06:00",
+ "links": [
+ {
+ "rel": "self",
+ "href": "http://servers.api.openstack.org/v1.0/"
+ },
+ {
+ "rel": "describedby",
+ "type": "application/pdf",
+ "href": "http://docs.rackspacecloud.com/"
+ "servers/api/v1.0/cs-devguide-20110125.pdf"
+ },
+ {
+ "rel": "describedby",
+ "type": "application/vnd.sun.wadl+xml",
+ "href": "http://docs.rackspacecloud.com/"
+ "servers/api/v1.0/application.wadl"
+ },
+ ],
+ "media-types": [
+ {
+ "base" : "application/xml",
+ "type" : "application/vnd.openstack.compute-v1.0+xml"
+ },
+ {
+ "base" : "application/json",
+ "type" : "application/vnd.openstack.compute-v1.0+json"
+ }
+ ],
+ },
}
expected = """
- <versions>
- <version id="2.7.1" status="DEPRECATED"
- updated="2011-07-18T11:30:00Z">
- <atom:link href="http://test/2.7.1" rel="self"/>
- </version>
- </versions>""".replace(" ", "").replace("\n", "")
+ <version id="v1.0" status="CURRENT"
+ updated="2011-01-21T11:33:21-06:00"
+ xmlns="http://docs.openstack.org/common/api/v1.0"
+ xmlns:atom="http://www.w3.org/2005/Atom">
+
+ <media-types>
+ <media-type base="application/xml"
+ type="application/vnd.openstack.compute-v1.0+xml"/>
+ <media-type base="application/json"
+ type="application/vnd.openstack.compute-v1.0+json"/>
+ </media-types>
+
+ <atom:link href="http://servers.api.openstack.org/v1.0/"
+ rel="self"/>
+
+ <atom:link href="http://docs.rackspacecloud.com/servers/
+ api/v1.0/cs-devguide-20110125.pdf"
+ rel="describedby"
+ type="application/pdf"/>
+
+ <atom:link href="http://docs.rackspacecloud.com/servers/
+ api/v1.0/application.wadl"
+ rel="describedby"
+ type="application/vnd.sun.wadl+xml"/>
+ </version>""".replace(" ", "").replace("\n", "")
serializer = versions.VersionsXMLSerializer()
- response = serializer.index(versions_data)
+ response = serializer.detail(versions_data)
response = response.replace(" ", "").replace("\n", "")
self.assertEqual(expected, response)
@@ -418,6 +490,7 @@ class VersionsTest(test.TestCase):
self.assertEqual(expected, response)
def test_version_detail_atom_serializer(self):
+ #TODO
versions_data = {
'versions': [
{