diff --git a/tcms/rpc/api/testcase.py b/tcms/rpc/api/testcase.py index 30552133a9..1334a3285f 100644 --- a/tcms/rpc/api/testcase.py +++ b/tcms/rpc/api/testcase.py @@ -1,5 +1,8 @@ # -*- coding: utf-8 -*- +from datetime import timedelta + +from django.db.models.functions import Coalesce from django.forms import EmailField, ValidationError from django.forms.models import model_to_dict from modernrpc.core import REQUEST_KEY, rpc_method @@ -279,8 +282,12 @@ def filter(query=None): # pylint: disable=redefined-builtin if query is None: query = {} - return list( - TestCase.objects.filter(**query) + qs = ( + TestCase.objects.annotate( + expected_duration=Coalesce("setup_duration", timedelta(0)) + + Coalesce("testing_duration", timedelta(0)) + ) + .filter(**query) .values( "id", "create_date", @@ -304,10 +311,15 @@ def filter(query=None): # pylint: disable=redefined-builtin "default_tester__username", "reviewer", "reviewer__username", + "setup_duration", + "testing_duration", + "expected_duration", ) .distinct() ) + return list(qs) + @permissions_required("testcases.view_testcase") @rpc_method(name="TestCase.history") diff --git a/tcms/rpc/tests/test_testcase.py b/tcms/rpc/tests/test_testcase.py index 67968721b7..ca2e00a37d 100644 --- a/tcms/rpc/tests/test_testcase.py +++ b/tcms/rpc/tests/test_testcase.py @@ -8,6 +8,7 @@ from attachments.models import Attachment from django.contrib.auth.models import Permission from django.core.exceptions import ValidationError +from parameterized import parameterized from tcms_api import xmlrpc from tcms.core.helpers import comments @@ -173,12 +174,55 @@ def test_filter_query_none(self): self.assertIn("author", result[0]) self.assertIn("default_tester", result[0]) self.assertIn("reviewer", result[0]) + self.assertIn("setup_duration", result[0]) + self.assertIn("testing_duration", result[0]) + self.assertIn("expected_duration", result[0]) def test_filter_by_product_id(self): cases = self.rpc_client.TestCase.filter({"category__product": self.product.pk}) self.assertIsNotNone(cases) self.assertEqual(len(cases), self.cases_count) + @parameterized.expand( + [ + ("both_values_are_not_set", {}, None, None, 0), + ( + "setup_duration_is_not_set", + {"testing_duration": timedelta(minutes=5)}, + None, + 300, + 300, + ), + ( + "testing_duration_is_not_set", + {"setup_duration": timedelta(seconds=45)}, + 45, + None, + 45, + ), + ( + "both_values_are_set", + { + "setup_duration": timedelta(seconds=45), + "testing_duration": timedelta(minutes=5), + }, + 45, + 300, + 345, + ), + ] + ) + def test_duration_properties_in_result( + self, _name, init_dict, setup_duration, testing_duration, expected_duration + ): + testcase = TestCaseFactory(**init_dict) + result = self.rpc_client.TestCase.filter({"pk": testcase.pk}) + + self.assertIsNotNone(result) + self.assertEqual(result[0]["setup_duration"], setup_duration) + self.assertEqual(result[0]["testing_duration"], testing_duration) + self.assertEqual(result[0]["expected_duration"], expected_duration) + class TestUpdate(APITestCase): non_existing_username = "FakeUsername"