69ac878893
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
175 lines
4.9 KiB
Python
175 lines
4.9 KiB
Python
from fastapi import FastAPI, Request
|
|
from fastapi.testclient import TestClient
|
|
|
|
|
|
def test_health_no_auth_required():
|
|
from cerbero_mcp.auth import install_auth_middleware
|
|
fa = FastAPI()
|
|
install_auth_middleware(fa, testnet_token="t", mainnet_token="m")
|
|
|
|
@fa.get("/health")
|
|
def h():
|
|
return {"ok": True}
|
|
|
|
c = TestClient(fa)
|
|
r = c.get("/health")
|
|
assert r.status_code == 200
|
|
|
|
|
|
def test_apidocs_no_auth_required():
|
|
from cerbero_mcp.auth import install_auth_middleware
|
|
fa = FastAPI(docs_url="/apidocs")
|
|
install_auth_middleware(fa, testnet_token="t", mainnet_token="m")
|
|
|
|
c = TestClient(fa)
|
|
r = c.get("/apidocs")
|
|
assert r.status_code == 200
|
|
r = c.get("/openapi.json")
|
|
assert r.status_code == 200
|
|
|
|
|
|
def test_missing_authorization_header_401():
|
|
from cerbero_mcp.auth import install_auth_middleware
|
|
fa = FastAPI()
|
|
install_auth_middleware(fa, testnet_token="t", mainnet_token="m")
|
|
|
|
@fa.get("/mcp-deribit/health")
|
|
def h():
|
|
return {"ok": True}
|
|
|
|
c = TestClient(fa)
|
|
r = c.get("/mcp-deribit/health")
|
|
assert r.status_code == 401
|
|
|
|
|
|
def test_invalid_bearer_401():
|
|
from cerbero_mcp.auth import install_auth_middleware
|
|
fa = FastAPI()
|
|
install_auth_middleware(fa, testnet_token="t", mainnet_token="m")
|
|
|
|
@fa.get("/mcp-deribit/health")
|
|
def h():
|
|
return {"ok": True}
|
|
|
|
c = TestClient(fa)
|
|
r = c.get("/mcp-deribit/health", headers={"Authorization": "Bearer wrong"})
|
|
assert r.status_code == 401
|
|
|
|
|
|
def test_testnet_token_sets_env_testnet():
|
|
from cerbero_mcp.auth import install_auth_middleware
|
|
|
|
fa = FastAPI()
|
|
install_auth_middleware(fa, testnet_token="tk_test", mainnet_token="tk_live")
|
|
|
|
@fa.get("/mcp-deribit/peek")
|
|
def peek(request: Request):
|
|
return {"env": request.state.environment}
|
|
|
|
c = TestClient(fa)
|
|
r = c.get(
|
|
"/mcp-deribit/peek",
|
|
headers={"Authorization": "Bearer tk_test", "X-Bot-Tag": "test-bot"},
|
|
)
|
|
assert r.status_code == 200
|
|
assert r.json() == {"env": "testnet"}
|
|
|
|
|
|
def test_mainnet_token_sets_env_mainnet():
|
|
from cerbero_mcp.auth import install_auth_middleware
|
|
|
|
fa = FastAPI()
|
|
install_auth_middleware(fa, testnet_token="tk_test", mainnet_token="tk_live")
|
|
|
|
@fa.get("/mcp-deribit/peek")
|
|
def peek(request: Request):
|
|
return {"env": request.state.environment}
|
|
|
|
c = TestClient(fa)
|
|
r = c.get(
|
|
"/mcp-deribit/peek",
|
|
headers={"Authorization": "Bearer tk_live", "X-Bot-Tag": "test-bot"},
|
|
)
|
|
assert r.status_code == 200
|
|
assert r.json() == {"env": "mainnet"}
|
|
|
|
|
|
def test_uses_compare_digest():
|
|
"""Verifica che _check_token usi secrets.compare_digest (timing-safe)."""
|
|
import inspect
|
|
|
|
from cerbero_mcp import auth
|
|
|
|
src = inspect.getsource(auth)
|
|
assert "compare_digest" in src, "auth.py deve usare secrets.compare_digest"
|
|
|
|
|
|
# ── X-Bot-Tag header ─────────────────────────────────────────────────────────
|
|
|
|
def test_missing_bot_tag_returns_400():
|
|
from cerbero_mcp.auth import install_auth_middleware
|
|
fa = FastAPI()
|
|
install_auth_middleware(fa, testnet_token="t", mainnet_token="m")
|
|
|
|
@fa.get("/mcp-deribit/health")
|
|
def h():
|
|
return {"ok": True}
|
|
|
|
c = TestClient(fa)
|
|
r = c.get("/mcp-deribit/health", headers={"Authorization": "Bearer t"})
|
|
assert r.status_code == 400
|
|
assert "X-Bot-Tag" in r.json()["error"]["message"]
|
|
|
|
|
|
def test_bot_tag_accepted_and_set_on_state():
|
|
from cerbero_mcp.auth import install_auth_middleware
|
|
fa = FastAPI()
|
|
install_auth_middleware(fa, testnet_token="t", mainnet_token="m")
|
|
|
|
@fa.get("/mcp-deribit/peek")
|
|
def peek(request: Request):
|
|
return {
|
|
"env": request.state.environment,
|
|
"bot_tag": request.state.bot_tag,
|
|
}
|
|
|
|
c = TestClient(fa)
|
|
r = c.get(
|
|
"/mcp-deribit/peek",
|
|
headers={"Authorization": "Bearer t", "X-Bot-Tag": "scanner-alpha"},
|
|
)
|
|
assert r.status_code == 200
|
|
assert r.json() == {"env": "testnet", "bot_tag": "scanner-alpha"}
|
|
|
|
|
|
def test_bot_tag_too_long_returns_400():
|
|
from cerbero_mcp.auth import install_auth_middleware
|
|
fa = FastAPI()
|
|
install_auth_middleware(fa, testnet_token="t", mainnet_token="m")
|
|
|
|
@fa.get("/mcp-deribit/health")
|
|
def h():
|
|
return {"ok": True}
|
|
|
|
c = TestClient(fa)
|
|
r = c.get(
|
|
"/mcp-deribit/health",
|
|
headers={"Authorization": "Bearer t", "X-Bot-Tag": "x" * 65},
|
|
)
|
|
assert r.status_code == 400
|
|
|
|
|
|
def test_bot_tag_not_required_on_health():
|
|
"""Health endpoint deve restare senza auth e senza bot tag."""
|
|
from cerbero_mcp.auth import install_auth_middleware
|
|
fa = FastAPI()
|
|
install_auth_middleware(fa, testnet_token="t", mainnet_token="m")
|
|
|
|
@fa.get("/health")
|
|
def h():
|
|
return {"ok": True}
|
|
|
|
c = TestClient(fa)
|
|
r = c.get("/health")
|
|
assert r.status_code == 200
|