Skip to content

Commit 038cffb

Browse files
authored
Merge pull request #40 from enix/fix_keep_servers_after_fail
Fix --keep-servers-after-fail option by retrieving test result inside fixture
2 parents 2f805eb + e4afa0e commit 038cffb

File tree

2 files changed

+33
-7
lines changed

2 files changed

+33
-7
lines changed

tests/conftest.py

+5-3
Original file line numberDiff line numberDiff line change
@@ -14,16 +14,18 @@
1414
install_galaxy_deps,
1515
run_ansible_playbook,
1616
)
17-
from tests.helpers.provider import cluster, provider # noqa: F401, Those are fixtures
1817
from tests.helpers.terraform import TerraformCompose
1918
from tests.helpers.vagrant import LocalVagrant
2019

2120
DEFAULT_OS = ["ubuntu2204"]
2221
ALL_OS = ["ubuntu2004", "ubuntu2204", "debian11"]
2322

2423

24+
pytest_plugins = ["tests.helpers.provider"]
25+
26+
2527
def pytest_addoption(parser):
26-
TRUE_VALUES = ["true", "yes", "y", "1"]
28+
TRUE_VALUES = ["true", "yes", "y", "1", True]
2729
parser.addoption(
2830
"--keep-servers",
2931
dest="keep_servers",
@@ -36,7 +38,7 @@ def pytest_addoption(parser):
3638
"--keep-servers-after-fail",
3739
dest="keep_servers_after_fail",
3840
nargs="?",
39-
type=bool,
41+
type=lambda arg: arg in TRUE_VALUES,
4042
const=True,
4143
default=os.environ.get("KEEP_SERVERS_AFTER_FAIL", "true").lower()
4244
in TRUE_VALUES,

tests/helpers/provider.py

+28-4
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,23 @@
11
import os
2+
from typing import Dict
23

34
import pytest
45
import tenacity
6+
from pytest import CollectReport, StashKey
7+
8+
# https://docs.pytest.org/en/latest/example/simple.html#making-test-result-information-available-in-fixtures
9+
phase_report_key = StashKey[Dict[str, CollectReport]]()
10+
11+
12+
@pytest.hookimpl(tryfirst=True, hookwrapper=True)
13+
def pytest_runtest_makereport(item, call):
14+
# execute all other hooks to obtain the report object
15+
outcome = yield
16+
rep = outcome.get_result()
17+
18+
# store test results for each phase of a call, which can
19+
# be "setup", "call", "teardown"
20+
item.stash.setdefault(phase_report_key, {})[rep.when] = rep
521

622

723
@pytest.fixture
@@ -15,18 +31,26 @@ def provider(request):
1531

1632

1733
@tenacity.retry(reraise=True, stop=tenacity.stop_after_attempt(2))
18-
def cluster_spawn(provider):
34+
def cluster_spawn(provider, keep_servers):
1935
provider.init()
36+
if not keep_servers:
37+
provider.destroy()
2038
provider.apply()
2139

2240

2341
@pytest.fixture
2442
def cluster(request, provider, operating_system):
43+
keep_servers = request.config.getoption("keep_servers")
44+
keep_after_fail = request.config.getoption("keep_servers_after_fail")
2545
try:
26-
cluster_spawn(provider)
46+
cluster_spawn(provider, keep_servers)
2747
yield provider.cluster()
28-
if not request.config.getoption("keep_servers"):
48+
report = request.node.stash[phase_report_key]
49+
if "call" in report and report["call"].failed:
50+
if not keep_after_fail:
51+
provider.destroy()
52+
elif not keep_servers:
2953
provider.destroy()
3054
except Exception:
31-
if not request.config.getoption("keep_servers_after_fail"):
55+
if not keep_after_fail:
3256
provider.destroy()

0 commit comments

Comments
 (0)