Added tests for Job, reformatted Job code
authorAleksey Maksimov <ctpeko3a@gmail.com>
Thu, 20 Jun 2013 04:03:44 +0000 (12:03 +0800)
committerAleksey Maksimov <ctpeko3a@gmail.com>
Thu, 20 Jun 2013 04:03:44 +0000 (12:03 +0800)
jenkinsapi/job.py
jenkinsapi_tests/unittests/test_job.py

index 9fe7925..9905875 100644 (file)
@@ -147,7 +147,8 @@ class Job(JenkinsBase, MutableJenkinsThing):
 
     def _buildid_for_type(self, buildtype):
         """Gets a buildid for a given type of build"""
-        KNOWNBUILDTYPES=["lastSuccessfulBuild", "lastBuild", "lastCompletedBuild"]
+        KNOWNBUILDTYPES=["lastSuccessfulBuild", "lastBuild", 
+                "lastCompletedBuild", "lastFailedBuild"]
         assert buildtype in KNOWNBUILDTYPES
         if self._data[buildtype] == None:
             return None
@@ -161,6 +162,12 @@ class Job(JenkinsBase, MutableJenkinsThing):
         """
         return self._buildid_for_type(buildtype="lastSuccessfulBuild")
 
+    def get_last_failed_buildnumber( self ):
+        """
+        Get the numerical ID of the last good build.
+        """
+        return self._buildid_for_type(buildtype="lastFailedBuild")
+
     def get_last_buildnumber( self ):
         """
         Get the numerical ID of the last build.
@@ -174,9 +181,10 @@ class Job(JenkinsBase, MutableJenkinsThing):
         return self._buildid_for_type(buildtype="lastCompletedBuild")
 
     def get_build_dict(self):
-        if not self._data.has_key( "builds" ):
-            raise NoBuildData( repr(self) )
-        return dict( ( a["number"], a["url"] ) for a in self._data["builds"] )
+        if not self._data.has_key("builds"):
+            raise NoBuildData(repr(self))
+        return dict((build["number"], build["url"]) 
+                        for build in self._data["builds"])
 
     def get_revision_dict(self):
         """
@@ -193,7 +201,7 @@ class Job(JenkinsBase, MutableJenkinsThing):
         """
         Return a sorted list of all good builds as ints.
         """
-        return reversed( sorted( self.get_build_dict().keys() ) )
+        return reversed(sorted(self.get_build_dict().keys()))
 
     def get_next_build_number(self):
         """
@@ -201,12 +209,12 @@ class Job(JenkinsBase, MutableJenkinsThing):
         """
         return self._data.get('nextBuildNumber', 0)
 
-    def get_last_good_build( self ):
+    def get_last_good_build(self):
         """
         Get the last good build
         """
         bn = self.get_last_good_buildnumber()
-        return self.get_build( bn )
+        return self.get_build(bn)
 
     def get_last_build( self ):
         """
@@ -249,10 +257,10 @@ class Job(JenkinsBase, MutableJenkinsThing):
 
     def get_build( self, buildnumber ):
         assert type(buildnumber) == int
-        url = self.get_build_dict()[ buildnumber ]
-        return Build( url, buildnumber, job=self )
+        url = self.get_build_dict()[buildnumber]
+        return Build(url, buildnumber, job=self)
 
-    def __getitem__( self, buildnumber ):
+    def __getitem__(self, buildnumber):
         return self.get_build(buildnumber)
 
     def is_queued_or_running(self):
index 2eff0ed..434f3e6 100644 (file)
@@ -3,7 +3,7 @@ import unittest
 import datetime
 
 from jenkinsapi.job import Job
-
+from jenkinsapi.exceptions import NoBuildData
 
 class TestJob(unittest.TestCase):
 
@@ -49,7 +49,7 @@ class TestJob(unittest.TestCase):
 
     def testRepr(self):
         # Can we produce a repr string for this object
-        repr(self.j)
+        self.assertEquals(repr(self.j), '<jenkinsapi.job.Job foo>')
 
     def testName(self):
         with self.assertRaises(AttributeError):
@@ -66,5 +66,88 @@ class TestJob(unittest.TestCase):
 
         self.assertEquals(self.j.get_rename_url(), 'http://halob:8080/job/foo/doRename')
 
+    def test_get_description(self):
+        self.assertEquals(self.j.get_description(), 'test job')
+
+    def test_get_build_triggerurl(self):
+        self.assertEquals(self.j.get_build_triggerurl(), 'http://halob:8080/job/foo/build')
+
+    def test_wrong__mk_json_from_build_parameters(self):
+        with self.assertRaises(AssertionError) as ar:
+            self.j._mk_json_from_build_parameters(build_params='bad parameter')
+
+        self.assertEquals(ar.exception.message, 'Build parameters must be a dict')
+
+    def test__mk_json_from_build_parameters(self):
+        params = {'param1': 'value1', 'param2': 'value2'}
+        ret = self.j._mk_json_from_build_parameters(build_params=params)
+        self.assertTrue(isinstance(ret, dict))
+        self.assertTrue(isinstance(ret.get('parameter'), list))
+        self.assertEquals(len(ret.get('parameter')), 2)
+
+    def test_wrong_mk_json_from_build_parameters(self):
+        with self.assertRaises(AssertionError) as ar:
+            self.j.mk_json_from_build_parameters(build_params='bad parameter')
+
+        self.assertEquals(ar.exception.message, 'Build parameters must be a dict')
+
+    def test__mk_json_from_build_parameters(self):
+        params = {'param1': 'value1', 'param2': 'value2'}
+        ret = self.j.mk_json_from_build_parameters(build_params=params)
+        self.assertTrue(isinstance(ret, str))
+        self.assertEquals(ret, 
+                '{"parameter": [{"name": "param2", "value": "value2"}, {"name": "param1", "value": "value1"}]}')
+
+    def test_wrong_field__build_id_for_type(self):
+        with self.assertRaises(AssertionError) as ar:
+            self.j._buildid_for_type('wrong')
+
+    def test_get_last_good_buildnumber(self):
+        ret = self.j.get_last_good_buildnumber()
+        self.assertTrue(ret, 3)
+
+    def test_get_last_failed_buildnumber(self):
+        ret = self.j.get_last_failed_buildnumber()
+        self.assertEquals(ret, None)
+
+    def test_get_last_buildnumber(self):
+        ret = self.j.get_last_buildnumber()
+        self.assertEquals(ret, 3)
+
+    def test_get_last_completed_buildnumber(self):
+        ret = self.j.get_last_completed_buildnumber()
+        self.assertEquals(ret, 3)
+
+    def test_get_build_dict(self):
+        ret = self.j.get_build_dict()
+        self.assertTrue(isinstance(ret, dict))
+        self.assertEquals(len(ret), 3)
+
+    @mock.patch.object(Job, '_poll')
+    def test_nobuilds_get_build_dict(self, _poll):
+        # Bare minimum build dict, we only testing dissapearance of 'builds'
+        _poll.return_value = {"name": "foo"}
+
+        j = Job('http://halob:8080/job/foo/', 'foo', self.J)
+        with self.assertRaises(NoBuildData) as nbd:
+            ret = j.get_build_dict()
+
+    def test_get_build_ids(self):
+        # We don't want to deal with listreverseiterator here
+        # So we convert result to a list
+        ret = list(self.j.get_build_ids())
+        self.assertTrue(isinstance(ret, list))
+        self.assertEquals(len(ret), 3)
+
+    @mock.patch.object(Job, '_poll')
+    def test_nobuilds_get_revision_dict(self, _poll):
+        # Bare minimum build dict, we only testing dissapearance of 'builds'
+        _poll.return_value = {"name": "foo"}
+
+        j = Job('http://halob:8080/job/foo/', 'foo', self.J)
+        with self.assertRaises(NoBuildData) as nbd:
+            ret = j.get_revision_dict()
+
+
 if __name__ == '__main__':
     unittest.main()