From: lechat Date: Tue, 9 Jul 2013 13:50:43 +0000 (+0800) Subject: Fixed tests, reformatted View with PEP8, added more tests X-Git-Tag: v0.2.23~113^2 X-Git-Url: http://review.tizen.org/git/?a=commitdiff_plain;h=204db5651aa43630682f41bbe1912d60e2be7f18;p=tools%2Fpython-jenkinsapi.git Fixed tests, reformatted View with PEP8, added more tests --- diff --git a/.gitignore b/.gitignore index 4dcab13..4fbc2c4 100644 --- a/.gitignore +++ b/.gitignore @@ -11,4 +11,5 @@ jenkins.war .coverage/ .coverage nosetests.xml -coverage*/ \ No newline at end of file +coverage*/ +.idea/ diff --git a/jenkinsapi/view.py b/jenkinsapi/view.py index 6401405..8d9d459 100644 --- a/jenkinsapi/view.py +++ b/jenkinsapi/view.py @@ -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() diff --git a/jenkinsapi/views.py b/jenkinsapi/views.py index 8aaabd2..9775419 100644 --- a/jenkinsapi/views.py +++ b/jenkinsapi/views.py @@ -45,7 +45,7 @@ class Views(object): else: return None - def __iteritems__(self): + def iteritems(self): """ Get the names & objects for all views """ diff --git a/jenkinsapi_tests/systests/test_views.py b/jenkinsapi_tests/systests/test_views.py index e1a0e74..ca15a02 100644 --- a/jenkinsapi_tests/systests/test_views.py +++ b/jenkinsapi_tests/systests/test_views.py @@ -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__': diff --git a/jenkinsapi_tests/unittests/test_jenkins.py b/jenkinsapi_tests/unittests/test_jenkins.py index 29df9ea..b80e54e 100644 --- a/jenkinsapi_tests/unittests/test_jenkins.py +++ b/jenkinsapi_tests/unittests/test_jenkins.py @@ -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() diff --git a/jenkinsapi_tests/unittests/test_requester.py b/jenkinsapi_tests/unittests/test_requester.py index 2b63efb..bbd92b0 100644 --- a/jenkinsapi_tests/unittests/test_requester.py +++ b/jenkinsapi_tests/unittests/test_requester.py @@ -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': . 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': . Expected (str, dict)") @mock.patch.object(requests, 'post') def test_post_and_confirm_status_some_data(self, _post): diff --git a/jenkinsapi_tests/unittests/test_view.py b/jenkinsapi_tests/unittests/test_view.py index cb41453..24e0f0d 100644 --- a/jenkinsapi_tests/unittests/test_view.py +++ b/jenkinsapi_tests/unittests/test_view.py @@ -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) diff --git a/jenkinsapi_tests/unittests/test_views.py b/jenkinsapi_tests/unittests/test_views.py index 7681bb5..c2e0528 100644 --- a/jenkinsapi_tests/unittests/test_views.py +++ b/jenkinsapi_tests/unittests/test_views.py @@ -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)