mirror of
https://github.com/pewdiepie-archdaemon/odysseus.git
synced 2026-06-15 17:25:26 -04:00
99 lines
2.6 KiB
Python
99 lines
2.6 KiB
Python
import asyncio
|
|
from pathlib import Path
|
|
from types import SimpleNamespace
|
|
|
|
import pytest
|
|
from fastapi import HTTPException
|
|
|
|
from routes import personal_routes
|
|
|
|
|
|
def _upload_endpoint():
|
|
router = personal_routes.setup_personal_routes(_FakePersonalDocs(), None, True)
|
|
for route in router.routes:
|
|
if getattr(route, "path", "") == "/api/personal/upload" and "POST" in getattr(route, "methods", set()):
|
|
return route.endpoint
|
|
raise AssertionError("upload endpoint not found")
|
|
|
|
|
|
def _request(privileges):
|
|
class _AuthManager:
|
|
def get_privileges(self, user):
|
|
assert user == "alice"
|
|
return privileges
|
|
|
|
return SimpleNamespace(
|
|
state=SimpleNamespace(current_user="alice"),
|
|
app=SimpleNamespace(
|
|
state=SimpleNamespace(
|
|
auth_manager=_AuthManager(),
|
|
),
|
|
),
|
|
client=SimpleNamespace(host="203.0.113.10"),
|
|
)
|
|
|
|
|
|
class _FakePersonalDocs:
|
|
def __init__(self):
|
|
self.added = []
|
|
|
|
def add_directory(self, directory, index=False):
|
|
self.added.append((directory, index))
|
|
|
|
|
|
class _FakeRAG:
|
|
def __init__(self):
|
|
self.docs = []
|
|
|
|
def _split_into_chunks(self, text, chunk_size=500):
|
|
return [text]
|
|
|
|
def add_document(self, chunk, metadata):
|
|
self.docs.append((chunk, metadata))
|
|
return True
|
|
|
|
|
|
class _Upload:
|
|
filename = "notes.txt"
|
|
|
|
async def read(self, limit):
|
|
return b"hello from upload"
|
|
|
|
|
|
def test_personal_upload_requires_document_privilege(monkeypatch):
|
|
monkeypatch.setenv("AUTH_ENABLED", "true")
|
|
monkeypatch.setattr(
|
|
personal_routes,
|
|
"get_rag_manager",
|
|
lambda: pytest.fail("RAG must not be touched before privilege passes"),
|
|
)
|
|
|
|
endpoint = _upload_endpoint()
|
|
|
|
with pytest.raises(HTTPException) as exc:
|
|
asyncio.run(endpoint(request=_request({"can_use_documents": False}), files=[]))
|
|
|
|
assert exc.value.status_code == 403
|
|
|
|
|
|
def test_personal_upload_indexes_with_privileged_owner(tmp_path, monkeypatch):
|
|
monkeypatch.setenv("AUTH_ENABLED", "true")
|
|
monkeypatch.setattr(personal_routes, "UPLOADS_DIR", str(tmp_path))
|
|
rag = _FakeRAG()
|
|
monkeypatch.setattr(personal_routes, "get_rag_manager", lambda: rag)
|
|
|
|
endpoint = _upload_endpoint()
|
|
result = asyncio.run(
|
|
endpoint(
|
|
request=_request({"can_use_documents": True}),
|
|
files=[_Upload()],
|
|
)
|
|
)
|
|
|
|
assert result["success"] is True
|
|
assert result["indexed_count"] == 1
|
|
assert rag.docs[0][0] == "hello from upload"
|
|
metadata = rag.docs[0][1]
|
|
assert metadata["owner"] == "alice"
|
|
assert Path(metadata["directory"]).name == "alice"
|