mirror of
https://github.com/Shu-Ying/main_plugin_farm.git
synced 2026-10-29 21:59:58 +08:00
49 lines
1.9 KiB
Python
49 lines
1.9 KiB
Python
import ast
|
|||
|
|
import sys
|
||
|
|
import unittest
|
||
|
|
from pathlib import Path
|
||
|
|
from unittest.mock import patch
|
||
|
|
|
||
|
|
ROOT = Path(__file__).resolve().parents[1]
|
||
|
|
sys.path.insert(0, str(ROOT / "scripts"))
|
||
|
|
from format_generated import format_generated
|
||
|
|
|
||
|
|
|
||
|
|
class FormatGeneratedTests(unittest.TestCase):
|
||
|
|
def test_formats_sorts_and_is_idempotent_without_changing_assets(self):
|
||
|
|
files = {
|
||
|
|
"package/main.py": (
|
||
|
|
b"import sys\r\nimport os\r\n\r\n"
|
||
|
|
b"def run( ):\r\n return 'ok',os.name,sys.version\r\n"
|
||
|
|
),
|
||
|
|
"images/example.png": b"unchanged binary\x00",
|
||
|
|
}
|
||
|
|
format_generated(ROOT, files)
|
||
|
|
source = files["package/main.py"]
|
||
|
|
self.assertTrue(source.startswith(b"import os\nimport sys\n"))
|
||
|
|
self.assertIn(b' return "ok", os.name, sys.version\n', source)
|
||
|
|
self.assertNotIn(b"\r", source)
|
||
|
|
ast.parse(source, feature_version=(3, 10))
|
||
|
|
self.assertEqual(files["images/example.png"], b"unchanged binary\x00")
|
||
|
|
first = files.copy()
|
||
|
|
format_generated(ROOT, files)
|
||
|
|
self.assertEqual(files, first)
|
||
|
|
|
||
|
|
def test_ruff_failure_does_not_partially_update_file_collection(self):
|
||
|
|
files = {"good.py": b"x=1\n", "bad.py": b"def broken(:\n"}
|
||
|
|
before = files.copy()
|
||
|
|
with self.assertRaisesRegex(RuntimeError, "failed Ruff"):
|
||
|
|
format_generated(ROOT, files)
|
||
|
|
self.assertEqual(files, before)
|
||
|
|
|
||
|
|
def test_rejects_unsafe_paths_and_missing_ruff(self):
|
||
|
|
for name in ("../outside.py", "C:/outside.py", "/outside.py"):
|
||
|
|
with self.subTest(name=name):
|
||
|
|
with self.assertRaisesRegex(ValueError, "Unsafe"):
|
||
|
|
format_generated(ROOT, {name: b"x=1\n"})
|
||
|
|
with patch(
|
||
|
|
"format_generated.importlib.util.find_spec", return_value=None
|
||
|
|
):
|
||
|
|
with self.assertRaisesRegex(RuntimeError, "requirements-build"):
|
||
|
|
format_generated(ROOT, {"main.py": b"x=1\n"})
|