Fixed get_server_baseurl, simplified create_job.
authorAleksey Maksimov <ctpeko3a@gmail.com>
Wed, 12 Jun 2013 16:29:20 +0000 (00:29 +0800)
committerAleksey Maksimov <ctpeko3a@gmail.com>
Wed, 12 Jun 2013 16:29:20 +0000 (00:29 +0800)
Added unit tests

jenkinsapi/jenkins.py
jenkinsapi_tests/unittests/test_jenkins.py

index 86f9889..02ec79d 100644 (file)
@@ -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()
index 7fd87eb..53c7744 100644 (file)
@@ -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):