mirror of
https://github.com/open-jarvis/OpenJarvis.git
synced 2026-07-28 05:12:26 +00:00
Cherry-picks the mobile channel gateway infrastructure: - ChannelBridge orchestrator for multi-channel routing - Webhook endpoints for Twilio SMS, BlueBubbles (iMessage), WhatsApp - SessionStore for per-sender conversation tracking - API key authentication middleware - TwilioSMSChannel adapter - CLI commands: jarvis auth, jarvis tunnel Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
76 lines
1.9 KiB
Python
76 lines
1.9 KiB
Python
"""Tests for API key authentication middleware."""
|
|
|
|
from __future__ import annotations
|
|
|
|
import pytest
|
|
|
|
pytest.importorskip(
|
|
"fastapi", reason="openjarvis[server] not installed"
|
|
)
|
|
|
|
from fastapi import FastAPI
|
|
from fastapi.testclient import TestClient
|
|
|
|
from openjarvis.server.auth_middleware import AuthMiddleware
|
|
|
|
|
|
def _make_app(api_key: str) -> FastAPI:
|
|
app = FastAPI()
|
|
app.add_middleware(AuthMiddleware, api_key=api_key)
|
|
|
|
@app.get("/v1/models")
|
|
async def models():
|
|
return {"models": []}
|
|
|
|
@app.get("/health")
|
|
async def health():
|
|
return {"status": "ok"}
|
|
|
|
@app.post("/webhooks/twilio")
|
|
async def twilio_webhook():
|
|
return {"status": "received"}
|
|
|
|
return app
|
|
|
|
|
|
@pytest.fixture
|
|
def client():
|
|
return TestClient(_make_app("oj_sk_test123"))
|
|
|
|
|
|
class TestAuthMiddleware:
|
|
def test_rejects_missing_auth_header(self, client):
|
|
resp = client.get("/v1/models")
|
|
assert resp.status_code == 401
|
|
assert "missing" in resp.json()["detail"].lower()
|
|
|
|
def test_rejects_wrong_key(self, client):
|
|
resp = client.get(
|
|
"/v1/models",
|
|
headers={"Authorization": "Bearer wrong"},
|
|
)
|
|
assert resp.status_code == 401
|
|
assert "invalid" in resp.json()["detail"].lower()
|
|
|
|
def test_accepts_valid_key(self, client):
|
|
resp = client.get(
|
|
"/v1/models",
|
|
headers={
|
|
"Authorization": "Bearer oj_sk_test123"
|
|
},
|
|
)
|
|
assert resp.status_code == 200
|
|
|
|
def test_health_exempt(self, client):
|
|
resp = client.get("/health")
|
|
assert resp.status_code == 200
|
|
|
|
def test_webhooks_exempt(self, client):
|
|
resp = client.post("/webhooks/twilio")
|
|
assert resp.status_code == 200
|
|
|
|
def test_no_key_configured_allows_all(self):
|
|
client = TestClient(_make_app(""))
|
|
resp = client.get("/v1/models")
|
|
assert resp.status_code == 200
|