diff --git a/tests/conftest.py b/tests/conftest.py index 781c71f..30c6274 100644 --- a/tests/conftest.py +++ b/tests/conftest.py @@ -8,8 +8,28 @@ from contextlib import suppress from pathlib import Path from typing import Any +import pytest -def pytest_configure() -> None: + +def pytest_addoption(parser: pytest.Parser) -> None: + """Register custom command-line options for optional integration tests.""" + parser.addoption( + "--run-real-git-backup-tests", + action="store_true", + default=False, + help="Run tests that push git backup state to a real repository.", + ) + + +def pytest_configure(config: pytest.Config) -> None: + """Configure test markers and isolate persistent app state per xdist worker.""" + config.addinivalue_line( + "markers", + "real_git_backup_push: marks tests that push git backup state to a real git repo", + ) + + +def pytest_sessionstart(session: pytest.Session) -> None: """Isolate persistent app state per xdist worker to avoid cross-worker test interference.""" worker_id: str = os.environ.get("PYTEST_XDIST_WORKER", "gw0") worker_data_dir: Path = Path(tempfile.gettempdir()) / "discord-rss-bot-tests" / worker_id @@ -38,3 +58,16 @@ def pytest_configure() -> None: get_reader: Any = getattr(settings_module, "get_reader", None) if callable(get_reader): main_module.reader = get_reader() + + +def pytest_collection_modifyitems(config: pytest.Config, items: list[pytest.Item]) -> None: + """Skip real git-repo push tests unless explicitly requested.""" + if config.getoption("--run-real-git-backup-tests"): + return + + skip_real_push = pytest.mark.skip( + reason="requires --run-real-git-backup-tests option to run", + ) + for item in items: + if "real_git_backup_push" in item.keywords: + item.add_marker(skip_real_push) diff --git a/tests/test_git_backup.py b/tests/test_git_backup.py index 0fa6f8e..8275cea 100644 --- a/tests/test_git_backup.py +++ b/tests/test_git_backup.py @@ -304,6 +304,7 @@ def test_commit_state_change_no_push_when_remote_unset(monkeypatch: pytest.Monke assert not push_calls, "git push should NOT be called when GIT_BACKUP_REMOTE is not set" +@pytest.mark.real_git_backup_push @SKIP_IF_NO_GIT def test_commit_state_change_e2e_push_to_bare_repo(monkeypatch: pytest.MonkeyPatch, tmp_path: Path) -> None: """End-to-end test: commit_state_change pushes to a real bare git repository."""