Fixed tests, reformatted View with PEP8, added more tests
authorlechat <ctpeko3a-github@gmail.com>
Tue, 9 Jul 2013 13:50:43 +0000 (21:50 +0800)
committerlechat <ctpeko3a-github@gmail.com>
Tue, 9 Jul 2013 15:04:29 +0000 (23:04 +0800)
.gitignore
jenkinsapi/view.py
jenkinsapi/views.py
jenkinsapi_tests/systests/test_views.py
jenkinsapi_tests/unittests/test_jenkins.py
jenkinsapi_tests/unittests/test_requester.py
jenkinsapi_tests/unittests/test_view.py
jenkinsapi_tests/unittests/test_views.py

index 4dcab1327901e7f6123f4b21c17bc07a6f872d35..4fbc2c41398f80e3d942aa8e6a8009db75738798 100644 (file)
@@ -11,4 +11,5 @@ jenkins.war
 .coverage/
 .coverage
 nosetests.xml
-coverage*/
\ No newline at end of file
+coverage*/
+.idea/
index 640140556409105538c47237af966243b80aff11..8d9d4591f0ea6f05346aab6335a63679db3e63e1 100644 (file)
@@ -1,13 +1,14 @@
-from urlparse import urlparse
-from jenkinsapi.jenkinsbase import JenkinsBase
-from jenkinsapi.job import Job
 import urllib
 import logging
 
+from jenkinsapi.jenkinsbase import JenkinsBase
+from jenkinsapi.job import Job
+
+
 log = logging.getLogger(__name__)
 
-class View(JenkinsBase):
 
+class View(JenkinsBase):
     def __init__(self, url, name, jenkins_obj):
         self.name = name
         self.jenkins_obj = jenkins_obj
@@ -36,27 +37,27 @@ class View(JenkinsBase):
 
     def iteritems(self):
         for name, url in self.get_job_dict().iteritems():
-            api_url = self.python_api_url( url )
-            yield name, Job( api_url, name, self.jenkins_obj )
+            api_url = self.python_api_url(url)
+            yield name, Job(api_url, name, self.jenkins_obj)
 
     def values(self):
-        return [ a[1] for a in self.iteritems() ]
+        return [a[1] for a in self.iteritems()]
 
     def items(self):
-        return [ a for a in self.iteritems() ]
+        return [a for a in self.iteritems()]
 
-    def _get_jobs( self ):
-        if not self._data.has_key( "jobs" ):
+    def _get_jobs(self):
+        if not 'jobs' in self._data:
             pass
         else:
             for viewdict in self._data["jobs"]:
                 yield viewdict["name"], viewdict["url"]
 
     def get_job_dict(self):
-        return dict( self._get_jobs() )
+        return dict(self._get_jobs())
 
     def __len__(self):
-        return len( self.get_job_dict().keys() )
+        return len(self.get_job_dict().keys())
 
     def get_job_url(self, str_job_name):
         try:
@@ -74,7 +75,7 @@ class View(JenkinsBase):
         """
         Add job to a view
 
-        :param job_name: name of the job to be added
+        :param str_job_name: name of the job to be added
         :param job: Job object to be added
         :return: True if job has been added, False if job already exists or
          job not known to Jenkins
@@ -82,7 +83,7 @@ class View(JenkinsBase):
         if not job:
             if str_job_name in self.get_job_dict():
                 log.warn('Job %s is already in the view %s' %
-                        (str_job_name, self.name))
+                         (str_job_name, self.name))
                 return False
             else:
                 # Since this call can be made from nested view,
@@ -90,7 +91,7 @@ class View(JenkinsBase):
                 # Thus let's create top level Jenkins and ask him
                 # http://jenkins:8080/view/CRT/view/CRT-FB/view/CRT-SCRT-1301/
                 top_jenkins = self.get_jenkins_obj().get_jenkins_obj_from_url(
-                        self.baseurl.split('view/')[0])
+                    self.baseurl.split('view/')[0])
                 if not top_jenkins.has_job(str_job_name):
                     log.error('Job "%s" is not known to Jenkins' % str_job_name)
                     return False
@@ -98,28 +99,27 @@ class View(JenkinsBase):
                     job = top_jenkins.get_job(str_job_name)
 
         log.info('Creating job %s in view %s' % (str_job_name, self.name))
-        jobs = self._data.setdefault('jobs', [])
         data = {
-            "description":"",
-            "statusFilter":"",
-            "useincluderegex":"on",
-            "includeRegex":"",
+            "description": "",
+            "statusFilter": "",
+            "useincluderegex": "on",
+            "includeRegex": "",
             "columns": [{"stapler-class": "hudson.views.StatusColumn",
-                        "kind": "hudson.views.StatusColumn"},
+                         "kind": "hudson.views.StatusColumn"},
                         {"stapler-class": "hudson.views.WeatherColumn",
-                        "kind": "hudson.views.WeatherColumn"},
+                         "kind": "hudson.views.WeatherColumn"},
                         {"stapler-class": "hudson.views.JobColumn",
-                        "kind": "hudson.views.JobColumn"},
+                         "kind": "hudson.views.JobColumn"},
                         {"stapler-class": "hudson.views.LastSuccessColumn",
-                        "kind": "hudson.views.LastSuccessColumn"},
+                         "kind": "hudson.views.LastSuccessColumn"},
                         {"stapler-class": "hudson.views.LastFailureColumn",
-                        "kind": "hudson.views.LastFailureColumn"},
+                         "kind": "hudson.views.LastFailureColumn"},
                         {"stapler-class": "hudson.views.LastDurationColumn",
-                        "kind": "hudson.views.LastDurationColumn"},
+                         "kind": "hudson.views.LastDurationColumn"},
                         {"stapler-class": "hudson.views.BuildButtonColumn",
-                        "kind": "hudson.views.BuildButtonColumn"}],
-            "Submit":"OK",
-            }
+                         "kind": "hudson.views.BuildButtonColumn"}],
+            "Submit": "OK",
+        }
         data["name"] = self.name
         # Add existing jobs (if any)
         for job_name in self.get_job_dict().keys():
@@ -131,21 +131,21 @@ class View(JenkinsBase):
         data['json'] = data.copy()
         data = urllib.urlencode(data)
         self.get_jenkins_obj().requester.post_and_confirm_status(
-                '%s/configSubmit' % self.baseurl, data=data)
+            '%s/configSubmit' % self.baseurl, data=data)
         self.poll()
         log.debug('Job "%s" has been added to a view "%s"' %
-                     (job.name, self.name))
+                  (job.name, self.name))
         return True
 
     def _get_nested_views(self):
-        if not self._data.has_key( "views" ):
+        if not 'views' in self._data:
             pass
         else:
             for viewdict in self._data["views"]:
                 yield viewdict["name"], viewdict["url"]
 
     def get_nested_view_dict(self):
-        return dict( self._get_nested_views() )
+        return dict(self._get_nested_views())
 
     def views(self):
         return self.jenkins_obj.views()
index 8aaabd2f3c4426c26969deae4b1bca0fb1dba7d6..97754196be1563751f8eb1b9713eabfc479e7c19 100644 (file)
@@ -45,7 +45,7 @@ class Views(object):
         else:
             return None
 
-    def __iteritems__(self):
+    def iteritems(self):
         """
         Get the names & objects for all views
         """
index e1a0e74f642994800d7d87965f713c6c8ae46fc5..ca15a02be744f3c10a959a25016221697fbde8c2 100644 (file)
@@ -40,10 +40,7 @@ class TestViews(BaseSystemTest):
         new_view = self.jenkins.views().create(view1_name)
         self.assertIn(view1_name, self.jenkins.views())
         del self.jenkins.views()[view1_name]
-
-        with self.assertRaises(KeyError):
-            del self.jenkins.views()[view1_name]
-
+        self.assertNotIn(view1_name, self.jenkins.views())
 
 
 if __name__ == '__main__':
index 29df9ea63e6365621e68ddc5589feb104cfeb2e8..b80e54ee42b8001c46e0cbe473d1210b070cf96c 100644 (file)
@@ -285,6 +285,58 @@ class TestJenkins(unittest.TestCase):
 
         self.assertEquals(ar.exception.message, 'Cannot create job job_new')
 
+    @mock.patch.object(JenkinsBase, '_poll')
+    @mock.patch.object(Jenkins, '_poll')
+    @mock.patch.object(Job, '_poll')
+    def test_get_jenkins_obj_from_url(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)
+
+        new_jenkins = J.get_jenkins_obj_from_url('http://localhost:8080/')
+        self.assertEquals(new_jenkins, J)
+
+        new_jenkins = J.get_jenkins_obj_from_url('http://localhost:8080/foo')
+        self.assertNotEquals(new_jenkins, J)
+
+    @mock.patch.object(JenkinsBase, '_poll')
+    @mock.patch.object(Jenkins, '_poll')
+    @mock.patch.object(Job, '_poll')
+    def test_get_jenkins_obj(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)
+
+        new_jenkins = J.get_jenkins_obj()
+        self.assertEquals(new_jenkins, J)
+
+
 class TestJenkinsURLs(unittest.TestCase):
 
     @mock.patch.object(Jenkins, '_poll')
@@ -303,5 +355,6 @@ class TestJenkinsURLs(unittest.TestCase):
         self.assertEquals(
             J.get_create_url(), 'http://localhost:8080/createItem')
 
+
 if __name__ == '__main__':
     unittest.main()
index 2b63efbdc9a7962df8d92729f6e44f88b2db3088..bbd92b0a3a14632be6da42aabf2c56462a3d0120 100644 (file)
@@ -105,7 +105,7 @@ class TestQueue(unittest.TestCase):
                             params={'param': 'value'},
                             data=None)
 
-        self.assertTrue(ae.exception.message=='Unexpected data type: None')
+        self.assertTrue(ae.exception.message=="Unexpected type of parameter 'data': <type 'NoneType'>. Expected (str, dict)")
 
     @mock.patch.object(requests, 'post')
     def test_post_xml_and_confirm_status_some_xml(self, _post):
@@ -129,7 +129,7 @@ class TestQueue(unittest.TestCase):
                             params={'param': 'value'},
                             data=None)
 
-        self.assertTrue(ae.exception.message=='Unexpected data type: None')
+        self.assertTrue(ae.exception.message=="Unexpected type of parameter 'data': <type 'NoneType'>. Expected (str, dict)")
 
     @mock.patch.object(requests, 'post')
     def test_post_and_confirm_status_some_data(self, _post):
index cb41453e3a97787d203f46e3a25fc4110caf12c4..24e0f0d69cbf29cd44024c6d7a24612715b9bfa7 100644 (file)
@@ -118,14 +118,21 @@ class TestView(unittest.TestCase):
         v = View('http://localhost:800/view/FodFanFo', 'FodFanFo', self.J)
 
         result = v.add_job('bar')
-        self.assertFalse(result)
+        self.assertTrue(result)
+
+
+    class SelfPatchJenkins(object):
+        def has_job(self, job_name):
+            return False
 
+        def get_jenkins_obj_from_url(self, url):
+            return self
 
     # We have to re-patch JenkinsBase here because by the time
     # it get to create Job, MagicMock will already expire
-    @mock.patch.object(Jenkins, 'has_job')
-    def test_add_wrong_job(self, _has_job):
-        _has_job.return_value = False
+    @mock.patch.object(View, 'get_jenkins_obj')
+    def test_add_wrong_job(self, _get_jenkins):
+        _get_jenkins.return_value = TestView.SelfPatchJenkins()
         result = self.v.add_job('bar')
         self.assertFalse(result)
 
index 7681bb54061d511d927eede3d44a91e43dc48668..c2e052862204514fad6a1bf8a4da2f6b053f1364 100644 (file)
@@ -25,7 +25,7 @@ class TestViews(unittest.TestCase):
                     username='foouser', password='foopassword',
                     requester=mock_requester)
 
-        new_view = J.views().create(str_view_name='NewView')
+        new_view = J.views().create('NewView')
         self.assertTrue(isinstance(new_view, View))
         self.assertEquals(new_view.baseurl,
                 'http://localhost:8080/views/NewView')
@@ -55,7 +55,7 @@ class TestViews(unittest.TestCase):
                     username='foouser',
                     password='foopassword')
 
-            new_view = J.views().create(str_view_name='NewView')
+            new_view = J.views().create('NewView')
 
             self.assertIsInstance(new_view, View)