77 lines
2.6 KiB
Python
77 lines
2.6 KiB
Python
import json
|
|
import os
|
|
from pathlib import Path
|
|
|
|
from fastapi.testclient import TestClient
|
|
|
|
import app as app_module
|
|
|
|
|
|
def make_client(tmp_path: Path) -> TestClient:
|
|
os.environ["JARVISCHAT_ADMIN_PIN"] = "1234"
|
|
app_module.DB_PATH = tmp_path / "jarvischat-rate.db"
|
|
app_module.SESSIONS.clear()
|
|
app_module.PIN_ATTEMPTS.clear()
|
|
app_module.RATE_EVENTS.clear()
|
|
app_module.init_db()
|
|
return TestClient(app_module.app)
|
|
|
|
|
|
def test_stats_rate_limit_hits_429(tmp_path: Path):
|
|
old_limit = app_module.RL_STATS_PER_WINDOW
|
|
old_window = app_module.RATE_WINDOW_SECONDS
|
|
app_module.RL_STATS_PER_WINDOW = 2
|
|
app_module.RATE_WINDOW_SECONDS = 60
|
|
try:
|
|
with make_client(tmp_path) as client:
|
|
sid = client.post("/api/auth/guest").json()["session_id"]
|
|
headers = {"X-Session-ID": sid}
|
|
|
|
r1 = client.get("/api/stats", headers=headers)
|
|
r2 = client.get("/api/stats", headers=headers)
|
|
r3 = client.get("/api/stats", headers=headers)
|
|
|
|
assert r1.status_code == 200
|
|
assert r2.status_code == 200
|
|
assert r3.status_code == 429
|
|
finally:
|
|
app_module.RL_STATS_PER_WINDOW = old_limit
|
|
app_module.RATE_WINDOW_SECONDS = old_window
|
|
|
|
|
|
def test_large_login_payload_rejected_413(tmp_path: Path):
|
|
with make_client(tmp_path) as client:
|
|
huge_pin = "1" * (app_module.BODY_LIMIT_DEFAULT_BYTES + 100)
|
|
resp = client.post(
|
|
"/api/auth/login",
|
|
data=json.dumps({"pin": huge_pin}),
|
|
headers={"Content-Type": "application/json"},
|
|
)
|
|
assert resp.status_code == 413
|
|
|
|
|
|
def test_chat_message_length_rejected_413(tmp_path: Path):
|
|
with make_client(tmp_path) as client:
|
|
sid = client.post("/api/auth/guest").json()["session_id"]
|
|
headers = {"X-Session-ID": sid, "Origin": "http://testserver"}
|
|
message = "x" * (app_module.MAX_CHAT_MESSAGE_CHARS + 1)
|
|
resp = client.post(
|
|
"/api/chat",
|
|
json={"message": message, "model": app_module.DEFAULT_MODEL},
|
|
headers=headers,
|
|
)
|
|
assert resp.status_code == 413
|
|
|
|
|
|
def test_search_query_length_rejected_413(tmp_path: Path):
|
|
with make_client(tmp_path) as client:
|
|
sid = client.post("/api/auth/guest").json()["session_id"]
|
|
headers = {"X-Session-ID": sid, "Origin": "http://testserver"}
|
|
query = "q" * (app_module.MAX_SEARCH_QUERY_CHARS + 1)
|
|
resp = client.post(
|
|
"/api/search",
|
|
json={"query": query, "model": app_module.DEFAULT_MODEL},
|
|
headers=headers,
|
|
)
|
|
assert resp.status_code == 413
|