forked from PostHog/posthog
-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathtest_coverage_report.py
More file actions
161 lines (118 loc) · 5.75 KB
/
Copy pathtest_coverage_report.py
File metadata and controls
161 lines (118 loc) · 5.75 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
from __future__ import annotations
import sys
import importlib.util
from pathlib import Path
import pytest
SCRIPT_PATH = Path(__file__).with_name("coverage_report.py")
SPEC = importlib.util.spec_from_file_location("coverage_report", SCRIPT_PATH)
assert SPEC is not None and SPEC.loader is not None
coverage_report = importlib.util.module_from_spec(SPEC)
sys.modules["coverage_report"] = coverage_report
SPEC.loader.exec_module(coverage_report)
# ---------- product_from_path ----------
@pytest.mark.parametrize(
"xml_path,expected",
[
(Path("cov-artifacts/product_analytics.xml"), "product_analytics"),
(Path("products/error_tracking/coverage.xml"), "error_tracking"),
(Path("coverage.xml"), None),
(Path("cov-artifacts/weird;name.xml"), "weird_name"),
(Path("products/weird;name/coverage.xml"), "weird_name"),
],
)
def test_product_from_path(xml_path: Path, expected: str | None) -> None:
assert coverage_report.product_from_path(xml_path) == expected
# ---------- repo_path_for ----------
@pytest.mark.parametrize(
"product,filename,expected",
[
("error_tracking", "api.py", "products/error_tracking/backend/api.py"),
("error_tracking", "migrations/0001.py", "products/error_tracking/backend/migrations/0001.py"),
("error_tracking", "backend/api.py", "products/error_tracking/backend/api.py"),
("error_tracking", "backend", "products/error_tracking/backend"),
],
)
def test_repo_path_for(product: str, filename: str, expected: str) -> None:
assert coverage_report.repo_path_for(product, filename) == expected
# ---------- resolve_core_path ----------
def test_resolve_core_path_passes_through_already_rooted_filenames() -> None:
assert coverage_report.resolve_core_path("posthog/api/auth.py", ["posthog", "ee"], {}) == "posthog/api/auth.py"
def test_resolve_core_path_resolves_against_the_owning_source(tmp_path: Path, monkeypatch: pytest.MonkeyPatch) -> None:
monkeypatch.chdir(tmp_path)
(tmp_path / "ee" / "api").mkdir(parents=True)
(tmp_path / "ee" / "api" / "only_in_ee.py").touch()
assert coverage_report.resolve_core_path("api/only_in_ee.py", ["posthog", "ee"], {}) == "ee/api/only_in_ee.py"
def test_resolve_core_path_falls_back_to_first_source_when_no_candidate_exists(
tmp_path: Path, monkeypatch: pytest.MonkeyPatch
) -> None:
monkeypatch.chdir(tmp_path)
assert coverage_report.resolve_core_path("nowhere.py", ["posthog", "ee"], {}) == "posthog/nowhere.py"
def test_resolve_core_path_warns_and_prefers_posthog_when_a_path_collides(
tmp_path: Path, monkeypatch: pytest.MonkeyPatch, capsys: pytest.CaptureFixture[str]
) -> None:
# A relative path that exists under both roots can't be disambiguated from the coverage
# XML alone — this is the silent-misattribution case the qa-swarm/codex reviews flagged.
monkeypatch.chdir(tmp_path)
(tmp_path / "posthog" / "api").mkdir(parents=True)
(tmp_path / "posthog" / "api" / "authentication.py").touch()
(tmp_path / "ee" / "api").mkdir(parents=True)
(tmp_path / "ee" / "api" / "authentication.py").touch()
resolved = coverage_report.resolve_core_path("api/authentication.py", ["ee", "posthog"], {})
assert resolved == "posthog/api/authentication.py"
assert "::warning::" in capsys.readouterr().err
def test_resolve_core_path_caches_by_filename() -> None:
cache: dict[str, str] = {"api/auth.py": "ee/api/auth.py"}
assert coverage_report.resolve_core_path("api/auth.py", ["posthog"], cache) == "ee/api/auth.py"
# ---------- compress_ranges / format_line_ranges ----------
@pytest.mark.parametrize(
"numbers,expected",
[
([], []),
([5], [(5, 5)]),
([1, 2, 3], [(1, 3)]),
([408, 409, 410, 412], [(408, 410), (412, 412)]),
([3, 1, 2], [(1, 3)]), # unsorted input, duplicates collapse via set()
],
)
def test_compress_ranges(numbers: list[int], expected: list[tuple[int, int]]) -> None:
assert coverage_report.compress_ranges(numbers) == expected
@pytest.mark.parametrize(
"numbers,expected",
[
([], ""),
([408, 409, 410, 412], "408–410, 412"),
([5], "5"),
],
)
def test_format_line_ranges(numbers: list[int], expected: str) -> None:
assert coverage_report.format_line_ranges(numbers) == expected
# ---------- diff_touches_backend ----------
@pytest.mark.parametrize(
"changed_files,expected",
[
(["frontend/src/scene.tsx", "docs/readme.md"], False), # frontend-only PR → safe to clear stale section
(["posthog/api/auth.py"], True),
(["ee/api/auth.py"], True),
(["products/error_tracking/backend/api.py"], True),
(["products/error_tracking/frontend/scene.tsx"], False), # product frontend is not measured
(["posthog/README.md"], False), # non-.py under a backend root is not measured
([], False),
],
)
def test_diff_touches_backend(monkeypatch: pytest.MonkeyPatch, changed_files: list[str], expected: bool) -> None:
def fake_run(*args: object, **kwargs: object) -> object:
class Proc:
returncode = 0
stdout = "\n".join(changed_files)
return Proc()
monkeypatch.setattr(coverage_report.subprocess, "run", fake_run)
assert coverage_report.diff_touches_backend("origin/master") is expected
def test_diff_touches_backend_is_undetermined_when_git_fails(monkeypatch: pytest.MonkeyPatch) -> None:
# Undetermined (not False) on git failure — False would clear a possibly-real warning.
def fake_run(*args: object, **kwargs: object) -> object:
class Proc:
returncode = 128
stdout = ""
return Proc()
monkeypatch.setattr(coverage_report.subprocess, "run", fake_run)
assert coverage_report.diff_touches_backend("origin/master") is None