Add API endpoints for results

This makes the API endpoints for results available for consumption.

Change-Id: Icc7938d0081bb71404fb02ead9b95295abcae914
This commit is contained in:
David Moreau Simard 2018-06-20 18:59:04 -04:00
parent ccffd48287
commit f34c6ccb85
No known key found for this signature in database
GPG Key ID: 33A07694CBB71ECC
5 changed files with 118 additions and 1 deletions

View File

@ -118,6 +118,8 @@ class ResultSerializer(serializers.ModelSerializer):
model = models.Result
fields = '__all__'
content = CompressedObjectField(default=zlib.compress(json.dumps({}).encode('utf8')))
class PlaybookSerializer(DurationSerializer):
class Meta:

View File

@ -65,3 +65,13 @@ class HostFactory(factory.DjangoModelFactory):
skipped = 1
unreachable = 0
play = factory.SubFactory(PlayFactory)
class ResultFactory(factory.DjangoModelFactory):
class Meta:
model = models.Result
content = b'x\x9c\xabVJ\xcb\xcfW\xb2RPJJ,R\xaa\x05\x00 \x98\x04T'
status = 'ok'
host = factory.SubFactory(HostFactory)
task = factory.SubFactory(TaskFactory)

View File

@ -0,0 +1,92 @@
from rest_framework.test import APITestCase
from ara.api import models, serializers
from ara.api.tests import factories
class ResultTestCase(APITestCase):
def test_result_factory(self):
result = factories.ResultFactory(status='failed')
self.assertEqual(result.status, 'failed')
def test_result_serializer(self):
host = factories.HostFactory()
task = factories.TaskFactory()
serializer = serializers.ResultSerializer(data={
'status': 'skipped',
'host': host.id,
'task': task.id
})
serializer.is_valid()
result = serializer.save()
result.refresh_from_db()
self.assertEqual(result.status, 'skipped')
self.assertEqual(result.host.id, host.id)
self.assertEqual(result.task.id, task.id)
def test_result_serializer_compress_content(self):
host = factories.HostFactory()
task = factories.TaskFactory()
serializer = serializers.ResultSerializer(data={
'host': host.id,
'task': task.id,
'content': {'foo': 'bar'}
})
serializer.is_valid()
result = serializer.save()
result.refresh_from_db()
self.assertEqual(
result.content, b'x\x9c\xabVJ\xcb\xcfW\xb2RPJJ,R\xaa\x05\x00 \x98\x04T'
)
def test_result_serializer_decompress_content(self):
result = factories.ResultFactory(
content=b'x\x9c\xabVJ\xcb\xcfW\xb2RPJJ,R\xaa\x05\x00 \x98\x04T'
)
serializer = serializers.ResultSerializer(instance=result)
self.assertEqual(serializer.data['content'], {'foo': 'bar'})
def test_get_no_results(self):
request = self.client.get('/api/v1/results/')
self.assertEqual(0, len(request.data['results']))
def test_get_results(self):
result = factories.ResultFactory()
request = self.client.get('/api/v1/results/')
self.assertEqual(1, len(request.data['results']))
self.assertEqual(result.status, request.data['results'][0]['status'])
def test_delete_result(self):
result = factories.ResultFactory()
self.assertEqual(1, models.Result.objects.all().count())
request = self.client.delete('/api/v1/results/%s/' % result.id)
self.assertEqual(204, request.status_code)
self.assertEqual(0, models.Result.objects.all().count())
def test_create_result(self):
host = factories.HostFactory()
task = factories.TaskFactory()
self.assertEqual(0, models.Result.objects.count())
request = self.client.post('/api/v1/results/', {
'status': 'ok',
'host': host.id,
'task': task.id,
'content': {'foo': 'bar'}
})
self.assertEqual(201, request.status_code)
self.assertEqual(1, models.Result.objects.count())
def test_partial_update_result(self):
result = factories.ResultFactory()
self.assertNotEqual('unreachable', result.status)
request = self.client.patch('/api/v1/results/%s/' % result.id, {
'status': 'unreachable'
})
self.assertEqual(200, request.status_code)
result_updated = models.Result.objects.get(id=result.id)
self.assertEqual('unreachable', result_updated.status)
def test_get_result(self):
result = factories.ResultFactory()
request = self.client.get('/api/v1/results/%s/' % result.id)
self.assertEqual(result.status, request.data['status'])

View File

@ -30,6 +30,8 @@ urlpatterns = [
url(r'^tasks/(?P<pk>[0-9]+)/$', views.TaskDetail.as_view(), name='task-detail'),
url(r'^hosts/$', views.HostList.as_view(), name='host-list'),
url(r'^hosts/(?P<pk>[0-9]+)/$', views.HostDetail.as_view(), name='host-detail'),
url(r'^results/$', views.ResultList.as_view(), name='result-list'),
url(r'^results/(?P<pk>[0-9]+)/$', views.ResultDetail.as_view(), name='result-detail'),
url(r'^files/$', views.FileList.as_view(), name='file-list'),
url(r'^files/(?P<pk>[0-9]+)/$', views.FileDetail.as_view(), name='file-detail'),
]

View File

@ -30,7 +30,8 @@ def api_root(request, format=None):
'plays': reverse('play-list', request=request, format=format),
'tasks': reverse('task-list', request=request, format=format),
'files': reverse('file-list', request=request, format=format),
'hosts': reverse('host-list', request=request, format=format)
'hosts': reverse('host-list', request=request, format=format),
'results': reverse('result-list', request=request, format=format)
})
@ -88,6 +89,16 @@ class HostDetail(generics.RetrieveUpdateDestroyAPIView):
serializer_class = serializers.HostSerializer
class ResultList(generics.ListCreateAPIView):
queryset = models.Result.objects.all()
serializer_class = serializers.ResultSerializer
class ResultDetail(generics.RetrieveUpdateDestroyAPIView):
queryset = models.Result.objects.all()
serializer_class = serializers.ResultSerializer
class FileList(generics.ListCreateAPIView):
queryset = models.File.objects.all()
serializer_class = serializers.FileSerializer