From: Aleksey Maksimov Date: Wed, 12 Jun 2013 16:29:20 +0000 (+0800) Subject: Fixed get_server_baseurl, simplified create_job. X-Git-Tag: v0.2.23~215^2 X-Git-Url: http://review.tizen.org/git/?a=commitdiff_plain;h=a579aab4747440e400c26ab139b48f036b36cdb3;p=tools%2Fpython-jenkinsapi.git Fixed get_server_baseurl, simplified create_job. Added unit tests --- diff --git a/jenkinsapi/jenkins.py b/jenkinsapi/jenkins.py index 86f9889..02ec79d 100644 --- a/jenkinsapi/jenkins.py +++ b/jenkinsapi/jenkins.py @@ -53,7 +53,10 @@ class Jenkins(JenkinsBase): return Jenkins(self.baseurl, username=self.username, password=self.password, requester=self.requester) def get_base_server_url(self): - return self.baseurl[:-(len(config.JENKINS_API))] + if config.JENKINS_API in self.baseurl: + return self.baseurl[:-(len(config.JENKINS_API))] + else: + return self.baseurl def validate_fingerprint(self, id): obj_fingerprint = Fingerprint(self.baseurl, id, jenkins_obj=self) @@ -136,11 +139,9 @@ class Jenkins(JenkinsBase): :param config: configuration of new job, xml :return: new Job obj """ - try: - job = self[jobname] + if self.has_job(jobname): raise JenkinsAPIException('Job %s already exists!' % jobname) - except KeyError: - pass + params = {'name': jobname} self.requester.post_xml_and_confirm_status(self.get_create_url(), data=config, params=params) self.poll() diff --git a/jenkinsapi_tests/unittests/test_jenkins.py b/jenkinsapi_tests/unittests/test_jenkins.py index 7fd87eb..53c7744 100644 --- a/jenkinsapi_tests/unittests/test_jenkins.py +++ b/jenkinsapi_tests/unittests/test_jenkins.py @@ -1,9 +1,11 @@ import mock import unittest import datetime +import urllib2 -from jenkinsapi.jenkins import Jenkins, JenkinsBase, View +from jenkinsapi.jenkins import Jenkins, JenkinsBase, View, Job from jenkinsapi.utils.requester import Requester +from jenkinsapi.exceptions import UnknownJob, NotAuthorized, JenkinsAPIException class TestJenkins(unittest.TestCase): @@ -27,6 +29,186 @@ class TestJenkins(unittest.TestCase): self.assertEquals(self.J.requester.password, 'foopassword') self.assertEquals(self.J.requester.username, 'foouser') + @mock.patch.object(Jenkins, '_poll') + def test_reload(self, _poll): + mock_requester = Requester(username='foouser', password='foopassword') + mock_requester.get_url = mock.MagicMock(return_value='') + J = Jenkins('http://localhost:8080/', + username='foouser', password='foopassword', + requester=mock_requester) + J.reload() + + @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') + + _poll.return_value = {} + mock_requester = Requester(username='foouser', password='foopassword') + mock_requester.get_url = mock.MagicMock(return_value='', + side_effect=fail_get_url) + J = Jenkins('http://localhost:8080/', + username='foouser', password='foopassword', + requester=mock_requester) + with self.assertRaises(NotAuthorized) as na: + J.reload() + + self.assertEquals(na.exception.message, + 'You are not authorized to reload this server') + + @mock.patch.object(Jenkins, '_poll') + def test_httperror_reload(self, _poll): + def fail_get_url(url): + raise urllib2.HTTPError(url=url, code=500, + msg='Because I said so!', hdrs=None, fp=None) + + _poll.return_value = {} + mock_requester = Requester(username='foouser', password='foopassword') + mock_requester.get_url = mock.MagicMock(return_value='', + side_effect=fail_get_url) + J = Jenkins('http://localhost:8080/', + username='foouser', password='foopassword', + requester=mock_requester) + with self.assertRaises(urllib2.HTTPError) as ar: + J.reload() + http_error = ar.exception + self.assertEquals(http_error.code, 500) + + @mock.patch.object(JenkinsBase, '_poll') + @mock.patch.object(Jenkins, '_poll') + @mock.patch.object(Job, '_poll') + def test_get_jobs(self, _base_poll, _poll, _job_poll): + _poll.return_value = {'jobs': [ + {'name': 'job_one', + 'url': 'http://localhost:8080/job_one'}, + {'name': 'job_two', + 'url': 'http://localhost:8080/job_two'}, + ]} + _base_poll.return_value = _poll.return_value + _job_poll.return_value = {} + J = Jenkins('http://localhost:8080/', + username='foouser', password='foopassword') + for idx, (job_name, job) in enumerate(J.get_jobs()): + self.assertEquals( + job_name, _poll.return_value['jobs'][idx]['name']) + self.assertTrue(isinstance(job, Job)) + self.assertEquals( + job.name, _poll.return_value['jobs'][idx]['name']) + self.assertEquals( + job.baseurl, _poll.return_value['jobs'][idx]['url']) + + @mock.patch.object(JenkinsBase, '_poll') + @mock.patch.object(Jenkins, '_poll') + @mock.patch.object(Job, '_poll') + def test_get_jobs_info(self, _base_poll, _poll, _job_poll): + _poll.return_value = {'jobs': [ + {'name': 'job_one', + 'url': 'http://localhost:8080/job_one'}, + {'name': 'job_two', + 'url': 'http://localhost:8080/job_two'}, + ]} + _base_poll.return_value = _poll.return_value + _job_poll.return_value = {} + J = Jenkins('http://localhost:8080/', + username='foouser', password='foopassword') + for idx, (url, job_name) in enumerate(J.get_jobs_info()): + self.assertEquals( + job_name, _poll.return_value['jobs'][idx]['name']) + self.assertEquals( + url, _poll.return_value['jobs'][idx]['url']) + + @mock.patch.object(JenkinsBase, '_poll') + @mock.patch.object(Jenkins, '_poll') + @mock.patch.object(Job, '_poll') + def test_get_jobs_list(self, _base_poll, _poll, _job_poll): + _poll.return_value = {'jobs': [ + {'name': 'job_one', + 'url': 'http://localhost:8080/job_one'}, + {'name': 'job_two', + 'url': 'http://localhost:8080/job_two'}, + ]} + _base_poll.return_value = _poll.return_value + _job_poll.return_value = {} + J = Jenkins('http://localhost:8080/', + username='foouser', password='foopassword') + for idx, job_name in enumerate(J.get_jobs_list()): + self.assertEquals( + job_name, _poll.return_value['jobs'][idx]['name']) + + @mock.patch.object(JenkinsBase, '_poll') + @mock.patch.object(Jenkins, '_poll') + @mock.patch.object(Job, '_poll') + def test_get_job(self, _base_poll, _poll, _job_poll): + _poll.return_value = {'jobs': [ + {'name': 'job_one', + 'url': 'http://localhost:8080/job_one'}, + {'name': 'job_two', + 'url': 'http://localhost:8080/job_two'}, + ]} + _base_poll.return_value = _poll.return_value + _job_poll.return_value = {} + J = Jenkins('http://localhost:8080/', + username='foouser', password='foopassword') + job = J.get_job('job_one') + self.assertTrue(isinstance(job, Job)) + self.assertEquals( + job.name, _poll.return_value['jobs'][0]['name']) + self.assertEquals( + job.baseurl, _poll.return_value['jobs'][0]['url']) + + @mock.patch.object(JenkinsBase, '_poll') + @mock.patch.object(Jenkins, '_poll') + @mock.patch.object(Job, '_poll') + def test_has_job(self, _base_poll, _poll, _job_poll): + _poll.return_value = {'jobs': [ + {'name': 'job_one', + 'url': 'http://localhost:8080/job_one'}, + {'name': 'job_two', + 'url': 'http://localhost:8080/job_two'}, + ]} + _base_poll.return_value = _poll.return_value + _job_poll.return_value = {} + J = Jenkins('http://localhost:8080/', + username='foouser', password='foopassword') + job = J.has_job('job_one') + self.assertTrue(job) + + @mock.patch.object(JenkinsBase, '_poll') + @mock.patch.object(Jenkins, '_poll') + @mock.patch.object(Job, '_poll') + def test_has_no_job(self, _base_poll, _poll, _job_poll): + _poll.return_value = {'jobs': [ + {'name': 'job_one', + 'url': 'http://localhost:8080/job_one'}, + {'name': 'job_two', + 'url': 'http://localhost:8080/job_two'}, + ]} + _base_poll.return_value = _poll.return_value + _job_poll.return_value = {} + J = Jenkins('http://localhost:8080/', + username='foouser', password='foopassword') + job = J.has_job('inexistant_job') + self.assertFalse(job) + + @mock.patch.object(JenkinsBase, '_poll') + @mock.patch.object(Jenkins, '_poll') + @mock.patch.object(Job, '_poll') + def test_create_dup_job(self, _base_poll, _poll, _job_poll): + _poll.return_value = {'jobs': [ + {'name': 'job_one', + 'url': 'http://localhost:8080/job_one'}, + {'name': 'job_two', + 'url': 'http://localhost:8080/job_two'}, + ]} + _base_poll.return_value = _poll.return_value + _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) + + self.assertEquals(ja.exception.message, + 'Job job_one already exists!') class TestJenkinsURLs(unittest.TestCase): @@ -46,6 +228,14 @@ class TestJenkinsURLs(unittest.TestCase): self.assertEquals( J.get_create_url(), 'http://localhost:8080/createItem') + @mock.patch.object(Jenkins, '_poll') + def test_get_base_server_url(self, _poll): + _poll.return_value = {} + J = Jenkins('http://localhost:8080/', + username='foouser', password='foopassword') + self.assertEquals(J.baseurl, 'http://localhost:8080') + self.assertEquals( + J.get_base_server_url(), 'http://localhost:8080') class TestJenkinsViews(unittest.TestCase):