def iteritems(self): try: it = self.get_job_dict().iteritems() except AttributeError: # Python3 it = self.get_job_dict().items() for name, url in it: yield name, Job(url, name, self.jenkins_obj)
def job(jenkins, monkeypatch): def fake_get_data(cls, url, tree=None): # pylint: disable=unused-argument return configs.JOB_DATA monkeypatch.setattr(JenkinsBase, 'get_data', fake_get_data) new_job = Job('http://halob:8080/job/foo/', 'foo', jenkins) return new_job
def job_tree_empty(jenkins, monkeypatch): def fake_get_data(cls, url, tree=None): # pylint: disable=unused-argument return {} monkeypatch.setattr(Job, 'get_data', fake_get_data) new_job = Job('http://halob:8080/job/foo/', 'foo', jenkins) return new_job
def __getitem__(self, job_name): for row in self.jenkins._data.get('jobs', []): if row['name'] == job_name: return Job( row['url'], row['name'], self.jenkins) raise UnknownJob(job_name)
def test_empty_field__add_missing_builds(self, get_data): url = 'http://halob:8080/job/foo/%s' % config.JENKINS_API data = TestJob.URL_DATA[url].copy() data.update({'firstBuild': None}) get_data.return_value = data j = Job('http://halob:8080/job/foo/', 'foo', self.J) initial_call_count = get_data.call_count j._add_missing_builds(data) self.assertEquals(get_data.call_count, initial_call_count)
def test_nobuilds_get_last_build(jenkins, monkeypatch): def fake_poll(cls, tree=None): # pylint: disable=unused-argument return {"name": "foo"} monkeypatch.setattr(Job, '_poll', fake_poll) job = Job('http://halob:8080/job/foo/', 'foo', jenkins) with pytest.raises(NoBuildData): job.get_last_build()
def test_lazy_builds_list_will_not_call_jenkins_twice(self): # The job data contains only one build, so we expect that the # remaining jobs will be fetched automatically, and to have two calls # to the Jenkins API TestJobGetAllBuilds.__get_data_call_count = 0 self.J.lazy = True self.j = Job('http://halob:8080/job/foo/', 'foo', self.J) self.assertEqual(TestJobGetAllBuilds.__get_data_call_count, 1) self.J.lazy = False
def iteritems(self): """ Get the names & objects for all jobs """ self.jenkins.poll() for row in self.jenkins._data.get('jobs', []): name = row['name'] url = row['url'] yield name, Job(url, name, self.jenkins)
def test__add_missing_builds_no_builds(self, get_data): url = 'http://halob:8080/job/foo/%s' % config.JENKINS_API data = TestJob.URL_DATA[url].copy() get_data.return_value = data j = Job('http://halob:8080/job/foo/', 'foo', self.J) initial_call_count = get_data.call_count mock_data = TestJob.URL_DATA[url].copy() mock_data['builds'] = None j._add_missing_builds(mock_data) self.assertEquals(initial_call_count, get_data.call_count)
def __getitem__(self, jobname): """ Get a job by name :param jobname: name of job, str :return: Job obj """ for url, name in self.get_jobs_info(): if name == jobname: return Job(url, name, jenkins_obj=self) raise UnknownJob(jobname)
def __getitem__(self, jobname): """ Get a job by name :param jobname: name of job, str :return: Job obj """ for info in self._data["jobs"]: if info["name"] == jobname: return Job(info["url"], info["name"], jenkins_obj=self) raise UnknownJob(jobname)
def __getitem__(self, job_name): if job_name in self: job_data = [job_row for job_row in self._data if job_row['name'] == job_name or Job.get_full_name_from_url_and_baseurl( job_row['url'], self.jenkins.baseurl) == job_name][0] return Job(job_data['url'], job_data['name'], self.jenkins) else: raise UnknownJob(job_name)
def test_get_params_list(self, get_data): url = 'http://halob:8080/job/foo/%s' % config.JENKINS_API get_data.return_value = TestJob.URL_DATA[url].copy() j = Job('http://halob:8080/job/foo/', 'foo', self.J) params = j.get_params_list() self.assertIsInstance(params, list) self.assertEquals(len(params), 2) self.assertEquals(params, ['param1', 'param2'])
def job_tree(jenkins, monkeypatch): def fake_get_data(cls, url, tree=None): # pylint: disable=unused-argument if tree is not None and 'builds' in tree: return {'builds': configs.JOB_DATA['builds']} else: return {'lastBuild': configs.JOB_DATA['lastBuild']} monkeypatch.setattr(Job, 'get_data', fake_get_data) new_job = Job('http://halob:8080/job/foo/', 'foo', jenkins) return new_job
def __getitem__(self, jobname): """ Get a job by name :param jobname: name of job, str :return: Job obj """ # We have to ask for 'color' here because folder resolution # relies on it jobs = self.poll(tree='jobs[name,url,color]')['jobs'] for info in jobs: if info["name"] == jobname: return Job(info["url"], info["name"], jenkins_obj=self) raise UnknownJob(jobname)
def __getitem__(self, jobname): """ Get a job by name :param jobname: name of job, str :return: Job obj """ for url, name in self.get_jobs_info(): if name == jobname: preferred_scheme = urlparse.urlsplit(self.baseurl).scheme url_split = urlparse.urlsplit(url) preferred_url = urlparse.urlunsplit([ preferred_scheme, url_split.netloc, url_split.path, url_split.query, url_split.fragment ]) return Job(preferred_url, name, jenkins_obj=self) raise UnknownJob(jobname)
def test__add_missing_builds_not_all_loaded(self, get_data): url = 'http://halob:8080/job/foo/%s' % config.JENKINS_API data = TestJob.URL_DATA[url].copy() get_data.return_value = data j = Job('http://halob:8080/job/foo/', 'foo', self.J) # to test this function we change data to not have one build # and set it to mark that firstBuild was not loaded # in that condition function will call j.get_data # and will use syntetic field 'allBuilds' to # repopulate 'builds' field with all builds mock_data = TestJob.URL_DATA[url].copy() mock_data['firstBuild'] = {'number': 1} del mock_data['builds'][-1] self.assertEquals(len(mock_data['builds']), 2) new_data = j._add_missing_builds(mock_data) self.assertEquals(len(new_data['builds']), 3)
def test__add_missing_builds_not_all_loaded(jenkins, monkeypatch): def fake_get_data(cls, url, tree): # pylint: disable=unused-argument return configs.JOB_DATA.copy() monkeypatch.setattr(JenkinsBase, 'get_data', fake_get_data) job = Job('http://halob:8080/job/foo/', 'foo', jenkins) # to test this function we change data to not have one build # and set it to mark that firstBuild was not loaded # in that condition function will call j.get_data # and will use syntetic field 'allBuilds' to # repopulate 'builds' field with all builds mock_data = configs.JOB_DATA.copy() mock_data['firstBuild'] = {'number': 1} del mock_data['builds'][-1] job._data = mock_data assert len(mock_data['builds']) == 2 new_data = job._add_missing_builds(mock_data) assert len(new_data['builds']) == 3
def test_get_build_by_params_not_found(jenkins, monkeypatch, mocker): build_params = {'param1': 'value1'} fake_builds = (mocker.Mock(get_params=lambda: {}), mocker.Mock(get_params=lambda: {}), mocker.Mock(get_params=lambda: {})) build_call_count = [0] def fake_get_build(cls, number): # pylint: disable=unused-argument build_call_count[0] += 1 return fake_builds[number - 1] monkeypatch.setattr(Job, 'get_first_buildnumber', lambda x: 1) monkeypatch.setattr(Job, 'get_last_buildnumber', lambda x: 3) monkeypatch.setattr(Job, 'get_build', fake_get_build) mocker.spy(Build, 'get_params') mocker.spy(Job, 'get_build') job = Job('http://localhost/jobs/foo', 'foo', jenkins) with pytest.raises(NoBuildData): job.get_build_by_params(build_params) assert job.get_build.call_count == 3 assert build_call_count[0] == 3
def test_nobuilds_get_build_dict(self): j = Job('http://halob:8080/job/foo/', 'foo', self.J) with self.assertRaises(NoBuildData): j.get_build_dict()
def iteritems(self): it = six.iteritems(self.get_job_dict()) for name, url in it: yield name, Job(url, name, self.jenkins_obj)
def setUp(self): self.J = mock.MagicMock() # Jenkins object self.j = Job('http://halob:8080/job/foo/', 'foo', self.J)
def __getitem__(self, job_name): if job_name in self: return Job(None, job_name, self.jenkins) else: raise UnknownJob(job_name)
def test_complete_builds_list_will_call_jenkins_once(self): # The job data contains all builds, so we will not gather remaining # builds TestJobGetAllBuilds.__get_data_call_count = 0 self.j = Job('http://halob:8080/job/fullfoo/', 'fullfoo', self.J) self.assertEquals(TestJobGetAllBuilds.__get_data_call_count, 1)
def setUp(self): TestJobGetAllBuilds.__get_data_call_count = 0 self.J = mock.MagicMock() # Jenkins object self.j = Job('http://halob:8080/job/foo/', 'foo', self.J)
def test_get_params(self, get_data): url = 'http://halob:8080/job/foo/%s' % config.JENKINS_API get_data.return_value = TestJob.URL_DATA[url].copy() j = Job('http://halob:8080/job/foo/', 'foo', self.J) params = list(j.get_params()) self.assertEquals(len(params), 2)
def iteritems(self): """ Iterate over the names & objects for all jobs """ for job_url, job_name in self.iter_urls_names(): yield job_name, Job(job_url, job_name, self.jenkins)
def __getitem__(self, job_name): assert isinstance(job_name, str) api_url = self.python_api_url(self.get_job_url(job_name)) return Job(api_url, job_name, self.jenkins_obj)
def iteritems(self): for name, url in self.get_job_dict().iteritems(): api_url = self.python_api_url(url) yield name, Job(api_url, name, self.jenkins_obj)
def __getitem__(self, str_job_id): assert isinstance(str_job_id, str) api_url = self.python_api_url(self.get_job_url(str_job_id)) return Job(api_url, str_job_id, self.jenkins_obj)