"""Tests for containers domain.""" from pathlib import Path from flow.domain.containers.models import ContainerSpec, ImageRef, Mount from flow.domain.containers.resolution import ( build_container_spec, container_name, parse_image_ref, resolve_mounts, ) class TestParseImageRef: def test_simple_name(self): ref = parse_image_ref("devbox") assert ref.registry == "registry.tomastm.com" assert ref.repo == "devbox" assert ref.tag == "latest" def test_with_tag(self): ref = parse_image_ref("devbox:v2") assert ref.tag == "v2" def test_full_ref(self): ref = parse_image_ref("ghcr.io/user/image:main") assert ref.registry == "ghcr.io" assert ref.repo == "user/image" assert ref.tag == "main" def test_full_image_string(self): ref = parse_image_ref("devbox") assert ref.full == "registry.tomastm.com/devbox:latest" class TestContainerName: def test_basic(self): assert container_name("devbox") == "dev-devbox" class TestResolveMounts: def test_projects_mount(self, tmp_path): projects = tmp_path / "projects" projects.mkdir() mounts = resolve_mounts(tmp_path, project_path=str(projects)) project_mounts = [m for m in mounts if m.target == "/workspace"] assert len(project_mounts) == 1 def test_dotfiles_mount(self, tmp_path): dotfiles = tmp_path / "dotfiles" dotfiles.mkdir() mounts = resolve_mounts(tmp_path, dotfiles_dir=dotfiles) assert any(m.target.endswith("/flow/dotfiles") for m in mounts) class TestBuildContainerSpec: def test_basic(self): image = ImageRef(registry="reg", repo="img", tag="v1", label="reg/img") spec = build_container_spec("api", image, []) assert spec.name == "dev-api" assert spec.labels["dev.name"] == "api" def test_with_mounts(self): image = ImageRef(registry="reg", repo="img", tag="v1", label="reg/img") mounts = [Mount(source=Path("/a"), target="/b")] spec = build_container_spec("api", image, mounts) assert len(spec.mounts) == 1 class TestMount: def test_to_flag(self): m = Mount(source=Path("/src"), target="/dst") assert m.to_flag() == "-v /src:/dst" def test_to_flag_readonly(self): m = Mount(source=Path("/src"), target="/dst", readonly=True) assert ":ro" in m.to_flag()