taler-deployment

Deployment scripts and configuration files
Log | Files | Refs | README

test_buildlib.py (5819B)


      1 #!/usr/bin/env python3
      2 
      3 # This file is in the public domain.
      4 
      5 import json
      6 import sys
      7 import tempfile
      8 import unittest
      9 from pathlib import Path
     10 from unittest.mock import patch
     11 
     12 BUILDSCRIPTS = Path(__file__).parents[1] / "buildscripts"
     13 sys.path.insert(0, str(BUILDSCRIPTS))
     14 
     15 import buildlib  # noqa: E402
     16 from package_config import ConfigError, parse_config  # noqa: E402
     17 
     18 
     19 class BuildLibraryTests(unittest.TestCase):
     20     def test_local_repository_keeps_packages_for_all_architectures(self):
     21         with tempfile.TemporaryDirectory() as temporary_directory:
     22             package_directory = Path(temporary_directory)
     23 
     24             with (
     25                 patch.object(buildlib, "PKGDIR", package_directory),
     26                 patch.object(buildlib.os, "chdir"),
     27                 patch.object(buildlib, "run_cmd") as run_cmd,
     28                 patch("builtins.open", unittest.mock.mock_open()),
     29             ):
     30                 buildlib.scan_local_repository()
     31 
     32         scan, update = run_cmd.call_args_list
     33         self.assertIn("dpkg-scanpackages --multiversion", scan.args[0])
     34         self.assertTrue(scan.kwargs["shell"])
     35         self.assertEqual(["apt-get", "update"], update.args[0])
     36 
     37     def test_pnpm_workspace_is_installed_and_built_once(self):
     38         with tempfile.TemporaryDirectory() as temporary_directory:
     39             root = Path(temporary_directory)
     40             package_paths = [root / "one", root / "two"]
     41             for number, package_path in enumerate(package_paths, start=1):
     42                 package_path.mkdir()
     43                 (package_path / "package.json").write_text(
     44                     json.dumps({"name": f"@example/package-{number}"})
     45                 )
     46 
     47             with patch.object(buildlib, "run_cmd") as run_cmd:
     48                 buildlib._prepare_pnpm_workspace(root, package_paths)
     49 
     50         self.assertEqual(2, run_cmd.call_count)
     51         install, build = run_cmd.call_args_list
     52         self.assertEqual("install", install.args[0][1])
     53         self.assertEqual("run", build.args[0][1])
     54         self.assertEqual(2, install.args[0].count("--filter"))
     55         self.assertEqual(2, build.args[0].count("--filter"))
     56 
     57     def test_group_validation_requires_equal_revision_and_builder(self):
     58         config = parse_config(
     59             {
     60                 "repositories": {
     61                     "repo": {
     62                         "url": "git://example.test/repo.git",
     63                         "builder": "pnpm-workspace",
     64                     }
     65                 },
     66                 "packages": {
     67                     "one": {"repository": "repo", "tag": "v1.0.0"},
     68                     "two": {"repository": "repo", "tag": "v2.0.0"},
     69                 },
     70             }
     71         )
     72 
     73         with self.assertRaisesRegex(ConfigError, "same repository, tag, and builder"):
     74             buildlib._validate_group(config, ["one", "two"], "pnpm-workspace")
     75 
     76     def test_debian_overlay_is_copied_without_replacing_packaging(self):
     77         config = parse_config(
     78             {
     79                 "repositories": {
     80                     "repo": {
     81                         "url": "git://example.test/repo.git",
     82                         "builder": "debian-overlay",
     83                     }
     84                 },
     85                 "packages": {"one": {"repository": "repo", "tag": "v1.0.0"}},
     86             }
     87         )
     88         package = config.packages["one"]
     89 
     90         with tempfile.TemporaryDirectory() as temporary_directory:
     91             root = Path(temporary_directory)
     92             overlay_root = root / "overlays"
     93             overlay = overlay_root / "one" / "debian"
     94             overlay.mkdir(parents=True)
     95             (overlay / "control").write_text("Source: one\n")
     96             source = root / "source"
     97             source.mkdir()
     98 
     99             with patch.object(buildlib, "OVERLAYDIR", overlay_root):
    100                 buildlib._apply_debian_overlay(package, source)
    101                 self.assertEqual("Source: one\n", (source / "debian/control").read_text())
    102                 with self.assertRaisesRegex(ConfigError, "refusing to replace"):
    103                     buildlib._apply_debian_overlay(package, source)
    104 
    105     def test_failed_validation_does_not_publish_artifacts_or_markers(self):
    106         config = parse_config(
    107             {
    108                 "repositories": {"repo": {"url": "git://example.test/repo.git"}},
    109                 "packages": {"one": {"repository": "repo", "tag": "v1.0.0"}},
    110             }
    111         )
    112         package = config.packages["one"]
    113 
    114         with tempfile.TemporaryDirectory() as temporary_directory:
    115             root = Path(temporary_directory)
    116             package_path = root / "source"
    117             output_dir = root
    118             (package_path / "debian").mkdir(parents=True)
    119             artifact = output_dir / "one_1.0.0_all.deb"
    120             artifact.touch()
    121             published = root / "published"
    122             published.mkdir()
    123 
    124             with (
    125                 patch.object(buildlib, "PKGDIR", published),
    126                 patch.object(buildlib, "run_cmd"),
    127                 patch.object(
    128                     buildlib,
    129                     "_package_artifacts",
    130                     side_effect=[set(), {artifact.resolve()}],
    131                 ),
    132                 patch.object(
    133                     buildlib,
    134                     "_check_installed_binaries",
    135                     side_effect=RuntimeError("invalid binary"),
    136                 ),
    137             ):
    138                 with self.assertRaisesRegex(RuntimeError, "invalid binary"):
    139                     buildlib._build_package(
    140                         package,
    141                         package_path,
    142                         "v1.0.0",
    143                         "trixie",
    144                         "amd64",
    145                         prebuilt=False,
    146                     )
    147 
    148             self.assertEqual([], list(published.iterdir()))
    149 
    150 
    151 if __name__ == "__main__":
    152     unittest.main()