Skip to content

Commit ac2771b

Browse files
committed
test(golden): parametrized corpus tests with actionable hints
One parametrized test per case for build + package output. Mismatch hint points at update_goldens.py and explains the semver gate's expectations.
1 parent 5c72dd8 commit ac2771b

2 files changed

Lines changed: 69 additions & 0 deletions

File tree

tests/golden/conftest.py

Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,21 @@
1+
"""Pytest fixtures for the golden-template corpus.
2+
3+
Each case directory under tests/golden/templates/ becomes one parametrized
4+
test ID (relative path), enabling `pytest -k <name>` selection.
5+
"""
6+
7+
from pathlib import Path
8+
9+
import pytest
10+
11+
TEMPLATES_ROOT = Path(__file__).parent / "templates"
12+
13+
14+
def pytest_generate_tests(metafunc):
15+
if "golden_case" in metafunc.fixturenames:
16+
cases = sorted(p.parent for p in TEMPLATES_ROOT.rglob("template.yaml"))
17+
metafunc.parametrize(
18+
"golden_case",
19+
cases,
20+
ids=lambda p: str(p.relative_to(TEMPLATES_ROOT)),
21+
)

tests/golden/test_corpus.py

Lines changed: 48 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,48 @@
1+
"""Golden corpus: byte-exact diff for build + package output per case."""
2+
3+
from pathlib import Path
4+
5+
import pytest
6+
7+
from tests.golden.harness import run_build_pipeline, run_package_pipeline
8+
from tests.golden.normalize import normalize
9+
from tests.golden.update_goldens import _read_metadata, _resolve_le_default
10+
11+
TEMPLATES_ROOT = Path(__file__).parent / "templates"
12+
13+
14+
def _hint(case_dir: Path) -> str:
15+
rel = case_dir.relative_to(TEMPLATES_ROOT)
16+
return (
17+
f"\nGolden mismatch in {rel}.\n"
18+
f"To inspect: python tests/golden/update_goldens.py --diff --filter '{rel}'\n"
19+
f"To re-pin: python tests/golden/update_goldens.py --filter '{rel}'\n"
20+
f"If intentional:\n"
21+
f" - new case (added expected.*.yaml) -> no version bump at PR time\n"
22+
f" - modified/deleted existing expected.* -> bump major in samcli/__init__.py\n"
23+
)
24+
25+
26+
def test_build_output_matches_golden(golden_case):
27+
meta = _read_metadata(golden_case)
28+
le_enabled = _resolve_le_default(golden_case, meta)
29+
actual = normalize(
30+
run_build_pipeline(golden_case / "template.yaml", language_extensions=le_enabled)
31+
)
32+
expected_path = golden_case / "expected.build.yaml"
33+
assert expected_path.exists(), f"missing {expected_path}; run update_goldens.py --new"
34+
expected = expected_path.read_text(encoding="utf-8")
35+
assert actual == expected, _hint(golden_case)
36+
37+
38+
def test_package_output_matches_golden(golden_case):
39+
meta = _read_metadata(golden_case)
40+
le_enabled = _resolve_le_default(golden_case, meta)
41+
build_out = run_build_pipeline(
42+
golden_case / "template.yaml", language_extensions=le_enabled
43+
)
44+
actual = normalize(run_package_pipeline(golden_case / "template.yaml", build_out))
45+
expected_path = golden_case / "expected.package.yaml"
46+
assert expected_path.exists(), f"missing {expected_path}; run update_goldens.py --new"
47+
expected = expected_path.read_text(encoding="utf-8")
48+
assert actual == expected, _hint(golden_case)

0 commit comments

Comments
 (0)