import importlib.util import tempfile import unittest from pathlib import Path MODULE_PATH = Path(__file__).resolve().parents[1] / "tools/validate_repo.py" SPEC = importlib.util.spec_from_file_location("validate_repo", MODULE_PATH) assert SPEC and SPEC.loader VALIDATOR = importlib.util.module_from_spec(SPEC) SPEC.loader.exec_module(VALIDATOR) class ParserTests(unittest.TestCase): def test_scalar_and_array(self): text = "name='demo'\narchitectures=('amd64' 'arm64')\n" self.assertEqual(VALIDATOR.scalar(text, "name"), "demo") self.assertEqual( VALIDATOR.array(text, "architectures"), ["amd64", "arm64"] ) def test_source_arrays_include_architectures(self): text = "sources=('one')\n\nsources_arm64=(\n 'two'\n)\n" self.assertEqual( VALIDATOR.source_arrays(text), {"sources": ["one"], "sources_arm64": ["two"]}, ) def test_local_source_rejects_traversal(self): self.assertEqual(VALIDATOR.local_source_name("local:///LICENSE"), "LICENSE") self.assertEqual(VALIDATOR.local_source_name("local:///../secret"), "") self.assertIsNone(VALIDATOR.local_source_name("https://example.com/file")) def test_markdown_targets(self): text = "[Doc](docs/guide.md) " self.assertEqual( VALIDATOR.markdown_targets(text), {"docs/guide.md", "assets/icon.svg"} ) class LinkTests(unittest.TestCase): def test_missing_link_is_reported(self): with tempfile.TemporaryDirectory() as directory: path = Path(directory) / "README.md" path.write_text("[missing](no.md)\n", encoding="utf-8") old_root = VALIDATOR.ROOT VALIDATOR.ROOT = Path(directory) try: errors = [] VALIDATOR.validate_links(path, errors) self.assertEqual(len(errors), 1) finally: VALIDATOR.ROOT = old_root if __name__ == "__main__": unittest.main()