From 41db775584b1310d39e161af685929e89cd6447a Mon Sep 17 00:00:00 2001 From: David Moreau Simard Date: Tue, 2 Oct 2018 14:44:07 -0500 Subject: [PATCH] Implement API for ARA records This adds the API support for implementing records in ARA that are meant to be used by the ara_record and ara_read modules. Change-Id: I162de3859ec05fb51d190753fe073c48ed6f8823 --- ara/api/serializers.py | 6 +++ ara/api/tests/factories.py | 10 +++++ ara/api/tests/tests_records.py | 73 ++++++++++++++++++++++++++++++++++ ara/api/urls.py | 1 + ara/api/views.py | 5 +++ 5 files changed, 95 insertions(+) create mode 100644 ara/api/tests/tests_records.py diff --git a/ara/api/serializers.py b/ara/api/serializers.py index 46bbd54..4e9e5b5 100644 --- a/ara/api/serializers.py +++ b/ara/api/serializers.py @@ -199,6 +199,12 @@ class TaskSerializer(DurationSerializer): ) +class RecordSerializer(serializers.ModelSerializer): + class Meta: + model = models.Record + fields = "__all__" + + class StatsSerializer(serializers.ModelSerializer): class Meta: model = models.Stats diff --git a/ara/api/tests/factories.py b/ara/api/tests/factories.py index d5374df..ff92627 100644 --- a/ara/api/tests/factories.py +++ b/ara/api/tests/factories.py @@ -107,6 +107,16 @@ class ResultFactory(factory.DjangoModelFactory): task = factory.SubFactory(TaskFactory) +class RecordFactory(factory.DjangoModelFactory): + class Meta: + model = models.Record + + key = "record-key" + value = "some-value" + type = "text" + playbook = factory.SubFactory(PlaybookFactory) + + class StatsFactory(factory.DjangoModelFactory): class Meta: model = models.Stats diff --git a/ara/api/tests/tests_records.py b/ara/api/tests/tests_records.py new file mode 100644 index 0000000..b7d7ca9 --- /dev/null +++ b/ara/api/tests/tests_records.py @@ -0,0 +1,73 @@ +# Copyright (c) 2018 Red Hat, Inc. +# +# This file is part of ARA Records Ansible. +# +# ARA is free software: you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation, either version 3 of the License, or +# (at your option) any later version. +# +# ARA is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with ARA. If not, see . + +from rest_framework.test import APITestCase + +from ara.api import models, serializers +from ara.api.tests import factories + + +class RecordTestCase(APITestCase): + def test_record_factory(self): + record = factories.RecordFactory(key="test") + self.assertEqual(record.key, "test") + + def test_record_serializer(self): + playbook = factories.PlaybookFactory() + serializer = serializers.RecordSerializer( + data={"key": "test", "value": "value", "type": "text", "playbook": playbook.id} + ) + serializer.is_valid() + record = serializer.save() + record.refresh_from_db() + self.assertEqual(record.key, "test") + self.assertEqual(record.value, "value") + self.assertEqual(record.type, "text") + + def test_get_no_records(self): + request = self.client.get("/api/v1/records") + self.assertEqual(0, len(request.data["results"])) + + def test_get_record(self): + record = factories.RecordFactory() + request = self.client.get("/api/v1/records") + self.assertEqual(1, len(request.data["results"])) + self.assertEqual(record.key, request.data["results"][0]["key"]) + + def test_delete_record(self): + record = factories.RecordFactory() + self.assertEqual(1, models.Record.objects.all().count()) + request = self.client.delete("/api/v1/records/%s" % record.id) + self.assertEqual(204, request.status_code) + self.assertEqual(0, models.Record.objects.all().count()) + + def test_create_record(self): + playbook = factories.PlaybookFactory() + self.assertEqual(0, models.Record.objects.count()) + request = self.client.post( + "/api/v1/records", {"key": "test", "value": "value", "type": "text", "playbook": playbook.id} + ) + self.assertEqual(201, request.status_code) + self.assertEqual(1, models.Record.objects.count()) + + def test_partial_update_record(self): + record = factories.RecordFactory() + self.assertNotEqual("update", record.key) + request = self.client.patch("/api/v1/records/%s" % record.id, {"key": "update"}) + self.assertEqual(200, request.status_code) + record_updated = models.Record.objects.get(id=record.id) + self.assertEqual("update", record_updated.key) diff --git a/ara/api/urls.py b/ara/api/urls.py index 67371ef..21852f1 100644 --- a/ara/api/urls.py +++ b/ara/api/urls.py @@ -26,6 +26,7 @@ router.register("tasks", views.TaskViewSet, base_name="task") router.register("hosts", views.HostViewSet, base_name="host") router.register("results", views.ResultViewSet, base_name="result") router.register("files", views.FileViewSet, base_name="file") +router.register("records", views.RecordViewSet, base_name="record") router.register("stats", views.StatsViewSet, base_name="stats") playbook_routes = router.register("playbooks", views.PlaybookViewSet, base_name="playbook") diff --git a/ara/api/views.py b/ara/api/views.py index cb981f1..964e5cc 100644 --- a/ara/api/views.py +++ b/ara/api/views.py @@ -67,6 +67,11 @@ class FileViewSet(viewsets.ModelViewSet): serializer_class = serializers.FileSerializer +class RecordViewSet(viewsets.ModelViewSet): + queryset = models.Record.objects.all() + serializer_class = serializers.RecordSerializer + + class StatsViewSet(viewsets.ModelViewSet): queryset = models.Stats.objects.all() serializer_class = serializers.StatsSerializer