fixed tests
This commit is contained in:
@@ -13,13 +13,16 @@ from app.config import Settings
|
||||
from app.db import init_db
|
||||
from app.main import create_app
|
||||
from app.models.server import ServerSettings, ServerSettingsResponse
|
||||
from app.services.geo_cache import GeoCache
|
||||
from app.utils.session_cache import NoOpSessionCache
|
||||
from app.utils.setup_state import set_setup_complete_cache
|
||||
|
||||
# ---------------------------------------------------------------------------
|
||||
# Fixtures
|
||||
# ---------------------------------------------------------------------------
|
||||
|
||||
_SETUP_PAYLOAD = {
|
||||
"master_password": "testpassword1",
|
||||
"master_password": "Testpass1!",
|
||||
"database_path": "bangui.db",
|
||||
"fail2ban_socket": "/var/run/fail2ban/fail2ban.sock",
|
||||
"timezone": "UTC",
|
||||
@@ -27,28 +30,62 @@ _SETUP_PAYLOAD = {
|
||||
}
|
||||
|
||||
|
||||
async def _write_password_hash(db: aiosqlite.Connection, password: str) -> str:
|
||||
"""Hash password and write to settings table."""
|
||||
import asyncio
|
||||
|
||||
import bcrypt
|
||||
|
||||
pw_bytes = password.encode()
|
||||
hashed = await asyncio.get_event_loop().run_in_executor(
|
||||
None, lambda: bcrypt.hashpw(pw_bytes, bcrypt.gensalt()).decode()
|
||||
)
|
||||
await db.execute(
|
||||
"INSERT OR REPLACE INTO settings (key, value) VALUES (?, ?)",
|
||||
("master_password_hash", hashed),
|
||||
)
|
||||
await db.commit()
|
||||
return hashed
|
||||
|
||||
|
||||
@pytest.fixture
|
||||
async def server_client(tmp_path: Path) -> AsyncClient: # type: ignore[misc]
|
||||
"""Provide an authenticated ``AsyncClient`` for server endpoint tests."""
|
||||
import os
|
||||
|
||||
os.makedirs(tmp_path / "fail2ban", exist_ok=True)
|
||||
settings = Settings(
|
||||
database_path=str(tmp_path / "server_test.db"),
|
||||
fail2ban_socket="/tmp/fake.sock",
|
||||
session_secret="test-server-secret",
|
||||
fail2ban_config_dir=str(tmp_path / "fail2ban"),
|
||||
session_secret="test-server-secret-0000000000000000000000",
|
||||
session_duration_minutes=60,
|
||||
timezone="UTC",
|
||||
log_level="debug",
|
||||
session_cookie_secure=False,
|
||||
)
|
||||
app = create_app(settings=settings)
|
||||
set_setup_complete_cache(app, True)
|
||||
|
||||
db: aiosqlite.Connection = await aiosqlite.connect(settings.database_path)
|
||||
db.row_factory = aiosqlite.Row
|
||||
await init_db(db)
|
||||
await _write_password_hash(db, _SETUP_PAYLOAD["master_password"])
|
||||
app.state.db = db
|
||||
app.state.http_session = MagicMock()
|
||||
app.state.session_cache = NoOpSessionCache()
|
||||
app.state.geo_cache = GeoCache()
|
||||
|
||||
async def _override_get_db():
|
||||
yield db
|
||||
|
||||
from app.dependencies import get_db, get_session_cache
|
||||
|
||||
app.dependency_overrides[get_db] = _override_get_db
|
||||
app.dependency_overrides[get_session_cache] = lambda: NoOpSessionCache()
|
||||
|
||||
transport = ASGITransport(app=app)
|
||||
async with AsyncClient(transport=transport, base_url="http://test") as ac:
|
||||
await ac.post("/api/v1/setup", json=_SETUP_PAYLOAD)
|
||||
async with AsyncClient(transport=transport, base_url="http://test", headers={"X-BanGUI-Request": "1"}) as ac:
|
||||
login = await ac.post(
|
||||
"/api/v1/auth/login",
|
||||
json={"password": _SETUP_PAYLOAD["master_password"]},
|
||||
@@ -57,6 +94,7 @@ async def server_client(tmp_path: Path) -> AsyncClient: # type: ignore[misc]
|
||||
yield ac
|
||||
|
||||
await db.close()
|
||||
app.dependency_overrides.clear()
|
||||
|
||||
|
||||
def _make_settings() -> ServerSettingsResponse:
|
||||
|
||||
Reference in New Issue
Block a user