diff --git a/tests/examples/conftest.py b/tests/examples/conftest.py index c41132d4f..b17e58cd3 100644 --- a/tests/examples/conftest.py +++ b/tests/examples/conftest.py @@ -26,7 +26,7 @@ SUBMODULES_PATH = MODULES_PATH / 'cloud-config-container' FILE_TEST_RE = re.compile(r'# tftest file (\w+) ([\S]+)') -Example = collections.namedtuple('Example', 'code files') +Example = collections.namedtuple('Example', 'code module files') File = collections.namedtuple('File', 'path content') @@ -64,8 +64,8 @@ def pytest_generate_tests(metafunc): if 'tftest skip' in code: continue if child.lang == 'hcl': - examples.append(Example(code, files)) path = module.relative_to(FABRIC_ROOT) + examples.append(Example(code, path, files)) name = f'{path}:{last_header}' if index > 1: name += f' {index}' diff --git a/tests/examples/test_plan.py b/tests/examples/test_plan.py index 2bb45af12..d5aaf46fe 100644 --- a/tests/examples/test_plan.py +++ b/tests/examples/test_plan.py @@ -16,16 +16,20 @@ import re from pathlib import Path BASE_PATH = Path(__file__).parent -COUNT_TEST_RE = re.compile( - r'# tftest modules=(\d+) resources=(\d+)(?: files=([\w,]+))?') +COUNT_TEST_RE = re.compile(r'# tftest modules=(\d+) resources=(\d+)' + + r'(?: files=([\w,-.]+))?' + + r'(?: inventory=([\w\-.]+))?') -def test_example(recursive_e2e_plan_runner, tmp_path, example): +def test_example(plan_validator, tmp_path, example): if match := COUNT_TEST_RE.search(example.code): - (tmp_path / 'fabric').symlink_to(Path(BASE_PATH, '../../')) - (tmp_path / 'variables.tf').symlink_to(Path(BASE_PATH, 'variables.tf')) + (tmp_path / 'fabric').symlink_to(BASE_PATH.parents[1]) + (tmp_path / 'variables.tf').symlink_to(BASE_PATH / 'variables.tf') (tmp_path / 'main.tf').write_text(example.code) + expected_modules = int(match.group(1)) + expected_resources = int(match.group(2)) + if match.group(3) is not None: requested_files = match.group(3).split(',') for f in requested_files: @@ -33,11 +37,18 @@ def test_example(recursive_e2e_plan_runner, tmp_path, example): destination.parent.mkdir(parents=True, exist_ok=True) destination.write_text(example.files[f].content) - expected_modules = int(match.group(1)) if match is not None else 1 - expected_resources = int(match.group(2)) if match is not None else 1 + inventory = [] + if match.group(4) is not None: + inventory = BASE_PATH.parent / example.module / 'examples' + inventory = inventory / match.group(4) - num_modules, num_resources = recursive_e2e_plan_runner( - str(tmp_path), tmpdir=False) + # TODO: force plan_validator to never copy files (we're already + # running from a temp dir) + summary = plan_validator(module_path=tmp_path, inventory_paths=inventory, + tf_var_files=[]) + + counts = summary.counts + num_modules, num_resources = counts['modules'], counts['resources'] assert expected_modules == num_modules, 'wrong number of modules' assert expected_resources == num_resources, 'wrong number of resources' diff --git a/tests/fixtures.py b/tests/fixtures.py index c483063f4..788f81786 100644 --- a/tests/fixtures.py +++ b/tests/fixtures.py @@ -103,6 +103,7 @@ def plan_summary(module_path, basedir, tf_var_files=None, **tf_vars): # compute resource type counts and address->values map values = {} counts = collections.defaultdict(int) + counts['modules'] = counts['resources'] = 0 q = collections.deque([plan.root_module]) while q: e = q.popleft() @@ -113,8 +114,10 @@ def plan_summary(module_path, basedir, tf_var_files=None, **tf_vars): values[e['address']] = e['values'] for x in e.get('resources', []): + counts['resources'] += 1 q.append(x) for x in e.get('child_modules', []): + counts['modules'] += 1 q.append(x) # extract planned outputs @@ -224,7 +227,7 @@ def plan_validator_fixture(request): basedir = Path(request.fspath).parent return plan_validator(module_path=module_path, inventory_paths=inventory_paths, basedir=basedir, - tf_var_files=tf_var_paths, **tf_vars) + tf_var_files=tf_var_files, **tf_vars) return inner