def test_get_jobs(self): job1_url = 'http://localhost:8080/job/j1' job1_name = 'j1' job2_url = 'http://localhost:8080/job/j2' job2_name = 'j2' mock_job1_dataio = MagicMock() mock_job1_dataio.get_api_data.return_value = {"name":job1_name} mock_job1_dataio.config_xml = "<project></project>" mock_job2_dataio = MagicMock() mock_job2_dataio.get_api_data.return_value = {"name":job2_name} mock_job2_dataio.config_xml = "<project></project>" mock_data_io = MagicMock() mock_data_io.get_api_data.return_value = {'name':"MyView1", 'jobs':[{'url':job1_url},{'url':job2_url}]} def mock_clone(new_url): if new_url == job1_url: return mock_job1_dataio if new_url == job2_url: return mock_job2_dataio self.fail("Unknown source URL provided to clone method: " + new_url) mock_data_io.clone.side_effect = mock_clone v = vView(mock_data_io, None) jobs = v.jobs self.assertEqual(len(jobs), 2, "view should have 2 jobs contained within it") self.assertEqual(jobs[0].name, job1_name) self.assertEqual(jobs[1].name, job2_name)
def test_multiple_upstream_jobs_recursive(self): # job j1 has no upstream dependencies upstream_job_name1 = "j1" upstream_job_url1 = "http://localhost:8080/job/" + upstream_job_name1 mock_job1_data_io = MagicMock() mock_job1_data_io.get_api_data.return_value = {"name": upstream_job_name1, "upstreamProjects": []} mock_job1_data_io.config_xml = "<project></project>" # job j1 triggers job j2 upstream_job_name2 = "j2" upstream_job_url2 = "http://localhost:8080/job/" + upstream_job_name2 mock_job2_data_io = MagicMock() mock_job2_data_io.get_api_data.return_value = {"name": upstream_job_name2, "upstreamProjects": [{"url": upstream_job_url1}]} mock_job2_data_io.clone.return_value = mock_job1_data_io mock_job2_data_io.config_xml = "<project></project>" # job j3 triggers job j2 upstream_job_name3 = "j3" upstream_job_url3 = "http://localhost:8080/job/" + upstream_job_name3 mock_job3_data_io = MagicMock() mock_job3_data_io.get_api_data.return_value = {"name": upstream_job_name3, "upstreamProjects": [{"url": upstream_job_url2}]} mock_job3_data_io.clone.return_value = mock_job2_data_io mock_job3_data_io.config_xml = "<project></project>" # job j2 triggers our main job mock_data_io = MagicMock() mock_data_io.get_api_data.return_value = {"upstreamProjects": [{"url": upstream_job_url3}]} mock_data_io.clone.return_value = mock_job3_data_io mock_data_io.config_xml = "<project></project>" # code under test j = vJob(mock_data_io, None) dependencies = j.all_upstream_jobs # validation self.assertEqual(len(dependencies), 3, "Test job should have three upstream dependencies") names = [] names.append(dependencies[0].name) names.append(dependencies[1].name) names.append(dependencies[2].name) self.assertTrue(upstream_job_name1 in names, "Mock job #1 should be returned as a transient dependency") self.assertTrue(upstream_job_name2 in names, "Mock job #2 should be returned as a transient dependency") self.assertTrue(upstream_job_name3 in names, "Mock job #3 should be returned as a direct dependency")
def mock_clone(url): mock_dependent_job_data_io = MagicMock() if url == upstream_job_url1: mock_dependent_job_data_io.get_api_data.return_value = {"name":upstream_job_name1} elif url == upstream_job_url2: mock_dependent_job_data_io.get_api_data.return_value = {"name":upstream_job_name2} else: self.fail("unexpected input value given to mock clone function: " + url) mock_dependent_job_data_io.config_xml = "<project></project>" return mock_dependent_job_data_io
def test_create_view(self): new_view_url = "http://localhost:8080/view/MyView" new_view_name = "MyView" new_view_dataio = MagicMock() new_view_dataio.get_api_data.return_value = {'name':new_view_name} new_view_dataio.config_xml = "<hudson.model.ListView/>" self.mock_jenkins_data_io.get_api_data.return_value['views'].append({'url':new_view_url,'name':new_view_name}) self.clone_map[new_view_url] = new_view_dataio j = Jenkins(self.mock_jenkins_data_io) v = j.create_view(new_view_name, "ListView") self.assertEqual(v.name, new_view_name)
def test_create_job(self): expected_name = "TestJob" jenkins_data_io = MagicMock() job_data_io = MagicMock() job_data_io.config_xml = "<project></project>" job_data_io.get_api_data.return_value = {"name": expected_name} jenkins_data_io.clone.return_value = job_data_io j = Jenkins(jenkins_data_io) job = j.create_job(expected_name, "project") self.assertEqual(job.name, expected_name)
def test_one_upstream_job(self): # our job under test depends directly on this one mock job upstream_job_name = "j1" mock_dependent_job_data_io = MagicMock() mock_dependent_job_data_io.get_api_data.return_value = {"name":upstream_job_name} mock_dependent_job_data_io.config_xml = "<project></project>" mock_data_io = MagicMock() mock_data_io.get_api_data.return_value = {"upstreamProjects":[{"url":"http://localhost:8080/job/" + upstream_job_name}]} mock_data_io.clone.return_value = mock_dependent_job_data_io j = vJob (mock_data_io, None) dependencies = j.upstream_jobs self.assertEqual(len(dependencies), 1, "Test job should have one upstream dependency") self.assertEqual(dependencies[0].name, upstream_job_name)
def setUp(self): """Configure a mock dataio object which supports a few mock view objects""" self.primary_view_name = 'main' jenkins_root_url = 'http://localhost:8080/' self.primary_view_url = jenkins_root_url + "view/" + self.primary_view_name self.view2_name = 'secondView' self.view2_url = 'http://localhost:8080/view/secondView' self.view2_job1_url = 'http://localhost:8080/job/j1' self.view2_job1_name = 'j1' mock_job1_dataio = MagicMock() mock_job1_dataio.get_api_data.return_value = {"name":self.view2_job1_name} mock_job1_dataio.config_xml = "<project></project>" # io objects used by the two views managed by our mock Jenkins instance self.mock_primary_view_data_io = MagicMock() self.mock_primary_view_data_io.get_api_data.return_value = {'name':self.primary_view_name} # TODO: double check to make sure this is the corrrect view type self.mock_primary_view_data_io.config_xml = "<hudson.model.ListView/>" self.mock_view2_data_io = MagicMock() self.mock_view2_data_io.get_api_data.return_value = {'name':self.view2_name, 'jobs':[{'url':self.view2_job1_url}]} self.mock_view2_data_io.clone.side_effect = self.mock_clone self.mock_view2_data_io.config_xml = "<hudson.model.ListView/>" # mock jenkins instance which exposes 2 views self.mock_jenkins_data_io = MagicMock() mock_views = [] mock_views.append({'url':self.view2_url,'name':self.view2_name}) mock_views.append({'url':jenkins_root_url,'name':self.primary_view_name}) self.mock_jenkins_data_io.get_api_data.return_value = {'views':mock_views,'primaryView':mock_views[1]} self.mock_jenkins_data_io.url = jenkins_root_url # construct mock 'clone' method such that views created by # these unit tests will behave correctly self.mock_jenkins_data_io.clone.side_effect = self.mock_clone self.clone_map = {} self.clone_map[self.primary_view_url] = self.mock_primary_view_data_io self.clone_map[self.view2_url] = self.mock_view2_data_io self.clone_map[self.view2_job1_url] = mock_job1_dataio