# Verify that we can hande binary artifacts
binary_artifact.save_to_dir(tempDir)
- readBackText = gzip.open(os.path.join(
- tempDir,
- binary_artifact.filename,
- ), 'rb').read().strip()
+ readBackText = gzip.open(os.path.join(tempDir, binary_artifact.filename,), 'rb').read().strip()
self.assertTrue(re.match(r'^PING \S+ \(127.0.0.1\)', readBackText))
self.assertTrue(readBackText.endswith('ms'))
finally:
class test_build(unittest.TestCase):
- DATA = {'actions': [{'causes': [{'shortDescription': 'Started by an SCM change'}]},
- {},
- {'buildsByBranchName': {'origin/HEAD': {'buildNumber': 2,
- 'buildResult': None,
- 'revision': {'SHA1': 'd2a5d435fa2df3bff572bd06e43c86544749c5d2',
- 'branch': [{'SHA1': 'd2a5d435fa2df3bff572bd06e43c86544749c5d2',
- 'name': 'origin/HEAD'},
- {'SHA1': 'd2a5d435fa2df3bff572bd06e43c86544749c5d2',
- 'name': 'origin/master'}]}},
- 'origin/master': {'buildNumber': 2,
- 'buildResult': None,
- 'revision': {'SHA1': 'd2a5d435fa2df3bff572bd06e43c86544749c5d2',
- 'branch': [{'SHA1': 'd2a5d435fa2df3bff572bd06e43c86544749c5d2',
- 'name': 'origin/HEAD'},
- {'SHA1': 'd2a5d435fa2df3bff572bd06e43c86544749c5d2',
- 'name': 'origin/master'}]}},
- 'origin/python_3_compatibility': {'buildNumber': 1,
- 'buildResult': None,
- 'revision': {'SHA1': 'c9d1c96bc926ff63a5209c51b3ed537e62ea50e6',
- 'branch': [{'SHA1': 'c9d1c96bc926ff63a5209c51b3ed537e62ea50e6',
- 'name': 'origin/python_3_compatibility'}]}},
- 'origin/unstable': {'buildNumber': 3,
- 'buildResult': None,
- 'revision': {'SHA1': '7def9ed6e92580f37d00e4980c36c4d36e68f702',
- 'branch': [{'SHA1': '7def9ed6e92580f37d00e4980c36c4d36e68f702',
- 'name': 'origin/unstable'}]}}},
- 'lastBuiltRevision': {'SHA1': '7def9ed6e92580f37d00e4980c36c4d36e68f702',
- 'branch': [{'SHA1': '7def9ed6e92580f37d00e4980c36c4d36e68f702',
- 'name': 'origin/unstable'}]},
- 'remoteUrls': ['https://github.com/salimfadhley/jenkinsapi.git'],
- 'scmName': ''},
- {},
- {}],
- 'artifacts': [],
- 'building': False,
- 'builtOn': '',
- 'changeSet': {'items': [], 'kind': 'git'},
- 'culprits': [],
- 'description': None,
- 'duration': 1051,
- 'estimatedDuration': 2260,
- 'executor': None,
- 'fullDisplayName': 'git_yssrtigfds #3',
- 'id': '2013-06-30_01-54-35',
- 'keepLog': False,
- 'number': 3,
- 'result': 'SUCCESS',
- 'timestamp': 1372553675652,
- 'url': 'http://localhost:8080/job/git_yssrtigfds/3/'}
+ DATA = {
+ 'actions': [
+ {
+ 'causes': [{'shortDescription': 'Started by an SCM change'}]
+ },
+ {},
+ {
+ 'buildsByBranchName': {
+ 'origin/HEAD': {
+ 'buildNumber': 2,
+ 'buildResult': None,
+ 'revision': {
+ 'SHA1': 'd2a5d435fa2df3bff572bd06e43c86544749c5d2',
+ 'branch': [
+ {'SHA1': 'd2a5d435fa2df3bff572bd06e43c86544749c5d2', 'name': 'origin/HEAD'},
+ {'SHA1': 'd2a5d435fa2df3bff572bd06e43c86544749c5d2', 'name': 'origin/master'}
+ ]
+ }
+ },
+ 'origin/master': {
+ 'buildNumber': 2,
+ 'buildResult': None,
+ 'revision': {
+ 'SHA1': 'd2a5d435fa2df3bff572bd06e43c86544749c5d2',
+ 'branch': [
+ {'SHA1': 'd2a5d435fa2df3bff572bd06e43c86544749c5d2', 'name': 'origin/HEAD'},
+ {'SHA1': 'd2a5d435fa2df3bff572bd06e43c86544749c5d2', 'name': 'origin/master'}
+ ]
+ }
+ },
+ 'origin/python_3_compatibility': {
+ 'buildNumber': 1,
+ 'buildResult': None,
+ 'revision': {
+ 'SHA1': 'c9d1c96bc926ff63a5209c51b3ed537e62ea50e6',
+ 'branch': [
+ {'SHA1': 'c9d1c96bc926ff63a5209c51b3ed537e62ea50e6', 'name': 'origin/python_3_compatibility'}
+ ]
+ }
+ },
+ 'origin/unstable': {
+ 'buildNumber': 3,
+ 'buildResult': None,
+ 'revision': {
+ 'SHA1': '7def9ed6e92580f37d00e4980c36c4d36e68f702',
+ 'branch': [
+ {'SHA1': '7def9ed6e92580f37d00e4980c36c4d36e68f702', 'name': 'origin/unstable'}
+ ]
+ }
+ }
+ },
+ 'lastBuiltRevision': {
+ 'SHA1': '7def9ed6e92580f37d00e4980c36c4d36e68f702',
+ 'branch': [
+ {'SHA1': '7def9ed6e92580f37d00e4980c36c4d36e68f702', 'name': 'origin/unstable'}
+ ]
+ },
+ 'remoteUrls': ['https://github.com/salimfadhley/jenkinsapi.git'],
+ 'scmName': ''
+ },
+ {},
+ {}
+ ],
+ 'artifacts': [],
+ 'building': False,
+ 'builtOn': '',
+ 'changeSet': {'items': [], 'kind': 'git'},
+ 'culprits': [],
+ 'description': None,
+ 'duration': 1051,
+ 'estimatedDuration': 2260,
+ 'executor': None,
+ 'fullDisplayName': 'git_yssrtigfds #3',
+ 'id': '2013-06-30_01-54-35',
+ 'keepLog': False,
+ 'number': 3,
+ 'result': 'SUCCESS',
+ 'timestamp': 1372553675652,
+ 'url': 'http://localhost:8080/job/git_yssrtigfds/3/'
+ }
@mock.patch.object(Build, '_poll')
def setUp(self, _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'},
- ]}
+ _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.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'])
+ 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'},
- ]}
+ _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'])
+ 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'},
- ]}
+ _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'])
+ 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'},
- ]}
+ _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'])
+ 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'},
- ]}
+ _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/',
@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'},
- ]}
+ _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/',
@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'},
- ]}
+ _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/',
# Define what we will return
create_job_returns = [
- # This will be returned when job is not yet created
- {'jobs': [
- {'name': 'job_one',
- 'url': 'http://localhost:8080/job_one'},
- {'name': 'job_one',
- 'url': 'http://localhost:8080/job_one'},
- ]},
- # This to simulate that the job has been created
- {'jobs': [
- {'name': 'job_one',
- 'url': 'http://localhost:8080/job_one'},
- {'name': 'job_two',
- 'url': 'http://localhost:8080/job_two'},
- {'name': 'job_new',
- 'url': 'http://localhost:8080/job_new'},
- ]}
- ]
+ # This will be returned when job is not yet created
+ {
+ 'jobs': [
+ {'name': 'job_one', 'url': 'http://localhost:8081/job_one'},
+ {'name': 'job_one', 'url': 'http://localhost:8080/job_one'},
+ ]
+ },
+ # This to simulate that the job has been created
+ {
+ 'jobs': [
+ {'name': 'job_one', 'url': 'http://localhost:8080/job_one'},
+ {'name': 'job_two', 'url': 'http://localhost:8080/job_two'},
+ {'name': 'job_new', 'url': 'http://localhost:8080/job_new'},
+ ]
+ }
+ ]
# Mock function
def second_call_poll():
_job_poll.return_value = {}
mock_requester = Requester(username='foouser', password='foopassword')
- mock_requester.post_xml_and_confirm_status = mock.MagicMock(
- return_value='')
+ mock_requester.post_xml_and_confirm_status = mock.MagicMock(return_value='')
J = Jenkins('http://localhost:8080/',
username='foouser', password='foopassword',
@mock.patch.object(Job, '_poll')
def test_create_new_job_fail(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'},
- ]}
+ _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='')
+ mock_requester.post_xml_and_confirm_status = mock.MagicMock(return_value='')
J = Jenkins('http://localhost:8080/',
username='foouser', password='foopassword',
@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'},
- ]}
+ _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='')
+ mock_requester.post_xml_and_confirm_status = mock.MagicMock(return_value='')
J = Jenkins('http://localhost:8080/',
username='foouser', password='foopassword',
@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'},
- ]}
+ _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='')
+ mock_requester.post_xml_and_confirm_status = mock.MagicMock(return_value='')
J = Jenkins('http://localhost:8080/',
username='foouser', password='foopassword',
_poll.return_value = {}
J = Jenkins('http://localhost:8080',
username='foouser', password='foopassword')
- self.assertEquals(
- J.get_create_url(), 'http://localhost:8080/createItem')
+ self.assertEquals(J.get_create_url(), 'http://localhost:8080/createItem')
@mock.patch.object(Jenkins, '_poll')
def testWithSlash(self, _poll):
_poll.return_value = {}
J = Jenkins('http://localhost:8080/',
username='foouser', password='foopassword')
- self.assertEquals(
- J.get_create_url(), 'http://localhost:8080/createItem')
+ self.assertEquals(J.get_create_url(), 'http://localhost:8080/createItem')
@mock.patch.object(Jenkins, '_poll')
@mock.patch.object(Plugins, '_poll')
def test_has_plugin(self, _p_poll, _poll):
_poll.return_value = {}
- _p_poll.return_value = {'plugins': [
- {'deleted': False, 'hasUpdate': True, 'downgradable': False,
- 'dependencies': [{}, {}, {}, {}],
- 'longName': 'Jenkins Subversion Plug-in', 'active': True,
- 'shortName': 'subversion', 'backupVersion': None,
- 'url': 'http://wiki.jenkins-ci.org/display/JENKINS/Subversion+Plugin',
- 'enabled': True, 'pinned': False, 'version': '1.45',
- 'supportsDynamicLoad': 'MAYBE', 'bundled': True}]}
+ _p_poll.return_value = {
+ 'plugins': [
+ {
+ 'deleted': False, 'hasUpdate': True, 'downgradable': False,
+ 'dependencies': [{}, {}, {}, {}],
+ 'longName': 'Jenkins Subversion Plug-in', 'active': True,
+ 'shortName': 'subversion', 'backupVersion': None,
+ 'url': 'http://wiki.jenkins-ci.org/display/JENKINS/Subversion+Plugin',
+ 'enabled': True, 'pinned': False, 'version': '1.45',
+ 'supportsDynamicLoad': 'MAYBE', 'bundled': True
+ }
+ ]
+ }
J = Jenkins('http://localhost:8080/',
username='foouser', password='foopassword')
class TestJob(unittest.TestCase):
- JOB_DATA = {"actions": [],
- "description": "test job",
- "displayName": "foo",
- "displayNameOrNull": None,
- "name": "foo",
- "url": "http://halob:8080/job/foo/",
- "buildable": True,
- "builds": [{"number": 3, "url": "http://halob:8080/job/foo/3/"},
- {"number": 2, "url": "http://halob:8080/job/foo/2/"},
- {"number": 1, "url": "http://halob:8080/job/foo/1/"}],
- "color": "blue",
- "firstBuild": {"number": 1, "url": "http://halob:8080/job/foo/1/"},
- "healthReport": [{"description": "Build stability: No recent builds failed.",
- "iconUrl": "health-80plus.png", "score": 100}],
- "inQueue": False,
- "keepDependencies": False,
- "lastBuild": {"number": 4, "url": "http://halob:8080/job/foo/4/"}, # build running
- "lastCompletedBuild": {"number": 3, "url": "http://halob:8080/job/foo/3/"},
- "lastFailedBuild": None,
- "lastStableBuild": {"number": 3, "url": "http://halob:8080/job/foo/3/"},
- "lastSuccessfulBuild": {"number": 3, "url": "http://halob:8080/job/foo/3/"},
- "lastUnstableBuild": None,
- "lastUnsuccessfulBuild": None,
- "nextBuildNumber": 4,
- "property": [],
- "queueItem": None,
- "concurrentBuild": False,
- "downstreamProjects": [],
- "scm": {},
- "upstreamProjects": []}
+ JOB_DATA = {
+ "actions": [],
+ "description": "test job",
+ "displayName": "foo",
+ "displayNameOrNull": None,
+ "name": "foo",
+ "url": "http://halob:8080/job/foo/",
+ "buildable": True,
+ "builds": [
+ {"number": 3, "url": "http://halob:8080/job/foo/3/"},
+ {"number": 2, "url": "http://halob:8080/job/foo/2/"},
+ {"number": 1, "url": "http://halob:8080/job/foo/1/"}
+ ],
+ "color": "blue",
+ "firstBuild": {"number": 1, "url": "http://halob:8080/job/foo/1/"},
+ "healthReport": [
+ {"description": "Build stability: No recent builds failed.", "iconUrl": "health-80plus.png", "score": 100}
+ ],
+ "inQueue": False,
+ "keepDependencies": False,
+ "lastBuild": {"number": 4, "url": "http://halob:8080/job/foo/4/"}, # build running
+ "lastCompletedBuild": {"number": 3, "url": "http://halob:8080/job/foo/3/"},
+ "lastFailedBuild": None,
+ "lastStableBuild": {"number": 3, "url": "http://halob:8080/job/foo/3/"},
+ "lastSuccessfulBuild": {"number": 3, "url": "http://halob:8080/job/foo/3/"},
+ "lastUnstableBuild": None,
+ "lastUnsuccessfulBuild": None,
+ "nextBuildNumber": 4,
+ "property": [],
+ "queueItem": None,
+ "concurrentBuild": False,
+ "downstreamProjects": [],
+ "scm": {},
+ "upstreamProjects": []
+ }
URL_DATA = {'http://halob:8080/job/foo/%s' % config.JENKINS_API: JOB_DATA}
from jenkinsapi import config
from jenkinsapi.job import Job
from jenkinsapi.jenkinsbase import JenkinsBase
-from jenkinsapi.custom_exceptions import NoBuildData
class TestJobGetAllBuilds(unittest.TestCase):
# this job has builds
- JOB1_DATA = {"actions": [],
- "description": "test job",
- "displayName": "foo",
- "displayNameOrNull": None,
- "name": "foo",
- "url": "http://halob:8080/job/foo/",
- "buildable": True,
- # do as if build 1 & 2 are not returned by jenkins
- "builds": [{"number": 3, "url": "http://halob:8080/job/foo/3/"}],
- "color": "blue",
- "firstBuild": {"number": 1, "url": "http://halob:8080/job/foo/1/"},
- "healthReport": [{"description": "Build stability: No recent builds failed.",
- "iconUrl": "health-80plus.png", "score": 100}],
- "inQueue": False,
- "keepDependencies": False,
- "lastBuild": {"number": 4, "url": "http://halob:8080/job/foo/4/"}, # build running
- "lastCompletedBuild": {"number": 3, "url": "http://halob:8080/job/foo/3/"},
- "lastFailedBuild": None,
- "lastStableBuild": {"number": 3, "url": "http://halob:8080/job/foo/3/"},
- "lastSuccessfulBuild": {"number": 3, "url": "http://halob:8080/job/foo/3/"},
- "lastUnstableBuild": None,
- "lastUnsuccessfulBuild": None,
- "nextBuildNumber": 4,
- "property": [],
- "queueItem": None,
- "concurrentBuild": False,
- "downstreamProjects": [],
- "scm": {},
- "upstreamProjects": []}
- JOB1_ALL_BUILDS_DATA = {"allBuilds": [
- {"number": 3, "url": "http://halob:8080/job/foo/3/"},
- {"number": 2, "url": "http://halob:8080/job/foo/2/"},
- {"number": 1, "url": "http://halob:8080/job/foo/1/"}],
+ JOB1_DATA = {
+ "actions": [],
+ "description": "test job",
+ "displayName": "foo",
+ "displayNameOrNull": None,
+ "name": "foo",
+ "url": "http://halob:8080/job/foo/",
+ "buildable": True,
+ # do as if build 1 & 2 are not returned by jenkins
+ "builds": [{"number": 3, "url": "http://halob:8080/job/foo/3/"}],
+ "color": "blue",
+ "firstBuild": {"number": 1, "url": "http://halob:8080/job/foo/1/"},
+ "healthReport": [
+ {"description": "Build stability: No recent builds failed.", "iconUrl": "health-80plus.png", "score": 100}
+ ],
+ "inQueue": False,
+ "keepDependencies": False,
+ "lastBuild": {"number": 4, "url": "http://halob:8080/job/foo/4/"}, # build running
+ "lastCompletedBuild": {"number": 3, "url": "http://halob:8080/job/foo/3/"},
+ "lastFailedBuild": None,
+ "lastStableBuild": {"number": 3, "url": "http://halob:8080/job/foo/3/"},
+ "lastSuccessfulBuild": {"number": 3, "url": "http://halob:8080/job/foo/3/"},
+ "lastUnstableBuild": None,
+ "lastUnsuccessfulBuild": None,
+ "nextBuildNumber": 4,
+ "property": [],
+ "queueItem": None,
+ "concurrentBuild": False,
+ "downstreamProjects": [],
+ "scm": {},
+ "upstreamProjects": []
+ }
+ JOB1_ALL_BUILDS_DATA = {
+ "allBuilds": [
+ {"number": 3, "url": "http://halob:8080/job/foo/3/"},
+ {"number": 2, "url": "http://halob:8080/job/foo/2/"},
+ {"number": 1, "url": "http://halob:8080/job/foo/1/"}
+ ],
}
JOB1_API_URL = 'http://halob:8080/job/foo/%s' % config.JENKINS_API
- JOB2_DATA = {'actions': [],
+ JOB2_DATA = {
+ 'actions': [],
'buildable': True,
'builds': [],
'color': 'notbuilt',
'queueItem': None,
'scm': {},
'upstreamProjects': [],
- 'url': 'http://halob:8080/job/look_ma_no_builds/'}
+ 'url': 'http://halob:8080/job/look_ma_no_builds/'
+ }
JOB2_API_URL = 'http://halob:8080/job/look_ma_no_builds/%s' % config.JENKINS_API
# Full list available immediatly
- JOB3_DATA = {"actions": [],
- "description": "test job",
- "displayName": "fullfoo",
- "displayNameOrNull": None,
- "name": "fullfoo",
- "url": "http://halob:8080/job/fullfoo/",
- "buildable": True,
- # all builds have been returned by Jenkins
- "builds": [{"number": 3, "url": "http://halob:8080/job/fullfoo/3/"},
- {"number": 2, "url": "http://halob:8080/job/fullfoo/2/"},
- {"number": 1, "url": "http://halob:8080/job/fullfoo/1/"}],
- "color": "blue",
- "firstBuild": {"number": 1, "url": "http://halob:8080/job/fullfoo/1/"},
- "healthReport": [{"description": "Build stability: No recent builds failed.",
- "iconUrl": "health-80plus.png", "score": 100}],
- "inQueue": False,
- "keepDependencies": False,
- "lastBuild": {"number": 4, "url": "http://halob:8080/job/fullfoo/4/"}, # build running
- "lastCompletedBuild": {"number": 3, "url": "http://halob:8080/job/fullfoo/3/"},
- "lastFailedBuild": None,
- "lastStableBuild": {"number": 3, "url": "http://halob:8080/job/fullfoo/3/"},
- "lastSuccessfulBuild": {"number": 3, "url": "http://halob:8080/job/fullfoo/3/"},
- "lastUnstableBuild": None,
- "lastUnsuccessfulBuild": None,
- "nextBuildNumber": 4,
- "property": [],
- "queueItem": None,
- "concurrentBuild": False,
- "downstreamProjects": [],
- "scm": {},
- "upstreamProjects": []}
+ JOB3_DATA = {
+ "actions": [],
+ "description": "test job",
+ "displayName": "fullfoo",
+ "displayNameOrNull": None,
+ "name": "fullfoo",
+ "url": "http://halob:8080/job/fullfoo/",
+ "buildable": True,
+ # all builds have been returned by Jenkins
+ "builds": [
+ {"number": 3, "url": "http://halob:8080/job/fullfoo/3/"},
+ {"number": 2, "url": "http://halob:8080/job/fullfoo/2/"},
+ {"number": 1, "url": "http://halob:8080/job/fullfoo/1/"}
+ ],
+ "color": "blue",
+ "firstBuild": {"number": 1, "url": "http://halob:8080/job/fullfoo/1/"},
+ "healthReport": [
+ {"description": "Build stability: No recent builds failed.", "iconUrl": "health-80plus.png", "score": 100}
+ ],
+ "inQueue": False,
+ "keepDependencies": False,
+ "lastBuild": {"number": 4, "url": "http://halob:8080/job/fullfoo/4/"}, # build running
+ "lastCompletedBuild": {"number": 3, "url": "http://halob:8080/job/fullfoo/3/"},
+ "lastFailedBuild": None,
+ "lastStableBuild": {"number": 3, "url": "http://halob:8080/job/fullfoo/3/"},
+ "lastSuccessfulBuild": {"number": 3, "url": "http://halob:8080/job/fullfoo/3/"},
+ "lastUnstableBuild": None,
+ "lastUnsuccessfulBuild": None,
+ "nextBuildNumber": 4,
+ "property": [],
+ "queueItem": None,
+ "concurrentBuild": False,
+ "downstreamProjects": [],
+ "scm": {},
+ "upstreamProjects": []
+ }
JOB3_ALL_BUILDS_DATA = {"allBuilds": [
{"number": 3, "url": "http://halob:8080/job/fullfoo/3/"},
{"number": 2, "url": "http://halob:8080/job/fullfoo/2/"},
JOB3_API_URL = 'http://halob:8080/job/fullfoo/%s' % config.JENKINS_API
URL_DATA = {
- JOB1_API_URL: JOB1_DATA,
- (JOB1_API_URL, str({'tree': 'allBuilds[number,url]'})): JOB1_ALL_BUILDS_DATA,
- JOB2_API_URL: JOB2_DATA,
- JOB3_API_URL: JOB3_DATA,
- # this one below should never be used
- (JOB3_API_URL, str({'tree': 'allBuilds[number,url]'})): JOB3_ALL_BUILDS_DATA,
+ JOB1_API_URL: JOB1_DATA,
+ (JOB1_API_URL, str({'tree': 'allBuilds[number,url]'})): JOB1_ALL_BUILDS_DATA,
+ JOB2_API_URL: JOB2_DATA,
+ JOB3_API_URL: JOB3_DATA,
+ # this one below should never be used
+ (JOB3_API_URL, str({'tree': 'allBuilds[number,url]'})): JOB3_ALL_BUILDS_DATA,
}
def fakeGetData(self, url, params=None):
import mock
import unittest
-import datetime
from jenkinsapi.jenkins import Jenkins
from jenkinsapi.nodes import Nodes
class TestNode(unittest.TestCase):
- DATA0 = {'assignedLabels': [{}],
- 'description': None,
- 'jobs': [],
- 'mode': 'NORMAL',
- 'nodeDescription': 'the master Jenkins node',
- 'nodeName': '',
- 'numExecutors': 2,
- 'overallLoad': {},
- 'primaryView': {'name': 'All', 'url': 'http://halob:8080/'},
- 'quietingDown': False,
- 'slaveAgentPort': 0,
- 'unlabeledLoad': {},
- 'useCrumbs': False,
- 'useSecurity': False,
- 'views': [{'name': 'All', 'url': 'http://halob:8080/'},
- {'name': 'FodFanFo', 'url': 'http://halob:8080/view/FodFanFo/'}]}
+ DATA0 = {
+ 'assignedLabels': [{}],
+ 'description': None,
+ 'jobs': [],
+ 'mode': 'NORMAL',
+ 'nodeDescription': 'the master Jenkins node',
+ 'nodeName': '',
+ 'numExecutors': 2,
+ 'overallLoad': {},
+ 'primaryView': {'name': 'All', 'url': 'http://halob:8080/'},
+ 'quietingDown': False,
+ 'slaveAgentPort': 0,
+ 'unlabeledLoad': {},
+ 'useCrumbs': False,
+ 'useSecurity': False,
+ 'views': [
+ {'name': 'All', 'url': 'http://halob:8080/'},
+ {'name': 'FodFanFo', 'url': 'http://halob:8080/view/FodFanFo/'}
+ ]
+ }
- DATA1 = {'busyExecutors': 0,
- 'computer': [{'actions': [],
- 'displayName': 'master',
- 'executors': [{}, {}],
- 'icon': 'computer.png',
- 'idle': True,
- 'jnlpAgent': False,
- 'launchSupported': True,
- 'loadStatistics': {},
- 'manualLaunchAllowed': True,
- 'monitorData': {'hudson.node_monitors.ArchitectureMonitor': 'Linux (amd64)',
- 'hudson.node_monitors.ClockMonitor': {'diff': 0},
- 'hudson.node_monitors.DiskSpaceMonitor': {'path': '/var/lib/jenkins',
- 'size': 671924924416},
- 'hudson.node_monitors.ResponseTimeMonitor': {'average': 0},
- 'hudson.node_monitors.SwapSpaceMonitor': {'availablePhysicalMemory': 3174686720,
- 'availableSwapSpace': 17163087872,
- 'totalPhysicalMemory': 16810180608,
- 'totalSwapSpace': 17163087872},
- 'hudson.node_monitors.TemporarySpaceMonitor': {'path': '/tmp',
- 'size': 671924924416}},
- 'numExecutors': 2,
- 'offline': False,
- 'offlineCause': None,
- 'oneOffExecutors': [],
- 'temporarilyOffline': False},
- {'actions': [],
- 'displayName': 'bobnit',
- 'executors': [{}],
- 'icon': 'computer-x.png',
- 'idle': True,
- 'jnlpAgent': False,
- 'launchSupported': True,
- 'loadStatistics': {},
- 'manualLaunchAllowed': True,
- 'monitorData': {'hudson.node_monitors.ArchitectureMonitor': 'Linux (amd64)',
- 'hudson.node_monitors.ClockMonitor': {'diff': 4261},
- 'hudson.node_monitors.DiskSpaceMonitor': {'path': '/home/sal/jenkins',
- 'size': 169784860672},
- 'hudson.node_monitors.ResponseTimeMonitor': {'average': 29},
- 'hudson.node_monitors.SwapSpaceMonitor': {'availablePhysicalMemory': 4570710016,
- 'availableSwapSpace': 12195983360,
- 'totalPhysicalMemory': 8374497280,
- 'totalSwapSpace': 12195983360},
- 'hudson.node_monitors.TemporarySpaceMonitor': {'path': '/tmp',
- 'size': 249737277440}},
- 'numExecutors': 1,
- 'offline': True,
- 'offlineCause': {},
- 'oneOffExecutors': [],
- 'temporarilyOffline': False},
- {'actions': [],
- 'displayName': 'halob',
- 'executors': [{}],
- 'icon': 'computer-x.png',
- 'idle': True,
- 'jnlpAgent': True,
- 'launchSupported': False,
- 'loadStatistics': {},
- 'manualLaunchAllowed': True,
- 'monitorData': {'hudson.node_monitors.ArchitectureMonitor': None,
- 'hudson.node_monitors.ClockMonitor': None,
- 'hudson.node_monitors.DiskSpaceMonitor': None,
- 'hudson.node_monitors.ResponseTimeMonitor': None,
- 'hudson.node_monitors.SwapSpaceMonitor': None,
- 'hudson.node_monitors.TemporarySpaceMonitor': None},
- 'numExecutors': 1,
- 'offline': True,
- 'offlineCause': None,
- 'oneOffExecutors': [],
- 'temporarilyOffline': False}],
- 'displayName': 'nodes',
- 'totalExecutors': 2}
+ DATA1 = {
+ 'busyExecutors': 0,
+ 'computer': [
+ {
+ 'actions': [],
+ 'displayName': 'master',
+ 'executors': [{}, {}],
+ 'icon': 'computer.png',
+ 'idle': True,
+ 'jnlpAgent': False,
+ 'launchSupported': True,
+ 'loadStatistics': {},
+ 'manualLaunchAllowed': True,
+ 'monitorData': {
+ 'hudson.node_monitors.ArchitectureMonitor': 'Linux (amd64)',
+ 'hudson.node_monitors.ClockMonitor': {'diff': 0},
+ 'hudson.node_monitors.DiskSpaceMonitor': {
+ 'path': '/var/lib/jenkins',
+ 'size': 671924924416
+ },
+ 'hudson.node_monitors.ResponseTimeMonitor': {'average': 0},
+ 'hudson.node_monitors.SwapSpaceMonitor': {
+ 'availablePhysicalMemory': 3174686720,
+ 'availableSwapSpace': 17163087872,
+ 'totalPhysicalMemory': 16810180608,
+ 'totalSwapSpace': 17163087872
+ },
+ 'hudson.node_monitors.TemporarySpaceMonitor': {
+ 'path': '/tmp',
+ 'size': 671924924416
+ }
+ },
+ 'numExecutors': 2,
+ 'offline': False,
+ 'offlineCause': None,
+ 'oneOffExecutors': [],
+ 'temporarilyOffline': False
+ },
+ {
+ 'actions': [],
+ 'displayName': 'bobnit',
+ 'executors': [{}],
+ 'icon': 'computer-x.png',
+ 'idle': True,
+ 'jnlpAgent': False,
+ 'launchSupported': True,
+ 'loadStatistics': {},
+ 'manualLaunchAllowed': True,
+ 'monitorData': {
+ 'hudson.node_monitors.ArchitectureMonitor': 'Linux (amd64)',
+ 'hudson.node_monitors.ClockMonitor': {'diff': 4261},
+ 'hudson.node_monitors.DiskSpaceMonitor': {
+ 'path': '/home/sal/jenkins',
+ 'size': 169784860672
+ },
+ 'hudson.node_monitors.ResponseTimeMonitor': {'average': 29},
+ 'hudson.node_monitors.SwapSpaceMonitor': {
+ 'availablePhysicalMemory': 4570710016,
+ 'availableSwapSpace': 12195983360,
+ 'totalPhysicalMemory': 8374497280,
+ 'totalSwapSpace': 12195983360
+ },
+ 'hudson.node_monitors.TemporarySpaceMonitor': {
+ 'path': '/tmp',
+ 'size': 249737277440
+ }
+ },
+ 'numExecutors': 1,
+ 'offline': True,
+ 'offlineCause': {},
+ 'oneOffExecutors': [],
+ 'temporarilyOffline': False
+ },
+ {
+ 'actions': [],
+ 'displayName': 'halob',
+ 'executors': [{}],
+ 'icon': 'computer-x.png',
+ 'idle': True,
+ 'jnlpAgent': True,
+ 'launchSupported': False,
+ 'loadStatistics': {},
+ 'manualLaunchAllowed': True,
+ 'monitorData': {
+ 'hudson.node_monitors.ArchitectureMonitor': None,
+ 'hudson.node_monitors.ClockMonitor': None,
+ 'hudson.node_monitors.DiskSpaceMonitor': None,
+ 'hudson.node_monitors.ResponseTimeMonitor': None,
+ 'hudson.node_monitors.SwapSpaceMonitor': None,
+ 'hudson.node_monitors.TemporarySpaceMonitor': None
+ },
+ 'numExecutors': 1,
+ 'offline': True,
+ 'offlineCause': None,
+ 'oneOffExecutors': [],
+ 'temporarilyOffline': False
+ }
+ ],
+ 'displayName': 'nodes',
+ 'totalExecutors': 2
+ }
- DATA2 = {'actions': [],
- 'displayName': 'master',
- 'executors': [{}, {}],
- 'icon': 'computer.png',
- 'idle': True,
- 'jnlpAgent': False,
- 'launchSupported': True,
- 'loadStatistics': {},
- 'manualLaunchAllowed': True,
- 'monitorData': {'hudson.node_monitors.ArchitectureMonitor': 'Linux (amd64)',
- 'hudson.node_monitors.ClockMonitor': {'diff': 0},
- 'hudson.node_monitors.DiskSpaceMonitor': {'path': '/var/lib/jenkins',
- 'size': 671942561792},
- 'hudson.node_monitors.ResponseTimeMonitor': {'average': 0},
- 'hudson.node_monitors.SwapSpaceMonitor': {'availablePhysicalMemory': 2989916160,
- 'availableSwapSpace': 17163087872,
- 'totalPhysicalMemory': 16810180608,
- 'totalSwapSpace': 17163087872},
- 'hudson.node_monitors.TemporarySpaceMonitor': {'path': '/tmp',
- 'size': 671942561792}},
- 'numExecutors': 2,
- 'offline': False,
- 'offlineCause': None,
- 'oneOffExecutors': [],
- 'temporarilyOffline': False}
+ DATA2 = {
+ 'actions': [],
+ 'displayName': 'master',
+ 'executors': [{}, {}],
+ 'icon': 'computer.png',
+ 'idle': True,
+ 'jnlpAgent': False,
+ 'launchSupported': True,
+ 'loadStatistics': {},
+ 'manualLaunchAllowed': True,
+ 'monitorData': {
+ 'hudson.node_monitors.ArchitectureMonitor': 'Linux (amd64)',
+ 'hudson.node_monitors.ClockMonitor': {'diff': 0},
+ 'hudson.node_monitors.DiskSpaceMonitor': {
+ 'path': '/var/lib/jenkins',
+ 'size': 671942561792
+ },
+ 'hudson.node_monitors.ResponseTimeMonitor': {'average': 0},
+ 'hudson.node_monitors.SwapSpaceMonitor': {
+ 'availablePhysicalMemory': 2989916160,
+ 'availableSwapSpace': 17163087872,
+ 'totalPhysicalMemory': 16810180608,
+ 'totalSwapSpace': 17163087872
+ },
+ 'hudson.node_monitors.TemporarySpaceMonitor': {
+ 'path': '/tmp',
+ 'size': 671942561792
+ }
+ },
+ 'numExecutors': 2,
+ 'offline': False,
+ 'offlineCause': None,
+ 'oneOffExecutors': [],
+ 'temporarilyOffline': False
+ }
- DATA3 = {'actions': [],
- 'displayName': 'halob',
- 'executors': [{}],
- 'icon': 'computer-x.png',
- 'idle': True,
- 'jnlpAgent': True,
- 'launchSupported': False,
- 'loadStatistics': {},
- 'manualLaunchAllowed': True,
- 'monitorData': {'hudson.node_monitors.ArchitectureMonitor': None,
- 'hudson.node_monitors.ClockMonitor': None,
- 'hudson.node_monitors.DiskSpaceMonitor': None,
- 'hudson.node_monitors.ResponseTimeMonitor': None,
- 'hudson.node_monitors.SwapSpaceMonitor': None,
- 'hudson.node_monitors.TemporarySpaceMonitor': None},
- 'numExecutors': 1,
- 'offline': True,
- 'offlineCause': None,
- 'oneOffExecutors': [],
- 'temporarilyOffline': False}
+ DATA3 = {
+ 'actions': [],
+ 'displayName': 'halob',
+ 'executors': [{}],
+ 'icon': 'computer-x.png',
+ 'idle': True,
+ 'jnlpAgent': True,
+ 'launchSupported': False,
+ 'loadStatistics': {},
+ 'manualLaunchAllowed': True,
+ 'monitorData': {
+ 'hudson.node_monitors.ArchitectureMonitor': None,
+ 'hudson.node_monitors.ClockMonitor': None,
+ 'hudson.node_monitors.DiskSpaceMonitor': None,
+ 'hudson.node_monitors.ResponseTimeMonitor': None,
+ 'hudson.node_monitors.SwapSpaceMonitor': None,
+ 'hudson.node_monitors.TemporarySpaceMonitor': None},
+ 'numExecutors': 1,
+ 'offline': True,
+ 'offlineCause': None,
+ 'oneOffExecutors': [],
+ 'temporarilyOffline': False
+ }
@mock.patch.object(Jenkins, '_poll')
@mock.patch.object(Nodes, '_poll')
class TestPlugins(unittest.TestCase):
- DATA = {'plugins': [
- {'deleted': False, 'hasUpdate': True, 'downgradable': False,
- 'dependencies': [{}, {}, {}, {}],
- 'longName': 'Jenkins Subversion Plug-in', 'active': True,
- 'shortName': 'subversion', 'backupVersion': None,
- 'url': 'http://wiki.jenkins-ci.org/display/JENKINS/Subversion+Plugin',
- 'enabled': True, 'pinned': False, 'version': '1.45',
- 'supportsDynamicLoad': 'MAYBE', 'bundled': True},
- {'deleted': False, 'hasUpdate': True, 'downgradable': False,
- 'dependencies': [{}, {}], 'longName': 'Maven Integration plugin',
- 'active': True, 'shortName': 'maven-plugin', 'backupVersion': None,
- 'url': 'http://wiki.jenkins-ci.org/display/JENKINS/Maven+Project+Plugin',
- 'enabled': True, 'pinned': False, 'version': '1.521',
- 'supportsDynamicLoad': 'MAYBE', 'bundled': True}
- ]}
+ DATA = {
+ 'plugins': [
+ {
+ 'deleted': False,
+ 'hasUpdate': True,
+ 'downgradable': False,
+ 'dependencies': [{}, {}, {}, {}],
+ 'longName': 'Jenkins Subversion Plug-in',
+ 'active': True,
+ 'shortName': 'subversion',
+ 'backupVersion': None,
+ 'url': 'http://wiki.jenkins-ci.org/display/JENKINS/Subversion+Plugin',
+ 'enabled': True,
+ 'pinned': False,
+ 'version': '1.45',
+ 'supportsDynamicLoad': 'MAYBE',
+ 'bundled': True
+ },
+ {
+ 'deleted': False,
+ 'hasUpdate': True,
+ 'downgradable': False,
+ 'dependencies': [{}, {}],
+ 'longName': 'Maven Integration plugin',
+ 'active': True,
+ 'shortName': 'maven-plugin',
+ 'backupVersion': None,
+ 'url': 'http://wiki.jenkins-ci.org/display/JENKINS/Maven+Project+Plugin',
+ 'enabled': True,
+ 'pinned': False,
+ 'version': '1.521',
+ 'supportsDynamicLoad': 'MAYBE',
+ 'bundled': True
+ }
+ ]
+ }
@mock.patch.object(Jenkins, '_poll')
def setUp(self, _poll_jenkins):
def test_plugins_values(self, _poll_plugins):
_poll_plugins.return_value = self.DATA
- p = Plugin({'deleted': False, 'hasUpdate': True, 'downgradable': False,
- 'dependencies': [{}, {}, {}, {}],
- 'longName': 'Jenkins Subversion Plug-in', 'active': True,
- 'shortName': 'subversion', 'backupVersion': None,
- 'url': 'http://wiki.jenkins-ci.org/display/JENKINS/Subversion+Plugin',
- 'enabled': True, 'pinned': False, 'version': '1.45',
- 'supportsDynamicLoad': 'MAYBE', 'bundled': True})
+ p = Plugin(
+ {
+ 'deleted': False,
+ 'hasUpdate': True,
+ 'downgradable': False,
+ 'dependencies': [{}, {}, {}, {}],
+ 'longName': 'Jenkins Subversion Plug-in',
+ 'active': True,
+ 'shortName': 'subversion',
+ 'backupVersion': None,
+ 'url': 'http://wiki.jenkins-ci.org/display/JENKINS/Subversion+Plugin',
+ 'enabled': True,
+ 'pinned': False,
+ 'version': '1.45',
+ 'supportsDynamicLoad': 'MAYBE',
+ 'bundled': True
+ }
+ )
plugins = self.J.get_plugins().values()
self.assertIn(p, plugins)
def test_plugin_get_by_name(self, _poll_plugins):
_poll_plugins.return_value = self.DATA
- p = Plugin({'deleted': False, 'hasUpdate': True, 'downgradable': False,
- 'dependencies': [{}, {}, {}, {}],
- 'longName': 'Jenkins Subversion Plug-in', 'active': True,
- 'shortName': 'subversion', 'backupVersion': None,
- 'url': 'http://wiki.jenkins-ci.org/display/JENKINS/Subversion+Plugin',
- 'enabled': True, 'pinned': False, 'version': '1.45',
- 'supportsDynamicLoad': 'MAYBE', 'bundled': True})
+ p = Plugin(
+ {
+ 'deleted': False,
+ 'hasUpdate': True,
+ 'downgradable': False,
+ 'dependencies': [{}, {}, {}, {}],
+ 'longName': 'Jenkins Subversion Plug-in',
+ 'active': True,
+ 'shortName': 'subversion',
+ 'backupVersion': None,
+ 'url': 'http://wiki.jenkins-ci.org/display/JENKINS/Subversion+Plugin',
+ 'enabled': True,
+ 'pinned': False,
+ 'version': '1.45',
+ 'supportsDynamicLoad': 'MAYBE',
+ 'bundled': True
+ }
+ )
plugin = self.J.get_plugins()['subversion']
self.assertEquals(p, plugin)
import mock
import unittest
-from collections import defaultdict
from jenkinsapi import config
from jenkinsapi.jenkins import Jenkins
from jenkinsapi.queue import Queue, QueueItem
URL_DATA = {}
- URL_DATA['http://localhost:8080/%s' % config.JENKINS_API] = \
- {'jobs': [
- {'name': 'utmebvpxrw',
- 'url': 'http://localhost/job/utmebvpxrw'}
- ]
- }
-
- URL_DATA['http://localhost/job/utmebvpxrw/%s' % config.JENKINS_API] = \
- {}
-
- URL_DATA['http://localhost:8080/queue/%s' % config.JENKINS_API] = \
- {'items': [{'actions': [{'causes': [{'shortDescription': 'Started by user anonymous',
- 'userId': None,
- 'userName': 'anonymous'}]}],
- 'blocked': False,
- 'buildable': True,
- 'buildableStartMilliseconds': 1371419916747,
- 'id': 42,
- 'inQueueSince': 1371419909428,
- 'params': '',
- 'stuck': False,
- 'task': {'color': 'grey',
- 'name': 'klscuimkqo',
- 'url': 'http://localhost:8080/job/klscuimkqo/'},
- 'why': 'Waiting for next available executor'},
- {'actions': [{'causes': [{'shortDescription': 'Started by user anonymous',
- 'userId': None,
- 'userName': 'anonymous'}]}],
- 'blocked': False,
- 'buildable': True,
- 'buildableStartMilliseconds': 1371419911747,
- 'id': 41,
- 'inQueueSince': 1371419906327,
- 'params': '',
- 'stuck': False,
- 'task': {'color': 'grey',
- 'name': 'vluyhzzepl',
- 'url': 'http://localhost:8080/job/vluyhzzepl/'},
- 'why': 'Waiting for next available executor'},
- {'actions': [{'causes': [{'shortDescription': 'Started by user anonymous',
- 'userId': None,
- 'userName': 'anonymous'}]}],
- 'blocked': False,
- 'buildable': True,
- 'buildableStartMilliseconds': 1371419911747,
- 'id': 40,
- 'inQueueSince': 1371419903212,
- 'params': '',
- 'stuck': False,
- 'task': {'color': 'grey',
- 'name': 'utmebvpxrw',
- 'url': 'http://localhost:8080/job/utmebvpxrw/'},
- 'why': 'Waiting for next available executor'}]}
+ URL_DATA['http://localhost:8080/%s' % config.JENKINS_API] = {
+ 'jobs': [
+ {
+ 'name': 'utmebvpxrw',
+ 'url': 'http://localhost/job/utmebvpxrw'
+ }
+ ]
+ }
+
+ URL_DATA['http://localhost/job/utmebvpxrw/%s' % config.JENKINS_API] = {}
+
+ URL_DATA['http://localhost:8080/queue/%s' % config.JENKINS_API] = {
+ 'items': [
+ {
+ 'actions': [
+ {
+ 'causes': [
+ {
+ 'shortDescription': 'Started by user anonymous',
+ 'userId': None,
+ 'userName': 'anonymous'
+ }
+ ]
+ }
+ ],
+ 'blocked': False,
+ 'buildable': True,
+ 'buildableStartMilliseconds': 1371419916747,
+ 'id': 42,
+ 'inQueueSince': 1371419909428,
+ 'params': '',
+ 'stuck': False,
+ 'task': {
+ 'color': 'grey',
+ 'name': 'klscuimkqo',
+ 'url': 'http://localhost:8080/job/klscuimkqo/'
+ },
+ 'why': 'Waiting for next available executor'
+ },
+ {
+ 'actions': [
+ {
+ 'causes': [
+ {
+ 'shortDescription': 'Started by user anonymous',
+ 'userId': None,
+ 'userName': 'anonymous'
+ }
+ ]
+ }
+ ],
+ 'blocked': False,
+ 'buildable': True,
+ 'buildableStartMilliseconds': 1371419911747,
+ 'id': 41,
+ 'inQueueSince': 1371419906327,
+ 'params': '',
+ 'stuck': False,
+ 'task': {
+ 'color': 'grey',
+ 'name': 'vluyhzzepl',
+ 'url': 'http://localhost:8080/job/vluyhzzepl/'
+ },
+ 'why': 'Waiting for next available executor'
+ },
+ {
+ 'actions': [
+ {
+ 'causes': [
+ {
+ 'shortDescription': 'Started by user anonymous',
+ 'userId': None,
+ 'userName': 'anonymous'
+ }
+ ]
+ }
+ ],
+ 'blocked': False,
+ 'buildable': True,
+ 'buildableStartMilliseconds': 1371419911747,
+ 'id': 40,
+ 'inQueueSince': 1371419903212,
+ 'params': '',
+ 'stuck': False,
+ 'task': {
+ 'color': 'grey',
+ 'name': 'utmebvpxrw',
+ 'url': 'http://localhost:8080/job/utmebvpxrw/'
+ },
+ 'why': 'Waiting for next available executor'
+ }
+ ]
+ }
@mock.patch.object(JenkinsBase, 'get_data', mockGetData)
def setUp(self):
import unittest
import requests
-from collections import defaultdict
from jenkinsapi.jenkins import Requester
from jenkinsapi.custom_exceptions import JenkinsAPIException
def test_get_request_dict_auth(self):
req = Requester('foo', 'bar')
- req_return = req.get_request_dict(url='http://', params={}, data=None,
- headers=None)
+ req_return = req.get_request_dict(
+ url='http://',
+ params={},
+ data=None,
+ headers=None
+ )
self.assertTrue(isinstance(req_return, dict))
self.assertTrue(req_return.get('auth'))
self.assertTrue(req_return['auth'] == ('foo', 'bar'))
req = Requester('foo', 'bar')
with self.assertRaises(AssertionError) as na:
- req_return = req.get_request_dict(url='http://', params='wrong',
- data=None, headers=None)
- self.assertTrue(
- na.exception.message == "Params must be a dict, got 'wrong'")
+ req.get_request_dict(
+ url='http://',
+ params='wrong',
+ data=None,
+ headers=None
+ )
+ self.assertTrue(na.exception.message == "Params must be a dict, got 'wrong'")
def test_get_request_dict_correct_params(self):
req = Requester('foo', 'bar')
- req_return = req.get_request_dict(url='http://',
+ req_return = req.get_request_dict(
+ url='http://',
params={'param': 'value'},
- data=None, headers=None)
+ data=None,
+ headers=None
+ )
self.assertTrue(isinstance(req_return, dict))
self.assertTrue(req_return.get('params'))
req = Requester('foo', 'bar')
with self.assertRaises(AssertionError) as na:
- req_return = req.get_request_dict(url='http://', params={},
- data=None, headers='wrong')
- self.assertTrue(
- na.exception.message == "headers must be a dict, got 'wrong'")
+ req.get_request_dict(
+ url='http://',
+ params={},
+ data=None,
+ headers='wrong'
+ )
+ self.assertTrue(na.exception.message == "headers must be a dict, got 'wrong'")
def test_get_request_dict_correct_headers(self):
req = Requester('foo', 'bar')
- req_return = req.get_request_dict(url='http://',
+ req_return = req.get_request_dict(
+ url='http://',
params={'param': 'value'},
- data=None, headers={'header': 'value'})
+ data=None,
+ headers={'header': 'value'}
+ )
self.assertTrue(isinstance(req_return, dict))
self.assertTrue(req_return.get('headers'))
def test_get_request_dict_data_passed(self):
req = Requester('foo', 'bar')
- req_return = req.get_request_dict(url='http://',
+ req_return = req.get_request_dict(
+ url='http://',
params={'param': 'value'},
- data='some data', headers={'header': 'value'})
+ data='some data',
+ headers={'header': 'value'}
+ )
self.assertTrue(isinstance(req_return, dict))
print req_return.get('data')
def test_get_request_dict_data_not_passed(self):
req = Requester('foo', 'bar')
- req_return = req.get_request_dict(url='http://',
+ req_return = req.get_request_dict(
+ url='http://',
params={'param': 'value'},
- data=None, headers={'header': 'value'})
+ data=None,
+ headers={'header': 'value'}
+ )
self.assertTrue(isinstance(req_return, dict))
self.assertFalse(req_return.get('data'))
@mock.patch.object(requests, 'get')
- def test_get_url(self, _get):
+ def test_get_url_get(self, _get):
_get.return_value = 'SUCCESS'
req = Requester('foo', 'bar')
- self.assertTrue(req.get_url('http://dummy',
- params={'param': 'value'},
- headers=None) == 'SUCCESS')
+ response = req.get_url(
+ 'http://dummy',
+ params={'param': 'value'},
+ headers=None)
+ self.assertTrue(response == 'SUCCESS')
@mock.patch.object(requests, 'post')
- def test_get_url(self, _post):
+ def test_get_url_post(self, _post):
_post.return_value = 'SUCCESS'
req = Requester('foo', 'bar')
- self.assertTrue(req.post_url('http://dummy',
- params={'param': 'value'},
- headers=None) == 'SUCCESS')
+ response = req.post_url(
+ 'http://dummy',
+ params={'param': 'value'},
+ headers=None)
+ self.assertTrue(response == 'SUCCESS')
@mock.patch.object(requests, 'post')
def test_post_xml_and_confirm_status_empty_xml(self, _post):
req = Requester('foo', 'bar')
with self.assertRaises(AssertionError) as ae:
req.post_xml_and_confirm_status(
- url='http://dummy',
- params={'param': 'value'},
- data=None)
+ url='http://dummy',
+ params={'param': 'value'},
+ data=None
+ )
self.assertTrue(ae.exception.message == "Unexpected type of parameter 'data': <type 'NoneType'>. Expected (str, dict)")
_post.return_value = response
req = Requester('foo', 'bar')
ret = req.post_xml_and_confirm_status(
- url='http://dummy',
- params={'param': 'value'},
- data='<xml/>')
+ url='http://dummy',
+ params={'param': 'value'},
+ data='<xml/>'
+ )
self.assertTrue(isinstance(ret, requests.Response))
@mock.patch.object(requests, 'post')
req = Requester('foo', 'bar')
with self.assertRaises(AssertionError) as ae:
req.post_and_confirm_status(
- url='http://dummy',
- params={'param': 'value'},
- data=None)
+ url='http://dummy',
+ params={'param': 'value'},
+ data=None
+ )
self.assertTrue(ae.exception.message == "Unexpected type of parameter 'data': <type 'NoneType'>. Expected (str, dict)")
_post.return_value = response
req = Requester('foo', 'bar')
ret = req.post_and_confirm_status(
- url='http://dummy',
- params={'param': 'value'},
- data='some data')
+ url='http://dummy',
+ params={'param': 'value'},
+ data='some data'
+ )
self.assertTrue(isinstance(ret, requests.Response))
@mock.patch.object(requests, 'post')
req = Requester('foo', 'bar')
with self.assertRaises(JenkinsAPIException) as ae:
req.post_and_confirm_status(
- url='http://dummy',
- params={'param': 'value'},
- data='some data')
+ url='http://dummy',
+ params={'param': 'value'},
+ data='some data'
+ )
print ae.exception.message
self.assertTrue(ae.exception.message == "Operation failed. url=None, data=some data, headers={'Content-Type': 'application/x-www-form-urlencoded'}, status=500, text=")
_get.return_value = response
req = Requester('foo', 'bar')
ret = req.get_and_confirm_status(
- url='http://dummy',
- params={'param': 'value'})
+ url='http://dummy',
+ params={'param': 'value'}
+ )
self.assertTrue(isinstance(ret, requests.Response))
@mock.patch.object(requests, 'get')
req = Requester('foo', 'bar')
with self.assertRaises(JenkinsAPIException) as ae:
req.get_and_confirm_status(
- url='http://dummy',
- params={'param': 'value'})
+ url='http://dummy',
+ params={'param': 'value'}
+ )
print ae.exception.message
self.assertTrue(ae.exception.message == "Operation failed. url=None, headers=None, status=500, text=")
'property': [],
'url': 'http://halob:8080/view/FodFanFo/'}
- JOB_DATA = {"actions": [],
- "description": "test job",
- "displayName": "foo",
- "displayNameOrNull": None,
- "name": "foo",
- "url": "http://halob:8080/job/foo/",
- "buildable": True,
- "builds": [{"number": 3, "url": "http://halob:8080/job/foo/3/"},
- {"number": 2, "url": "http://halob:8080/job/foo/2/"},
- {"number": 1, "url": "http://halob:8080/job/foo/1/"}],
- "color": "blue",
- "firstBuild": {"number": 1, "url": "http://halob:8080/job/foo/1/"},
- "healthReport": [{"description": "Build stability: No recent builds failed.",
- "iconUrl": "health-80plus.png", "score": 100}],
- "inQueue": False,
- "keepDependencies": False,
- "lastBuild": {"number": 3, "url": "http://halob:8080/job/foo/3/"},
- "lastCompletedBuild": {"number": 3, "url": "http://halob:8080/job/foo/3/"},
- "lastFailedBuild": None,
- "lastStableBuild": {"number": 3, "url": "http://halob:8080/job/foo/3/"},
- "lastSuccessfulBuild": {"number": 3, "url": "http://halob:8080/job/foo/3/"},
- "lastUnstableBuild": None,
- "lastUnsuccessfulBuild": None,
- "nextBuildNumber": 4,
- "property": [],
- "queueItem": None,
- "concurrentBuild": False,
- "downstreamProjects": [],
- "scm": {},
- "upstreamProjects": []}
+ JOB_DATA = {
+ "actions": [],
+ "description": "test job",
+ "displayName": "foo",
+ "displayNameOrNull": None,
+ "name": "foo",
+ "url": "http://halob:8080/job/foo/",
+ "buildable": True,
+ "builds": [
+ {"number": 3, "url": "http://halob:8080/job/foo/3/"},
+ {"number": 2, "url": "http://halob:8080/job/foo/2/"},
+ {"number": 1, "url": "http://halob:8080/job/foo/1/"}
+ ],
+ "color": "blue",
+ "firstBuild": {"number": 1, "url": "http://halob:8080/job/foo/1/"},
+ "healthReport": [
+ {"description": "Build stability: No recent builds failed.",
+ "iconUrl": "health-80plus.png", "score": 100}
+ ],
+ "inQueue": False,
+ "keepDependencies": False,
+ "lastBuild": {"number": 3, "url": "http://halob:8080/job/foo/3/"},
+ "lastCompletedBuild": {"number": 3, "url": "http://halob:8080/job/foo/3/"},
+ "lastFailedBuild": None,
+ "lastStableBuild": {"number": 3, "url": "http://halob:8080/job/foo/3/"},
+ "lastSuccessfulBuild": {"number": 3, "url": "http://halob:8080/job/foo/3/"},
+ "lastUnstableBuild": None,
+ "lastUnsuccessfulBuild": None,
+ "nextBuildNumber": 4,
+ "property": [],
+ "queueItem": None,
+ "concurrentBuild": False,
+ "downstreamProjects": [],
+ "scm": {},
+ "upstreamProjects": []
+ }
@mock.patch.object(Job, '_poll')
@mock.patch.object(View, '_poll')
self.assertTrue(self.v.deleted)
def test_get_job_url(self):
- self.assertEquals(
- self.v.get_job_url('foo'), 'http://halob:8080/job/foo/')
+ self.assertEquals(self.v.get_job_url('foo'), 'http://halob:8080/job/foo/')
def test_wrong_get_job_url(self):
with self.assertRaises(KeyError):
mock_requester = Requester(username='foouser', password='foopassword')
mock_requester.get_url = mock.MagicMock(return_value='<div/>')
mock_requester.post_url = mock.MagicMock(return_value='')
- _poll.return_value = {'views': [
- {'name': 'All',
- 'url': 'http://localhost:8080/views/All'},
- {'name': 'NewView',
- 'url': 'http://localhost:8080/views/NewView'},
- ]}
+ _poll.return_value = {
+ 'views': [
+ {'name': 'All', 'url': 'http://localhost:8080/views/All'},
+ {'name': 'NewView', 'url': 'http://localhost:8080/views/NewView'},
+ ]
+ }
_base_poll.return_value = _poll.return_value
J = Jenkins('http://localhost:8080/',
username='foouser', password='foopassword',
new_view = J.views.create('NewView')
self.assertTrue(isinstance(new_view, View))
self.assertEquals(new_view.baseurl,
- 'http://localhost:8080/views/NewView')
+ 'http://localhost:8080/views/NewView')
def test_create_existing_view(self):
"""
with mock.patch.object(JenkinsBase, 'get_data', mockGetData):
- J = Jenkins('http://localhost:8080',
- username='foouser',
- password='foopassword')
+ J = Jenkins('http://localhost:8080', username='foouser', password='foopassword')
new_view = J.views.create('NewView')