From 76410adc19ad4b382eda827a2f1fd279a8bf235d Mon Sep 17 00:00:00 2001 From: Darragh Bailey Date: Thu, 14 May 2015 18:07:36 +0100 Subject: [PATCH] Modify tests to exercise Request on python3 Need to exercise the Request object on python3 to ensure that the parameters passed to it are in the correct format. Use a simple combination of the opener and required handler to be able to have the url handling code parse the Request object created for performing API calls. Change-Id: Ia6ce75958bb18a743b7fd88d9512fcba3128a527 --- jenkins/__init__.py | 34 ++++++++----- tests/test_jenkins.py | 113 ++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 135 insertions(+), 12 deletions(-) diff --git a/jenkins/__init__.py b/jenkins/__init__.py index e0fde01..ec3fd61 100644 --- a/jenkins/__init__.py +++ b/jenkins/__init__.py @@ -360,7 +360,7 @@ class Jenkins(object): # https://issues.jenkins-ci.org/browse/JENKINS-21311 try: self.jenkins_open( - Request(self.server + CANCEL_QUEUE % locals(), '', + Request(self.server + CANCEL_QUEUE % locals(), b'', headers={'Referer': self.server})) except NotFoundException: # Exception is expected; cancel_queue() is a best-effort @@ -513,7 +513,8 @@ class Jenkins(object): :param to_name: Name of Jenkins job to copy to, ``str`` ''' self.jenkins_open(Request( - self.server + COPY_JOB % self._get_encoded_params(locals()), '')) + self.server + COPY_JOB % self._get_encoded_params(locals()), + b'')) self.assert_job_exists(to_name, 'create[%s] failed') def rename_job(self, from_name, to_name): @@ -523,7 +524,8 @@ class Jenkins(object): :param to_name: New Jenkins job name, ``str`` ''' self.jenkins_open(Request( - self.server + RENAME_JOB % self._get_encoded_params(locals()), '')) + self.server + RENAME_JOB % self._get_encoded_params(locals()), + b'')) self.assert_job_exists(to_name, 'rename[%s] failed') def delete_job(self, name): @@ -532,7 +534,8 @@ class Jenkins(object): :param name: Name of Jenkins job, ``str`` ''' self.jenkins_open(Request( - self.server + DELETE_JOB % self._get_encoded_params(locals()), '')) + self.server + DELETE_JOB % self._get_encoded_params(locals()), + b'')) if self.job_exists(name): raise JenkinsException('delete[%s] failed' % (name)) @@ -542,7 +545,8 @@ class Jenkins(object): :param name: Name of Jenkins job, ``str`` ''' self.jenkins_open(Request( - self.server + ENABLE_JOB % self._get_encoded_params(locals()), '')) + self.server + ENABLE_JOB % self._get_encoded_params(locals()), + b'')) def disable_job(self, name): '''Disable Jenkins job. @@ -552,7 +556,8 @@ class Jenkins(object): :param name: Name of Jenkins job, ``str`` ''' self.jenkins_open(Request( - self.server + DISABLE_JOB % self._get_encoded_params(locals()), '')) + self.server + DISABLE_JOB % self._get_encoded_params(locals()), + b'')) def job_exists(self, name): '''Check whether a job exists @@ -592,7 +597,8 @@ class Jenkins(object): raise JenkinsException('job[%s] already exists' % (name)) self.jenkins_open(Request( - self.server + CREATE_JOB % self._get_encoded_params(locals()), config_xml, DEFAULT_HEADERS)) + self.server + CREATE_JOB % self._get_encoded_params(locals()), + config_xml.encode('utf-8'), DEFAULT_HEADERS)) self.assert_job_exists(name, 'create[%s] failed') def get_job_config(self, name): @@ -613,7 +619,8 @@ class Jenkins(object): :param config_xml: New XML configuration, ``str`` ''' reconfig_url = self.server + CONFIG_JOB % self._get_encoded_params(locals()) - self.jenkins_open(Request(reconfig_url, config_xml, DEFAULT_HEADERS)) + self.jenkins_open(Request(reconfig_url, config_xml.encode('utf-8'), + DEFAULT_HEADERS)) def build_job_url(self, name, parameters=None, token=None): '''Get URL to trigger build job. @@ -644,7 +651,7 @@ class Jenkins(object): :param token: Jenkins API token ''' return self.jenkins_open(Request( - self.build_job_url(name, parameters, token), "")) + self.build_job_url(name, parameters, token), b'')) def stop_build(self, name, number): '''Stop a running Jenkins build. @@ -723,7 +730,8 @@ class Jenkins(object): ''' self.get_node_info(name) self.jenkins_open(Request( - self.server + DELETE_NODE % self._get_encoded_params(locals()), '')) + self.server + DELETE_NODE % self._get_encoded_params(locals()), + b'')) if self.node_exists(name): raise JenkinsException('delete[%s] failed' % (name)) @@ -737,7 +745,8 @@ class Jenkins(object): if info['offline']: return self.jenkins_open(Request( - self.server + TOGGLE_OFFLINE % self._get_encoded_params(locals()), '')) + self.server + TOGGLE_OFFLINE % self._get_encoded_params(locals()), + b'')) def enable_node(self, name): '''Enable a node @@ -749,7 +758,8 @@ class Jenkins(object): return msg = '' self.jenkins_open(Request( - self.server + TOGGLE_OFFLINE % self._get_encoded_params(locals()), '')) + self.server + TOGGLE_OFFLINE % self._get_encoded_params(locals()), + b'')) def create_node(self, name, numExecutors=2, nodeDescription=None, remoteFS='/var/lib/jenkins', labels=None, exclusive=False, diff --git a/tests/test_jenkins.py b/tests/test_jenkins.py index 2c59f2d..b52d12d 100644 --- a/tests/test_jenkins.py +++ b/tests/test_jenkins.py @@ -9,6 +9,7 @@ else: from mock import patch, Mock import six from six.moves.urllib.error import HTTPError +from six.moves.urllib.request import build_opener from tests.helper import jenkins @@ -43,6 +44,28 @@ class JenkinsTest(unittest.TestCase): ] } + def setUp(self): + super(JenkinsTest, self).setUp() + self.opener = build_opener() + + def _check_requests(self, requests): + + for req in requests: + self._check_request(req[0][0]) + + def _check_request(self, request): + + # taken from opener.open() in request + # attribute request.type is only set automatically for python 3 + # requests, must use request.get_type() for python 2.7 + protocol = request.type or request.get_type() + + # check that building the request doesn't throw any exception + meth_name = protocol + "_request" + for processor in self.opener.process_request.get(protocol, []): + meth = getattr(processor, meth_name) + request = meth(request) + def test_constructor_url_with_trailing_slash(self): j = jenkins.Jenkins('http://example.com/', 'test', 'test') self.assertEqual(j.server, 'http://example.com/') @@ -95,6 +118,7 @@ class JenkinsTest(unittest.TestCase): self.assertEqual( jenkins_mock.call_args[0][0].get_full_url(), u'http://example.com/job/Test%20Job/config.xml') + self._check_requests(jenkins_mock.call_args_list) @patch('jenkins.urlopen') def test_maybe_add_crumb(self, jenkins_mock): @@ -109,6 +133,7 @@ class JenkinsTest(unittest.TestCase): 'http://example.com/crumbIssuer/api/json') self.assertFalse(j.crumb) self.assertFalse('.crumb' in request.headers) + self._check_requests(jenkins_mock.call_args_list) @patch('jenkins.urlopen') def test_maybe_add_crumb__with_data(self, jenkins_mock): @@ -127,6 +152,7 @@ class JenkinsTest(unittest.TestCase): 'http://example.com/crumbIssuer/api/json') self.assertEqual(j.crumb, crumb_data) self.assertEqual(request.headers['.crumb'], crumb_data['crumb']) + self._check_requests(jenkins_mock.call_args_list) @patch.object(jenkins.Jenkins, 'jenkins_open') def test_maybe_add_crumb__empty_response(self, jenkins_mock): @@ -142,6 +168,7 @@ class JenkinsTest(unittest.TestCase): 'http://example.com/crumbIssuer/api/json') self.assertFalse(j.crumb) self.assertFalse('.crumb' in request.headers) + self._check_requests(jenkins_mock.call_args_list) @patch('jenkins.urlopen') def test_jenkins_open(self, jenkins_mock): @@ -165,6 +192,7 @@ class JenkinsTest(unittest.TestCase): self.assertEqual(response, json.dumps(data)) self.assertEqual(j.crumb, crumb_data) self.assertEqual(request.headers['.crumb'], crumb_data['crumb']) + self._check_requests(jenkins_mock.call_args_list) @patch('jenkins.urlopen') def test_jenkins_open__403(self, jenkins_mock): @@ -186,6 +214,7 @@ class JenkinsTest(unittest.TestCase): self.assertEqual( jenkins_mock.call_args[0][0].get_full_url(), 'http://example.com/job/TestJob') + self._check_requests(jenkins_mock.call_args_list) @patch('jenkins.urlopen') def test_jenkins_open__404(self, jenkins_mock): @@ -206,6 +235,7 @@ class JenkinsTest(unittest.TestCase): self.assertEqual( jenkins_mock.call_args[0][0].get_full_url(), 'http://example.com/job/TestJob') + self._check_requests(jenkins_mock.call_args_list) @patch('jenkins.urlopen') def test_jenkins_open__empty_response(self, jenkins_mock): @@ -223,6 +253,7 @@ class JenkinsTest(unittest.TestCase): self.assertEqual( jenkins_mock.call_args[0][0].get_full_url(), 'http://example.com/job/TestJob') + self._check_requests(jenkins_mock.call_args_list) @patch('jenkins.urlopen') def test_jenkins_open__501(self, jenkins_mock): @@ -243,6 +274,7 @@ class JenkinsTest(unittest.TestCase): self.assertEqual( jenkins_mock.call_args[0][0].get_full_url(), 'http://example.com/job/TestJob') + self._check_requests(jenkins_mock.call_args_list) @patch('jenkins.urlopen') def test_jenkins_open__timeout(self, jenkins_mock): @@ -259,6 +291,7 @@ class JenkinsTest(unittest.TestCase): self.assertEqual( jenkins_mock.call_args[0][0].get_full_url(), 'http://example.com/job/TestJob') + self._check_requests(jenkins_mock.call_args_list) @patch.object(jenkins.Jenkins, 'jenkins_open') def test_assert_job_exists__job_missing(self, jenkins_mock): @@ -270,6 +303,7 @@ class JenkinsTest(unittest.TestCase): self.assertEqual( str(context_manager.exception), 'job[NonExistent] does not exist') + self._check_requests(jenkins_mock.call_args_list) @patch.object(jenkins.Jenkins, 'jenkins_open') def test_assert_job_exists__job_exists(self, jenkins_mock): @@ -278,6 +312,7 @@ class JenkinsTest(unittest.TestCase): ] j = jenkins.Jenkins('http://example.com/', 'test', 'test') j.assert_job_exists('ExistingJob') + self._check_requests(jenkins_mock.call_args_list) @patch.object(jenkins.Jenkins, 'jenkins_open') def test_create_job(self, jenkins_mock): @@ -298,6 +333,7 @@ class JenkinsTest(unittest.TestCase): self.assertEqual( jenkins_mock.call_args_list[1][0][0].get_full_url(), 'http://example.com/createItem?name=Test%20Job') + self._check_requests(jenkins_mock.call_args_list) @patch.object(jenkins.Jenkins, 'jenkins_open') def test_create_job__already_exists(self, jenkins_mock): @@ -320,6 +356,7 @@ class JenkinsTest(unittest.TestCase): self.assertEqual( str(context_manager.exception), 'job[TestJob] already exists') + self._check_requests(jenkins_mock.call_args_list) @patch.object(jenkins.Jenkins, 'jenkins_open') def test_create_job__create_failed(self, jenkins_mock): @@ -346,6 +383,7 @@ class JenkinsTest(unittest.TestCase): self.assertEqual( str(context_manager.exception), 'create[TestJob] failed') + self._check_requests(jenkins_mock.call_args_list) @patch.object(jenkins.Jenkins, 'jenkins_open') def test_reconfig_job(self, jenkins_mock): @@ -364,6 +402,7 @@ class JenkinsTest(unittest.TestCase): self.assertEqual(jenkins_mock.call_args[0][0].get_full_url(), u'http://example.com/job/Test%20Job/config.xml') + self._check_requests(jenkins_mock.call_args_list) @patch.object(jenkins.Jenkins, 'jenkins_open') def test_build_job(self, jenkins_mock): @@ -377,6 +416,7 @@ class JenkinsTest(unittest.TestCase): self.assertEqual(jenkins_mock.call_args[0][0].get_full_url(), u'http://example.com/job/Test%20Job/build') self.assertEqual(build_info, {'foo': 'bar'}) + self._check_requests(jenkins_mock.call_args_list) @patch.object(jenkins.Jenkins, 'jenkins_open') def test_build_job__with_token(self, jenkins_mock): @@ -390,6 +430,7 @@ class JenkinsTest(unittest.TestCase): self.assertEqual(jenkins_mock.call_args[0][0].get_full_url(), u'http://example.com/job/TestJob/build?token=some_token') self.assertEqual(build_info, {'foo': 'bar'}) + self._check_requests(jenkins_mock.call_args_list) @patch.object(jenkins.Jenkins, 'jenkins_open') def test_build_job__with_parameters_and_token(self, jenkins_mock): @@ -407,6 +448,7 @@ class JenkinsTest(unittest.TestCase): self.assertTrue('when=now' in jenkins_mock.call_args[0][0].get_full_url()) self.assertTrue('why=because+I+felt+like+it' in jenkins_mock.call_args[0][0].get_full_url()) self.assertEqual(build_info, {'foo': 'bar'}) + self._check_requests(jenkins_mock.call_args_list) @patch.object(jenkins.Jenkins, 'jenkins_open') def test_stop_build(self, jenkins_mock): @@ -417,6 +459,7 @@ class JenkinsTest(unittest.TestCase): self.assertEqual( jenkins_mock.call_args[0][0].get_full_url(), u'http://example.com/job/Test%20Job/52/stop') + self._check_requests(jenkins_mock.call_args_list) @patch.object(jenkins.Jenkins, 'jenkins_open') def test_get_build_console_output(self, jenkins_mock): @@ -429,6 +472,7 @@ class JenkinsTest(unittest.TestCase): self.assertEqual( jenkins_mock.call_args[0][0].get_full_url(), u'http://example.com/job/Test%20Job/52/consoleText') + self._check_requests(jenkins_mock.call_args_list) @patch.object(jenkins.Jenkins, 'jenkins_open') def test_get_build_console_output__None(self, jenkins_mock): @@ -440,6 +484,7 @@ class JenkinsTest(unittest.TestCase): self.assertEqual( str(context_manager.exception), 'job[TestJob] number[52] does not exist') + self._check_requests(jenkins_mock.call_args_list) @patch.object(jenkins.Jenkins, 'jenkins_open') def test_get_build_console_output__invalid_json(self, jenkins_mock): @@ -448,6 +493,7 @@ class JenkinsTest(unittest.TestCase): console_output = j.get_build_console_output(u'TestJob', number=52) self.assertEqual(console_output, jenkins_mock.return_value) + self._check_requests(jenkins_mock.call_args_list) @patch.object(jenkins.Jenkins, 'jenkins_open') def test_get_build_console_output__HTTPError(self, jenkins_mock): @@ -467,6 +513,7 @@ class JenkinsTest(unittest.TestCase): self.assertEqual( str(context_manager.exception), 'job[TestJob] number[52] does not exist') + self._check_requests(jenkins_mock.call_args_list) @patch.object(jenkins.Jenkins, 'jenkins_open') def test_get_build_info(self, jenkins_mock): @@ -485,6 +532,7 @@ class JenkinsTest(unittest.TestCase): self.assertEqual( jenkins_mock.call_args[0][0].get_full_url(), u'http://example.com/job/Test%20Job/52/api/json?depth=0') + self._check_requests(jenkins_mock.call_args_list) @patch.object(jenkins.Jenkins, 'jenkins_open') def test_get_build_info__None(self, jenkins_mock): @@ -496,6 +544,7 @@ class JenkinsTest(unittest.TestCase): self.assertEqual( str(context_manager.exception), 'job[TestJob] number[52] does not exist') + self._check_requests(jenkins_mock.call_args_list) @patch.object(jenkins.Jenkins, 'jenkins_open') def test_get_build_info__invalid_json(self, jenkins_mock): @@ -507,6 +556,7 @@ class JenkinsTest(unittest.TestCase): self.assertEqual( str(context_manager.exception), 'Could not parse JSON info for job[TestJob] number[52]') + self._check_requests(jenkins_mock.call_args_list) @patch.object(jenkins.Jenkins, 'jenkins_open') def test_get_build_info__HTTPError(self, jenkins_mock): @@ -523,6 +573,7 @@ class JenkinsTest(unittest.TestCase): self.assertEqual( str(context_manager.exception), 'job[TestJob] number[52] does not exist') + self._check_requests(jenkins_mock.call_args_list) @patch.object(jenkins.Jenkins, 'jenkins_open') def test_get_job_info(self, jenkins_mock): @@ -541,6 +592,7 @@ class JenkinsTest(unittest.TestCase): self.assertEqual( jenkins_mock.call_args[0][0].get_full_url(), u'http://example.com/job/Test%20Job/api/json?depth=0') + self._check_requests(jenkins_mock.call_args_list) @patch.object(jenkins.Jenkins, 'jenkins_open') def test_get_job_info_regex(self, jenkins_mock): @@ -561,6 +613,7 @@ class JenkinsTest(unittest.TestCase): self.assertEqual(len(j.get_job_info_regex('job')), 3) self.assertEqual(len(j.get_job_info_regex('project')), 1) self.assertEqual(len(j.get_job_info_regex('[Yy]our-[Jj]ob-1')), 2) + self._check_requests(jenkins_mock.call_args_list) @patch.object(jenkins.Jenkins, 'jenkins_open') def test_get_job_info__None(self, jenkins_mock): @@ -575,6 +628,7 @@ class JenkinsTest(unittest.TestCase): self.assertEqual( str(context_manager.exception), 'job[TestJob] does not exist') + self._check_requests(jenkins_mock.call_args_list) @patch.object(jenkins.Jenkins, 'jenkins_open') def test_get_job_info__invalid_json(self, jenkins_mock): @@ -589,6 +643,7 @@ class JenkinsTest(unittest.TestCase): self.assertEqual( str(context_manager.exception), 'Could not parse JSON info for job[TestJob]') + self._check_requests(jenkins_mock.call_args_list) @patch.object(jenkins.Jenkins, 'jenkins_open') def test_get_job_info__HTTPError(self, jenkins_mock): @@ -608,6 +663,7 @@ class JenkinsTest(unittest.TestCase): self.assertEqual( str(context_manager.exception), 'job[TestJob] does not exist') + self._check_requests(jenkins_mock.call_args_list) @patch.object(jenkins.Jenkins, 'jenkins_open') def test_debug_job_info(self, jenkins_mock): @@ -625,6 +681,7 @@ class JenkinsTest(unittest.TestCase): self.assertEqual( jenkins_mock.call_args[0][0].get_full_url(), u'http://example.com/job/Test%20Job/api/json?depth=0') + self._check_requests(jenkins_mock.call_args_list) @patch('jenkins.urlopen') def test_get_version__some_version(self, urlopen_mock): @@ -640,6 +697,7 @@ class JenkinsTest(unittest.TestCase): mock_response.configure_mock(**config) urlopen_mock.side_effect = [mock_response] self.assertEqual(j.get_version(), 'Version42') + self._check_requests(urlopen_mock.call_args_list) @patch('jenkins.urlopen') def test_get_version__HTTPError(self, urlopen_mock): @@ -655,6 +713,7 @@ class JenkinsTest(unittest.TestCase): self.assertEqual( str(context_manager.exception), 'Error communicating with server[http://example.com/]') + self._check_requests(urlopen_mock.call_args_list) @patch('jenkins.urlopen') def test_get_version__BadStatusLine(self, urlopen_mock): @@ -665,6 +724,7 @@ class JenkinsTest(unittest.TestCase): self.assertEqual( str(context_manager.exception), 'Error communicating with server[http://example.com/]') + self._check_requests(urlopen_mock.call_args_list) @patch('jenkins.urlopen', return_value=None) def test_get_version__empty_response(self, urlopen_mock): @@ -675,6 +735,7 @@ class JenkinsTest(unittest.TestCase): str(context_manager.exception), 'Error communicating with server[http://example.com/]:' ' empty response') + self._check_requests(urlopen_mock.call_args_list) @patch.object(jenkins.Jenkins, 'jenkins_open') def test_jobs_count(self, jenkins_mock): @@ -687,6 +748,7 @@ class JenkinsTest(unittest.TestCase): jenkins_mock.return_value = json.dumps(job_info_to_return) j = jenkins.Jenkins('http://example.com/', 'test', 'test') self.assertEqual(j.jobs_count(), 3) + self._check_requests(jenkins_mock.call_args_list) @patch.object(jenkins.Jenkins, 'jenkins_open') def test_get_jobs(self, jenkins_mock): @@ -705,6 +767,7 @@ class JenkinsTest(unittest.TestCase): self.assertEqual( jenkins_mock.call_args[0][0].get_full_url(), u'http://example.com/api/json') + self._check_requests(jenkins_mock.call_args_list) @patch.object(jenkins.Jenkins, 'jenkins_open') def test_get_info(self, jenkins_mock): @@ -724,6 +787,7 @@ class JenkinsTest(unittest.TestCase): self.assertEqual( jenkins_mock.call_args[0][0].get_full_url(), u'http://example.com/api/json') + self._check_requests(jenkins_mock.call_args_list) @patch.object(jenkins.Jenkins, 'jenkins_open') def test_get_plugins_info(self, jenkins_mock): @@ -737,6 +801,7 @@ class JenkinsTest(unittest.TestCase): self.assertEqual( jenkins_mock.call_args[0][0].get_full_url(), u'http://example.com/pluginManager/api/json?depth=2') + self._check_requests(jenkins_mock.call_args_list) @patch.object(jenkins.Jenkins, 'jenkins_open') def test_get_plugins_info_none(self, jenkins_mock): @@ -748,6 +813,7 @@ class JenkinsTest(unittest.TestCase): plugins_info = j.get_plugins_info() self.assertEqual(plugins_info, []) + self._check_requests(jenkins_mock.call_args_list) @patch.object(jenkins.Jenkins, 'jenkins_open') def test_get_plugins_info_depth(self, jenkins_mock): @@ -759,6 +825,7 @@ class JenkinsTest(unittest.TestCase): self.assertEqual( jenkins_mock.call_args[0][0].get_full_url(), u'http://example.com/pluginManager/api/json?depth=1') + self._check_requests(jenkins_mock.call_args_list) @patch.object(jenkins.Jenkins, 'jenkins_open') def test_get_plugins_info__BadStatusLine(self, jenkins_mock): @@ -773,6 +840,7 @@ class JenkinsTest(unittest.TestCase): self.assertEqual( str(context_manager.exception), 'Error communicating with server[http://example.com/]') + self._check_requests(jenkins_mock.call_args_list) @patch.object(jenkins.Jenkins, 'jenkins_open') def test_get_plugins_info__ValueError(self, jenkins_mock): @@ -787,6 +855,7 @@ class JenkinsTest(unittest.TestCase): self.assertEqual( str(context_manager.exception), 'Could not parse JSON info for server[http://example.com/]') + self._check_requests(jenkins_mock.call_args_list) @patch.object(jenkins.Jenkins, 'jenkins_open') def test_get_plugins_info__HTTPError(self, jenkins_mock): @@ -803,6 +872,7 @@ class JenkinsTest(unittest.TestCase): self.assertEqual( str(context_manager.exception), 'Error communicating with server[http://example.com/]') + self._check_requests(jenkins_mock.call_args_list) @patch.object(jenkins.Jenkins, 'jenkins_open') def test_get_plugin_info_shortname(self, jenkins_mock): @@ -813,6 +883,7 @@ class JenkinsTest(unittest.TestCase): # expected to return info on a single plugin plugin_info = j.get_plugin_info("mailer") self.assertEqual(plugin_info, self.plugin_info_json['plugins'][0]) + self._check_requests(jenkins_mock.call_args_list) @patch.object(jenkins.Jenkins, 'jenkins_open') def test_get_plugin_info_longname(self, jenkins_mock): @@ -823,6 +894,7 @@ class JenkinsTest(unittest.TestCase): # expected to return info on a single plugin plugin_info = j.get_plugin_info("Jenkins Mailer Plugin") self.assertEqual(plugin_info, self.plugin_info_json['plugins'][0]) + self._check_requests(jenkins_mock.call_args_list) @patch.object(jenkins.Jenkins, 'jenkins_open') def test_get_plugin_info_none(self, jenkins_mock): @@ -833,6 +905,7 @@ class JenkinsTest(unittest.TestCase): # expected not to find bogus so should return None plugin_info = j.get_plugin_info("bogus") self.assertEqual(plugin_info, None) + self._check_requests(jenkins_mock.call_args_list) @patch.object(jenkins.Jenkins, 'jenkins_open') def test_get_plugin_info_depth(self, jenkins_mock): @@ -844,6 +917,7 @@ class JenkinsTest(unittest.TestCase): self.assertEqual( jenkins_mock.call_args[0][0].get_full_url(), u'http://example.com/pluginManager/api/json?depth=1') + self._check_requests(jenkins_mock.call_args_list) @patch.object(jenkins.Jenkins, 'jenkins_open') def test_get_plugin_info__BadStatusLine(self, jenkins_mock): @@ -858,6 +932,7 @@ class JenkinsTest(unittest.TestCase): self.assertEqual( str(context_manager.exception), 'Error communicating with server[http://example.com/]') + self._check_requests(jenkins_mock.call_args_list) @patch.object(jenkins.Jenkins, 'jenkins_open') def test_get_plugin_info__ValueError(self, jenkins_mock): @@ -872,6 +947,7 @@ class JenkinsTest(unittest.TestCase): self.assertEqual( str(context_manager.exception), 'Could not parse JSON info for server[http://example.com/]') + self._check_requests(jenkins_mock.call_args_list) @patch.object(jenkins.Jenkins, 'jenkins_open') def test_get_plugin_info__HTTPError(self, jenkins_mock): @@ -888,6 +964,7 @@ class JenkinsTest(unittest.TestCase): self.assertEqual( str(context_manager.exception), 'Error communicating with server[http://example.com/]') + self._check_requests(jenkins_mock.call_args_list) @patch.object(jenkins.Jenkins, 'jenkins_open') def test_get_info__HTTPError(self, jenkins_mock): @@ -907,6 +984,7 @@ class JenkinsTest(unittest.TestCase): self.assertEqual( str(context_manager.exception), 'Error communicating with server[http://example.com/]') + self._check_requests(jenkins_mock.call_args_list) @patch.object(jenkins.Jenkins, 'jenkins_open') def test_get_info__BadStatusLine(self, jenkins_mock): @@ -921,6 +999,7 @@ class JenkinsTest(unittest.TestCase): self.assertEqual( str(context_manager.exception), 'Error communicating with server[http://example.com/]') + self._check_requests(jenkins_mock.call_args_list) @patch.object(jenkins.Jenkins, 'jenkins_open') def test_get_info__ValueError(self, jenkins_mock): @@ -935,6 +1014,7 @@ class JenkinsTest(unittest.TestCase): self.assertEqual( str(context_manager.exception), 'Could not parse JSON info for server[http://example.com/]') + self._check_requests(jenkins_mock.call_args_list) @patch.object(jenkins.Jenkins, 'jenkins_open') def test_get_info__empty_response(self, jenkins_mock): @@ -952,6 +1032,7 @@ class JenkinsTest(unittest.TestCase): str(context_manager.exception), 'Error communicating with server[http://example.com/]: ' 'empty response') + self._check_requests(jenkins_mock.call_args_list) @patch.object(jenkins.Jenkins, 'jenkins_open') def test_copy_job(self, jenkins_mock): @@ -969,6 +1050,7 @@ class JenkinsTest(unittest.TestCase): 'http://example.com/createItem' '?name=Test%20Job_2&mode=copy&from=Test%20Job') self.assertTrue(j.job_exists('Test Job_2')) + self._check_requests(jenkins_mock.call_args_list) @patch.object(jenkins.Jenkins, 'jenkins_open') def test_copy_job__create_failed(self, jenkins_mock): @@ -987,6 +1069,7 @@ class JenkinsTest(unittest.TestCase): self.assertEqual( str(context_manager.exception), 'create[TestJob_2] failed') + self._check_requests(jenkins_mock.call_args_list) @patch.object(jenkins.Jenkins, 'jenkins_open') def test_rename_job(self, jenkins_mock): @@ -1003,6 +1086,7 @@ class JenkinsTest(unittest.TestCase): jenkins_mock.call_args_list[0][0][0].get_full_url(), 'http://example.com/job/Test%20Job/doRename?newName=Test%20Job_2') self.assertTrue(j.job_exists('Test Job_2')) + self._check_requests(jenkins_mock.call_args_list) @patch.object(jenkins.Jenkins, 'jenkins_open') def test_rename_job__rename_failed(self, jenkins_mock): @@ -1020,6 +1104,7 @@ class JenkinsTest(unittest.TestCase): self.assertEqual( str(context_manager.exception), 'rename[TestJob_2] failed') + self._check_requests(jenkins_mock.call_args_list) @patch.object(jenkins.Jenkins, 'jenkins_open') def test_delete_job(self, jenkins_mock): @@ -1034,6 +1119,7 @@ class JenkinsTest(unittest.TestCase): self.assertEqual( jenkins_mock.call_args_list[0][0][0].get_full_url(), 'http://example.com/job/Test%20Job/doDelete') + self._check_requests(jenkins_mock.call_args_list) @patch.object(jenkins.Jenkins, 'jenkins_open') def test_delete_job__delete_failed(self, jenkins_mock): @@ -1052,6 +1138,7 @@ class JenkinsTest(unittest.TestCase): self.assertEqual( str(context_manager.exception), 'delete[TestJob] failed') + self._check_requests(jenkins_mock.call_args_list) @patch.object(jenkins.Jenkins, 'jenkins_open') def test_enable_job(self, jenkins_mock): @@ -1067,6 +1154,7 @@ class JenkinsTest(unittest.TestCase): jenkins_mock.call_args_list[0][0][0].get_full_url(), 'http://example.com/job/TestJob/enable') self.assertTrue(j.job_exists('TestJob')) + self._check_requests(jenkins_mock.call_args_list) @patch.object(jenkins.Jenkins, 'jenkins_open') def test_disable_job(self, jenkins_mock): @@ -1082,6 +1170,7 @@ class JenkinsTest(unittest.TestCase): jenkins_mock.call_args_list[0][0][0].get_full_url(), 'http://example.com/job/Test%20Job/disable') self.assertTrue(j.job_exists('Test Job')) + self._check_requests(jenkins_mock.call_args_list) @patch.object(jenkins.Jenkins, 'jenkins_open') def test_get_job_name(self, jenkins_mock): @@ -1095,6 +1184,7 @@ class JenkinsTest(unittest.TestCase): self.assertEqual( jenkins_mock.call_args[0][0].get_full_url(), u'http://example.com/job/Test%20Job/api/json?tree=name') + self._check_requests(jenkins_mock.call_args_list) @patch.object(jenkins.Jenkins, 'jenkins_open') def test_get_job_name__None(self, jenkins_mock): @@ -1107,6 +1197,7 @@ class JenkinsTest(unittest.TestCase): self.assertEqual( jenkins_mock.call_args[0][0].get_full_url(), u'http://example.com/job/TestJob/api/json?tree=name') + self._check_requests(jenkins_mock.call_args_list) @patch.object(jenkins.Jenkins, 'jenkins_open') def test_get_job_name__unexpected_job_name(self, jenkins_mock): @@ -1123,6 +1214,7 @@ class JenkinsTest(unittest.TestCase): str(context_manager.exception), 'Jenkins returned an unexpected job name {0} ' '(expected: {1})'.format(job_name_to_return['name'], 'TestJob')) + self._check_requests(jenkins_mock.call_args_list) @patch.object(jenkins.Jenkins, 'jenkins_open') def test_cancel_queue(self, jenkins_mock): @@ -1135,6 +1227,7 @@ class JenkinsTest(unittest.TestCase): self.assertEqual( jenkins_mock.call_args[0][0].get_full_url(), u'http://example.com/queue/cancelItem?id=52') + self._check_requests(jenkins_mock.call_args_list) @patch.object(jenkins.Jenkins, 'jenkins_open', side_effect=jenkins.NotFoundException('not found')) @@ -1148,6 +1241,7 @@ class JenkinsTest(unittest.TestCase): self.assertEqual( jenkins_mock.call_args[0][0].get_full_url(), u'http://example.com/queue/cancelItem?id=52') + self._check_requests(jenkins_mock.call_args_list) @patch.object(jenkins.Jenkins, 'jenkins_open') def test_get_nodes(self, jenkins_mock): @@ -1160,6 +1254,7 @@ class JenkinsTest(unittest.TestCase): j = jenkins.Jenkins('http://example.com/', 'test', 'test') self.assertEqual(j.get_nodes(), [{'name': 'master', 'offline': False}]) + self._check_requests(jenkins_mock.call_args_list) @patch.object(jenkins.Jenkins, 'jenkins_open') def test_get_nodes__invalid_json(self, jenkins_mock): @@ -1176,6 +1271,7 @@ class JenkinsTest(unittest.TestCase): self.assertEqual( str(context_manager.exception), 'Could not parse JSON info for server[http://example.com/]') + self._check_requests(jenkins_mock.call_args_list) @patch('jenkins.urlopen') def test_get_nodes__BadStatusLine(self, urlopen_mock): @@ -1186,6 +1282,7 @@ class JenkinsTest(unittest.TestCase): self.assertEqual( str(context_manager.exception), 'Error communicating with server[http://example.com/]') + self._check_requests(urlopen_mock.call_args_list) @patch.object(jenkins.Jenkins, 'jenkins_open') def test_get_nodes__HTTPError(self, jenkins_mock): @@ -1205,6 +1302,7 @@ class JenkinsTest(unittest.TestCase): self.assertEqual( str(context_manager.exception), 'Error communicating with server[http://example.com/]') + self._check_requests(jenkins_mock.call_args_list) @patch.object(jenkins.Jenkins, 'jenkins_open') def test_get_node_info(self, jenkins_mock): @@ -1221,6 +1319,7 @@ class JenkinsTest(unittest.TestCase): self.assertEqual( jenkins_mock.call_args[0][0].get_full_url(), 'http://example.com/computer/test%20node/api/json?depth=0') + self._check_requests(jenkins_mock.call_args_list) @patch.object(jenkins.Jenkins, 'jenkins_open') def test_get_node_info__invalid_json(self, jenkins_mock): @@ -1237,6 +1336,7 @@ class JenkinsTest(unittest.TestCase): self.assertEqual( str(context_manager.exception), 'Could not parse JSON info for node[test_node]') + self._check_requests(jenkins_mock.call_args_list) @patch.object(jenkins.Jenkins, 'jenkins_open') def test_get_node_info__HTTPError(self, jenkins_mock): @@ -1256,6 +1356,7 @@ class JenkinsTest(unittest.TestCase): self.assertEqual( str(context_manager.exception), 'node[test_node] does not exist') + self._check_requests(jenkins_mock.call_args_list) @patch.object(jenkins.Jenkins, 'jenkins_open') def test_assert_node_exists__node_missing(self, jenkins_mock): @@ -1267,6 +1368,7 @@ class JenkinsTest(unittest.TestCase): self.assertEqual( str(context_manager.exception), 'node[NonExistentNode] does not exist') + self._check_requests(jenkins_mock.call_args_list) @patch.object(jenkins.Jenkins, 'jenkins_open') def test_assert_node_exists__node_exists(self, jenkins_mock): @@ -1275,6 +1377,7 @@ class JenkinsTest(unittest.TestCase): ] j = jenkins.Jenkins('http://example.com/', 'test', 'test') j.assert_node_exists('ExistingNode') + self._check_requests(jenkins_mock.call_args_list) @patch.object(jenkins.Jenkins, 'jenkins_open') def test_delete_node(self, jenkins_mock): @@ -1296,6 +1399,7 @@ class JenkinsTest(unittest.TestCase): jenkins_mock.call_args_list[1][0][0].get_full_url(), 'http://example.com/computer/test%20node/doDelete') self.assertFalse(j.node_exists('test node')) + self._check_requests(jenkins_mock.call_args_list) @patch.object(jenkins.Jenkins, 'jenkins_open') def test_delete_node__delete_failed(self, jenkins_mock): @@ -1318,6 +1422,7 @@ class JenkinsTest(unittest.TestCase): self.assertEqual( str(context_manager.exception), 'delete[test_node] failed') + self._check_requests(jenkins_mock.call_args_list) @patch.object(jenkins.Jenkins, 'jenkins_open') def test_create_node(self, jenkins_mock): @@ -1339,6 +1444,7 @@ class JenkinsTest(unittest.TestCase): jenkins_mock.call_args_list[1][0][0].get_full_url().split('?')[0], 'http://example.com/computer/doCreateItem') self.assertTrue(j.node_exists('test node')) + self._check_requests(jenkins_mock.call_args_list) @patch.object(jenkins.Jenkins, 'jenkins_open') def test_create_node__node_already_exists(self, jenkins_mock): @@ -1356,6 +1462,7 @@ class JenkinsTest(unittest.TestCase): self.assertEqual( str(context_manager.exception), 'node[test_node] already exists') + self._check_requests(jenkins_mock.call_args_list) @patch.object(jenkins.Jenkins, 'jenkins_open') def test_create_node__create_failed(self, jenkins_mock): @@ -1375,6 +1482,7 @@ class JenkinsTest(unittest.TestCase): self.assertEqual( str(context_manager.exception), 'create[test_node] failed') + self._check_requests(jenkins_mock.call_args_list) @patch.object(jenkins.Jenkins, 'jenkins_open') def test_enable_node(self, jenkins_mock): @@ -1404,6 +1512,7 @@ class JenkinsTest(unittest.TestCase): jenkins_mock.side_effect = [json.dumps(expected_node_info)] node_info = j.get_node_info('test node') self.assertEqual(node_info, expected_node_info) + self._check_requests(jenkins_mock.call_args_list) @patch.object(jenkins.Jenkins, 'jenkins_open') def test_enable_node__offline_False(self, jenkins_mock): @@ -1434,6 +1543,7 @@ class JenkinsTest(unittest.TestCase): jenkins_mock.side_effect = [json.dumps(expected_node_info)] node_info = j.get_node_info('test_node') self.assertEqual(node_info, expected_node_info) + self._check_requests(jenkins_mock.call_args_list) @patch.object(jenkins.Jenkins, 'jenkins_open') def test_disable_node(self, jenkins_mock): @@ -1463,6 +1573,7 @@ class JenkinsTest(unittest.TestCase): jenkins_mock.side_effect = [json.dumps(expected_node_info)] node_info = j.get_node_info('test node') self.assertEqual(node_info, expected_node_info) + self._check_requests(jenkins_mock.call_args_list) @patch.object(jenkins.Jenkins, 'jenkins_open') def test_disable_node__offline_True(self, jenkins_mock): @@ -1493,6 +1604,7 @@ class JenkinsTest(unittest.TestCase): jenkins_mock.side_effect = [json.dumps(expected_node_info)] node_info = j.get_node_info('test_node') self.assertEqual(node_info, expected_node_info) + self._check_requests(jenkins_mock.call_args_list) @patch.object(jenkins.Jenkins, 'jenkins_open') def test_get_queue_info(self, jenkins_mock): @@ -1529,3 +1641,4 @@ class JenkinsTest(unittest.TestCase): self.assertEqual( jenkins_mock.call_args[0][0].get_full_url(), u'http://example.com/queue/api/json?depth=0') + self._check_requests(jenkins_mock.call_args_list)