Skip to content

Commit 2aabe55

Browse files
authored
[api]: TestCase.filter() method now returns duration fields. Refs #1923
New fields: setup_duration, testing_duration, expected_duration - all serialized in seconds.
1 parent 8106477 commit 2aabe55

File tree

2 files changed

+58
-2
lines changed

2 files changed

+58
-2
lines changed

tcms/rpc/api/testcase.py

+14-2
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,8 @@
11
# -*- coding: utf-8 -*-
22

3+
from datetime import timedelta
4+
5+
from django.db.models.functions import Coalesce
36
from django.forms import EmailField, ValidationError
47
from django.forms.models import model_to_dict
58
from modernrpc.core import REQUEST_KEY, rpc_method
@@ -279,8 +282,12 @@ def filter(query=None): # pylint: disable=redefined-builtin
279282
if query is None:
280283
query = {}
281284

282-
return list(
283-
TestCase.objects.filter(**query)
285+
qs = (
286+
TestCase.objects.annotate(
287+
expected_duration=Coalesce("setup_duration", timedelta(0))
288+
+ Coalesce("testing_duration", timedelta(0))
289+
)
290+
.filter(**query)
284291
.values(
285292
"id",
286293
"create_date",
@@ -304,10 +311,15 @@ def filter(query=None): # pylint: disable=redefined-builtin
304311
"default_tester__username",
305312
"reviewer",
306313
"reviewer__username",
314+
"setup_duration",
315+
"testing_duration",
316+
"expected_duration",
307317
)
308318
.distinct()
309319
)
310320

321+
return list(qs)
322+
311323

312324
@permissions_required("testcases.view_testcase")
313325
@rpc_method(name="TestCase.history")

tcms/rpc/tests/test_testcase.py

+44
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@
88
from attachments.models import Attachment
99
from django.contrib.auth.models import Permission
1010
from django.core.exceptions import ValidationError
11+
from parameterized import parameterized
1112
from tcms_api import xmlrpc
1213

1314
from tcms.core.helpers import comments
@@ -173,12 +174,55 @@ def test_filter_query_none(self):
173174
self.assertIn("author", result[0])
174175
self.assertIn("default_tester", result[0])
175176
self.assertIn("reviewer", result[0])
177+
self.assertIn("setup_duration", result[0])
178+
self.assertIn("testing_duration", result[0])
179+
self.assertIn("expected_duration", result[0])
176180

177181
def test_filter_by_product_id(self):
178182
cases = self.rpc_client.TestCase.filter({"category__product": self.product.pk})
179183
self.assertIsNotNone(cases)
180184
self.assertEqual(len(cases), self.cases_count)
181185

186+
@parameterized.expand(
187+
[
188+
("both_values_are_not_set", {}, None, None, 0),
189+
(
190+
"setup_duration_is_not_set",
191+
{"testing_duration": timedelta(minutes=5)},
192+
None,
193+
300,
194+
300,
195+
),
196+
(
197+
"testing_duration_is_not_set",
198+
{"setup_duration": timedelta(seconds=45)},
199+
45,
200+
None,
201+
45,
202+
),
203+
(
204+
"both_values_are_set",
205+
{
206+
"setup_duration": timedelta(seconds=45),
207+
"testing_duration": timedelta(minutes=5),
208+
},
209+
45,
210+
300,
211+
345,
212+
),
213+
]
214+
)
215+
def test_duration_properties_in_result(
216+
self, _name, init_dict, setup_duration, testing_duration, expected_duration
217+
):
218+
testcase = TestCaseFactory(**init_dict)
219+
result = self.rpc_client.TestCase.filter({"pk": testcase.pk})
220+
221+
self.assertIsNotNone(result)
222+
self.assertEqual(result[0]["setup_duration"], setup_duration)
223+
self.assertEqual(result[0]["testing_duration"], testing_duration)
224+
self.assertEqual(result[0]["expected_duration"], expected_duration)
225+
182226

183227
class TestUpdate(APITestCase):
184228
non_existing_username = "FakeUsername"

0 commit comments

Comments
 (0)