Add endpoint/tests for GET /revisions/{revision_id}
This commit is contained in:
parent
441f3afd9f
commit
cbb09bd1ed
|
@ -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())
|
||||
|
|
|
@ -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'))
|
||||
|
|
|
@ -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)
|
||||
|
|
|
@ -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': [],
|
||||
}
|
||||
|
|
|
@ -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())
|
||||
|
|
|
@ -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)
|
||||
|
|
Loading…
Reference in New Issue