add fixture to capture output in tests less fragile

Now we always remove previous output before capturing.
This commit is contained in:
Jörg Thalheim
2024-08-15 18:21:27 +02:00
parent 6d764b35f7
commit e51905545d
6 changed files with 50 additions and 24 deletions

View File

@@ -15,6 +15,7 @@ pytest_plugins = [
"ports",
"host_group",
"fixtures_flakes",
"stdout",
]

View File

@@ -0,0 +1,23 @@
from typing import Any
import pytest
from pytest import CaptureFixture
class CaptureOutput:
def __init__(self, capsys: CaptureFixture) -> None:
self.capsys = capsys
def __enter__(self) -> "CaptureOutput":
self.capsys.readouterr()
return self
def __exit__(self, exc_type: Any, exc_value: Any, exc_traceback: Any) -> bool:
res = self.capsys.readouterr()
self.out = res.out
self.err = res.err
@pytest.fixture
def capture_output(capsys: CaptureFixture) -> CaptureOutput:
return CaptureOutput(capsys)

View File

@@ -1,9 +1,9 @@
import pytest
from helpers import cli
from stdout import CaptureOutput
def test_help(capsys: pytest.CaptureFixture) -> None:
with pytest.raises(SystemExit):
def test_help(capture_output: CaptureOutput) -> None:
with capture_output as output, pytest.raises(SystemExit):
cli.run(["--help"])
captured = capsys.readouterr()
assert captured.out.startswith("usage:")
assert output.out.startswith("usage:")

View File

@@ -5,14 +5,15 @@ from pathlib import Path
import pytest
from fixtures_flakes import substitute
from helpers import cli
from stdout import CaptureOutput
@pytest.mark.impure
def test_create_flake(
monkeypatch: pytest.MonkeyPatch,
capsys: pytest.CaptureFixture,
temporary_home: Path,
clan_core: Path,
capture_output: CaptureOutput,
) -> None:
flake_dir = temporary_home / "test-flake"
@@ -29,7 +30,6 @@ def test_create_flake(
monkeypatch.chdir(flake_dir)
cli.run(["machines", "create", "machine1"])
capsys.readouterr() # flush cache
# create a hardware-configuration.nix that doesn't throw an eval error
@@ -39,8 +39,9 @@ def test_create_flake(
) as hw_config_nix:
hw_config_nix.write("{}")
with capture_output as output:
cli.run(["machines", "list"])
assert "machine1" in capsys.readouterr().out
assert "machine1" in output.out
flake_show = subprocess.run(
["nix", "flake", "show", "--json"],
check=True,
@@ -57,9 +58,9 @@ def test_create_flake(
@pytest.mark.impure
def test_ui_template(
monkeypatch: pytest.MonkeyPatch,
capsys: pytest.CaptureFixture,
temporary_home: Path,
clan_core: Path,
capture_output: CaptureOutput,
) -> None:
flake_dir = temporary_home / "test-flake"
url = f"{clan_core}#minimal"
@@ -73,10 +74,10 @@ def test_ui_template(
monkeypatch.chdir(flake_dir)
cli.run(["machines", "create", "machine1"])
capsys.readouterr() # flush cache
with capture_output as output:
cli.run(["machines", "list"])
assert "machine1" in capsys.readouterr().out
assert "machine1" in output.out
flake_show = subprocess.run(
["nix", "flake", "show", "--json"],
check=True,

View File

@@ -4,7 +4,7 @@ from typing import TYPE_CHECKING
import pytest
from fixtures_flakes import FlakeForTest
from helpers import cli
from pytest import CaptureFixture
from stdout import CaptureOutput
from clan_cli.dirs import user_history_file
from clan_cli.history.add import HistoryEntry
@@ -32,15 +32,15 @@ def test_history_add(
@pytest.mark.impure
def test_history_list(
capsys: CaptureFixture,
capture_output: CaptureOutput,
test_flake_with_core: FlakeForTest,
) -> None:
capsys.readouterr()
with capture_output as output:
cli.run(["history", "list"])
assert str(test_flake_with_core.path) not in capsys.readouterr().out
assert str(test_flake_with_core.path) not in output.out
cli.run(["history", "add", f"clan://{test_flake_with_core.path}#vm1"])
capsys.readouterr()
with capture_output as output:
cli.run(["history", "list"])
assert str(test_flake_with_core.path) in capsys.readouterr().out
assert str(test_flake_with_core.path) in output.out

View File

@@ -3,6 +3,7 @@ from pathlib import Path
from typing import TYPE_CHECKING
import pytest
from stdout import CaptureOutput
from tests.fixtures_flakes import FlakeForTest, generate_flake
from tests.helpers import cli
@@ -18,11 +19,11 @@ no_kvm = not os.path.exists("/dev/kvm")
@pytest.mark.impure
def test_inspect(
test_flake_with_core: FlakeForTest, capsys: pytest.CaptureFixture
test_flake_with_core: FlakeForTest, capture_output: CaptureOutput
) -> None:
with capture_output as output:
cli.run(["vms", "inspect", "--flake", str(test_flake_with_core.path), "vm1"])
out = capsys.readouterr() # empty the buffer
assert "Cores" in out.out
assert "Cores" in output.out
@pytest.mark.skipif(no_kvm, reason="Requires KVM")