diff --git a/Data/Engine/tests/conftest.py b/Data/Engine/tests/conftest.py new file mode 100644 index 0000000..5489be5 --- /dev/null +++ b/Data/Engine/tests/conftest.py @@ -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("", 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 + diff --git a/Data/Engine/tests/test_http_admin.py b/Data/Engine/tests/test_http_admin.py index aea1b61..d229c70 100644 --- a/Data/Engine/tests/test_http_admin.py +++ b/Data/Engine/tests/test_http_admin.py @@ -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): diff --git a/Data/Engine/tests/test_http_agent.py b/Data/Engine/tests/test_http_agent.py index 0d16e9f..e96cbd2 100644 --- a/Data/Engine/tests/test_http_agent.py +++ b/Data/Engine/tests/test_http_agent.py @@ -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("", 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: diff --git a/Data/Engine/tests/test_http_assemblies.py b/Data/Engine/tests/test_http_assemblies.py index 81fd57e..0bc4687 100644 --- a/Data/Engine/tests/test_http_assemblies.py +++ b/Data/Engine/tests/test_http_assemblies.py @@ -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): diff --git a/Data/Engine/tests/test_http_auth.py b/Data/Engine/tests/test_http_auth.py index 2f811c6..27a1924 100644 --- a/Data/Engine/tests/test_http_auth.py +++ b/Data/Engine/tests/test_http_auth.py @@ -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("", 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", } diff --git a/Data/Engine/tests/test_http_sites_devices.py b/Data/Engine/tests/test_http_sites_devices.py index 0925449..2afe32a 100644 --- a/Data/Engine/tests/test_http_sites_devices.py +++ b/Data/Engine/tests/test_http_sites_devices.py @@ -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): diff --git a/Data/Engine/tests/test_http_users.py b/Data/Engine/tests/test_http_users.py index e30fadb..411f84c 100644 --- a/Data/Engine/tests/test_http_users.py +++ b/Data/Engine/tests/test_http_users.py @@ -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):