a8c4a3125d
We basically apply the change from https://github.com/mpounsett/nagiosplugin/issues/24 as a fixture, but only when nagiosplugin's version is old.
77 lines
2 KiB
Python
77 lines
2 KiB
Python
import logging
|
|
import sys
|
|
from pathlib import Path
|
|
from threading import Thread
|
|
from typing import Any, Iterator, Tuple
|
|
from unittest.mock import patch
|
|
|
|
if sys.version_info >= (3, 8):
|
|
from importlib.metadata import version as metadata_version
|
|
else:
|
|
from importlib_metadata import version as metadata_version
|
|
|
|
import pytest
|
|
from click.testing import CliRunner
|
|
|
|
from . import PatroniAPI
|
|
|
|
logger = logging.getLogger(__name__)
|
|
|
|
|
|
def numversion(pkgname: str) -> Tuple[int, ...]:
|
|
version = metadata_version(pkgname)
|
|
return tuple(int(v) for v in version.split(".", 3))
|
|
|
|
|
|
if numversion("pytest") >= (6, 2):
|
|
TempPathFactory = pytest.TempPathFactory
|
|
else:
|
|
from _pytest.tmpdir import TempPathFactory
|
|
|
|
|
|
@pytest.fixture(scope="session", autouse=True)
|
|
def nagioplugin_runtime_stdout() -> Iterator[None]:
|
|
# work around https://github.com/mpounsett/nagiosplugin/issues/24 when
|
|
# nagiosplugin is older than 1.3.3
|
|
if numversion("nagiosplugin") < (1, 3, 3):
|
|
target = "nagiosplugin.runtime.Runtime.stdout"
|
|
with patch(target, None):
|
|
logger.warning("patching %r", target)
|
|
yield None
|
|
else:
|
|
yield None
|
|
|
|
|
|
@pytest.fixture(
|
|
params=[False, True],
|
|
ids=lambda v: "new-replica-state" if v else "old-replica-state",
|
|
)
|
|
def old_replica_state(request: Any) -> Any:
|
|
return request.param
|
|
|
|
|
|
@pytest.fixture(scope="session")
|
|
def datadir() -> Path:
|
|
return Path(__file__).parent / "json"
|
|
|
|
|
|
@pytest.fixture(scope="session")
|
|
def patroni_api(
|
|
tmp_path_factory: TempPathFactory, datadir: Path
|
|
) -> Iterator[PatroniAPI]:
|
|
"""A fake HTTP server for the Patroni API serving files from a temporary
|
|
directory.
|
|
"""
|
|
httpd = PatroniAPI(tmp_path_factory.mktemp("api"), datadir=datadir)
|
|
t = Thread(target=httpd.serve_forever)
|
|
t.start()
|
|
yield httpd
|
|
httpd.shutdown()
|
|
t.join()
|
|
|
|
|
|
@pytest.fixture
|
|
def runner() -> CliRunner:
|
|
"""A CliRunner with stdout and stderr not mixed."""
|
|
return CliRunner(mix_stderr=False)
|