MpakoImageAIbot/tests/test_web.py

103 lines
3.1 KiB
Python

from __future__ import annotations
import sqlite3
from pathlib import Path
from fastapi.testclient import TestClient
from config import Settings
from web import create_app
def make_settings(tmp_path: Path, **overrides) -> Settings:
values = {
"bot_token": "",
"db_path": tmp_path / "bot.db",
"storage_dir": tmp_path / "storage",
}
values.update(overrides)
return Settings(**values)
def insert_request(
path: Path,
*,
user_id: int,
prompt: str,
status: str = "done",
mode: str = "t2i",
output: str | None = None,
) -> int:
connection = sqlite3.connect(path)
try:
cursor = connection.execute(
"""
INSERT INTO requests
(user_id, timestamp, prompt_text, status, mode, seed, output_file_path)
VALUES (?, '2026-10-18T12:00:00+00:00', ?, ?, ?, 1, ?)
""",
(user_id, prompt, status, mode, output),
)
connection.commit()
return int(cursor.lastrowid)
finally:
connection.close()
def test_history_page_and_user_filter(tmp_path: Path) -> None:
settings = make_settings(tmp_path)
app = create_app(settings)
with TestClient(app) as client:
insert_request(settings.db_path, user_id=1, prompt="apple prompt")
insert_request(settings.db_path, user_id=2, prompt="banana prompt")
response = client.get("/")
assert response.status_code == 200
assert "apple prompt" in response.text
assert "banana prompt" in response.text
response = client.get("/?user_id=1")
assert response.status_code == 200
assert "apple prompt" in response.text
assert "banana prompt" not in response.text
response = client.get("/?user_id=abc")
assert response.status_code == 200
assert "user_id должен состоять только из цифр" in response.text
def test_detail_and_media(tmp_path: Path) -> None:
settings = make_settings(tmp_path)
output = settings.storage_dir / "1" / "1_output.png"
output.parent.mkdir(parents=True)
output.write_bytes(b"fake-png")
app = create_app(settings)
with TestClient(app) as client:
request_id = insert_request(
settings.db_path,
user_id=1,
prompt="detail prompt",
output=str(output),
)
detail = client.get(f"/request/{request_id}")
assert detail.status_code == 200
assert "detail prompt" in detail.text
media = client.get(f"/media/{request_id}/output")
assert media.status_code == 200
assert media.content == b"fake-png"
missing = client.get(f"/media/{request_id}/input")
assert missing.status_code == 404
def test_basic_auth(tmp_path: Path) -> None:
settings = make_settings(tmp_path, web_username="admin", web_password="secret")
app = create_app(settings)
with TestClient(app) as client:
assert client.get("/").status_code == 401
assert client.get("/", auth=("admin", "secret")).status_code == 200
assert client.get("/", auth=("admin", "wrong")).status_code == 401