HG_URL = './scm/source'
GIT_BRANCH = './scm/branches/hudson.plugins.git.BranchSpec/name'
HG_BRANCH = './scm/branch'
+DEFAULT_HG_BRANCH_NAME = 'default'
log = logging.getLogger(__name__)
self._scmurlmap = {
'svn': lambda element_tree: list(element_tree.findall(SVN_URL)),
'git': lambda element_tree: list(element_tree.findall(GIT_URL)),
- 'hg': lambda element_tree: list(element_tree.find(HG_URL)),
+ 'hg': lambda element_tree: list(element_tree.findall(HG_URL)),
None: lambda element_tree: []
}
self._scmbranchmap = {
'svn': lambda element_tree: [],
'git': lambda element_tree: list(element_tree.findall(GIT_BRANCH)),
- 'hg': lambda element_tree: list(element_tree.find(HG_BRANCH)),
+ 'hg': self._get_hg_branch,
None: lambda element_tree: []
}
JenkinsBase.__init__(self, url)
def get_jenkins_obj(self):
return self.jenkins
+ # When the name of the hg branch used in the job is default hg branch (i.e.
+ # default), Mercurial plugin doesn't store default branch name in config XML
+ # file of the job. Create XML node corresponding to default branch
+ def _get_hg_branch(self, element_tree):
+ branches = element_tree.findall(HG_BRANCH)
+ if not branches:
+ hg_default_branch = ET.Element('branch')
+ hg_default_branch.text = DEFAULT_HG_BRANCH_NAME
+ branches.append(hg_default_branch)
+ return branches
+
def _poll(self):
data = JenkinsBase._poll(self)
# jenkins loads only the first 100 builds, load more if needed
--- /dev/null
+import sys
+sys.path.append('C:\opensource\jenkinsapi')
+import mock
+import unittest
+
+from jenkinsapi import config
+from jenkinsapi.job import Job
+from jenkinsapi.jenkinsbase import JenkinsBase
+
+
+#TODO: Make JOB_DATA to be one coming from Hg job
+class TestHgJob(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": []
+ }
+
+ URL_DATA = {'http://halob:8080/job/foo/%s' % config.JENKINS_API: JOB_DATA}
+
+ def fakeGetData(self, url, *args):
+ try:
+ return TestHgJob.URL_DATA[url]
+ except KeyError:
+ raise Exception("Missing data for %s" % url)
+
+ @mock.patch.object(JenkinsBase, 'get_data', fakeGetData)
+ def setUp(self):
+ self.J = mock.MagicMock() # Jenkins object
+ self.j = Job('http://halob:8080/job/foo/', 'foo', self.J)
+
+ def configtree_with_branch(self):
+ config_node = '''
+ <project>
+ <scm class="hudson.plugins.mercurial.MercurialSCM" plugin="mercurial@1.42">
+ <source>http://cm5/hg/sandbox/v01.0/int</source>
+ <modules/>
+ <branch>testme</branch>
+ <clean>false</clean>
+ <browser class="hudson.plugins.mercurial.browser.HgWeb">
+ <url>http://cm5/hg/sandbox/v01.0/int/</url>
+ </browser>
+ </scm>
+ </project>
+ '''
+ return config_node
+
+ def configtree_with_default_branch(self):
+ config_node = '''
+ <project>
+ <scm class="hudson.plugins.mercurial.MercurialSCM" plugin="mercurial@1.42">
+ <source>http://cm5/hg/sandbox/v01.0/int</source>
+ <modules/>
+ <clean>false</clean>
+ <browser class="hudson.plugins.mercurial.browser.HgWeb">
+ <url>http://cm5/hg/sandbox/v01.0/int/</url>
+ </browser>
+ </scm>
+ </project>
+ '''
+ return config_node
+
+ @mock.patch.object(Job,'get_config',configtree_with_branch)
+ def test_hg_attributes(self):
+ expected_url = ['http://cm5/hg/sandbox/v01.0/int']
+ self.assertEquals(self.j.get_scm_type(),'hg')
+ self.assertEquals(self.j.get_scm_url(),expected_url)
+ self.assertEquals(self.j.get_scm_branch(),['testme'])
+
+ @mock.patch.object(Job,'get_config',configtree_with_default_branch)
+ def test_hg_attributes(self):
+ self.assertEquals(self.j.get_scm_branch(),['default'])
+
+if __name__ == '__main__':
+ unittest.main()