Skip to content

Commit 7966584

Browse files
authored
Merge pull request #1915 from kinbald/test-report-summary
feat: add support for test report summary
2 parents b37fc41 + 2828b10 commit 7966584

File tree

3 files changed

+98
-1
lines changed

3 files changed

+98
-1
lines changed

docs/gl_objects/pipelines_and_jobs.rst

Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -367,3 +367,27 @@ Examples
367367
Get the test report for a pipeline::
368368

369369
test_report = pipeline.test_report.get()
370+
371+
Pipeline test report summary
372+
============================
373+
374+
Get a pipeline’s test report summary.
375+
376+
Reference
377+
---------
378+
379+
* v4 API
380+
381+
+ :class:`gitlab.v4.objects.ProjectPipelineTestReportSummary`
382+
+ :class:`gitlab.v4.objects.ProjectPipelineTestReportSummaryManager`
383+
+ :attr:`gitlab.v4.objects.ProjectPipeline.test_report_summary`
384+
385+
* GitLab API: https://docs.gitlab.com/ee/api/pipelines.html#get-a-pipelines-test-report-summary
386+
387+
Examples
388+
--------
389+
390+
Get the test report summary for a pipeline::
391+
392+
test_report_summary = pipeline.test_report_summary.get()
393+

gitlab/v4/objects/pipelines.py

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -35,6 +35,8 @@
3535
"ProjectPipelineScheduleManager",
3636
"ProjectPipelineTestReport",
3737
"ProjectPipelineTestReportManager",
38+
"ProjectPipelineTestReportSummary",
39+
"ProjectPipelineTestReportSummaryManager",
3840
]
3941

4042

@@ -52,6 +54,7 @@ class ProjectPipeline(RefreshMixin, ObjectDeleteMixin, RESTObject):
5254
bridges: "ProjectPipelineBridgeManager"
5355
jobs: "ProjectPipelineJobManager"
5456
test_report: "ProjectPipelineTestReportManager"
57+
test_report_summary: "ProjectPipelineTestReportSummaryManager"
5558
variables: "ProjectPipelineVariableManager"
5659

5760
@cli.register_custom_action("ProjectPipeline")
@@ -251,3 +254,20 @@ def get(
251254
self, id: Optional[Union[int, str]] = None, **kwargs: Any
252255
) -> Optional[ProjectPipelineTestReport]:
253256
return cast(Optional[ProjectPipelineTestReport], super().get(id=id, **kwargs))
257+
258+
259+
class ProjectPipelineTestReportSummary(RESTObject):
260+
_id_attr = None
261+
262+
263+
class ProjectPipelineTestReportSummaryManager(GetWithoutIdMixin, RESTManager):
264+
_path = "/projects/{project_id}/pipelines/{pipeline_id}/test_report_summary"
265+
_obj_cls = ProjectPipelineTestReportSummary
266+
_from_parent_attrs = {"project_id": "project_id", "pipeline_id": "id"}
267+
268+
def get(
269+
self, id: Optional[Union[int, str]] = None, **kwargs: Any
270+
) -> Optional[ProjectPipelineTestReportSummary]:
271+
return cast(
272+
Optional[ProjectPipelineTestReportSummary], super().get(id=id, **kwargs)
273+
)

tests/unit/objects/test_pipelines.py

Lines changed: 54 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,11 @@
44
import pytest
55
import responses
66

7-
from gitlab.v4.objects import ProjectPipeline, ProjectPipelineTestReport
7+
from gitlab.v4.objects import (
8+
ProjectPipeline,
9+
ProjectPipelineTestReport,
10+
ProjectPipelineTestReportSummary,
11+
)
812

913
pipeline_content = {
1014
"id": 46,
@@ -66,6 +70,32 @@
6670
}
6771

6872

73+
test_report_summary_content = {
74+
"total": {
75+
"time": 1904,
76+
"count": 3363,
77+
"success": 3351,
78+
"failed": 0,
79+
"skipped": 12,
80+
"error": 0,
81+
"suite_error": None,
82+
},
83+
"test_suites": [
84+
{
85+
"name": "test",
86+
"total_time": 1904,
87+
"total_count": 3363,
88+
"success_count": 3351,
89+
"failed_count": 0,
90+
"skipped_count": 12,
91+
"error_count": 0,
92+
"build_ids": [66004],
93+
"suite_error": None,
94+
}
95+
],
96+
}
97+
98+
6999
@pytest.fixture
70100
def resp_get_pipeline():
71101
with responses.RequestsMock() as rsps:
@@ -118,6 +148,19 @@ def resp_get_pipeline_test_report():
118148
yield rsps
119149

120150

151+
@pytest.fixture
152+
def resp_get_pipeline_test_report_summary():
153+
with responses.RequestsMock() as rsps:
154+
rsps.add(
155+
method=responses.GET,
156+
url="http://localhost/api/v4/projects/1/pipelines/1/test_report_summary",
157+
json=test_report_summary_content,
158+
content_type="application/json",
159+
status=200,
160+
)
161+
yield rsps
162+
163+
121164
def test_get_project_pipeline(project, resp_get_pipeline):
122165
pipeline = project.pipelines.get(1)
123166
assert isinstance(pipeline, ProjectPipeline)
@@ -144,3 +187,13 @@ def test_get_project_pipeline_test_report(project, resp_get_pipeline_test_report
144187
assert isinstance(test_report, ProjectPipelineTestReport)
145188
assert test_report.total_time == 5
146189
assert test_report.test_suites[0]["name"] == "Secure"
190+
191+
192+
def test_get_project_pipeline_test_report_summary(
193+
project, resp_get_pipeline_test_report_summary
194+
):
195+
pipeline = project.pipelines.get(1, lazy=True)
196+
test_report_summary = pipeline.test_report_summary.get()
197+
assert isinstance(test_report_summary, ProjectPipelineTestReportSummary)
198+
assert test_report_summary.total["count"] == 3363
199+
assert test_report_summary.test_suites[0]["name"] == "test"

0 commit comments

Comments
 (0)