"""Проверка, что сторож пропусков кричит под 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