def test_get_forge(clean_before_and_after, multiple_forge_projects): projects = list(GitProjectModel.get_forge(0, 10, "github.com")) assert projects assert len(projects) == 2 projects = list(GitProjectModel.get_forge(0, 10, "gitlab.com")) assert len(projects) == 1 projects = list(GitProjectModel.get_forge(0, 10, "git.stg.centos.org")) assert len(projects) == 1
def test_get_project_prs(clean_before_and_after, a_copr_build_for_pr): prs_a = GitProjectModel.get_project_prs(0, 10, "github.com", "the-namespace", "the-repo-name") assert prs_a is not None assert len(prs_a) == 1 assert prs_a[ 0].id is not None # cant explicitly check because its random like prs_b = GitProjectModel.get_project_prs(0, 10, "gitlab.com", "the-namespace", "the-repo-name") assert prs_b is None prs_c = GitProjectModel.get_project_prs(0, 10, "github", "the-namespace", "the-repo-name") assert prs_c is None
def test_get_logs(client): chroot = "foo-1-x86_64" state = "pending" build_id = 2 project = GitProjectModel() project.namespace = "john-foo" project.repo_name = "bar" pr = PullRequestModel() pr.pr_id = 234 pr.project = project srpm_build = SRPMBuildModel() srpm_build.logs = "asd<br>qwe" c = CoprBuildModel() c.target = chroot c.build_id = str(build_id) c.srpm_build = srpm_build c.status = state c.web_url = ( "https://copr.fedorainfracloud.org/coprs/john-foo-bar/john-foo-bar/build/2/" ) c.build_logs_url = "https://localhost:5000/build/2/foo-1-x86_64/logs" flexmock(CoprBuildModel).should_receive("get_by_id").and_return(c) flexmock(CoprBuildModel).should_receive("get_project").and_return(project) flexmock(CoprBuildModel).should_receive("job_trigger").and_return( flexmock(get_trigger_object=lambda: pr)) url = f"/copr-build/1/logs" logs_url = get_copr_build_log_url_from_flask(1) assert logs_url.endswith(url) resp = client.get(url) expected = ( "<html><head>" f"<title>COPR build {project.namespace}/{project.repo_name}:" f" PR #{pr.pr_id}</title></head><body>" f"COPR build ID: {c.build_id}<br>" f"Submitted: {optional_time(c.build_submitted_time)}<br>" f"State: {c.status}<br><br>" f'Build web interface URL: <a href="{c.web_url}">{c.web_url}</a><br>' f'Build logs: <a href="{c.build_logs_url}">{c.build_logs_url}</a><br>' "SRPM creation logs:<br><br>" f"<pre>{c.srpm_build.logs}</pre>" "<br></body></html>") assert resp.data == expected.encode()
def test_get_logs(client): chroot = "foo-1-x86_64" state = "success" build_id = 2 project = GitProjectModel() project.namespace = "john-foo" project.repo_name = "bar" pr = PullRequestModel() pr.pr_id = 234 pr.project = project srpm = SRPMBuildModel() srpm.url = "https://some.random.copr.subdomain.org/my_srpm.srpm" c = CoprBuildModel() c.target = chroot c.build_id = str(build_id) c.srpm_build_id = 11 c.status = state c.srpm_build = srpm c.web_url = ( "https://copr.fedorainfracloud.org/coprs/john-foo-bar/john-foo-bar/build/2/" ) c.build_logs_url = "https://localhost:5000/build/2/foo-1-x86_64/logs" c.owner = "packit" c.project_name = "example_project" flexmock(CoprBuildModel).should_receive("get_by_id").and_return(c) flexmock(CoprBuildModel).should_receive("get_project").and_return(project) flexmock(CoprBuildModel).should_receive("job_trigger").and_return( flexmock(get_trigger_object=lambda: pr)) url = "/copr-build/1" logs_url = get_copr_build_info_url_from_flask(1) assert logs_url.endswith(url) resp = client.get(url).data.decode() assert f"srpm-build/{c.srpm_build_id}/logs" in resp assert c.web_url in resp assert c.build_logs_url in resp assert c.target in resp assert "Status: success" in resp assert "You can install" in resp assert "Download SRPM" in resp assert srpm.url in resp
def get(self, forge): """List of projects of given forge (e.g. github.com, gitlab.com)""" result = [] first, last = indices() for project in GitProjectModel.get_forge(first, last, forge): project_info = { "namespace": project.namespace, "repo_name": project.repo_name, "project_url": project.project_url, "prs_handled": len(project.pull_requests), "branches_handled": len(project.branches), "releases_handled": len(project.releases), "issues_handled": len(project.issues), } result.append(project_info) if not result: return response_maker([]) resp = response_maker( result, status=HTTPStatus.PARTIAL_CONTENT.value, ) resp.headers["Content-Range"] = f"git-projects {first + 1}-{last}/*" return resp
def get(self): """List all GitProjects""" result = [] first, last = indices() projects_list = GitProjectModel.get_projects(first, last) if not projects_list: return ([], HTTPStatus.OK) for project in projects_list: project_info = { "namespace": project.namespace, "repo_name": project.repo_name, "project_url": project.project_url, "prs_handled": len(project.pull_requests), "branches_handled": len(project.branches), "releases_handled": len(project.releases), "issues_handled": len(project.issues), } result.append(project_info) resp = make_response(dumps(result), HTTPStatus.PARTIAL_CONTENT) resp.headers["Content-Range"] = f"git-projects {first + 1}-{last}/*" resp.headers["Content-Type"] = "application/json" resp.headers["Access-Control-Allow-Origin"] = "*" return resp
def test_get_project_releases(clean_before_and_after, release_model): releases = GitProjectModel.get_project_releases("github.com", "the-namespace", "the-repo-name") assert releases[0].tag_name == "v1.0.2" assert releases[0].commit_hash == "80201a74d96c" assert len(releases) == 1
def get(self, forge, namespace, repo_name): """Project branches""" branches = GitProjectModel.get_project_branches( forge, namespace, repo_name) if not branches: return response_maker([]) result = [] for branch in branches: branch_info = { "branch": branch.name, "builds": [], "tests": [], } for build in branch.get_copr_builds(): build_info = { "build_id": build.build_id, "chroot": build.target, "status": build.status, "web_url": build.web_url, } branch_info["builds"].append(build_info) result.append(branch_info) for test_run in branch.get_test_runs(): test_info = { "pipeline_id": test_run.pipeline_id, "chroot": test_run.target, "status": test_run.status, "web_url": test_run.web_url, } branch_info["tests"].append(test_info) return response_maker(result)
def test_get_project(clean_before_and_after, a_copr_build_for_pr): project = GitProjectModel.get_project( "github.com", "the-namespace", "the-repo-name" ) assert project.namespace == "the-namespace" assert project.repo_name == "the-repo-name" assert project.project_url == "https://github.com/the-namespace/the-repo-name"
def get(self): """List all GitProjects""" result = [] first, last = indices() projects_list = GitProjectModel.get_projects(first, last) if not projects_list: return response_maker([]) for project in projects_list: project_info = { "namespace": project.namespace, "repo_name": project.repo_name, "project_url": project.project_url, "prs_handled": len(project.pull_requests), "branches_handled": len(project.branches), "releases_handled": len(project.releases), "issues_handled": len(project.issues), } result.append(project_info) resp = response_maker( result, status=HTTPStatus.PARTIAL_CONTENT.value, ) resp.headers["Content-Range"] = f"git-projects {first + 1}-{last}/*" return resp
def test_get_projects(clean_before_and_after, a_copr_build_for_pr): projects = GitProjectModel.get_projects(0, 10) assert isinstance(projects[0], GitProjectModel) assert projects[0].namespace == "the-namespace" assert projects[0].repo_name == "the-repo-name" assert projects[ 0].project_url == "https://github.com/the-namespace/the-repo-name"
def get(self, forge, namespace, repo_name): """Project branches""" branches = GitProjectModel.get_project_branches( forge, namespace, repo_name) if not branches: return response_maker([]) result = [] for branch in branches: branch_info = { "branch": branch.name, "builds": [], "koji_builds": [], "srpm_builds": [], "tests": [], } for build in branch.get_copr_builds(): build_info = { "build_id": build.build_id, "chroot": build.target, "status": build.status, "web_url": build.web_url, } branch_info["builds"].append(build_info) for build in branch.get_koji_builds(): build_info = { "build_id": build.build_id, "chroot": build.target, "status": build.status, "web_url": build.web_url, } branch_info["koji_builds"].append(build_info) for build in branch.get_srpm_builds(): build_info = { "srpm_build_id": build.id, "success": build.success, "log_url": url_for("builds.get_srpm_build_logs_by_id", id_=build.id, _external=True), } branch_info["srpm_builds"].append(build_info) for test_run in branch.get_test_runs(): test_info = { "pipeline_id": test_run.pipeline_id, "chroot": test_run.target, "status": test_run.status, "web_url": test_run.web_url, } branch_info["tests"].append(test_info) result.append(branch_info) return response_maker(result)
def get(self, forge, namespace, repo_name): """Project issues""" issues_list = GitProjectModel.get_project_issues(forge, namespace, repo_name) if not issues_list: return response_maker([]) result = [] for issue in issues_list: result.append(issue.issue_id) return response_maker(result)
def get(self, forge, namespace, repo_name): """Project issues""" issues_list = GitProjectModel.get_project_issues( forge, namespace, repo_name) if not issues_list: return ([], HTTPStatus.OK) result = {"issues": []} for issue in issues_list: result["issues"].append(issue.issue_id) resp = make_response(dumps(result)) resp.headers["Content-Type"] = "application/json" resp.headers["Access-Control-Allow-Origin"] = "*" return resp
def get(self, forge, namespace, repo_name): """Project releases""" releases_list = GitProjectModel.get_project_releases( forge, namespace, repo_name) if not releases_list: return response_maker([]) result = [] for release in releases_list: release_info = { "tag_name": release.tag_name, "commit_hash": release.commit_hash, } result.append(release_info) return response_maker(result)
def test_get_logs(client): chroot = "foo-1-x86_64" state = "pending" build_id = 2 project = GitProjectModel() project.namespace = "john-foo" project.repo_name = "bar" pr = PullRequestModel() pr.pr_id = 234 pr.project = project c = CoprBuildModel() c.target = chroot c.build_id = str(build_id) c.srpm_build_id = 11 c.status = state c.web_url = ( "https://copr.fedorainfracloud.org/coprs/john-foo-bar/john-foo-bar/build/2/" ) c.build_logs_url = "https://localhost:5000/build/2/foo-1-x86_64/logs" flexmock(CoprBuildModel).should_receive("get_by_id").and_return(c) flexmock(CoprBuildModel).should_receive("get_project").and_return(project) flexmock(CoprBuildModel).should_receive("job_trigger").and_return( flexmock(get_trigger_object=lambda: pr)) url = "/copr-build/1" logs_url = get_copr_build_info_url_from_flask(1) assert logs_url.endswith(url) resp = client.get(url).data.decode() assert f"srpm-build/{c.srpm_build_id}/logs" in resp assert c.web_url in resp assert c.build_logs_url in resp assert c.target in resp
def get(self, forge, namespace, repo_name): """Project releases""" releases_list = GitProjectModel.get_project_releases( forge, namespace, repo_name) if not releases_list: return ([], HTTPStatus.OK) result = [] for release in releases_list: release_info = { "tag_name": release.tag_name, "commit_hash": release.commit_hash, } result.append(release_info) resp = make_response(dumps(result)) resp.headers["Content-Type"] = "application/json" resp.headers["Access-Control-Allow-Origin"] = "*" return resp
def get(self, forge, namespace, repo_name): """List PRs""" result = [] first, last = indices() pr_list = GitProjectModel.get_project_prs(first, last, forge, namespace, repo_name) if not pr_list: return response_maker([]) for pr in pr_list: pr_info = { "pr_id": pr.pr_id, "builds": [], "tests": [], } copr_builds = [] test_runs = [] for build in pr.get_copr_builds(): build_info = { "build_id": build.build_id, "chroot": build.target, "status": build.status, "web_url": build.web_url, } copr_builds.append(build_info) pr_info["builds"] = copr_builds for test_run in pr.get_test_runs(): test_info = { "pipeline_id": test_run.pipeline_id, "chroot": test_run.target, "status": str(test_run.status), "web_url": test_run.web_url, } test_runs.append(test_info) pr_info["tests"] = test_runs result.append(pr_info) resp = response_maker( result, status=HTTPStatus.PARTIAL_CONTENT, ) resp.headers["Content-Range"] = f"git-project-prs {first + 1}-{last}/*" return resp
def get(self, forge, namespace, repo_name): """Project Details""" project = GitProjectModel.get_project(forge, namespace, repo_name) if not project: return response_maker( {"error": "No info about project stored in DB"}, status=HTTPStatus.NOT_FOUND, ) project_info = { "namespace": project.namespace, "repo_name": project.repo_name, "project_url": project.project_url, "prs_handled": len(project.pull_requests), "branches_handled": len(project.branches), "releases_handled": len(project.releases), "issues_handled": len(project.issues), } return response_maker(project_info)
def get(self, forge, namespace): """List of projects of given forge and namespace""" result = [] projects = GitProjectModel.get_namespace(forge, namespace) if not projects: return response_maker([]) for project in projects: project_info = { "namespace": project.namespace, "repo_name": project.repo_name, "project_url": project.project_url, "prs_handled": len(project.pull_requests), "branches_handled": len(project.branches), "releases_handled": len(project.releases), "issues_handled": len(project.issues), } result.append(project_info) return response_maker(result)
def test_get_project_issues(clean_before_and_after, an_issue_model): issues_list = GitProjectModel.get_project_issues("github.com", "the-namespace", "the-repo-name") assert len(issues_list) == 1 assert issues_list[0].issue_id == 2020
def test_get_project_branch(clean_before_and_after, a_copr_build_for_branch_push): branches_list = GitProjectModel.get_project_branches( "github.com", "the-namespace", "the-repo-name") assert len(branches_list) == 1 assert branches_list[0].name == "build-branch"
def test_get_namespace(clean_before_and_after, multiple_copr_builds): projects = GitProjectModel.get_namespace("github.com", "the-namespace") assert projects[0].namespace == "the-namespace" assert projects[0].repo_name == "the-repo-name"