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
"""
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.
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):
"""
"""
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):
"""
"""
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 ):
"""
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):
import datetime
from jenkinsapi.job import Job
-
+from jenkinsapi.exceptions import NoBuildData
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):
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()