test_package_config.py (2874B)
1 # This file is in the public domain. 2 3 import stat 4 import tempfile 5 import tomllib 6 import unittest 7 from dataclasses import replace 8 from pathlib import Path 9 10 from buildscripts.package_config import ( 11 ConfigError, 12 load_config, 13 parse_config, 14 serialize_config, 15 write_config, 16 ) 17 18 19 VALID_CONFIG = { 20 "repositories": { 21 "workspace": { 22 "url": "git://example.test/workspace.git", 23 "builder": "pnpm-workspace", 24 } 25 }, 26 "packages": { 27 "application": { 28 "repository": "workspace", 29 "tag": "v1.2.3", 30 "debian_path": "packages/application", 31 "dependencies": ["library"], 32 "enabled": True, 33 }, 34 "library": {"repository": "workspace", "tag": "v1.2.2"}, 35 }, 36 } 37 38 39 class PackageConfigTests(unittest.TestCase): 40 def test_defaults_match_packaging_ng(self): 41 config = parse_config(VALID_CONFIG) 42 library = config.packages["library"] 43 self.assertEqual("", library.debian_path) 44 self.assertEqual((), library.dependencies) 45 self.assertTrue(library.enabled) 46 self.assertEqual("pnpm-workspace", config.builder_for(library)) 47 48 def test_rejects_unknown_fields_references_and_cycles(self): 49 with self.assertRaisesRegex(ConfigError, "unknown field"): 50 parse_config({**VALID_CONFIG, "surprise": {}}) 51 data = { 52 **VALID_CONFIG, 53 "packages": { 54 **VALID_CONFIG["packages"], 55 "library": { 56 **VALID_CONFIG["packages"]["library"], 57 "dependencies": ["application"], 58 }, 59 }, 60 } 61 with self.assertRaisesRegex(ConfigError, "application -> library -> application"): 62 parse_config(data) 63 64 def test_serializer_round_trips_and_atomic_writer_preserves_mode(self): 65 config = parse_config(VALID_CONFIG) 66 serialized = serialize_config(config) 67 self.assertEqual(config, parse_config(tomllib.loads(serialized))) 68 with tempfile.TemporaryDirectory() as temporary: 69 path = Path(temporary) / "packages.toml" 70 path.write_text("old\n", encoding="utf-8") 71 path.chmod(0o640) 72 write_config(path, config) 73 self.assertEqual(config, load_config(path)) 74 self.assertEqual(0o640, stat.S_IMODE(path.stat().st_mode)) 75 76 def test_repository_change_is_represented_in_config(self): 77 config = parse_config(VALID_CONFIG) 78 repositories = dict(config.repositories) 79 repositories["workspace"] = replace( 80 repositories["workspace"], url="git://example.test/new.git" 81 ) 82 changed = replace(config, repositories=repositories) 83 self.assertNotEqual(serialize_config(config), serialize_config(changed)) 84 85 86 if __name__ == "__main__": 87 unittest.main()