From 2fc776a95f623bf238767c5396e2699d69ddecaf Mon Sep 17 00:00:00 2001 From: David Moreau Simard Date: Wed, 14 Nov 2018 14:36:12 -0500 Subject: [PATCH] model: change play.completed to play.status We want a bit more granularity regarding the status of the plays, "completed" is not enough. In 0.x, the status was inferred at runtime. We'll set it so we don't need to compute it every time. Change-Id: I0184aab6cf1f839165fdcfdab4b7f567ec44442e --- ara/api/migrations/0001_initial.py | 4 ++-- ara/api/models.py | 8 +++++++- ara/api/tests/factories.py | 2 +- ara/api/tests/tests_play.py | 13 +++++++++++-- 4 files changed, 21 insertions(+), 6 deletions(-) diff --git a/ara/api/migrations/0001_initial.py b/ara/api/migrations/0001_initial.py index afbff36..bb2b456 100644 --- a/ara/api/migrations/0001_initial.py +++ b/ara/api/migrations/0001_initial.py @@ -1,4 +1,4 @@ -# Generated by Django 2.1.2 on 2018-10-16 00:43 +# Generated by Django 2.1.3 on 2018-11-14 19:34 from django.db import migrations, models import django.db.models.deletion @@ -75,7 +75,7 @@ class Migration(migrations.Migration): ('ended', models.DateTimeField(blank=True, null=True)), ('name', models.CharField(blank=True, max_length=255, null=True)), ('uuid', models.UUIDField()), - ('completed', models.BooleanField(default=False)), + ('status', models.CharField(choices=[('unknown', 'unknown'), ('running', 'running'), ('completed', 'completed')], default='unknown', max_length=25)), ], options={ 'db_table': 'plays', diff --git a/ara/api/models.py b/ara/api/models.py index 6c52ae9..3af1f37 100644 --- a/ara/api/models.py +++ b/ara/api/models.py @@ -156,9 +156,15 @@ class Play(Duration): class Meta: db_table = "plays" + # A play in ARA can be running (in progress) or completed (regardless of success or failure) + UNKNOWN = "unknown" + RUNNING = "running" + COMPLETED = "completed" + STATUS = ((UNKNOWN, "unknown"), (RUNNING, "running"), (COMPLETED, "completed")) + name = models.CharField(max_length=255, blank=True, null=True) uuid = models.UUIDField() - completed = models.BooleanField(default=False) + status = models.CharField(max_length=25, choices=STATUS, default=UNKNOWN) playbook = models.ForeignKey(Playbook, on_delete=models.CASCADE, related_name="plays") def __str__(self): diff --git a/ara/api/tests/factories.py b/ara/api/tests/factories.py index ae17c44..92e0fc2 100644 --- a/ara/api/tests/factories.py +++ b/ara/api/tests/factories.py @@ -69,7 +69,7 @@ class PlayFactory(factory.DjangoModelFactory): model = models.Play name = "test play" - completed = True + status = "running" uuid = "5c5f67b9-e63c-6297-80da-000000000005" playbook = factory.SubFactory(PlaybookFactory) diff --git a/ara/api/tests/tests_play.py b/ara/api/tests/tests_play.py index 1c4a695..b9f856b 100644 --- a/ara/api/tests/tests_play.py +++ b/ara/api/tests/tests_play.py @@ -34,7 +34,7 @@ class PlayTestCase(APITestCase): serializer = serializers.PlaySerializer( data={ "name": "serializer", - "completed": True, + "status": "completed", "uuid": "5c5f67b9-e63c-6297-80da-000000000005", "playbook": playbook.id, } @@ -43,6 +43,7 @@ class PlayTestCase(APITestCase): play = serializer.save() play.refresh_from_db() self.assertEqual(play.name, "serializer") + self.assertEqual(play.status, "completed") def test_get_no_plays(self): request = self.client.get("/api/v1/plays") @@ -68,7 +69,7 @@ class PlayTestCase(APITestCase): "/api/v1/plays", { "name": "create", - "completed": False, + "status": "running", "uuid": "5c5f67b9-e63c-6297-80da-000000000005", "playbook": playbook.id, }, @@ -109,3 +110,11 @@ class PlayTestCase(APITestCase): play = factories.PlayFactory(started=started, ended=ended) request = self.client.get("/api/v1/plays/%s" % play.id) self.assertEqual(request.data["duration"], datetime.timedelta(0, 3600)) + + def test_update_wrong_play_status(self): + play = factories.PlayFactory() + self.assertNotEqual("wrong", play.status) + request = self.client.patch("/api/v1/plays/%s" % play.id, {"status": "wrong"}) + self.assertEqual(400, request.status_code) + play_updated = models.Play.objects.get(id=play.id) + self.assertNotEqual("wrong", play_updated.status)