from pathlib import Path import yaml def test_local_compose_uses_the_generic_external_endpoint_contract(): root = Path(__file__).resolve().parents[2] compose = yaml.safe_load((root / "compose.yaml").read_text()) local = yaml.safe_load((root / "deploy/compose.local.yaml").read_text()) assert set(compose["services"]) == { "core", "frontend", "qdrant", "embedding", "embedding-model-init", "workspace-maintenance", } # workspace-maintenance is profile-gated: it must not be part of the default local startup. assert compose["services"]["workspace-maintenance"].get("profiles") == ["workspace-maintenance"] assert local["services"]["core"]["environment"]["AUTH_MODE"] == "none" assert local["services"]["core"]["ports"] == ["127.0.0.1:${THOTH_CORE_HTTP_PORT:-8787}:8787"] assert local["services"]["frontend"]["ports"] == ["127.0.0.1:${THOTH_HTTP_PORT:-8080}:8080"] environment = compose["services"]["core"]["environment"] for name in ("THT_DWH_REST_URL", "THT_LLM_URL"): assert name in environment assert environment["THT_INTERNAL_QDRANT_URL"] == "http://qdrant:6333" assert environment["THT_INTERNAL_EMBEDDING_URL"] == "http://embedding:11434" assert environment["THT_INTERNAL_EMBEDDING_MODEL"] == "qwen3-embedding:0.6b" assert environment["THT_INTERNAL_EMBEDDING_DIMENSIONS"] == "1024" for name in ("THT_VEC_REST_URL", "THT_VEC_WRITE_REST_URL", "THT_OLLAMA_URL"): assert name not in environment assert {"settings", "pi-state", "workspace-registry", "sessions", "qdrant-data", "embedding-models"} <= set(compose["volumes"]) qdrant = compose["services"]["qdrant"] assert qdrant["expose"] == ["6333"] assert "ports" not in qdrant assert "healthcheck" in qdrant embedding = compose["services"]["embedding"] assert embedding["expose"] == ["11434"] assert "ports" not in embedding assert "healthcheck" in embedding model_init = compose["services"]["embedding-model-init"] assert "ports" not in model_init assert model_init["depends_on"]["embedding"]["condition"] == "service_healthy" assert compose["services"]["core"]["depends_on"]["embedding-model-init"]["condition"] == "service_completed_successfully" def test_core_image_prepares_the_writable_pi_profile_before_mounting_config_files(): root = Path(__file__).resolve().parents[2] dockerfile = (root / "docker/core.Dockerfile").read_text() assert "mkdir -p /home/thoth/.pi/agent" in dockerfile assert "chown -R thoth:thoth /home/thoth/.pi" in dockerfile assert ( "cp --remove-destination /app/harness/workspaces/local.yaml " "/app/harness/config/tht.yaml" in dockerfile ) assert "ln -sf /app/harness/workspaces/local.yaml /app/harness/config/tht.yaml" not in dockerfile assert "ln -sfn /app/harness/config/tht.yaml /app/harness/workspaces/" not in dockerfile