sandcastle-ng

Scripts for the deployment of Sandcastle (GNU Taler)
Log | Files | Refs | README

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()