mirror of
https://github.com/storytold/craft-common-actions.git
synced 2026-11-15 15:02:24 +00:00
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.
66 lines
2.6 KiB
Python
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()
|