Reemplaza el placeholder mínimo previo por el scaffold canónico del golden path rest-api/python (entry point para tier free-trial): - code/app/main.py — FastAPI con /health (sin DB), /metrics, middleware correlation_id, settings Pydantic - code/tests/ — pytest + httpx TestClient (sin testcontainers, sin Docker) - helm/APP_NAME/ — chart minimal: Deployment, Service, IngressRoute, NetworkPolicy. SIN Job Alembic, SIN ServiceMonitor, SIN claim de BD - coralware-shape.yaml — shapeVersion 1.0.0, minTier free-trial, promotionPath -> web-backend-python cuando se requiera persistencia - .gitea/workflows/APP_NAME-build.yaml — invoca reusable workflow ADR-038 + job helm-deploy con KUBECONFIG_TENANT_B64 Diferencias con web-backend/python: sin alembic, sin BD, sin testcontainers, NetworkPolicy sin acceso a ns-addons. Placeholders __APP_NAME__, __TIER__, __TENANT_ID__, __TENANT_ID_NODASHES__ serán sustituidos server-side por repo-provisioner. El openspec/ del golden path NO se sincroniza al repo Gitea (gobernanza interna de Coralware). Refs: ADR-027 (Golden Paths), ADR-038 (CI), ADR-053 (referencia anatomía).
27 lines
929 B
Python
27 lines
929 B
Python
"""Cubre los endpoints obligatorios del shape: /health y /metrics."""
|
|
|
|
from fastapi.testclient import TestClient
|
|
|
|
|
|
def test_health_returns_200_ok(client: TestClient) -> None:
|
|
response = client.get("/health")
|
|
assert response.status_code == 200
|
|
assert response.json() == {"status": "ok"}
|
|
|
|
|
|
def test_health_propagates_correlation_id(client: TestClient) -> None:
|
|
cid = "test-cid-12345"
|
|
response = client.get("/health", headers={"X-Correlation-ID": cid})
|
|
assert response.headers.get("X-Correlation-ID") == cid
|
|
|
|
|
|
def test_health_generates_correlation_id_when_absent(client: TestClient) -> None:
|
|
response = client.get("/health")
|
|
assert response.headers.get("X-Correlation-ID")
|
|
|
|
|
|
def test_metrics_endpoint_serves_prometheus_format(client: TestClient) -> None:
|
|
response = client.get("/metrics")
|
|
assert response.status_code == 200
|
|
assert "text/plain" in response.headers.get("content-type", "")
|