from __future__ import annotations from pathlib import Path import yaml PROJECT_ROOT = Path(__file__).resolve().parents[1] def test_compose_is_local_and_does_not_require_nvidia() -> None: compose = yaml.safe_load( (PROJECT_ROOT / "docker-compose.yml").read_text(encoding="utf-8") ) assert set(compose["services"].keys()) == {"webui"} webui = compose["services"]["webui"] assert webui["ports"] == ["8000:8000"] assert "deploy" not in webui assert "YOLO_WEBUI_MLFLOW_TRACKING_URI" in webui["environment"] def test_docker_dependencies_are_exported_from_lock_file() -> None: dockerfile = (PROJECT_ROOT / "Dockerfile").read_text(encoding="utf-8") assert "COPY pyproject.toml uv.lock README.md ./" in dockerfile assert "uv export --locked --no-dev" in dockerfile assert "--group build" in dockerfile assert "--prune ultralytics" in dockerfile assert "uv pip install --system --no-deps --no-build-isolation ." in dockerfile assert "ULTRALYTICS_SAFE_LOAD=1" in dockerfile def test_docker_context_excludes_local_training_artifacts() -> None: ignored = { line.strip() for line in (PROJECT_ROOT / ".dockerignore").read_text(encoding="utf-8").splitlines() if line.strip() and not line.lstrip().startswith("#") } assert {".git", ".venv", "datasets", "models", "runs", "mlruns"} <= ignored