diff --git a/tests/unit/test_builtin_agent_images.py b/tests/unit/test_builtin_agent_images.py index b08b3012..089df863 100644 --- a/tests/unit/test_builtin_agent_images.py +++ b/tests/unit/test_builtin_agent_images.py @@ -12,14 +12,19 @@ _AGENT_DOCKERFILES = tuple(sorted(_CONTRIB_DIR.glob("*/Dockerfile"))) class TestBuiltinAgentImages(unittest.TestCase): - def test_all_use_debian_trixie_stable(self): + def test_all_share_one_digest_pinned_node_trixie_base(self): self.assertTrue(_AGENT_DOCKERFILES) + bases = [] for dockerfile in _AGENT_DOCKERFILES: with self.subTest(provider=dockerfile.parent.name): - self.assertRegex( + match = re.search( + r"(?m)^FROM " + r"(node:22\.\d+\.\d+-trixie-slim@sha256:[0-9a-f]{64})\s*$", dockerfile.read_text(), - r"(?m)^FROM node:22-trixie-slim\s*$", ) + self.assertIsNotNone(match) + bases.append(match.group(1)) + self.assertEqual(1, len(set(bases))) def test_none_install_podman(self): # podman lives in the nested-containers derived layer (nested_containers.py), diff --git a/tests/unit/test_contrib_pi_provider.py b/tests/unit/test_contrib_pi_provider.py index 5f3c0a1f..eb010217 100644 --- a/tests/unit/test_contrib_pi_provider.py +++ b/tests/unit/test_contrib_pi_provider.py @@ -2,6 +2,7 @@ from __future__ import annotations +import json import unittest from pathlib import Path from unittest.mock import MagicMock, patch @@ -21,6 +22,7 @@ from bot_bottle.manifest import ManifestIndex _URL = "http://supervise:9100/" _PI_DOCKERFILE = Path(__file__).resolve().parents[2] / "bot_bottle/contrib/pi/Dockerfile" +_PI_PACKAGE_JSON = _PI_DOCKERFILE.with_name("package.json") def _make_bottle(exec_result: ExecResult | None = None) -> MagicMock: @@ -209,9 +211,13 @@ class TestPiSuperviseMcp(unittest.TestCase): class TestPiDockerfile(unittest.TestCase): - def test_installs_pi_cwd_at_build_time(self): + def test_installs_exact_pi_cwd_from_the_committed_lock(self): dockerfile = _PI_DOCKERFILE.read_text() - self.assertIn("pi install npm:@harms-haus/pi-cwd", dockerfile) + package = json.loads(_PI_PACKAGE_JSON.read_text()) + version = package["dependencies"]["@harms-haus/pi-cwd"] + self.assertRegex(version, r"^\d+\.\d+\.\d+$") + self.assertIn("npm ci --omit=dev", dockerfile) + self.assertNotIn("pi install", dockerfile) def test_prepares_pi_extension_state_dirs_and_tmp_for_node(self): dockerfile = _PI_DOCKERFILE.read_text()