44 lines
1.9 KiB
Python
44 lines
1.9 KiB
Python
"""Проверка, что сторож пропусков кричит под Actions (#2871)."""
|
|
|
|
from __future__ import annotations
|
|
|
|
import types
|
|
|
|
import tests.conftest as ct
|
|
|
|
|
|
def _run_guard(monkeypatch, capsys, *, ci: bool, observed: set[str]) -> str:
|
|
monkeypatch.setattr(ct, "_observed_skips", observed)
|
|
monkeypatch.setattr(ct, "_allowed_skips", lambda: set())
|
|
monkeypatch.delenv("GITHUB_ACTIONS", raising=False)
|
|
monkeypatch.delenv("CI", raising=False)
|
|
if ci:
|
|
monkeypatch.setenv("GITHUB_ACTIONS", "true")
|
|
session = types.SimpleNamespace(exitstatus=0)
|
|
ct.pytest_sessionfinish(session, 0)
|
|
return capsys.readouterr().out, session.exitstatus
|
|
|
|
|
|
def test_guard_emits_error_annotation_under_actions(monkeypatch, capsys) -> None:
|
|
out, rc = _run_guard(monkeypatch, capsys, ci=True, observed={"tests/x.py::test_y"})
|
|
assert "::error::" in out, "под Actions сторож обязан подниматься в аннотации"
|
|
assert "tests/x.py::test_y" in out
|
|
assert rc == 1
|
|
|
|
|
|
def test_guard_stays_quiet_locally(monkeypatch, capsys) -> None:
|
|
"""Контроль: локально ::error:: не нужен, человеческое сообщение остаётся."""
|
|
out, rc = _run_guard(monkeypatch, capsys, ci=False, observed={"tests/x.py::test_y"})
|
|
assert "::error::" not in out
|
|
assert "НЕУЧТЁННЫЙ ПРОПУСК" in out
|
|
assert rc == 1
|
|
|
|
|
|
def test_guard_silent_when_all_skips_declared(monkeypatch, capsys) -> None:
|
|
"""Контроль: без незадекларированных пропусков сторож молчит и не роняет."""
|
|
monkeypatch.setattr(ct, "_observed_skips", set())
|
|
monkeypatch.setattr(ct, "_allowed_skips", lambda: set())
|
|
session = types.SimpleNamespace(exitstatus=0)
|
|
ct.pytest_sessionfinish(session, 0)
|
|
assert capsys.readouterr().out == ""
|
|
assert session.exitstatus == 0
|