From 772878c05c0f41286a1865048fa5528cdb64c4ee Mon Sep 17 00:00:00 2001 From: Matthew Treinish Date: Wed, 6 May 2015 16:47:18 -0400 Subject: [PATCH] Add db api method to get per status counts for a test This commit adds a new db api method to return a dictionary containing per test counts of failures, successes, and skips. It also lets you optionally provide a date range to only get counts in a narrower window. Change-Id: I4aaf8b4b596e03342861e83bd52f3f5360970d9b --- subunit2sql/db/api.py | 48 +++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 48 insertions(+) diff --git a/subunit2sql/db/api.py b/subunit2sql/db/api.py index f4e0af6..a793fec 100644 --- a/subunit2sql/db/api.py +++ b/subunit2sql/db/api.py @@ -698,3 +698,51 @@ def get_ids_for_all_tests(session=None): """ session = session or get_session() return db_utils.model_query(models.Test, session).value(models.Test.id) + + +def get_test_counts_in_date_range(test_id, start_date=None, stop_date=None, + session=None): + """Return the number of successes, failures, and skips for a single test. + + Optionally you can provide a date to filter the results to be within a + certain date range + + :param str start_date: The date to use as the start for counting + :param str stop_date: The date to use as the cutoff for counting + :param session: optional session object if one isn't provided a new session + will be acquired for the duration of this operation + :return: a dict containing the number of successes, failures, and skips + :rtype: dict + """ + start_date = datetime.datetime.strptime(start_date, '%b %d %Y') + if isinstance(stop_date, str): + stop_date = datetime.datetime.strptime(stop_date, '%b %d %Y') + session = session or get_session() + count_dict = {} + success_query = db_utils.model_query(models.TestRun, session).filter_by( + test_id=test_id).filter(models.TestRun.status == 'success') + fail_query = db_utils.model_query(models.TestRun, session).filter_by( + test_id=test_id).filter(models.TestRun.status == 'fail') + skip_query = db_utils.model_query(models.TestRun, session).filter_by( + test_id=test_id).filter(models.TestRun.status == 'skip') + + if start_date: + success_query = success_query.filter( + models.TestRun.start_time > start_date) + fail_query = fail_query.filter( + models.TestRun.start_time > start_date) + skip_query = skip_query.filter( + models.TestRun.start_time > start_date) + + if stop_date: + success_query = success_query.filter( + models.TestRun.stop_time < stop_date) + fail_query = fail_query.filter( + models.TestRun.stop_time < stop_date) + skip_query = skip_query.filter( + models.TestRun.stop_time < stop_date) + + count_dict['success'] = success_query.count() + count_dict['failure'] = fail_query.count() + count_dict['skips'] = skip_query.count() + return count_dict