diff --git a/tests/cmd/fixtures/update-both.yaml b/tests/cmd/fixtures/update-both.yaml new file mode 100644 index 000000000..ed34d20cd --- /dev/null +++ b/tests/cmd/fixtures/update-both.yaml @@ -0,0 +1,17 @@ +# Input file for test_update with both jobs and views. + +- job-template: + name: job-{num} + description: Job Number {num} + +- view-template: + name: view-{num} + description: View Number {num} + +- project: + name: sample-project + num: [1, 2, 3] + jobs: + - job-{num} + views: + - view-{num} diff --git a/tests/cmd/fixtures/update-views.yaml b/tests/cmd/fixtures/update-views.yaml new file mode 100644 index 000000000..ddbfd9369 --- /dev/null +++ b/tests/cmd/fixtures/update-views.yaml @@ -0,0 +1,11 @@ +# Input file for test_update with only views. + +- view-template: + name: view-{num} + description: View Number {num} + +- project: + name: sample-project + num: [1, 2, 3] + views: + - view-{num} diff --git a/tests/cmd/subcommands/test_update.py b/tests/cmd/subcommands/test_update.py index 70cc207c4..b4996b0c3 100644 --- a/tests/cmd/subcommands/test_update.py +++ b/tests/cmd/subcommands/test_update.py @@ -138,6 +138,112 @@ def test_update_jobs_and_delete_old( assert jenkins_delete_job.call_count == len(calls) +def test_update_views(mocker, fixtures_dir, default_config_file, execute_jenkins_jobs): + """ + Test update_job is called for project with views + """ + mocker.patch("jenkins_jobs.builder.jenkins.Jenkins.view_exists") + mocker.patch("jenkins_jobs.builder.jenkins.Jenkins.get_views") + reconfig_view = mocker.patch("jenkins_jobs.builder.jenkins.Jenkins.reconfig_view") + + path = fixtures_dir / "update-views.yaml" + args = ["--conf", default_config_file, "update", str(path)] + + execute_jenkins_jobs(args) + + reconfig_view.assert_has_calls( + [ + mock.call(view_name, mock.ANY) + for view_name in ["view-1", "view-2", "view-3"] + ], + any_order=True, + ) + assert reconfig_view.call_count == 3 + + +def test_update_jobs_and_views( + mocker, fixtures_dir, default_config_file, execute_jenkins_jobs +): + """ + Test update_job is called for project with both jobs and views + """ + mocker.patch("jenkins_jobs.builder.jenkins.Jenkins.job_exists") + mocker.patch("jenkins_jobs.builder.jenkins.Jenkins.get_all_jobs") + reconfig_job = mocker.patch("jenkins_jobs.builder.jenkins.Jenkins.reconfig_job") + + mocker.patch("jenkins_jobs.builder.jenkins.Jenkins.view_exists") + mocker.patch("jenkins_jobs.builder.jenkins.Jenkins.get_views") + reconfig_view = mocker.patch("jenkins_jobs.builder.jenkins.Jenkins.reconfig_view") + + path = fixtures_dir / "update-both.yaml" + args = ["--conf", default_config_file, "update", str(path)] + + execute_jenkins_jobs(args) + + reconfig_job.assert_has_calls( + [mock.call(job_name, mock.ANY) for job_name in ["job-1", "job-2", "job-3"]], + any_order=True, + ) + assert reconfig_job.call_count == 3 + + reconfig_view.assert_has_calls( + [ + mock.call(view_name, mock.ANY) + for view_name in ["view-1", "view-2", "view-3"] + ], + any_order=True, + ) + assert reconfig_view.call_count == 3 + + +def test_update_jobs_only( + mocker, fixtures_dir, default_config_file, execute_jenkins_jobs +): + """ + Test update_job is called for project with both jobs and views + but only jobs update is requested + """ + mocker.patch("jenkins_jobs.builder.jenkins.Jenkins.job_exists") + mocker.patch("jenkins_jobs.builder.jenkins.Jenkins.get_all_jobs") + reconfig_job = mocker.patch("jenkins_jobs.builder.jenkins.Jenkins.reconfig_job") + + mocker.patch("jenkins_jobs.builder.jenkins.Jenkins.view_exists") + mocker.patch("jenkins_jobs.builder.jenkins.Jenkins.get_views") + reconfig_view = mocker.patch("jenkins_jobs.builder.jenkins.Jenkins.reconfig_view") + + path = fixtures_dir / "update-both.yaml" + args = ["--conf", default_config_file, "update", "--jobs-only", str(path)] + + execute_jenkins_jobs(args) + + assert reconfig_job.call_count == 3 + assert reconfig_view.call_count == 0 + + +def test_update_views_only( + mocker, fixtures_dir, default_config_file, execute_jenkins_jobs +): + """ + Test update_job is called for project with both jobs and views + but only views update is requested + """ + mocker.patch("jenkins_jobs.builder.jenkins.Jenkins.job_exists") + mocker.patch("jenkins_jobs.builder.jenkins.Jenkins.get_all_jobs") + reconfig_job = mocker.patch("jenkins_jobs.builder.jenkins.Jenkins.reconfig_job") + + mocker.patch("jenkins_jobs.builder.jenkins.Jenkins.view_exists") + mocker.patch("jenkins_jobs.builder.jenkins.Jenkins.get_views") + reconfig_view = mocker.patch("jenkins_jobs.builder.jenkins.Jenkins.reconfig_view") + + path = fixtures_dir / "update-both.yaml" + args = ["--conf", default_config_file, "update", "--views-only", str(path)] + + execute_jenkins_jobs(args) + + assert reconfig_job.call_count == 0 + assert reconfig_view.call_count == 3 + + @pytest.mark.skip(reason="TODO: Develop actual update timeout test approach.") def test_update_timeout_not_set(): """Validate update timeout behavior when timeout not explicitly configured."""