From: Aleksey Maksimov Date: Fri, 14 Jun 2013 08:57:54 +0000 (+0000) Subject: jenkins.create_job no longer throws exception X-Git-Tag: v0.2.23~180^2^2 X-Git-Url: http://review.tizen.org/git/?a=commitdiff_plain;h=050b1e7a792893e4242f7a932ed57f0d37fc9101;p=tools%2Fpython-jenkinsapi.git jenkins.create_job no longer throws exception Changed unit test for create_dup_job Added tests for create_job --- diff --git a/jenkinsapi/jenkins.py b/jenkinsapi/jenkins.py index 02ec79d..d90b3e8 100644 --- a/jenkinsapi/jenkins.py +++ b/jenkinsapi/jenkins.py @@ -112,6 +112,7 @@ class Jenkins(JenkinsBase): return jobs dict,'name:url' """ jobs = [] + print "_data[jobs]=%s" % self._data["jobs"] for info in self._data["jobs"]: jobs.append(info["name"]) return jobs @@ -140,11 +141,13 @@ class Jenkins(JenkinsBase): :return: new Job obj """ if self.has_job(jobname): - raise JenkinsAPIException('Job %s already exists!' % jobname) + return self[jobname] params = {'name': jobname} self.requester.post_xml_and_confirm_status(self.get_create_url(), data=config, params=params) self.poll() + if not self.has_job(jobname): + raise JenkinsAPIException('Cannot create job %s' % jobname) return self[jobname] def copy_job(self, jobname, newjobname): diff --git a/jenkinsapi_tests/unittests/test_jenkins.py b/jenkinsapi_tests/unittests/test_jenkins.py index 53c7744..42d29c4 100644 --- a/jenkinsapi_tests/unittests/test_jenkins.py +++ b/jenkinsapi_tests/unittests/test_jenkins.py @@ -41,7 +41,9 @@ class TestJenkins(unittest.TestCase): @mock.patch.object(Jenkins, '_poll') def test_unauthorised_reload(self, _poll): def fail_get_url(url): - raise NotAuthorized('You are not authorized to reload this server') + raise urllib2.HTTPError(url=url, code=403, + msg='You are not authorized to reload this server', + hdrs=None, fp=None) _poll.return_value = {} mock_requester = Requester(username='foouser', password='foopassword') @@ -204,11 +206,85 @@ class TestJenkins(unittest.TestCase): _job_poll.return_value = {} J = Jenkins('http://localhost:8080/', username='foouser', password='foopassword') - with self.assertRaises(JenkinsAPIException) as ja: - J.create_job('job_one', None) + job = J.create_job('job_one', None) + self.assertTrue(isinstance(job, Job)) + self.assertTrue(job.baseurl=='http://localhost:8080/job_one') + self.assertTrue(job.name=='job_one') + + # Here we're going to test function, which is going to modify + # Jenkins internal data. It calls for data once to check + # if job already there, then calls again to see if job hs been created. + # So we need to create mock function, which + # will return different value per each call + + # Define what we will return + create_job_returns = [ + # This will be returned when job is not yet created + {'jobs': [ + {'name': 'job_one', + 'url': 'http://localhost:8080/job_one'}, + {'name': 'job_one', + 'url': 'http://localhost:8080/job_one'}, + ]}, + # This to simulate that the job has been created + {'jobs': [ + {'name': 'job_one', + 'url': 'http://localhost:8080/job_one'}, + {'name': 'job_two', + 'url': 'http://localhost:8080/job_two'}, + {'name': 'job_new', + 'url': 'http://localhost:8080/job_new'}, + ]} + ] + + # Mock function + def second_call_poll(): + return TestJenkins.create_job_returns.pop(0) + + # Patch Jenkins with mock function + @mock.patch.object(Jenkins, '_poll', side_effect=second_call_poll) + @mock.patch.object(Job, '_poll') + def test_create_new_job(self, _poll, _job_poll): + _job_poll.return_value = {} + + mock_requester = Requester(username='foouser', password='foopassword') + mock_requester.post_xml_and_confirm_status = mock.MagicMock( + return_value='') + + J = Jenkins('http://localhost:8080/', + username='foouser', password='foopassword', + requester=mock_requester) + + job = J.create_job('job_new', None) + self.assertTrue(isinstance(job, Job)) + self.assertTrue(job.baseurl=='http://localhost:8080/job_new') + self.assertTrue(job.name=='job_new') + + @mock.patch.object(JenkinsBase, '_poll') + @mock.patch.object(Jenkins, '_poll') + @mock.patch.object(Job, '_poll') + def test_create_new_job_fail(self, _base_poll, _poll, _job_poll): + _job_poll.return_value = {} + _poll.return_value = {'jobs': [ + {'name': 'job_one', + 'url': 'http://localhost:8080/job_one'}, + {'name': 'job_one', + 'url': 'http://localhost:8080/job_one'}, + ]} + _base_poll.return_value = _poll.return_value + + mock_requester = Requester(username='foouser', password='foopassword') + mock_requester.post_xml_and_confirm_status = mock.MagicMock( + return_value='') + + J = Jenkins('http://localhost:8080/', + username='foouser', password='foopassword', + requester=mock_requester) + + with self.assertRaises(JenkinsAPIException) as ar: + job = J.create_job('job_new', None) - self.assertEquals(ja.exception.message, - 'Job job_one already exists!') + self.assertEquals(ar.exception.message, 'Cannot create job job_new') class TestJenkinsURLs(unittest.TestCase):