Autotest: Refactor complete_failures slightly.

Move the get_last_pass_times functions to a common area as it will be useful
for future scripts. Also tests are looked up based on status name instead
of status id.

BUG=None
DEPLOY=None
TEST=Unittests and ran script manually to verify

Change-Id: I398237d0f11bef63492e10a1206387bb2058dc40
Reviewed-on: https://gerrit.chromium.org/gerrit/62570
Reviewed-by: Dennis Jeffrey <dennisjeffrey@chromium.org>
Tested-by: Keyar Hood <keyar@chromium.org>
Commit-Queue: Keyar Hood <keyar@chromium.org>
diff --git a/frontend/health/utils_unittests.py b/frontend/health/utils_unittests.py
new file mode 100755
index 0000000..b0c1318
--- /dev/null
+++ b/frontend/health/utils_unittests.py
@@ -0,0 +1,121 @@
+#!/usr/bin/python
+#
+# Copyright (c) 2013 The Chromium OS Authors. All rights reserved.
+# Use of this source code is governed by a BSD-style license that can be
+# found in the LICENSE file.
+
+import datetime, unittest
+
+import mox
+
+import common
+# This must come before the import of utils in order to use the in memory
+# database.
+from autotest_lib.frontend import setup_django_readonly_environment
+from autotest_lib.frontend import setup_test_environment
+from autotest_lib.frontend.health import utils
+from autotest_lib.frontend.tko import models
+from django import test
+
+FAIL_STATUS = models.Status(status_idx=4, word='FAIL')
+GOOD_STATUS = models.Status(status_idx=6, word='GOOD')
+
+
+def add_statuses():
+    """
+    Save the statuses to the in-memory database.
+
+    These normally exist in the database and the code expects them. However, the
+    normal test database setup does not do this for us.
+    """
+    FAIL_STATUS.save()
+    GOOD_STATUS.save()
+
+
+class GetLastPassTimesTests(mox.MoxTestBase, test.TestCase):
+    """Tests the get_last_pass_times function."""
+
+    def setUp(self):
+        super(GetLastPassTimesTests, self).setUp()
+        setup_test_environment.set_up()
+        add_statuses()
+
+
+    def tearDown(self):
+        setup_test_environment.tear_down()
+        super(GetLastPassTimesTests, self).tearDown()
+
+
+    def test_return_most_recent_pass(self):
+        """The last time a test passed should be returned."""
+        # To add a test entry to the database, the test object has to
+        # be instantiated with various other model instances. We give these
+        # instances dummy id values.
+        job = models.Job(job_idx=1)
+        kernel = models.Kernel(kernel_idx=1)
+        machine = models.Machine(machine_idx=1)
+
+        early_pass = models.Test(job=job, status=GOOD_STATUS,
+                                 kernel=kernel, machine=machine,
+                                 test='test',
+                                 started_time=datetime.datetime(2012, 1, 1))
+        early_pass.save()
+        late_pass = models.Test(job=job, status=GOOD_STATUS,
+                                kernel=kernel, machine=machine,
+                                test='test',
+                                started_time=datetime.datetime(2012, 1, 2))
+        late_pass.save()
+
+        results = utils.get_last_pass_times()
+
+        self.assertEquals(results, {'test': datetime.datetime(2012, 1, 2)})
+
+
+    def test_only_return_passing_tests(self):
+        """Tests that only tests that have passed at some point are returned."""
+        job = models.Job(job_idx=1)
+        kernel = models.Kernel(kernel_idx=1)
+        machine = models.Machine(machine_idx=1)
+
+        passing_test = models.Test(job=job, status=GOOD_STATUS,
+                                   kernel=kernel, machine=machine,
+                                   test='passing_test',
+                                   started_time=datetime.datetime(2012, 1, 1))
+        passing_test.save()
+        failing_test = models.Test(job=job, status=FAIL_STATUS,
+                                   kernel=kernel, machine=machine,
+                                   test='failing_test',
+                                   started_time=datetime.datetime(2012, 1, 1))
+        failing_test.save()
+
+        results = utils.get_last_pass_times()
+
+        self.assertEquals(results,
+                          {'passing_test': datetime.datetime(2012, 1, 1)})
+
+
+    def test_return_all_passing_tests(self):
+        """This function returns all tests that passed at least once."""
+        job = models.Job(job_idx=1)
+        kernel = models.Kernel(kernel_idx=1)
+        machine = models.Machine(machine_idx=1)
+
+        test1 = models.Test(job=job, status=GOOD_STATUS,
+                            kernel=kernel, machine=machine,
+                            test='test1',
+                            started_time=datetime.datetime(2012, 1, 1))
+        test1.save()
+        test2 = models.Test(job=job, status=GOOD_STATUS,
+                            kernel=kernel, machine=machine,
+                            test='test2',
+                            started_time=datetime.datetime(2012, 1, 2))
+        test2.save()
+
+        results = utils.get_last_pass_times()
+
+        self.assertEquals(results, {'test1': datetime.datetime(2012, 1, 1),
+                                    'test2': datetime.datetime(2012, 1, 2)})
+
+
+if __name__ == '__main__':
+    unittest.main()