Merge "Fix date format for agg_count and get_test_counts_in_date_range()"

This commit is contained in:
Jenkins 2016-05-19 15:06:53 +00:00 committed by Gerrit Code Review
commit 5429a5d7a8
4 changed files with 57 additions and 5 deletions

View File

@ -0,0 +1,10 @@
---
deprecations:
- Passing in the date as a string in the format "%b %d %Y" to the function
get_test_counts_in_date_rage() in the DB API. Instead pass the date in
as a datetime object.
fixes:
- Setting the date as an ISO8601, as indicated by the docs and --help, for
the subunit2sql-graph command agg_count will now work correctly. It would
previously stack trace. (Story 2000581)

View File

@ -12,6 +12,7 @@
# License for the specific language governing permissions and limitations # License for the specific language governing permissions and limitations
# under the License. # under the License.
from dateutil import parser as date_parser
from oslo_config import cfg from oslo_config import cfg
import pandas as pd import pandas as pd
@ -48,13 +49,19 @@ def generate_series():
'failure': int(test.failure), 'failure': int(test.failure),
} }
else: else:
start_date = None
stop_date = None
if CONF.start_date:
start_date = date_parser.parse(CONF.start_date)
if CONF.stop_date:
stop_date = date_parser.parse(CONF.stop_date)
if CONF.command.test_ids: if CONF.command.test_ids:
ids = [api.get_id_from_test_id(x) for x in CONF.command.test_ids] ids = [api.get_id_from_test_id(x) for x in CONF.command.test_ids]
else: else:
ids = api.get_ids_for_all_tests(session) ids = api.get_ids_for_all_tests(session)
for test in ids: for test in ids:
test_dict[test] = api.get_test_counts_in_date_range( test_dict[test] = api.get_test_counts_in_date_range(
test, CONF.start_date, CONF.stop_date, session) test, start_date, stop_date, session)
if CONF.command.no_success_graph: if CONF.command.no_success_graph:
for test in test_dict: for test in test_dict:
test_dict[test].pop('success') test_dict[test].pop('success')

View File

@ -1209,14 +1209,22 @@ def get_test_counts_in_date_range(test_id, start_date=None, stop_date=None,
certain date range certain date range
:param str test_id: The test_id's ID(big integer) to identify the test :param str test_id: The test_id's ID(big integer) to identify the test
:param str start_date: The date to use as the start for counting :param datetime start_date: The date to use as the start for counting. A
:param str stop_date: The date to use as the cutoff for counting str in the datetime str format "%b %d %Y" was
the previous format here and will still work
but is deprecated in favor of passing in a
datetime object.
:param datetime stop_date: The date to use as the cutoff for counting. A
str in the datetime str format "%b %d %Y" was
the previous format here and will still work but
is deprecated in favor of passing in a datetime.
:param session: Optional session object if one isn't provided a new session :param session: Optional session object if one isn't provided a new session
will be acquired for the duration of this operation will be acquired for the duration of this operation
:return: A dict containing the number of successes, failures, and skips :return: A dict containing the number of successes, failures, and skips
:rtype: dict :rtype: dict
""" """
start_date = datetime.datetime.strptime(start_date, '%b %d %Y') if isinstance(start_date, str):
start_date = datetime.datetime.strptime(start_date, '%b %d %Y')
if isinstance(stop_date, str): if isinstance(stop_date, str):
stop_date = datetime.datetime.strptime(stop_date, '%b %d %Y') stop_date = datetime.datetime.strptime(stop_date, '%b %d %Y')
session = session or get_session() session = session or get_session()

View File

@ -950,7 +950,7 @@ class TestDatabaseAPI(base.TestCase):
self.assertIn(run_b.uuid, res) self.assertIn(run_b.uuid, res)
self.assertIn(run_c.uuid, res) self.assertIn(run_c.uuid, res)
def test_get_test_counts_in_date_range(self): def test_get_test_counts_in_date_range_as_str(self):
timestamp_str_a = 'Dec 01 2015' timestamp_str_a = 'Dec 01 2015'
timestamp_str_b = 'Dec 20 2015' timestamp_str_b = 'Dec 20 2015'
timestamp_a = datetime.datetime(2015, 12, 2, 10, 00, 00) timestamp_a = datetime.datetime(2015, 12, 2, 10, 00, 00)
@ -977,6 +977,33 @@ class TestDatabaseAPI(base.TestCase):
self.assertEqual(1, res['failure']) self.assertEqual(1, res['failure'])
self.assertEqual(0, res['skips']) self.assertEqual(0, res['skips'])
def test_get_test_counts_in_date_range(self):
timestamp_a = datetime.datetime(2015, 12, 2, 10, 00, 00)
timestamp_b = timestamp_a + datetime.timedelta(minutes=10)
timestamp_c = timestamp_a + datetime.timedelta(minutes=20)
timestamp_d = datetime.datetime(2015, 12, 22, 10, 00, 00)
timerange_a = datetime.datetime(2015, 12, 1)
timerange_b = datetime.datetime(2015, 12, 20)
run_a = api.create_run()
run_b = api.create_run()
run_c = api.create_run()
run_d = api.create_run()
test = api.create_test('fake_test')
api.create_test_run(test.id, run_a.id, 'success',
timestamp_a, timestamp_b)
api.create_test_run(test.id, run_b.id, 'fail',
timestamp_a, timestamp_c)
api.create_test_run(test.id, run_c.id, 'success',
timestamp_a, timestamp_d)
api.create_test_run(test.id, run_d.id, 'skip',
timestamp_c, timestamp_d)
res = api.get_test_counts_in_date_range(test.id,
timerange_a,
timerange_b)
self.assertEqual(1, res['success'])
self.assertEqual(1, res['failure'])
self.assertEqual(0, res['skips'])
def test_get_failing_test_ids_from_runs_by_key_value(self): def test_get_failing_test_ids_from_runs_by_key_value(self):
test_a = api.create_test('fake_test') test_a = api.create_test('fake_test')
test_b = api.create_test('fake_test1') test_b = api.create_test('fake_test1')