def test_dist_git_push_release_handle_one_failed( github_release_webhook, fedora_branches ): packit_yaml = ( "{'specfile_path': 'hello-world.spec', 'synced_files': []" ", jobs: [{trigger: release, job: propose_downstream, " "metadata: {targets:[], dist-git-branch: fedora-all}}]}" ) flexmock(Github, get_repo=lambda full_name_or_id: None) project = ( flexmock( get_file_content=lambda path, ref: packit_yaml, full_repo_name="packit-service/hello-world", repo="hello-world", get_files=lambda ref, filter_regex: [], get_sha_from_tag=lambda tag_name: "123456", get_web_url=lambda: "https://github.com/packit/hello-world", is_private=lambda: False, ) .should_receive("create_issue") .once() .mock() ) flexmock(LocalProject, refresh_the_arguments=lambda: None) flexmock(Whitelist, check_and_report=True) config = ServiceConfig() config.command_handler_work_dir = SANDCASTLE_WORK_DIR config.get_project = lambda url: project flexmock(ServiceConfig).should_receive("get_service_config").and_return(config) # it would make sense to make LocalProject offline for i, branch in enumerate(fedora_branches): sync_release = ( flexmock(PackitAPI) .should_receive("sync_release") .with_args(dist_git_branch=branch, version="0.3.0") .once() ) if i == 1: sync_release.and_raise(Exception, f"Failed {branch}").once() flexmock(FedPKG).should_receive("clone").and_return(None) flexmock(sentry_integration).should_receive("send_to_sentry").and_return().once() flexmock(AddReleaseDbTrigger).should_receive("db_trigger").and_return( flexmock(job_config_trigger_type=JobConfigTriggerType.release, id=123) ) flexmock(Signature).should_receive("apply_async").once() processing_results = SteveJobs().process_message(github_release_webhook) assert processing_results["details"]["event"]["trigger"] == "release" event_dict, package_config, job = get_parameters_from_results(processing_results) results = run_propose_downstream_handler( package_config=package_config, event=event_dict, job_config=job, ) assert not first_dict_value(results["job"])["success"]
def test_dist_git_push_release_handle_all_failed(github_release_webhook, fedora_branches): packit_yaml = ("{'specfile_path': 'hello-world.spec', 'synced_files': []" ", jobs: [{trigger: release, job: propose_downstream, " "metadata: {targets:[], dist-git-branch: fedora-all}}]}") flexmock(Github, get_repo=lambda full_name_or_id: None) table_content = "" for branch in fedora_branches: table_content += f"| `{branch}` | `Failed` |\n" project = (flexmock( get_file_content=lambda path, ref: packit_yaml, full_repo_name="packit-service/hello-world", repo="hello-world", get_files=lambda ref, filter_regex: [], get_sha_from_tag=lambda tag_name: "123456", get_web_url=lambda: "https://github.com/packit/hello-world", is_private=lambda: False, default_branch="main", ).should_receive("create_issue").with_args( title="[packit] Propose downstream failed for release 0.3.0", body="Packit failed on creating pull-requests in dist-git:\n\n" "| dist-git branch | error |\n" "| --------------- | ----- |\n" f"{table_content}\n\n" "You can retrigger the update by adding a comment (`/packit propose-downstream`)" " into this issue.\n", ).once().mock()) lp = flexmock(LocalProject, refresh_the_arguments=lambda: None) lp.git_project = project flexmock(DistGit).should_receive("local_project").and_return(lp) flexmock(Allowlist, check_and_report=True) config = ServiceConfig() config.command_handler_work_dir = SANDCASTLE_WORK_DIR config.get_project = lambda url: project flexmock(ServiceConfig).should_receive("get_service_config").and_return( config) # it would make sense to make LocalProject offline flexmock(PackitAPI).should_receive("sync_release").and_raise( Exception, "Failed").times(len(fedora_branches)) flexmock(AddReleaseDbTrigger).should_receive("db_trigger").and_return( flexmock(job_config_trigger_type=JobConfigTriggerType.release, id=123)) flexmock(sentry_integration).should_receive( "send_to_sentry").and_return().times(len(fedora_branches)) flexmock(Signature).should_receive("apply_async").once() processing_results = SteveJobs().process_message(github_release_webhook) event_dict, job, job_config, package_config = get_parameters_from_results( processing_results) results = run_propose_downstream_handler( package_config=package_config, event=event_dict, job_config=job_config, ) assert not first_dict_value(results["job"])["success"]
def test_retry_propose_downstream_task(github_release_webhook): packit_yaml = ( "{'specfile_path': 'hello-world.spec', 'synced_files': []" ", jobs: [{trigger: release, job: propose_downstream, metadata: {targets:[]}}]}" ) flexmock(Github, get_repo=lambda full_name_or_id: None) project = flexmock( get_file_content=lambda path, ref: packit_yaml, full_repo_name="packit-service/hello-world", repo="hello-world", get_files=lambda ref, filter_regex: [], get_sha_from_tag=lambda tag_name: "123456", get_web_url=lambda: "https://github.com/packit-service/hello-world", is_private=lambda: False, ) flexmock(LocalProject, refresh_the_arguments=lambda: None) flexmock(Whitelist, check_and_report=True) config = ServiceConfig() config.command_handler_work_dir = SANDCASTLE_WORK_DIR config.get_project = lambda url: project flexmock(ServiceConfig).should_receive("get_service_config").and_return( config) # it would make sense to make LocalProject offline flexmock(AddReleaseDbTrigger).should_receive("db_trigger").and_return( flexmock(job_config_trigger_type=JobConfigTriggerType.release, id=123)) flexmock(Signature).should_receive("apply_async").once() flexmock(PackitAPI).should_receive("sync_release").with_args( dist_git_branch="master", version="0.3.0").and_raise( RebaseHelperError, "Failed to download file from URL example.com") flexmock(Task).should_receive("retry").once().and_raise(Retry) processing_results = SteveJobs().process_message(github_release_webhook) assert processing_results["details"]["event"]["trigger"] == "release" event_dict, package_config, job = get_parameters_from_results( processing_results) with pytest.raises(Retry): run_propose_downstream_handler( package_config=package_config, event=event_dict, job_config=job, )
def test_process_message(event, private, enabled_private_namespaces, success): packit_yaml = { "specfile_path": "bar.spec", "synced_files": [], "jobs": [{ "trigger": "release", "job": "propose_downstream" }], } flexmock(Github, get_repo=lambda full_name_or_id: None) gh_project = flexmock( GithubProject, get_file_content=lambda path, ref: dumps(packit_yaml), full_repo_name="the-namespace/the-repo", get_files=lambda ref, filter_regex: [], get_sha_from_tag=lambda tag_name: "12345", get_web_url=lambda: "https://github.com/the-namespace/the-repo", is_private=lambda: private, ) gh_project.default_branch = "main" lp = flexmock(LocalProject, refresh_the_arguments=lambda: None) lp.git_project = gh_project flexmock(DistGit).should_receive("local_project").and_return(lp) config = ServiceConfig( enabled_private_namespaces=enabled_private_namespaces) config.command_handler_work_dir = SANDCASTLE_WORK_DIR flexmock(ServiceConfig).should_receive("get_service_config").and_return( config) flexmock(PackitAPI).should_receive("sync_release").with_args( dist_git_branch="main", tag="1.2.3").times(1 if success else 0) flexmock(AddReleaseDbTrigger).should_receive("db_trigger").and_return( flexmock(job_config_trigger_type=JobConfigTriggerType.release, id=1)) flexmock(Allowlist, check_and_report=True) flexmock(Signature).should_receive("apply_async").times( 1 if success else 0) processing_results = SteveJobs().process_message(event) if not success: assert processing_results == [] return event_dict, job, job_config, package_config = get_parameters_from_results( processing_results) results = run_propose_downstream_handler( package_config=package_config, event=event_dict, job_config=job_config, ) assert "propose_downstream" in next(iter(results["job"])) assert first_dict_value(results["job"])["success"]
def test_issue_comment_propose_downstream_handler( mock_comment, event_type, ): project_class, comment_event = mock_comment flexmock(PackitAPI).should_receive("sync_release").and_return( PullRequestReadOnly( title="foo", description="bar", target_branch="baz", source_branch="yet", id=1, status=PRStatus.open, url="https://xyz", author="me", created=datetime.now(), ) ) flexmock( project_class, get_files=lambda ref, filter_regex: [], is_private=lambda: False, ) flexmock(LocalProject).should_receive("reset").with_args("HEAD").once() flexmock(IssueCommentGitlabEvent).should_receive("db_trigger").and_return( flexmock(id=123, job_config_trigger_type=JobConfigTriggerType.release) ) flexmock(IssueModel).should_receive("get_or_create").and_return( flexmock(id=123, job_config_trigger_type=JobConfigTriggerType.release) ) flexmock(Signature).should_receive("apply_async").once() flexmock(Pushgateway).should_receive("push").once().and_return() flexmock(shutil).should_receive("rmtree").with_args("") processing_results = SteveJobs().process_message(comment_event) event_dict, job, job_config, package_config = get_parameters_from_results( processing_results ) assert json.dumps(event_dict) results = run_propose_downstream_handler( package_config=package_config, event=event_dict, job_config=job_config, ) assert first_dict_value(results["job"])["success"]
def test_process_message(event): packit_yaml = { "specfile_path": "bar.spec", "synced_files": [], "jobs": [{ "trigger": "release", "job": "propose_downstream" }], } flexmock(Github, get_repo=lambda full_name_or_id: None) flexmock( GithubProject, get_file_content=lambda path, ref: dumps(packit_yaml), full_repo_name="foo/bar", get_files=lambda ref, filter_regex: [], get_sha_from_tag=lambda tag_name: "12345", get_web_url=lambda: "https://github.com/the-namespace/the-repo", is_private=lambda: False, ) flexmock(LocalProject, refresh_the_arguments=lambda: None) config = ServiceConfig() config.command_handler_work_dir = SANDCASTLE_WORK_DIR flexmock(ServiceConfig).should_receive("get_service_config").and_return( config) flexmock(PackitAPI).should_receive("sync_release").with_args( dist_git_branch="master", version="1.2.3").once() flexmock(AddReleaseDbTrigger).should_receive("db_trigger").and_return( flexmock(job_config_trigger_type=JobConfigTriggerType.release, id=1)) flexmock(Whitelist, check_and_report=True) flexmock(Signature).should_receive("apply_async").once() processing_results = SteveJobs().process_message(event) assert processing_results["details"]["event"]["trigger"] == "release" event_dict, package_config, job = get_parameters_from_results( processing_results) results = run_propose_downstream_handler( package_config=package_config, event=event_dict, job_config=job, ) assert "propose_downstream" in next(iter(results["job"])) assert first_dict_value(results["job"])["success"]
def test_dist_git_push_release_handle(github_release_webhook): packit_yaml = ( "{'specfile_path': 'hello-world.spec', 'synced_files': []" ", jobs: [{trigger: release, job: propose_downstream, metadata: {targets:[]}}]}" ) flexmock(Github, get_repo=lambda full_name_or_id: None) project = flexmock( get_file_content=lambda path, ref: packit_yaml, full_repo_name="packit-service/hello-world", repo="hello-world", get_files=lambda ref, filter_regex: [], get_sha_from_tag=lambda tag_name: "123456", get_web_url=lambda: "https://github.com/packit/hello-world", is_private=lambda: False, default_branch="main", ) lp = flexmock(LocalProject, refresh_the_arguments=lambda: None) lp.git_project = project flexmock(DistGit).should_receive("local_project").and_return(lp) flexmock(Allowlist, check_and_report=True) config = ServiceConfig() config.command_handler_work_dir = SANDCASTLE_WORK_DIR config.get_project = lambda url: project flexmock(ServiceConfig).should_receive("get_service_config").and_return( config) # it would make sense to make LocalProject offline flexmock(PackitAPI).should_receive("sync_release").with_args( dist_git_branch="main", tag="0.3.0").once() flexmock(AddReleaseDbTrigger).should_receive("db_trigger").and_return( flexmock(job_config_trigger_type=JobConfigTriggerType.release, id=123)) flexmock(Signature).should_receive("apply_async").once() processing_results = SteveJobs().process_message(github_release_webhook) event_dict, job, job_config, package_config = get_parameters_from_results( processing_results) results = run_propose_downstream_handler( package_config=package_config, event=event_dict, job_config=job_config, ) assert first_dict_value(results["job"])["success"]
def test_issue_comment_propose_downstream_handler( mock_issue_comment_functionality, issue_comment_propose_downstream_event): flexmock(PackitAPI).should_receive("sync_release").and_return( PullRequest( title="foo", description="bar", target_branch="baz", source_branch="yet", id=1, status=PRStatus.open, url="https://xyz", author="me", created=datetime.now(), )) flexmock( GithubProject, get_files=lambda ref, filter_regex: [], get_web_url=lambda: "https://github.com/the-namespace/the-repo", is_private=lambda: False, ) flexmock(IssueCommentEvent, db_trigger=IssueModel(id=123)) flexmock(IssueModel).should_receive("get_by_id").with_args(123).and_return( flexmock(issue_id=12345)) flexmock(Signature).should_receive("apply_async").once() processing_results = SteveJobs().process_message( issue_comment_propose_downstream_event) event_dict, job, job_config, package_config = get_parameters_from_results( processing_results) results = run_propose_downstream_handler( package_config=package_config, event=event_dict, job_config=job_config, ) assert first_dict_value(results["job"])["success"]