Files
craft-common-actions/tests/test_release_train.py
T
FredApps 3eaa8798ac release_train: --logs is a relative folder inside the current directory (#214)
Closes SonarCloud's path-injection alert on the merged release_train.py (pythonsecurity:S8707):
an absolute path, .., or anything outside the working directory is refused before the folder is
made.
2026-11-12 21:52:12 -05:00

66 lines
2.6 KiB
Python

"""scripts/release_train.py: which apps a train releases, and what it passes on."""
import importlib.util
import os
import tempfile
import unittest
from pathlib import Path
from unittest import mock
ROOT = Path(__file__).resolve().parents[1]
spec = importlib.util.spec_from_file_location("release_train", ROOT / "scripts/release_train.py")
release_train = importlib.util.module_from_spec(spec)
spec.loader.exec_module(release_train)
class TrainTests(unittest.TestCase):
def run_train(self, argv, rc=0):
calls = []
def fake(repo, extra, logs):
calls.append((repo, extra))
return repo, rc, "done"
cwd = os.getcwd()
os.chdir(tempfile.mkdtemp())
try:
with mock.patch.object(release_train, "run_app", side_effect=fake):
code = release_train.main(["--logs", "logs"] + argv)
finally:
os.chdir(cwd)
return code, calls
def test_all_but_the_skipped_apps_with_the_flags_passed_on(self):
code, calls = self.run_train(["--all", "--skip", "figcraft,soundcraft", "--publish", "--", "--part", "patch"])
repos = sorted(r for r, _ in calls)
self.assertEqual(code, 0)
self.assertEqual(len(repos), len(release_train.APPS) - 2)
self.assertNotIn("storytold/figcraft", repos)
self.assertTrue(all(extra == ["--part", "patch", "--publish"] for _, extra in calls))
def test_only_owner_name_repos_and_known_options_reach_cut_release(self):
release_train.check(["storytold/pdfcraft"], ["--part", "patch", "--publish", "--gate-workflow", "CI"])
for repos, extra in [(["--upload-pack=x"], []), (["pdfcraft"], []),
(["storytold/pdfcraft"], ["--commit", "abc"]), (["storytold/pdfcraft"], ["--part", "major"]),
(["storytold/pdfcraft"], ["--version"])]:
with self.assertRaises(SystemExit, msg=f"{repos} {extra}"):
release_train.check(repos, extra)
def test_the_log_folder_stays_inside_the_current_directory(self):
cwd = os.getcwd()
os.chdir(tempfile.mkdtemp())
try:
self.assertEqual(release_train.logs_dir("logs/today"), Path.cwd().resolve() / "logs" / "today")
for bad in ["/tmp/x", "../outside", "logs/../../x", "C:/Windows", "a b"]:
with self.assertRaises(SystemExit, msg=bad):
release_train.logs_dir(bad)
finally:
os.chdir(cwd)
def test_one_stopped_app_fails_the_train(self):
code, _ = self.run_train(["storytold/pdfcraft"], rc=1)
self.assertEqual(code, 1)
if __name__ == "__main__":
unittest.main()