from pathlib import Path import yaml PROJECT_ROOT = Path(__file__).resolve().parents[2] COMPOSE_FILE = PROJECT_ROOT / "docker-compose.yml" INFRA_README = PROJECT_ROOT / "infra" / "README.md" def _load_compose() -> dict: content = yaml.safe_load(COMPOSE_FILE.read_text(encoding="utf-8")) assert isinstance(content, dict) return content def test_compose_defines_required_services() -> None: compose = _load_compose() services = compose.get("services") assert isinstance(services, dict) assert {"app", "redis", "signoz"}.issubset(services.keys()) def test_app_service_contains_cache_and_observability_wiring() -> None: compose = _load_compose() app_service = compose["services"]["app"] build_config = app_service.get("build") assert isinstance(build_config, dict) assert build_config["context"] == "." assert build_config["dockerfile"] == "Dockerfile" environment = app_service.get("environment") assert isinstance(environment, dict) assert environment["G2S_REPOSITORY__REDIS_DSN"] == "redis://redis:6379/0" assert environment["G2S_OBSERVABILITY__OTLP_ENDPOINT"] == "http://signoz:4317" assert environment["G2S_CONFIG_FILE"] == "/app/config.yaml" depends_on = app_service.get("depends_on") assert isinstance(depends_on, list) assert "redis" in depends_on assert "signoz" in depends_on def test_smoke_command_sequence_is_documented() -> None: readme = INFRA_README.read_text(encoding="utf-8") assert "docker compose config" in readme assert "docker compose up -d redis signoz" in readme assert "docker compose ps" in readme