proposed fix for #295 - crash during get_params on maven jobs
authorSalim Fadhley <sal@stodge.org>
Sun, 27 Jul 2014 22:32:01 +0000 (23:32 +0100)
committerSalim Fadhley <sal@stodge.org>
Sun, 27 Jul 2014 22:32:01 +0000 (23:32 +0100)
jenkinsapi/job.py
jenkinsapi_tests/unittests/test_job_maven.py [new file with mode: 0644]
release.sh [changed mode: 0644->0755]

index e7e7891a6be90c9065f1408edb8fc3249b3b3cc8..b0ceb48447474059e4d58e96adc304bfed1fb674 100644 (file)
@@ -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 (file)
index 0000000..ddc1169
--- /dev/null
@@ -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()
old mode 100644 (file)
new mode 100755 (executable)