From 064f641fe63d761bcc51d38f1821e89791d147e8 Mon Sep 17 00:00:00 2001 From: "Mr. Senko" Date: Sun, 27 Sep 2020 00:08:23 +0300 Subject: [PATCH] API TestExecution.update() will adjust close_date. Fixes #1820 When changing status the close_date field will be updated according to status.weight --- tcms/rpc/api/forms/testrun.py | 1 + tcms/rpc/api/testexecution.py | 9 +++++++++ tcms/rpc/tests/test_testexecution.py | 30 ++++++++++++++++++++++++++++ 3 files changed, 40 insertions(+) diff --git a/tcms/rpc/api/forms/testrun.py b/tcms/rpc/api/forms/testrun.py index 9a12c7d2ab..ea9674fff7 100644 --- a/tcms/rpc/api/forms/testrun.py +++ b/tcms/rpc/api/forms/testrun.py @@ -42,3 +42,4 @@ class Meta: assignee = UserField() tested_by = UserField() + close_date = DateTimeField() diff --git a/tcms/rpc/api/testexecution.py b/tcms/rpc/api/testexecution.py index d7c68b17af..a527ad2de0 100644 --- a/tcms/rpc/api/testexecution.py +++ b/tcms/rpc/api/testexecution.py @@ -2,6 +2,7 @@ from django.conf import settings from django.forms.models import model_to_dict +from django.utils import timezone from modernrpc.core import REQUEST_KEY, rpc_method from tcms.core.contrib.linkreference.models import LinkReference @@ -125,6 +126,14 @@ def update(execution_id, values): else: raise ValueError(form_errors_to_list(form)) + # if this call updated TE.status then adjust timestamps + if values.get('status'): + if test_execution.status.weight != 0: + test_execution.close_date = timezone.now() + else: + test_execution.close_date = None + test_execution.save() + return test_execution.serialize() diff --git a/tcms/rpc/tests/test_testexecution.py b/tcms/rpc/tests/test_testexecution.py index cb7c6bafe5..39be364a7f 100644 --- a/tcms/rpc/tests/test_testexecution.py +++ b/tcms/rpc/tests/test_testexecution.py @@ -393,3 +393,33 @@ def test_update_with_no_perm(self): with self.assertRaisesRegex(ProtocolError, '403 Forbidden'): self.rpc_client.TestExecution.update(self.execution_1.pk, {"close_date": timezone.now()}) + + def test_update_non_zero_status_changes_close_date(self): + """ + Non-zero weight statuses will set close_date + """ + few_secs_ago = timezone.now() + self.execution_1.close_date = None + self.execution_1.save() + + self.rpc_client.TestExecution.update(self.execution_1.pk, { + 'status': self.status_positive.pk, + }) + + self.execution_1.refresh_from_db() + self.assertGreater(self.execution_1.close_date, few_secs_ago) + + def test_update_zero_status_changes_close_date(self): + """ + Zero weight statuses will set close_date to None, + e.g. re-test the TE! + """ + self.execution_1.close_date = timezone.now() + self.execution_1.save() + + self.rpc_client.TestExecution.update(self.execution_1.pk, { + 'status': TestExecutionStatus.objects.filter(weight=0).first().pk, + }) + + self.execution_1.refresh_from_db() + self.assertIsNone(self.execution_1.close_date)