Skip to content

Commit 879fe62

Browse files
authored
feat: add quarantine report in Mergify CI section (#181)
related to MRGFY-5846
1 parent 69b4d9f commit 879fe62

File tree

3 files changed

+53
-9
lines changed

3 files changed

+53
-9
lines changed

pytest_mergify/__init__.py

Lines changed: 9 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -65,13 +65,15 @@ def pytest_terminal_summary(
6565

6666
if self.mergify_ci.quarantined_tests is None:
6767
terminalreporter.write_line("CI Insights Quarantine could not be setup")
68-
elif (
69-
self.mergify_ci.quarantined_tests is not None
70-
and self.mergify_ci.quarantined_tests.init_error_msg
71-
):
72-
terminalreporter.write_line(
73-
self.mergify_ci.quarantined_tests.init_error_msg, yellow=True
74-
)
68+
elif self.mergify_ci.quarantined_tests is not None:
69+
if self.mergify_ci.quarantined_tests.init_error_msg:
70+
terminalreporter.write_line(
71+
self.mergify_ci.quarantined_tests.init_error_msg, yellow=True
72+
)
73+
else:
74+
terminalreporter.write_line(
75+
self.mergify_ci.quarantined_tests.quarantined_tests_report()
76+
)
7577

7678
# CI Insights Traces upload logs
7779
if self.mergify_ci.tracer_provider is None:

pytest_mergify/quarantine.py

Lines changed: 30 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
11
import dataclasses
2+
import os
23
import pytest
34
import _pytest.nodes
45
import requests
@@ -14,6 +15,9 @@ class Quarantine:
1415
quarantined_tests: typing.List[str] = dataclasses.field(
1516
init=False, default_factory=list
1617
)
18+
quarantine_used_by_tests: typing.Set[str] = dataclasses.field(
19+
init=False, default_factory=set
20+
)
1721
init_error_msg: typing.Optional[str] = dataclasses.field(init=False, default=None)
1822

1923
def __post_init__(self) -> None:
@@ -51,8 +55,31 @@ def __post_init__(self) -> None:
5155
def __contains__(self, item: _pytest.nodes.Item) -> bool:
5256
return item.nodeid in self.quarantined_tests
5357

54-
@staticmethod
55-
def mark_test_as_quarantined(test_item: _pytest.nodes.Item) -> None:
58+
def quarantined_tests_report(self) -> str:
59+
report_str = f"""🛡️ Quarantine
60+
- Repository: {self.repo_name}
61+
- Branch: {self.branch_name}
62+
- Quarantined tests fetched from API: {len(self.quarantined_tests)}
63+
"""
64+
65+
if self.quarantine_used_by_tests:
66+
report_str += f"""
67+
- 🔒 Quarantined:
68+
· {f"{os.linesep} · ".join(sorted(self.quarantine_used_by_tests))}
69+
"""
70+
71+
unused_quarantined_tests = (
72+
set(self.quarantined_tests) - self.quarantine_used_by_tests
73+
)
74+
if unused_quarantined_tests:
75+
report_str += f"""
76+
- Unused quarantined tests:
77+
· {f"{os.linesep} · ".join(sorted(unused_quarantined_tests))}
78+
"""
79+
80+
return report_str
81+
82+
def mark_test_as_quarantined(self, test_item: _pytest.nodes.Item) -> None:
5683
test_item.add_marker(
5784
pytest.mark.xfail(
5885
reason="Test is quarantined from Mergify CI Insights",
@@ -62,3 +89,4 @@ def mark_test_as_quarantined(test_item: _pytest.nodes.Item) -> None:
6289
),
6390
append=True,
6491
)
92+
self.quarantine_used_by_tests.add(test_item.nodeid)

tests/test_spans_quarantine.py

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -30,6 +30,7 @@ def test_my_very_flaky_success_test():
3030
quarantined_tests=[
3131
"test_spans_quarantine.py::test_my_very_flaky_failure_test",
3232
"test_spans_quarantine.py::test_my_very_flaky_success_test",
33+
"test_spans_quarantine.py::some_other_test",
3334
],
3435
)
3536
assert spans is not None
@@ -95,3 +96,16 @@ def test_my_very_flaky_success_test():
9596
assert spans[
9697
"test_spans_quarantine.py::test_my_very_flaky_success_test"
9798
].attributes["cicd.test.quarantined"]
99+
100+
assert """🛡️ Quarantine
101+
- Repository: foo/bar
102+
- Branch: main
103+
- Quarantined tests fetched from API: 3
104+
105+
- 🔒 Quarantined:
106+
· test_spans_quarantine.py::test_my_very_flaky_failure_test
107+
· test_spans_quarantine.py::test_my_very_flaky_success_test
108+
109+
- Unused quarantined tests:
110+
· test_spans_quarantine.py::some_other_test
111+
""" in result.stdout.str()

0 commit comments

Comments
 (0)