65 lines
1.7 KiB
Python
65 lines
1.7 KiB
Python
import importlib
|
|
import time
|
|
|
|
import jwt
|
|
from fastapi import FastAPI
|
|
from fastapi.testclient import TestClient
|
|
|
|
|
|
def _client(monkeypatch, jwt_secret="test-jwt-secret-with-at-least-32-bytes", tlsync_secret="test-tlsync-secret"):
|
|
monkeypatch.setenv("JWT_SECRET", jwt_secret)
|
|
if tlsync_secret is None:
|
|
monkeypatch.delenv("TLSYNC_SECRET", raising=False)
|
|
else:
|
|
monkeypatch.setenv("TLSYNC_SECRET", tlsync_secret)
|
|
|
|
tlsync = importlib.import_module("routers.tlsync")
|
|
app = FastAPI()
|
|
app.include_router(tlsync.router, prefix="/tlsync")
|
|
return TestClient(app), jwt_secret
|
|
|
|
|
|
def _token(jwt_secret: str) -> str:
|
|
now = int(time.time())
|
|
return jwt.encode(
|
|
{
|
|
"sub": "user-123",
|
|
"aud": "authenticated",
|
|
"iat": now,
|
|
"exp": now + 3600,
|
|
},
|
|
jwt_secret,
|
|
algorithm="HS256",
|
|
)
|
|
|
|
|
|
def test_tlsync_token_requires_bearer_auth(monkeypatch):
|
|
client, _ = _client(monkeypatch)
|
|
|
|
response = client.get("/tlsync/token")
|
|
|
|
assert response.status_code == 401
|
|
|
|
|
|
def test_tlsync_token_returns_configured_secret(monkeypatch):
|
|
client, jwt_secret = _client(monkeypatch, tlsync_secret="runtime-secret")
|
|
|
|
response = client.get(
|
|
"/tlsync/token",
|
|
headers={"Authorization": f"Bearer {_token(jwt_secret)}"},
|
|
)
|
|
|
|
assert response.status_code == 200
|
|
assert response.json() == {"token": "runtime-secret"}
|
|
|
|
|
|
def test_tlsync_token_500_when_secret_missing(monkeypatch):
|
|
client, jwt_secret = _client(monkeypatch, tlsync_secret=None)
|
|
|
|
response = client.get(
|
|
"/tlsync/token",
|
|
headers={"Authorization": f"Bearer {_token(jwt_secret)}"},
|
|
)
|
|
|
|
assert response.status_code == 500
|