From 276bbf7ab27578ea710d1b79450140322608bfce Mon Sep 17 00:00:00 2001 From: adlee-was-taken Date: Sun, 5 Apr 2026 13:21:04 -0400 Subject: [PATCH] test(sim): guard simulator shell scripts with bash -n + shellcheck Co-Authored-By: Claude Opus 4.6 (1M context) --- tests/unit/test_sim_script.py | 42 +++++++++++++++++++++++++++++++++++ 1 file changed, 42 insertions(+) create mode 100644 tests/unit/test_sim_script.py diff --git a/tests/unit/test_sim_script.py b/tests/unit/test_sim_script.py new file mode 100644 index 0000000..07994dd --- /dev/null +++ b/tests/unit/test_sim_script.py @@ -0,0 +1,42 @@ +"""Guard shell scripts in scripts/ against syntax regressions.""" + +from __future__ import annotations + +import shutil +import subprocess +from pathlib import Path + +import pytest + +REPO_ROOT = Path(__file__).resolve().parents[2] +SCRIPTS = [ + REPO_ROOT / "scripts" / "sim_cameras.sh", + REPO_ROOT / "scripts" / "download_mediamtx.sh", +] + + +@pytest.mark.parametrize("script", SCRIPTS, ids=lambda p: p.name) +def test_script_exists(script: Path) -> None: + assert script.is_file(), f"missing script: {script}" + + +@pytest.mark.parametrize("script", SCRIPTS, ids=lambda p: p.name) +def test_bash_syntax(script: Path) -> None: + result = subprocess.run( + ["bash", "-n", str(script)], + capture_output=True, + text=True, + ) + assert result.returncode == 0, f"bash -n failed:\n{result.stderr}" + + +@pytest.mark.parametrize("script", SCRIPTS, ids=lambda p: p.name) +def test_shellcheck(script: Path) -> None: + if shutil.which("shellcheck") is None: + pytest.skip("shellcheck not installed") + result = subprocess.run( + ["shellcheck", "--severity=warning", str(script)], + capture_output=True, + text=True, + ) + assert result.returncode == 0, f"shellcheck failed:\n{result.stdout}\n{result.stderr}"