From: Salim Fadhley Date: Sun, 27 Jul 2014 22:32:01 +0000 (+0100) Subject: proposed fix for #295 - crash during get_params on maven jobs X-Git-Tag: v0.2.23~7 X-Git-Url: http://review.tizen.org/git/?a=commitdiff_plain;h=1268cbd2df5f1edd66d841a2c2ff95a53ba75a72;p=tools%2Fpython-jenkinsapi.git proposed fix for #295 - crash during get_params on maven jobs --- diff --git a/jenkinsapi/job.py b/jenkinsapi/job.py index e7e7891..b0ceb48 100644 --- a/jenkinsapi/job.py +++ b/jenkinsapi/job.py @@ -645,7 +645,7 @@ class Job(JenkinsBase, MutableJenkinsThing): """ If job has parameters, returns True, else False """ - return any("parameterDefinitions" in a for a in self._data["actions"]) + return any("parameterDefinitions" in a for a in self._data["actions"] if a) def has_queued_build(self, build_params): """Returns True if a build with build_params is currently queued.""" diff --git a/jenkinsapi_tests/unittests/test_job_maven.py b/jenkinsapi_tests/unittests/test_job_maven.py new file mode 100644 index 0000000..ddc1169 --- /dev/null +++ b/jenkinsapi_tests/unittests/test_job_maven.py @@ -0,0 +1,108 @@ +import mock +# To run unittests on python 2.6 please use unittest2 library +try: + import unittest2 as unittest +except ImportError: + import unittest + +import jenkinsapi +from jenkinsapi import config +from jenkinsapi.job import Job +from jenkinsapi.jenkinsbase import JenkinsBase +from jenkinsapi.jenkins import Jenkins +from jenkinsapi.custom_exceptions import NoBuildData + + +class TestJob(unittest.TestCase): + JOB_DATA = {'actions': [None, {}], + 'buildable': True, + 'builds': [{'number': 106, + 'url': 'http://dlsysadm-ap72:18080/jenkins/job/ecd-webgoat/106/'}, + {'number': 105, + 'url': 'http://dlsysadm-ap72:18080/jenkins/job/ecd-webgoat/105/'}, + {'number': 104, + 'url': 'http://dlsysadm-ap72:18080/jenkins/job/ecd-webgoat/104/'}, + {'number': 103, + 'url': 'http://dlsysadm-ap72:18080/jenkins/job/ecd-webgoat/103/'}, + {'number': 102, + 'url': 'http://dlsysadm-ap72:18080/jenkins/job/ecd-webgoat/102/'}, + {'number': 101, + 'url': 'http://dlsysadm-ap72:18080/jenkins/job/ecd-webgoat/101/'}, + {'number': 100, + 'url': 'http://dlsysadm-ap72:18080/jenkins/job/ecd-webgoat/100/'}, + {'number': 99, + 'url': 'http://dlsysadm-ap72:18080/jenkins/job/ecd-webgoat/99/'}, + {'number': 98, + 'url': 'http://dlsysadm-ap72:18080/jenkins/job/ecd-webgoat/98/'}, + {'number': 97, + 'url': 'http://dlsysadm-ap72:18080/jenkins/job/ecd-webgoat/97/'}], + 'color': 'red', + 'concurrentBuild': False, + 'description': '', + 'displayName': 'ecd-webgoat', + 'displayNameOrNull': None, + 'downstreamProjects': [], + 'firstBuild': {'number': 97, + 'url': 'http://dlsysadm-ap72:18080/jenkins/job/ecd-webgoat/97/'}, + 'healthReport': [{'description': 'Build stability: 1 out of the last 5 builds failed.', + 'iconUrl': 'health-60to79.png', + 'score': 80}], + 'inQueue': False, + 'keepDependencies': False, + 'lastBuild': {'number': 106, + 'url': 'http://dlsysadm-ap72:18080/jenkins/job/ecd-webgoat/106/'}, + 'lastCompletedBuild': {'number': 106, + 'url': 'http://dlsysadm-ap72:18080/jenkins/job/ecd-webgoat/106/'}, + 'lastFailedBuild': {'number': 106, + 'url': 'http://dlsysadm-ap72:18080/jenkins/job/ecd-webgoat/106/'}, + 'lastStableBuild': {'number': 105, + 'url': 'http://dlsysadm-ap72:18080/jenkins/job/ecd-webgoat/105/'}, + 'lastSuccessfulBuild': {'number': 105, + 'url': 'http://dlsysadm-ap72:18080/jenkins/job/ecd-webgoat/105/'}, + 'lastUnstableBuild': None, + 'lastUnsuccessfulBuild': {'number': 106, + 'url': 'http://dlsysadm-ap72:18080/jenkins/job/ecd-webgoat/106/'}, + 'modules': [{'color': 'blue', + 'displayName': 'webgoat', + 'name': 'com.googlecode:webgoat', + 'url': 'http://dlsysadm-ap72:18080/jenkins/job/ecd-webgoat/com.googlecode$webgoat/'}], + 'name': 'ecd-webgoat', + 'nextBuildNumber': 107, + 'property': [{}], + 'queueItem': None, + 'scm': {}, + 'upstreamProjects': [], + 'url': 'http://dlsysadm-ap72:18080/jenkins/job/ecd-webgoat/' + } + + URL_DATA = {'http://halob:8080/job/foo/%s' % config.JENKINS_API: JOB_DATA} + + def fakeGetData(self, url, **args): + try: + return TestJob.URL_DATA[url] + except KeyError: + raise Exception("Missing data for %s" % url) + +# def fake_add_missing_builds(self, data): +# return data + + @mock.patch.object(JenkinsBase, 'get_data', fakeGetData) + #@mock.patch.object(Job, '_add_missing_builds', fake_add_missing_builds) + def setUp(self): + + self.J = mock.MagicMock() # Jenkins object + self.j = Job('http://halob:8080/job/foo/', 'foo', self.J) + + @mock.patch.object(JenkinsBase, 'get_data', fakeGetData) + def test_get_last_good_buildnumber(self): + ret = self.j.get_last_good_buildnumber() + self.assertTrue(ret, 3) + + + @mock.patch.object(JenkinsBase, 'get_data', fakeGetData) + def test_has_params(self): + self.assertFalse(self.j.has_params()) + + +if __name__ == '__main__': + unittest.main() diff --git a/release.sh b/release.sh old mode 100644 new mode 100755