From a4d8461081366fe821f6ddd19977e1bdcafb3bb0 Mon Sep 17 00:00:00 2001 From: codex Date: Tue, 21 Jul 2026 06:20:15 +0000 Subject: [PATCH] test(macos): cover rootless image launch wiring --- tests/unit/test_macos_rootless_docker.py | 42 ++++++++++++++++++++++++ 1 file changed, 42 insertions(+) diff --git a/tests/unit/test_macos_rootless_docker.py b/tests/unit/test_macos_rootless_docker.py index cb43c73..ddd611d 100644 --- a/tests/unit/test_macos_rootless_docker.py +++ b/tests/unit/test_macos_rootless_docker.py @@ -3,11 +3,15 @@ from __future__ import annotations import unittest +from dataclasses import dataclass from pathlib import Path from types import SimpleNamespace +from typing import cast from unittest.mock import patch from bot_bottle.backend.macos_container import rootless_docker +from bot_bottle.backend.macos_container import launch as launch_mod +from bot_bottle.backend.macos_container.bottle_plan import MacosContainerBottlePlan class _Bottle: @@ -24,6 +28,20 @@ def _result(returncode: int, *, stdout: str = "", stderr: str = "") -> SimpleNam return SimpleNamespace(returncode=returncode, stdout=stdout, stderr=stderr) +@dataclass(frozen=True) +class _AgentProvision: + image: str + + +@dataclass(frozen=True) +class _Plan: + slug: str + image: str + dockerfile_path: str + docker_access: bool + agent_provision: _AgentProvision + + class TestRootlessDockerStart(unittest.TestCase): def test_bootstraps_then_waits_for_guest_local_daemon(self) -> None: bottle = _Bottle([_result(0), _result(1), _result(0)]) @@ -72,6 +90,30 @@ class TestRootlessDockerImage(unittest.TestCase): self.assertEqual("agent:base-rootless-docker", image) self.assertEqual("agent:base-rootless-docker", calls[0][0]) + def test_launch_builds_base_then_rootless_variant(self) -> None: + plan = cast(MacosContainerBottlePlan, cast(object, _Plan( + slug="dev-abc", + image="agent:base", + dockerfile_path="/repo/Dockerfile", + docker_access=True, + agent_provision=_AgentProvision(image="agent:base"), + ))) + with patch.object(launch_mod, "read_committed_image", return_value=None), \ + patch.object(launch_mod.container_mod, "build_image") as build, \ + patch.object( + launch_mod.rootless_docker, + "build_image", + return_value="agent:base-rootless-docker", + ) as build_rootless: + result = launch_mod._build_images(plan) # pylint: disable=protected-access + + build.assert_called_once_with( + "agent:base", launch_mod._REPO_DIR, # pylint: disable=protected-access + dockerfile="/repo/Dockerfile", + ) + build_rootless.assert_called_once_with("agent:base", build) + self.assertEqual("agent:base-rootless-docker", result.agent_provision.image) + if __name__ == "__main__": unittest.main()