Files
ThothII/harness/tests/test_local_compose_contract.py
T

72 lines
3.3 KiB
Python

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",
"catalog-db",
"catalog-migrate",
"frontend",
"qdrant",
"embedding",
"embedding-model-init",
"workspace-maintenance",
}
# Catalog migrations are explicit maintenance, while the catalog database is required by core.
assert compose["services"]["catalog-migrate"].get("profiles") == ["catalog-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"]
# Authentication is controlled by the mounted configuration; the local profile
# must not silently re-enable the legacy unauthenticated development mode.
assert "AUTH_MODE" not in local["services"]["core"]["environment"]
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"]
assert {"THT_AUTH_CONFIG_FILE", "THT_AUTH_STATE_ROOT"} <= set(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