mirror of
https://github.com/bunny-lab-io/Borealis.git
synced 2025-10-26 15:21:57 -06:00
tests: centralize engine fixtures
This commit is contained in:
72
Data/Engine/tests/conftest.py
Normal file
72
Data/Engine/tests/conftest.py
Normal file
@@ -0,0 +1,72 @@
|
||||
"""Shared pytest fixtures for Engine HTTP interface tests."""
|
||||
|
||||
from __future__ import annotations
|
||||
|
||||
from pathlib import Path
|
||||
|
||||
import pytest
|
||||
|
||||
from Data.Engine.config.environment import (
|
||||
DatabaseSettings,
|
||||
EngineSettings,
|
||||
FlaskSettings,
|
||||
GitHubSettings,
|
||||
ServerSettings,
|
||||
SocketIOSettings,
|
||||
)
|
||||
from Data.Engine.interfaces.http import register_http_interfaces
|
||||
from Data.Engine.repositories.sqlite import connection as sqlite_connection
|
||||
from Data.Engine.repositories.sqlite import migrations as sqlite_migrations
|
||||
from Data.Engine.server import create_app
|
||||
from Data.Engine.services.container import build_service_container
|
||||
|
||||
|
||||
@pytest.fixture()
|
||||
def engine_settings(tmp_path: Path) -> EngineSettings:
|
||||
"""Provision an EngineSettings instance backed by a temporary project root."""
|
||||
|
||||
project_root = tmp_path
|
||||
static_root = project_root / "static"
|
||||
static_root.mkdir()
|
||||
(static_root / "index.html").write_text("<html></html>", encoding="utf-8")
|
||||
|
||||
database_path = project_root / "database.db"
|
||||
|
||||
return EngineSettings(
|
||||
project_root=project_root,
|
||||
debug=False,
|
||||
database=DatabaseSettings(path=database_path, apply_migrations=False),
|
||||
flask=FlaskSettings(
|
||||
secret_key="test-key",
|
||||
static_root=static_root,
|
||||
cors_allowed_origins=("https://localhost",),
|
||||
),
|
||||
socketio=SocketIOSettings(cors_allowed_origins=("https://localhost",)),
|
||||
server=ServerSettings(host="127.0.0.1", port=5000),
|
||||
github=GitHubSettings(
|
||||
default_repo="owner/repo",
|
||||
default_branch="main",
|
||||
refresh_interval_seconds=60,
|
||||
cache_root=project_root / "cache",
|
||||
),
|
||||
)
|
||||
|
||||
|
||||
@pytest.fixture()
|
||||
def prepared_app(engine_settings: EngineSettings):
|
||||
"""Create a Flask app instance with registered Engine interfaces."""
|
||||
|
||||
settings = engine_settings
|
||||
settings.github.cache_root.mkdir(exist_ok=True, parents=True)
|
||||
|
||||
db_factory = sqlite_connection.connection_factory(settings.database.path)
|
||||
with sqlite_connection.connection_scope(settings.database.path) as conn:
|
||||
sqlite_migrations.apply_all(conn)
|
||||
|
||||
app = create_app(settings, db_factory=db_factory)
|
||||
services = build_service_container(settings, db_factory=db_factory)
|
||||
app.extensions["engine_services"] = services
|
||||
register_http_interfaces(app, services)
|
||||
app.config.update(TESTING=True)
|
||||
return app
|
||||
|
||||
@@ -2,7 +2,7 @@ import base64
|
||||
import sqlite3
|
||||
from datetime import datetime, timezone
|
||||
|
||||
from .test_http_auth import _login, prepared_app
|
||||
from .test_http_auth import _login
|
||||
|
||||
|
||||
def test_enrollment_codes_require_authentication(prepared_app):
|
||||
|
||||
@@ -8,14 +8,6 @@ import time
|
||||
from datetime import datetime, timezone
|
||||
from pathlib import Path
|
||||
|
||||
from Data.Engine.config.environment import (
|
||||
DatabaseSettings,
|
||||
EngineSettings,
|
||||
FlaskSettings,
|
||||
GitHubSettings,
|
||||
ServerSettings,
|
||||
SocketIOSettings,
|
||||
)
|
||||
from Data.Engine.domain.device_auth import (
|
||||
AccessTokenClaims,
|
||||
DeviceAuthContext,
|
||||
@@ -24,57 +16,6 @@ from Data.Engine.domain.device_auth import (
|
||||
DeviceIdentity,
|
||||
DeviceStatus,
|
||||
)
|
||||
from Data.Engine.interfaces.http import register_http_interfaces
|
||||
from Data.Engine.repositories.sqlite import connection as sqlite_connection
|
||||
from Data.Engine.repositories.sqlite import migrations as sqlite_migrations
|
||||
from Data.Engine.server import create_app
|
||||
from Data.Engine.services.container import build_service_container
|
||||
|
||||
|
||||
@pytest.fixture()
|
||||
def engine_settings(tmp_path: Path) -> EngineSettings:
|
||||
project_root = tmp_path
|
||||
static_root = project_root / "static"
|
||||
static_root.mkdir()
|
||||
(static_root / "index.html").write_text("<html></html>", encoding="utf-8")
|
||||
|
||||
database_path = project_root / "database.db"
|
||||
|
||||
return EngineSettings(
|
||||
project_root=project_root,
|
||||
debug=False,
|
||||
database=DatabaseSettings(path=database_path, apply_migrations=False),
|
||||
flask=FlaskSettings(
|
||||
secret_key="test-key",
|
||||
static_root=static_root,
|
||||
cors_allowed_origins=("https://localhost",),
|
||||
),
|
||||
socketio=SocketIOSettings(cors_allowed_origins=("https://localhost",)),
|
||||
server=ServerSettings(host="127.0.0.1", port=5000),
|
||||
github=GitHubSettings(
|
||||
default_repo="owner/repo",
|
||||
default_branch="main",
|
||||
refresh_interval_seconds=60,
|
||||
cache_root=project_root / "cache",
|
||||
),
|
||||
)
|
||||
|
||||
|
||||
@pytest.fixture()
|
||||
def prepared_app(engine_settings: EngineSettings):
|
||||
settings = engine_settings
|
||||
settings.github.cache_root.mkdir(exist_ok=True, parents=True)
|
||||
|
||||
db_factory = sqlite_connection.connection_factory(settings.database.path)
|
||||
with sqlite_connection.connection_scope(settings.database.path) as conn:
|
||||
sqlite_migrations.apply_all(conn)
|
||||
|
||||
app = create_app(settings, db_factory=db_factory)
|
||||
services = build_service_container(settings, db_factory=db_factory)
|
||||
app.extensions["engine_services"] = services
|
||||
register_http_interfaces(app, services)
|
||||
app.config.update(TESTING=True)
|
||||
return app
|
||||
|
||||
|
||||
def _insert_device(app, guid: str, fingerprint: str, hostname: str) -> None:
|
||||
|
||||
@@ -2,7 +2,7 @@ import pytest
|
||||
|
||||
pytest.importorskip("flask")
|
||||
|
||||
from .test_http_auth import _login, prepared_app
|
||||
from .test_http_auth import _login
|
||||
|
||||
|
||||
def test_assembly_crud_flow(prepared_app, engine_settings):
|
||||
|
||||
@@ -1,72 +1,10 @@
|
||||
import hashlib
|
||||
from pathlib import Path
|
||||
|
||||
import pytest
|
||||
|
||||
pytest.importorskip("flask")
|
||||
pytest.importorskip("jwt")
|
||||
|
||||
from Data.Engine.config.environment import (
|
||||
DatabaseSettings,
|
||||
EngineSettings,
|
||||
FlaskSettings,
|
||||
GitHubSettings,
|
||||
ServerSettings,
|
||||
SocketIOSettings,
|
||||
)
|
||||
from Data.Engine.interfaces.http import register_http_interfaces
|
||||
from Data.Engine.repositories.sqlite import connection as sqlite_connection
|
||||
from Data.Engine.repositories.sqlite import migrations as sqlite_migrations
|
||||
from Data.Engine.server import create_app
|
||||
from Data.Engine.services.container import build_service_container
|
||||
|
||||
|
||||
@pytest.fixture()
|
||||
def engine_settings(tmp_path: Path) -> EngineSettings:
|
||||
project_root = tmp_path
|
||||
static_root = project_root / "static"
|
||||
static_root.mkdir()
|
||||
(static_root / "index.html").write_text("<html></html>", encoding="utf-8")
|
||||
|
||||
database_path = project_root / "database.db"
|
||||
|
||||
return EngineSettings(
|
||||
project_root=project_root,
|
||||
debug=False,
|
||||
database=DatabaseSettings(path=database_path, apply_migrations=False),
|
||||
flask=FlaskSettings(
|
||||
secret_key="test-key",
|
||||
static_root=static_root,
|
||||
cors_allowed_origins=("https://localhost",),
|
||||
),
|
||||
socketio=SocketIOSettings(cors_allowed_origins=("https://localhost",)),
|
||||
server=ServerSettings(host="127.0.0.1", port=5000),
|
||||
github=GitHubSettings(
|
||||
default_repo="owner/repo",
|
||||
default_branch="main",
|
||||
refresh_interval_seconds=60,
|
||||
cache_root=project_root / "cache",
|
||||
),
|
||||
)
|
||||
|
||||
|
||||
@pytest.fixture()
|
||||
def prepared_app(engine_settings: EngineSettings):
|
||||
settings = engine_settings
|
||||
settings.github.cache_root.mkdir(exist_ok=True, parents=True)
|
||||
|
||||
db_factory = sqlite_connection.connection_factory(settings.database.path)
|
||||
with sqlite_connection.connection_scope(settings.database.path) as conn:
|
||||
sqlite_migrations.apply_all(conn)
|
||||
|
||||
app = create_app(settings, db_factory=db_factory)
|
||||
services = build_service_container(settings, db_factory=db_factory)
|
||||
app.extensions["engine_services"] = services
|
||||
register_http_interfaces(app, services)
|
||||
app.config.update(TESTING=True)
|
||||
return app
|
||||
|
||||
|
||||
def _login(client) -> dict:
|
||||
payload = {
|
||||
"username": "admin",
|
||||
@@ -88,7 +26,7 @@ def test_auth_me_returns_session_user(prepared_app):
|
||||
body = resp.get_json()
|
||||
assert body == {
|
||||
"username": "admin",
|
||||
"display_name": "admin",
|
||||
"display_name": "Administrator",
|
||||
"role": "Admin",
|
||||
}
|
||||
|
||||
@@ -101,14 +39,14 @@ def test_auth_me_uses_token_when_session_missing(prepared_app):
|
||||
|
||||
# New client without session
|
||||
other_client = prepared_app.test_client()
|
||||
other_client.set_cookie(server_name="localhost", key="borealis_auth", value=token)
|
||||
other_client.set_cookie("borealis_auth", token)
|
||||
|
||||
resp = other_client.get("/api/auth/me")
|
||||
assert resp.status_code == 200
|
||||
body = resp.get_json()
|
||||
assert body == {
|
||||
"username": "admin",
|
||||
"display_name": "admin",
|
||||
"display_name": "Administrator",
|
||||
"role": "Admin",
|
||||
}
|
||||
|
||||
|
||||
@@ -6,7 +6,7 @@ import pytest
|
||||
|
||||
pytest.importorskip("flask")
|
||||
|
||||
from .test_http_auth import _login, prepared_app, engine_settings
|
||||
from .test_http_auth import _login
|
||||
|
||||
|
||||
def _ensure_admin_session(client):
|
||||
|
||||
@@ -4,7 +4,7 @@ from __future__ import annotations
|
||||
|
||||
import hashlib
|
||||
|
||||
from .test_http_auth import _login, prepared_app
|
||||
from .test_http_auth import _login
|
||||
|
||||
|
||||
def test_list_users_requires_authentication(prepared_app):
|
||||
|
||||
Reference in New Issue
Block a user