mirror of
https://github.com/pewdiepie-archdaemon/odysseus.git
synced 2026-06-15 17:25:26 -04:00
150 lines
5.1 KiB
Python
150 lines
5.1 KiB
Python
import uuid
|
|
|
|
from fastapi import FastAPI
|
|
from fastapi.testclient import TestClient
|
|
from sqlalchemy import create_engine
|
|
from sqlalchemy.orm import sessionmaker
|
|
from sqlalchemy.pool import NullPool
|
|
|
|
import core.database as cdb
|
|
from core.database import GalleryAlbum, GalleryImage
|
|
import routes.gallery_routes as gallery_routes
|
|
|
|
|
|
def _client_with_gallery(monkeypatch, tmp_path):
|
|
engine = create_engine(
|
|
f"sqlite:///{tmp_path / 'gallery.db'}",
|
|
connect_args={"check_same_thread": False},
|
|
poolclass=NullPool,
|
|
)
|
|
cdb.Base.metadata.create_all(engine)
|
|
session_factory = sessionmaker(bind=engine, autoflush=False, autocommit=False)
|
|
monkeypatch.setattr(gallery_routes, "SessionLocal", session_factory)
|
|
|
|
db = session_factory()
|
|
try:
|
|
db.add_all(
|
|
[
|
|
GalleryAlbum(id="album-alice", name="Alice album", owner="alice"),
|
|
GalleryAlbum(id="album-bob", name="Bob album", owner="bob"),
|
|
GalleryImage(
|
|
id="img-alice",
|
|
filename=f"{uuid.uuid4().hex}.png",
|
|
prompt="alice prompt",
|
|
model="model-a",
|
|
tags="alice-tag",
|
|
ai_tags="",
|
|
owner="alice",
|
|
album_id="album-alice",
|
|
is_active=True,
|
|
file_size=10,
|
|
),
|
|
GalleryImage(
|
|
id="img-bob",
|
|
filename=f"{uuid.uuid4().hex}.png",
|
|
prompt="bob prompt",
|
|
model="model-b",
|
|
tags="bob-tag",
|
|
ai_tags="",
|
|
owner="bob",
|
|
album_id="album-bob",
|
|
is_active=True,
|
|
file_size=20,
|
|
),
|
|
]
|
|
)
|
|
db.commit()
|
|
finally:
|
|
db.close()
|
|
|
|
app = FastAPI()
|
|
app.include_router(gallery_routes.setup_gallery_routes())
|
|
return TestClient(app)
|
|
|
|
|
|
def test_auth_enabled_null_user_gallery_routes_fail_closed(monkeypatch, tmp_path):
|
|
monkeypatch.setenv("AUTH_ENABLED", "true")
|
|
client = _client_with_gallery(monkeypatch, tmp_path)
|
|
|
|
library = client.get("/api/gallery/library").json()
|
|
assert library["items"] == []
|
|
assert library["total"] == 0
|
|
assert library["total_tagged"] == 0
|
|
assert library["tags"] == []
|
|
assert library["models"] == []
|
|
|
|
shuffled = client.get("/api/gallery/library", params={"sort": "shuffle"}).json()
|
|
assert shuffled["items"] == []
|
|
assert shuffled["total"] == 0
|
|
|
|
assert client.get("/api/gallery/tags").json() == {"tags": []}
|
|
assert client.get("/api/gallery/albums").json() == {"albums": []}
|
|
assert client.get("/api/gallery/stats").json() == {
|
|
"total_photos": 0,
|
|
"total_size": 0,
|
|
"total_size_human": "0.0 B",
|
|
"favorites": 0,
|
|
"albums": 0,
|
|
}
|
|
assert client.post("/api/gallery/ai-tag-batch").json() == {
|
|
"ok": True,
|
|
"queued": 0,
|
|
"total_untagged": 0,
|
|
"image_ids": [],
|
|
}
|
|
|
|
|
|
def test_auth_disabled_null_user_gallery_routes_keep_single_user_mode(monkeypatch, tmp_path):
|
|
monkeypatch.setenv("AUTH_ENABLED", "false")
|
|
client = _client_with_gallery(monkeypatch, tmp_path)
|
|
|
|
library = client.get("/api/gallery/library").json()
|
|
assert {item["id"] for item in library["items"]} == {"img-alice", "img-bob"}
|
|
assert library["total"] == 2
|
|
assert library["tags"] == ["alice-tag", "bob-tag"]
|
|
assert library["models"] == ["model-a", "model-b"]
|
|
|
|
assert client.get("/api/gallery/tags").json() == {"tags": ["alice-tag", "bob-tag"]}
|
|
assert len(client.get("/api/gallery/albums").json()["albums"]) == 2
|
|
assert client.get("/api/gallery/stats").json() == {
|
|
"total_photos": 2,
|
|
"total_size": 30,
|
|
"total_size_human": "30.0 B",
|
|
"favorites": 0,
|
|
"albums": 2,
|
|
}
|
|
batch = client.post("/api/gallery/ai-tag-batch").json()
|
|
assert batch["ok"] is True
|
|
assert batch["queued"] == 2
|
|
assert batch["total_untagged"] == 2
|
|
assert set(batch["image_ids"]) == {"img-alice", "img-bob"}
|
|
|
|
|
|
def test_authenticated_gallery_routes_remain_owner_scoped(monkeypatch, tmp_path):
|
|
monkeypatch.setenv("AUTH_ENABLED", "true")
|
|
monkeypatch.setattr(gallery_routes, "get_current_user", lambda request: "alice")
|
|
client = _client_with_gallery(monkeypatch, tmp_path)
|
|
|
|
library = client.get("/api/gallery/library").json()
|
|
assert [item["id"] for item in library["items"]] == ["img-alice"]
|
|
assert library["total"] == 1
|
|
assert library["tags"] == ["alice-tag"]
|
|
assert library["models"] == ["model-a"]
|
|
|
|
assert client.get("/api/gallery/tags").json() == {"tags": ["alice-tag"]}
|
|
albums = client.get("/api/gallery/albums").json()["albums"]
|
|
assert [album["id"] for album in albums] == ["album-alice"]
|
|
assert client.get("/api/gallery/stats").json() == {
|
|
"total_photos": 1,
|
|
"total_size": 10,
|
|
"total_size_human": "10.0 B",
|
|
"favorites": 0,
|
|
"albums": 1,
|
|
}
|
|
assert client.post("/api/gallery/ai-tag-batch").json() == {
|
|
"ok": True,
|
|
"queued": 1,
|
|
"total_untagged": 1,
|
|
"image_ids": ["img-alice"],
|
|
}
|