# HG changeset patch # User cmlenz # Date 1144852473 0 # Node ID 90c79fabe6f1149e2ac3a488c9b8509ee7f760b4 # Parent 59d770fefae1cf374d3fe9c1669f52ba95d252c2 Fix bug in the model classes where `db.executemany()` was being called with an empty list. This could happen for an empty build log, for example. diff --git a/bitten/model.py b/bitten/model.py --- a/bitten/model.py +++ b/bitten/model.py @@ -727,10 +727,11 @@ "VALUES (%s,%s,%s,%s)", (self.build, self.step, self.generator, self.orderno)) id = db.get_last_id(cursor, 'bitten_log') - cursor.executemany("INSERT INTO bitten_log_message " - "(log,line,level,message) VALUES (%s,%s,%s,%s)", - [(id, idx, message[0], message[1]) for idx, message - in enumerate(self.messages)]) + if self.messages: + cursor.executemany("INSERT INTO bitten_log_message " + "(log,line,level,message) VALUES (%s,%s,%s,%s)", + [(id, idx, message[0], message[1]) for idx, message + in enumerate(self.messages)]) if handle_ta: db.commit() @@ -858,7 +859,7 @@ "(build,step,category,generator) VALUES (%s,%s,%s,%s)", (self.build, self.step, self.category, self.generator)) id = db.get_last_id(cursor, 'bitten_report') - for idx, item in enumerate(self.items): + for idx, item in enumerate([item for item in self.items if item]): cursor.executemany("INSERT INTO bitten_report_item " "(report,item,name,value) VALUES (%s,%s,%s,%s)", [(id, idx, key, value) for key, value diff --git a/bitten/tests/model.py b/bitten/tests/model.py --- a/bitten/tests/model.py +++ b/bitten/tests/model.py @@ -453,6 +453,21 @@ self.assertEqual((BuildLog.INFO, 'running tests'), cursor.fetchone()) self.assertEqual((BuildLog.ERROR, 'tests failed'), cursor.fetchone()) + def test_insert_empty(self): + log = BuildLog(self.env, build=1, step='test', generator='distutils') + log.messages = [] + log.insert() + self.assertNotEqual(None, log.id) + + db = self.env.get_db_cnx() + cursor = db.cursor() + cursor.execute("SELECT build,step,generator FROM bitten_log " + "WHERE id=%s", (log.id,)) + self.assertEqual((1, 'test', 'distutils'), cursor.fetchone()) + cursor.execute("SELECT COUNT(*) FROM bitten_log_message " + "WHERE log=%s", (log.id,)) + self.assertEqual(0, cursor.fetchone()[0]) + def test_insert_no_build_or_step(self): log = BuildLog(self.env, step='test') self.assertRaises(AssertionError, log.insert) # No build @@ -605,6 +620,22 @@ generator='unittest') self.assertRaises(AssertionError, report.insert) + def test_insert_empty_items(self): + report = Report(self.env, build=1, step='test', category='test', + generator='unittest') + report.items = [{}, {}] + report.insert() + + db = self.env.get_db_cnx() + cursor = db.cursor() + cursor.execute("SELECT build,step,category,generator " + "FROM bitten_report WHERE id=%s", (report.id,)) + self.assertEqual((1, 'test', 'test', 'unittest'), + cursor.fetchone()) + cursor.execute("SELECT COUNT(*) FROM bitten_report_item " + "WHERE report=%s", (report.id,)) + self.assertEqual(0, cursor.fetchone()[0]) + def test_fetch(self): db = self.env.get_db_cnx() cursor = db.cursor()