def test_dist_git_package_url(): di = { "dist_git_base_url": "https://packit.dev/", "downstream_package_name": "packit", "dist_git_namespace": "awesome", "synced_files": ["fedora/foobar.spec"], "specfile_path": "fedora/package.spec", "create_pr": False, } new_pc = PackageConfig.get_from_dict(di) pc = PackageConfig( dist_git_base_url="https://packit.dev/", downstream_package_name="packit", dist_git_namespace="awesome", synced_files=SyncFilesConfig(files_to_sync=[ SyncFilesItem(src="fedora/foobar.spec", dest="fedora/foobar.spec") ]), specfile_path="fedora/package.spec", create_pr=False, jobs=get_default_job_config(), ) assert new_pc.specfile_path.endswith("fedora/package.spec") assert pc.specfile_path.endswith("fedora/package.spec") assert pc == new_pc assert pc.dist_git_package_url == "https://packit.dev/awesome/packit.git" assert new_pc.dist_git_package_url == "https://packit.dev/awesome/packit.git" assert not pc.create_pr
def test_package_config_equal(): assert PackageConfig( specfile_path="fedora/package.spec", synced_files=["a", "b"], jobs=[JobConfig(trigger=TriggerType.release, release_to=["f28"], metadata={})], metadata={"c": "d"}, ) == PackageConfig( specfile_path="fedora/package.spec", synced_files=["a", "b"], jobs=[JobConfig(trigger=TriggerType.release, release_to=["f28"], metadata={})], metadata={"c": "d"}, )
def test_package_config_equal(job_config_simple): assert PackageConfig( specfile_path="fedora/package.spec", synced_files=SyncFilesConfig(files_to_sync=[ SyncFilesItem(src="packit.yaml", dest="packit.yaml") ]), jobs=[job_config_simple], ) == PackageConfig( specfile_path="fedora/package.spec", synced_files=SyncFilesConfig(files_to_sync=[ SyncFilesItem(src="packit.yaml", dest="packit.yaml") ]), jobs=[job_config_simple], )
def test_precheck(github_pr_event): flexmock(PullRequestModel).should_receive("get_or_create").with_args( pr_id=342, namespace="packit-service", repo_name="packit", project_url="https://github.com/packit-service/packit", ).and_return( flexmock(id=342, job_config_trigger_type=JobConfigTriggerType.pull_request)) copr_build_handler = CoprBuildHandler( package_config=PackageConfig(jobs=[ JobConfig( type=JobType.copr_build, trigger=JobConfigTriggerType.pull_request, ), JobConfig( type=JobType.tests, trigger=JobConfigTriggerType.pull_request, ), ]), job_config=JobConfig( type=JobType.copr_build, trigger=JobConfigTriggerType.pull_request, ), event=github_pr_event.get_dict(), ) assert copr_build_handler.pre_check()
def test_precheck_skip_tests_when_build_defined(pull_request_event): flexmock(AbstractGithubCoprBuildHandler).should_receive( "get_package_config_from_repo").and_return( PackageConfig(jobs=[ JobConfig( type=JobType.copr_build, trigger=JobConfigTriggerType.pull_request, metadata={}, ), JobConfig( type=JobType.tests, trigger=JobConfigTriggerType.pull_request, metadata={}, ), ])) copr_build_handler = AbstractGithubCoprBuildHandler( config=flexmock(), job_config=JobConfig( type=JobType.tests, trigger=JobConfigTriggerType.pull_request, metadata={}, ), event=pull_request_event, ) assert not copr_build_handler.pre_check()
def build_handler(metadata=None, trigger=None): if not metadata: metadata = { "owner": "nobody", "targets": [ "fedora-29-x86_64", "fedora-30-x86_64", "fedora-31-x86_64", "fedora-rawhide-x86_64", ], } jobs = [ JobConfig( job=JobType.copr_build, trigger=trigger or JobTriggerType.pull_request, metadata=metadata, ) ] pkg_conf = PackageConfig(jobs=jobs, downstream_package_name="dummy") event = Parser.parse_pr_event(pull_request()) handler = CoprBuildHandler( config=ServiceConfig(), package_config=pkg_conf, project=GitProject("", GitService(), ""), event=event, ) handler._api = PackitAPI(ServiceConfig, pkg_conf) return handler
def test_copr_project_and_namespace( jobs, job_config_trigger_type, tag_name, job_owner, job_project, ): copr_build_helper = CoprBuildJobHelper( service_config=flexmock(deployment="stg"), package_config=PackageConfig(jobs=jobs), job_config=jobs[0], # BuildHelper looks at all jobs in the end project=flexmock( namespace="the/example/namespace", repo="the-example-repo", service=flexmock(instance_url="https://git.instance.io"), ), metadata=flexmock(pr_id=None, identifier="the-event-identifier", tag_name=tag_name), db_trigger=flexmock(job_config_trigger_type=job_config_trigger_type), ) copr_build_helper._api = flexmock(copr_helper=flexmock( copr_client=flexmock(config={"username": "******"}))) assert copr_build_helper.job_project == job_project assert copr_build_helper.job_owner == job_owner
def build_helper( event: Union[PullRequestEvent, PullRequestCommentEvent, CoprBuildEvent, PushGitHubEvent, ReleaseEvent, ], metadata=None, trigger=None, jobs=None, ): if not metadata: metadata = { "owner": "nobody", "targets": [ "fedora-29-x86_64", "fedora-30-x86_64", "fedora-31-x86_64", "fedora-rawhide-x86_64", ], } jobs = jobs or [] jobs.append( JobConfig( type=JobType.copr_build, trigger=trigger or JobConfigTriggerType.pull_request, metadata=metadata, )) pkg_conf = PackageConfig(jobs=jobs, downstream_package_name="dummy") handler = CoprBuildJobHelper( config=ServiceConfig(), package_config=pkg_conf, project=GitProject("", GitService(), ""), event=event, ) handler._api = PackitAPI(ServiceConfig(), pkg_conf) return handler
def test_package_config_parse(raw, expected): package_config = PackageConfig.get_from_dict(raw_dict=raw) assert package_config # tests for https://github.com/packit-service/packit-service/pull/342 if expected.jobs: for j in package_config.jobs: assert j.type assert package_config == expected
def packit_repository_base_more_actions(): return PackitRepositoryBase( config=Config(), package_config=PackageConfig( actions={ ActionName.pre_sync: ["command --a", "command --a"], ActionName.get_current_version: "command --b", }), )
def test_dist_git_package_url(): di = { "dist_git_base_url": "https://packit.dev/", "downstream_package_name": "packit", "dist_git_namespace": "awesome", "specfile_path": "fedora/package.spec", "synced_files": [], } new_pc = PackageConfig.get_from_dict(di) pc = PackageConfig( dist_git_base_url="https://packit.dev/", downstream_package_name="packit", dist_git_namespace="awesome", specfile_path="fedora/package.spec", synced_files=[], ) assert pc == new_pc assert pc.dist_git_package_url == "https://packit.dev/awesome/packit.git" assert new_pc.dist_git_package_url == "https://packit.dev/awesome/packit.git"
def test_get_output_from_action_defined(echo_cmd, expected_output): packit_repository_base = PackitRepositoryBase( config=flexmock(Config()), package_config=flexmock(PackageConfig(actions={ActionName.pre_sync: echo_cmd})), ) packit_repository_base.local_project = flexmock(working_dir=".") result = packit_repository_base.get_output_from_action(ActionName.pre_sync) assert result == expected_output
def test_run_in_sandbox(): packit_repository_base = PackitRepositoryBase( config=Config(), package_config=PackageConfig(actions={ActionName.pre_sync: "ls -lha"}), ) packit_repository_base.config.actions_handler = "sandcastle" result = packit_repository_base.get_output_from_action(ActionName.pre_sync) assert "total 4.0K" in result assert "drwxr-xr-x. 1 root root" in result
def distgit_with_actions(): return DistGit( config=flexmock(Config()), package_config=flexmock( PackageConfig( actions={ ActionName.pre_sync: "command --a", ActionName.get_current_version: "command --b", })), )
def test_raw_files_to_sync(packit_files, expected): with cwd(TESTS_DIR): pc = PackageConfig( dist_git_base_url="https://packit.dev/", downstream_package_name="packit", dist_git_namespace="awesome", specfile_path="fedora/package.spec", synced_files=packit_files, ) assert set(pc.synced_files.raw_files_to_sync) == set(expected)
def packit_repository_base(): return PackitRepositoryBase( config=flexmock(), package_config=flexmock( PackageConfig( actions={ ActionName.pre_sync: "command --a", ActionName.get_current_version: "command --b", })), )
def test_pr_exists(title, description, branch, prs, exists): local_project = LocalProject( git_project=flexmock(service="something", get_pr_list=lambda: prs), refresh=False, ) distgit = DistGit( config=flexmock(Config()), package_config=flexmock(PackageConfig()), local_project=local_project, ) assert distgit.pr_exists(title, description, branch) == exists
def test_package_config_not_equal(not_equal_package_config): j = get_job_config_full() j.metadata["b"] = "c" assert (not PackageConfig( specfile_path="fedora/package.spec", synced_files=SyncFilesConfig(files_to_sync=[ SyncFilesItem(src="c", dest="c"), SyncFilesItem(src="d", dest="d"), ]), jobs=[j], ) == not_equal_package_config)
def upstream_with_actions(): return Upstream( config=flexmock(Config()), package_config=flexmock( PackageConfig( actions={ ActionName.pre_sync: "command --a", ActionName.get_current_version: "command --b", })), local_project=flexmock(repo_name=flexmock()), )
def test_koji_targets_overrides(jobs, job_config_trigger_type, targets_override, build_targets): koji_build_helper = KojiBuildJobHelper( service_config=flexmock(), package_config=PackageConfig(jobs=jobs), job_config=jobs[0], project=flexmock(), metadata=flexmock(), db_trigger=flexmock(job_config_trigger_type=job_config_trigger_type), targets_override=targets_override, ) assert koji_build_helper.build_targets == build_targets
def test_base_push_good(upstream_distgit_remote): _, distgit, _ = upstream_distgit_remote b = PackitRepositoryBase(config=Config(), package_config=PackageConfig()) b.local_project = LocalProject( working_dir=str(distgit), git_url="https://github.com/packit-service/lol") flexmock( LocalProject, push=lambda *args, **kwargs: [PushInfo(PushInfo.FAST_FORWARD, None, None, None, None)], ) b.push("master")
def test_download_remote_sources_via_spec(self): """ Use case: package_config.sources and Source0 are out of sync, make sure packit downloads correct archive specifiec in the spec file """ # we should use an actual git.centos.org url but we'd store the tarball in our history # which we don't want I'd say # "https://git.centos.org/sources/rsync/c8s/82e7829c0b3cefbd33c233005341e2073c425629" git_centos_org_url = "https://example.org/" package_config = PackageConfig( specfile_path="rsync.spec", sources=[ SourcesItem( path="rsync-3.1.2.tar.gz", url=git_centos_org_url, ), ], jobs=[], ) # same drill here, let's not store tarballs in our git-history # source = "https://download.samba.org/pub/rsync/src/rsync-3.1.3.tar.gz" source = "https://httpbin.org/anything/rsync-3.1.3.tar.gz" base_git = PackitRepositoryBase(config=flexmock(), package_config=package_config) specfile_content = ("Name: rsync\n" "Version: 3.1.3\n" "Release: 1\n" f"Source0: {source}\n" "License: GPLv3+\n" "Summary: rsync\n" "%description\nrsync\n") tmp = Path(self.static_tmp) spec_path = tmp / "rsync.spec" spec_path.write_text(specfile_content) specfile = Specfile(spec_path, sourcedir=tmp, autosave=True) flexmock(base_git).should_receive("specfile").and_return(specfile) def mocked_is_file(): import inspect # return False only if Path.is_file() is called directly from within # the download_remote_sources() method # this is necessary because specfile relies on Path.is_file() as well return inspect.stack()[3].function != "download_remote_sources" flexmock(Path).should_receive("is_file").replace_with(mocked_is_file) base_git.download_remote_sources() expected_path = tmp / "rsync-3.1.3.tar.gz" assert Path(expected_path).exists()
def test_check_copr_build_updated(): flexmock(CoprBuildModel).should_receive("get_by_build_id").and_return() flexmock(CoprBuildModel).should_receive("get_all_by_build_id").with_args( 1).and_return([ flexmock( status="pending", target="the-target", owner="the-owner", project_name="the-project-name", commit_sha="123456", job_trigger=flexmock(type=JobTriggerModelType.pull_request). should_receive("get_trigger_object").and_return( flexmock( project=flexmock( repo_name="repo_name", namespace="the-namespace", project_url= "https://github.com/the-namespace/repo_name", ), pr_id=5, job_config_trigger_type=JobConfigTriggerType. pull_request, id=123, )).mock(), srpm_build=flexmock(url=None).should_receive( "set_url").with_args("https://some.host/my.srpm").mock(), ) ]) flexmock(Client).should_receive("create_from_config_file").and_return( flexmock( build_proxy=flexmock().should_receive("get").with_args( 1).and_return( flexmock( ended_on=True, state="completed", source_package={ "name": "source_package_name", "url": "https://some.host/my.srpm", }, )).mock(), build_chroot_proxy=flexmock().should_receive("get").with_args( 1, "the-target").and_return( flexmock(ended_on="timestamp", state="completed")).mock(), )) flexmock(AbstractCoprBuildEvent).should_receive( "get_package_config").and_return( PackageConfig(jobs=[ JobConfig(type=JobType.build, trigger=JobConfigTriggerType.pull_request) ])) flexmock(CoprBuildEndHandler).should_receive("run").and_return().once() assert check_copr_build(build_id=1)
def test_get_output_from_action_defined(): echo_cmd = "echo 'hello world'" packit_repository_base = PackitRepositoryBase( config=flexmock(), package_config=flexmock( PackageConfig(actions={ActionName.pre_sync: echo_cmd})), ) packit_repository_base.local_project = flexmock(working_dir=".") result = packit_repository_base.get_output_from_action(ActionName.pre_sync) assert result == "hello world\n"
def packit_repository_base_with_sandcastle_object(tmp_path): c = Config() c.command_handler = RunCommandType.sandcastle b = PackitRepositoryBase( config=c, package_config=PackageConfig( actions={ ActionName.pre_sync: "command -a", ActionName.get_current_version: "command -b", }), ) b.local_project = LocalProject(working_dir=tmp_path) return b
def test_targets(jobs, trigger, build_targets, test_targets): copr_build_handler = CoprBuildJobHelper( config=flexmock(), package_config=PackageConfig(jobs=jobs), project=flexmock(), event=flexmock(trigger=trigger), ) assert copr_build_handler.package_config.jobs assert [j.type for j in copr_build_handler.package_config.jobs] assert set(copr_build_handler.build_chroots) == build_targets assert set(copr_build_handler.tests_chroots) == test_targets
def test_base_push_bad(upstream_distgit_remote): _, distgit, _ = upstream_distgit_remote b = PackitRepositoryBase(config=Config(), package_config=PackageConfig()) b.local_project = LocalProject( working_dir=str(distgit), git_url="https://github.com/packit-service/lol") flexmock( LocalProject, push=lambda *args, **kwargs: [PushInfo(PushInfo.REMOTE_REJECTED, None, None, None, None)], ) with pytest.raises(PackitException) as e: b.push("master") assert "unable to push" in str(e.value)
def test_existing_pr(title, description, branch, prs, exists): local_project = LocalProject( git_project=flexmock(service="something", get_pr_list=lambda: prs), refresh=False, ) distgit = DistGit( config=flexmock(Config()), package_config=flexmock(PackageConfig()), local_project=local_project, ) pr = distgit.existing_pr(title, description, branch) if exists: assert pr is not None else: assert pr is None
def test_targets(jobs, job_config_trigger_type, build_chroots, test_chroots): copr_build_helper = CoprBuildJobHelper( service_config=flexmock(), package_config=PackageConfig(jobs=jobs), job_config=jobs[0], # BuildHelper looks at all jobs in the end project=flexmock(), metadata=flexmock(pr_id=None), db_trigger=flexmock(job_config_trigger_type=job_config_trigger_type), ) assert copr_build_helper.package_config.jobs assert [j.type for j in copr_build_helper.package_config.jobs] assert copr_build_helper.configured_build_targets == build_chroots assert copr_build_helper.configured_tests_targets == test_chroots
def test_get_output_from_action_defined_in_sandcastle(): echo_cmd = "hello world" flexmock(Sandcastle).should_receive("get_api_client") flexmock(Sandcastle).should_receive("is_pod_already_deployed").and_return(True) c = Config() c.command_handler = RunCommandType.sandcastle packit_repository_base = PackitRepositoryBase( config=c, package_config=PackageConfig(actions={ActionName.pre_sync: echo_cmd}) ) packit_repository_base.local_project = LocalProject() flexmock(Sandcastle).should_receive("run") flexmock(Sandcastle).should_receive("exec").and_return(echo_cmd) result = packit_repository_base.get_output_from_action(ActionName.pre_sync) assert result == echo_cmd