Add endpoint/tests for GET /revisions/{revision_id}

This commit is contained in:
Felipe Monteiro 2017-07-31 21:13:39 +01:00
parent 441f3afd9f
commit cbb09bd1ed
6 changed files with 61 additions and 7 deletions

View File

@ -71,6 +71,7 @@ def start_api(state_manager=None):
v1_0_routes = [
('documents', documents.DocumentsResource()),
('revisions', revisions.RevisionsResource()),
('revisions/{revision_id}', revisions.RevisionResource()),
('revisions/{revision_id}/documents',
revision_documents.RevisionDocumentsResource()),
('secrets', secrets.SecretsResource())

View File

@ -24,3 +24,8 @@ class ViewBuilder(object):
"""Model API responses as dictionaries."""
_collection_name = None
def _gen_url(self, revision):
# TODO: Use a config-based url for the base url below.
base_url = 'https://deckhand/api/v1.0/%s/%s'
return base_url % (self._collection_name, revision.get('id'))

View File

@ -20,7 +20,7 @@ from deckhand.db.sqlalchemy import api as db_api
class RevisionsResource(api_base.BaseResource):
"""API resource for realizing CRUD endpoints for Revisions."""
"""API resource for realizing GET /revisions."""
def on_get(self, req, resp):
"""Returns list of existing revisions.
@ -30,8 +30,25 @@ class RevisionsResource(api_base.BaseResource):
of each revision.
"""
revisions = db_api.revision_get_all()
revisions_view = revision_view.ViewBuilder().list(revisions)
revisions_resp = revision_view.ViewBuilder().list(revisions)
resp.status = falcon.HTTP_200
resp.append_header('Content-Type', 'application/x-yaml')
resp.body = self.to_yaml_body(revisions_view)
resp.body = self.to_yaml_body(revisions_resp)
class RevisionResource(api_base.BaseResource):
"""API resource for realizing GET /revisions/{revision_id}."""
def on_get(self, req, resp, revision_id):
"""Returns detailed description of a particular revision.
The status of each ValidationPolicy belonging to the revision is also
included.
"""
revision = db_api.revision_get(revision_id)
revision_resp = revision_view.ViewBuilder().show(revision)
resp.status = falcon.HTTP_200
resp.append_header('Content-Type', 'application/x-yaml')
resp.body = self.to_yaml_body(revision_resp)

View File

@ -36,3 +36,12 @@ class ViewBuilder(common.ViewBuilder):
resp_body['results'].append(result)
return resp_body
def show(self, revision):
return {
'id': revision.get('id'),
'createdAt': revision.get('created_at'),
'url': self._gen_url(revision),
# TODO: Not yet implemented.
'validationPolicies': [],
}

View File

@ -30,10 +30,18 @@ class TestApi(testtools.TestCase):
super(TestApi, self).setUp()
for resource in (documents, revisions, revision_documents, secrets):
resource_name = resource.__name__.split('.')[-1]
resource_obj = mock.patch.object(
resource, '%sResource' % resource_name.title().replace('_', '')
).start()
setattr(self, '%s_resource' % resource_name, resource_obj)
# Mock the singular/plural version.
resource_names = [resource_name, resource_name[:-1]]
for resource_name in resource_names:
try:
resource_obj = mock.patch.object(
resource, '%sResource' % resource_name.title().replace(
'_', '')).start()
setattr(self, '%s_resource' % resource_name, resource_obj)
except AttributeError:
# If a resource doesn't exist, ignore.
pass
@mock.patch.object(api, 'db_api', autospec=True)
@mock.patch.object(api, 'config', autospec=True)
@ -50,6 +58,8 @@ class TestApi(testtools.TestCase):
mock_falcon_api.add_route.assert_has_calls([
mock.call('/api/v1.0/documents', self.documents_resource()),
mock.call('/api/v1.0/revisions', self.revisions_resource()),
mock.call('/api/v1.0/revisions/{revision_id}',
self.revision_resource()),
mock.call('/api/v1.0/revisions/{revision_id}/documents',
self.revision_documents_resource()),
mock.call('/api/v1.0/secrets', self.secrets_resource())

View File

@ -64,3 +64,15 @@ class TestRevisionViews(base.TestDbBase):
self.assertIn('id', revisions_view['results'][idx])
self.assertEqual(doc_count, revisions_view['results'][idx][
'count'])
def test_show_revision(self):
payload = [base.DocumentFixture.get_minimal_fixture()
for _ in range(4)]
documents = self._create_documents(payload)
revision = self._get_revision(documents[0]['revision_id'])
revision_view = self.view_builder.show(revision)
expected_attrs = ('id', 'url', 'createdAt', 'validationPolicies')
for attr in expected_attrs:
self.assertIn(attr, revision_view)
self.assertIsInstance(revision_view['validationPolicies'], list)