1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203
|
import json
from mock import patch
import jenkins
from tests.helper import build_response_mock
from tests.jobs.base import JenkinsJobsTestBase
class JenkinsGetJobInfoTest(JenkinsJobsTestBase):
@patch.object(jenkins.Jenkins, 'jenkins_open')
def test_simple(self, jenkins_mock):
job_info_to_return = {
u'building': False,
u'msg': u'test',
u'revision': 66,
u'user': u'unknown'
}
jenkins_mock.return_value = json.dumps(job_info_to_return)
job_info = self.j.get_job_info(u'Test Job')
self.assertEqual(job_info, job_info_to_return)
self.assertEqual(
jenkins_mock.call_args[0][0].url,
self.make_url('job/Test%20Job/api/json?depth=0'))
self._check_requests(jenkins_mock.call_args_list)
@patch.object(jenkins.Jenkins, 'jenkins_open')
def test_all_builds(self, jenkins_mock):
job_info_to_return = {
u'building': False,
u'msg': u'test',
u'revision': 66,
u'user': u'unknown',
u'firstBuild': {u'number': 4},
u'builds': [{u'number': 5}],
u'name': u'Test Job',
u'fullName': u'Test Job'
}
all_builds_to_return = {u'allBuilds': [{u'number': 4},
{u'number': 5}]}
jenkins_mock.side_effect = [json.dumps(job_info_to_return),
json.dumps(all_builds_to_return)]
job_info = self.j.get_job_info(u'Test Job', fetch_all_builds=True)
expected = dict(job_info_to_return)
expected["builds"] = [{u'number': 4}, {u'number': 5}]
self.assertEqual(job_info, expected)
self.assertEqual(
jenkins_mock.call_args_list[0][0][0].url,
self.make_url('job/Test%20Job/api/json?depth=0'))
self.assertEqual(
jenkins_mock.call_args_list[1][0][0].url,
self.make_url(
'job/Test%20Job/api/json?tree=allBuilds[number,url]'))
self._check_requests(jenkins_mock.call_args_list)
@patch.object(jenkins.Jenkins, 'jenkins_open')
def test_in_folder(self, jenkins_mock):
job_info_to_return = {
u'building': False,
u'msg': u'test',
u'revision': 66,
u'user': u'unknown'
}
jenkins_mock.return_value = json.dumps(job_info_to_return)
job_info = self.j.get_job_info(u'a Folder/Test Job')
self.assertEqual(job_info, job_info_to_return)
self.assertEqual(
jenkins_mock.call_args[0][0].url,
self.make_url('job/a%20Folder/job/Test%20Job/api/json?depth=0'))
self._check_requests(jenkins_mock.call_args_list)
@patch.object(jenkins.Jenkins, 'jenkins_open')
def test_all_builds_in_folder(self, jenkins_mock):
job_info_to_return = {
u'building': False,
u'msg': u'test',
u'revision': 66,
u'user': u'unknown',
u'firstBuild': {u'number': 4},
u'builds': [{u'number': 5}],
u'name': u'Test Job',
u'fullName': u'a Folder/Test Job'
}
all_builds_to_return = {u'allBuilds': [{u'number': 4},
{u'number': 5}]}
jenkins_mock.side_effect = [json.dumps(job_info_to_return),
json.dumps(all_builds_to_return)]
job_info = self.j.get_job_info(u'a Folder/Test Job', fetch_all_builds=True)
expected = dict(job_info_to_return)
expected["builds"] = [{u'number': 4}, {u'number': 5}]
self.assertEqual(job_info, expected)
self.assertEqual(
jenkins_mock.call_args_list[0][0][0].url,
self.make_url('job/a%20Folder/job/Test%20Job/api/json?depth=0'))
self.assertEqual(
jenkins_mock.call_args_list[1][0][0].url,
self.make_url(
'job/a%20Folder/job/Test%20Job/api/json?tree=allBuilds[number,url]'))
self._check_requests(jenkins_mock.call_args_list)
@patch.object(jenkins.Jenkins, 'jenkins_open')
def test_regex(self, jenkins_mock):
parent_job = {
u'name': u'nested-parent-job',
u'jobs': [{u'name': u'nested-child-job'}],
}
jobs = [
{u'name': u'my-job-1'},
{u'name': u'my-job-2'},
{u'name': u'your-job-1'},
{u'name': u'Your-Job-1'},
{u'name': u'my-project-1'},
parent_job,
]
job_info_to_return = {u'jobs': jobs}
def mock_jenkins_open(req, **kwargs):
return json.dumps(parent_job if parent_job['name'] in req.url else job_info_to_return)
jenkins_mock.side_effect = mock_jenkins_open
self.assertEqual(len(self.j.get_job_info_regex('her-job')), 0)
self.assertEqual(len(self.j.get_job_info_regex('my-job-1')), 1)
self.assertEqual(len(self.j.get_job_info_regex('my-job')), 2)
self.assertEqual(len(self.j.get_job_info_regex('job')), 4)
self.assertEqual(len(self.j.get_job_info_regex('job', folder_depth=1)), 5)
self.assertEqual(len(self.j.get_job_info_regex('project')), 1)
self.assertEqual(len(self.j.get_job_info_regex('[Yy]our-[Jj]ob-1')), 2)
self.assertEqual(len(self.j.get_job_info_regex('nested-.*-job')), 1)
self.assertEqual(len(self.j.get_job_info_regex('nested-.*-job', folder_depth=1)), 2)
self.assertEqual(len(self.j.get_job_info_regex('parent')), 1)
self.assertEqual(len(self.j.get_job_info_regex('child')), 0)
self.assertEqual(len(self.j.get_job_info_regex('child', folder_depth=1)), 1)
self._check_requests(jenkins_mock.call_args_list)
@patch.object(jenkins.Jenkins, 'jenkins_open')
def test_return_none(self, jenkins_mock):
jenkins_mock.return_value = None
with self.assertRaises(jenkins.JenkinsException) as context_manager:
self.j.get_job_info(u'TestJob')
self.assertEqual(
jenkins_mock.call_args[0][0].url,
self.make_url('job/TestJob/api/json?depth=0'))
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_return_invalid_json(self, jenkins_mock):
jenkins_mock.return_value = 'Invalid JSON'
with self.assertRaises(jenkins.JenkinsException) as context_manager:
self.j.get_job_info(u'TestJob')
self.assertEqual(
jenkins_mock.call_args[0][0].url,
self.make_url('job/TestJob/api/json?depth=0'))
self.assertEqual(
str(context_manager.exception),
'Could not parse JSON info for job[TestJob]')
self._check_requests(jenkins_mock.call_args_list)
@patch('jenkins.requests.Session.send', autospec=True)
def test_raise_HTTPError(self, session_send_mock):
session_send_mock.side_effect = iter([
build_response_mock(404, reason="Not Found"), # crumb
build_response_mock(404, reason="Not Found"), # request
])
with self.assertRaises(jenkins.JenkinsException) as context_manager:
self.j.get_job_info(u'TestJob')
self.assertEqual(
session_send_mock.call_args_list[1][0][1].url,
self.make_url('job/TestJob/api/json?depth=0'))
self.assertEqual(
str(context_manager.exception),
'job[TestJob] does not exist')
@patch('jenkins.requests.Session.send', autospec=True)
def test_in_folder_raise_HTTPError(self, session_send_mock):
session_send_mock.side_effect = iter([
build_response_mock(404, reason="Not Found"), # crumb
build_response_mock(404, reason="Not Found"), # request
])
with self.assertRaises(jenkins.JenkinsException) as context_manager:
self.j.get_job_info(u'a Folder/TestJob')
self.assertEqual(
session_send_mock.call_args_list[1][0][1].url,
self.make_url('job/a%20Folder/job/TestJob/api/json?depth=0'))
self.assertEqual(
str(context_manager.exception),
'job[a Folder/TestJob] does not exist')
|