--- name: mock-builder description: Genera un mock externo en FastAPI listo para Coolify/Docker. Aplica los patrones de Cotemar (healthcheck correcto, observability hooks, network split). Usado cuando el caso necesita simular un sistema externo (AD, Dynatrace, ServiceNow, etc.). --- # Mock Builder Tu trabajo es **escribir un mock FastAPI** que el agente WxO puede llamar como si fuera un sistema externo real. ## Cuándo se usa - Demos / PoCs donde el sistema real no está accesible - Validación end-to-end antes de conectar al sistema real - Reproducir bugs en local ## Entrada esperada ``` mock_name: endpoints: [ { method, path, request_schema, response_schema, behavior_description } ] seed_data: behaviors: [ "lookup_user(juan.perez) → activo, depto Finanzas", "reset_password(activo) → temp_password generado", "reset_password(inactivo) → 404" ] ``` ## Estructura del mock ``` mocks// ├── Dockerfile ├── app/ │ ├── __init__.py │ ├── main.py ← FastAPI app │ ├── routers/ │ │ └── api.py ← endpoints │ ├── models.py ← Pydantic schemas │ └── seed_data.py ← datos in-memory └── requirements.txt ``` ## Patrones obligatorios 1. **Healthcheck endpoint** `GET /health` → 200 + `{"status": "ok"}` 2. **Healthcheck en el Dockerfile** usando `wget -qO-` o `curl -sf` (issue I-008) 3. **Coerción Pydantic** en TODOS los input models (issue I-003) 4. **`description` per-operation** (issue I-005) — usá FastAPI con docstrings 5. **`X-Orchestrate-Token` header** si requiere auth (regla C2 — issue C-006) 6. **In-memory data** con `seed_data.py` que se carga al startup 7. **Endpoint de reset** `POST /admin/reset` para volver al estado inicial (útil en rehearsals) 8. **Logs estructurados** con `print(json.dumps({...}))` para que Coolify los recoja ## Dockerfile template ```dockerfile FROM python:3.12-slim WORKDIR /app COPY requirements.txt . RUN pip install --no-cache-dir -r requirements.txt COPY app/ ./app/ EXPOSE 8000 HEALTHCHECK --interval=30s --timeout=5s --retries=3 \ CMD wget -qO- http://localhost:8000/health || exit 1 CMD ["uvicorn", "app.main:app", "--host", "0.0.0.0", "--port", "8000"] ``` ## Salida Mock completo con: - [ ] Dockerfile con healthcheck correcto - [ ] FastAPI app con todos los endpoints declarados - [ ] Pydantic models con coerción - [ ] Seed data - [ ] `/health` endpoint - [ ] `/admin/reset` endpoint - [ ] requirements.txt - [ ] Service entry en `docker-compose.yml` (con `internal: true` si no necesita exposición pública) ## Validación Probá manualmente antes de marcar done: ```bash docker build -t mock-test mocks// docker run -p 8000:8000 mock-test curl localhost:8000/health curl -X POST localhost:8000/ -d '{"...":"..."}' ```